diff --git a/.eslintrc.json b/.eslintrc.json
deleted file mode 100644
index 7ba4fae97..000000000
--- a/.eslintrc.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
-  "root": true,
-  "parser": "@typescript-eslint/parser",
-  "plugins": ["solid", "spellcheck"],
-  "extends": [
-    "eslint:recommended",
-    "plugin:solid/typescript",
-    "plugin:@typescript-eslint/recommended",
-    "prettier"
-  ],
-  "rules": {
-    "@typescript-eslint/no-non-null-assertion": "off",
-    "spellcheck/spell-checker": [
-      "warn",
-      {
-        "lang": "en_GB",
-        "strings": false,
-        "identifiers": false,
-        "templates": false,
-        "skipWords": ["dismissable", "regex", "accessor", "dnd", "webhooks"],
-        "minLength": 3
-      }
-    ],
-    "@typescript-eslint/no-unused-vars": [
-      "warn",
-      {
-        "varsIgnorePattern": "^_"
-      }
-    ],
-    "no-unused-vars": [
-      "warn",
-      {
-        "varsIgnorePattern": "^_"
-      }
-    ],
-    "require-jsdoc": [
-      "warn",
-      {
-        "require": {
-          "FunctionDeclaration": true,
-          "MethodDefinition": true,
-          "ClassDeclaration": true,
-          "ArrowFunctionExpression": true,
-          "FunctionExpression": true
-        }
-      }
-    ]
-  }
-}
diff --git a/.gitignore b/.gitignore
index 233f6745a..84fa7fc3d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ dist
 .env*
 !.env.example
 .vercel
+.idea
diff --git a/.prettierrc b/.prettierrc
deleted file mode 100644
index d15c81ce9..000000000
--- a/.prettierrc
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "tabWidth": 2,
-  "useTabs": false,
-  "plugins": ["@trivago/prettier-plugin-sort-imports"],
-  "importOrder": [
-    "^solid",
-    "<THIRD_PARTY_MODULES>",
-    "^@revolt",
-    "^@material-design-icons",
-    "^\\.\\.",
-    "^[./]"
-  ],
-  "importOrderSeparation": true,
-  "importOrderSortSpecifiers": true
-}
diff --git a/.prettierrc.cjs b/.prettierrc.cjs
new file mode 100644
index 000000000..d14cd8be6
--- /dev/null
+++ b/.prettierrc.cjs
@@ -0,0 +1,14 @@
+const prettierConfigStandard = require('prettier-config-standard');
+
+const modifiedConfig = {
+  ...prettierConfigStandard,
+  semi: true,
+  parser: 'typescript',
+  singleQuote: true,
+  trailingComma: 'es5',
+  proseWrap: 'never',
+  arrowParens: 'always',
+  tabWidth: 2,
+};
+
+module.exports = modifiedConfig;
\ No newline at end of file
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 000000000..f434f30d7
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,52 @@
+// @ts-check
+import eslint from '@eslint/js';
+import prettier from 'eslint-plugin-prettier/recommended';
+import promise from 'eslint-plugin-promise';
+import simpleImportSort from 'eslint-plugin-simple-import-sort';
+import solid from 'eslint-plugin-solid/configs/typescript';
+import tseslint from 'typescript-eslint';
+import path from 'node:path';
+import tsParser from '@typescript-eslint/parser';
+
+export default tseslint.config(
+  prettier,
+  eslint.configs.recommended,
+  ...tseslint.configs.recommended,
+  ...tseslint.configs.stylistic,
+  {
+    ignores: ['**/styled-system/'],
+  },
+  {
+    files: ['**/*.tsx', '**/*.ts'],
+    extends: [solid],
+    plugins: {
+      'simple-import-sort': simpleImportSort,
+      promise,
+    },
+    languageOptions: {
+      parser: tsParser,
+      parserOptions: {
+        project: path.resolve(
+          import.meta.dirname,
+          'packages',
+          'client',
+          'tsconfig.json'
+        ),
+        tsconfigRootDir: path.resolve(
+          import.meta.dirname,
+          'packages',
+          'client'
+        ),
+      },
+    },
+    rules: {
+      'simple-import-sort/imports': 'error',
+      'simple-import-sort/exports': 'error',
+      '@typescript-eslint/consistent-type-imports': 'error',
+      '@typescript-eslint/no-non-null-assertion': 'off',
+      '@typescript-eslint/no-unused-vars': 'off',
+      'solid/jsx-no-undef': 'off',
+      'no-unused-vars': 'off',
+    },
+  }
+);
diff --git a/package.json b/package.json
index 7494cbd31..496465bae 100644
--- a/package.json
+++ b/package.json
@@ -1,9 +1,10 @@
 {
   "name": "resolvite",
+  "type": "module",
   "version": "1.0.0",
   "description": "Revolt's front-end monorepo.",
   "scripts": {
-    "test": "pnpm --filter test-runner test",
+    "test": "pnpm test --filter=client",
     "test:coverage": "pnpm --filter test-runner coverage",
     "test:browser:install": "pnpm --filter browser-test-runner exec playwright install",
     "test:browser:regression": "pnpm --filter browser-test-runner exec playwright test regression",
@@ -20,6 +21,20 @@
     "fmt:check": "prettier --check '**/*.{ts,tsx,json}'",
     "typecheck": "cd packages/client && pnpm run typecheck"
   },
+  "devDependencies": {
+    "@eslint/js": "^9.12.0",
+    "@types/node": "^22.7.5",
+    "eslint": "^9.12.0",
+    "eslint-config-prettier": "^8.10.0",
+    "eslint-plugin-prettier": "^5.2.1",
+    "eslint-plugin-promise": "^7.1.0",
+    "eslint-plugin-simple-import-sort": "^12.1.1",
+    "eslint-plugin-solid": "^0.14.3",
+    "prettier": "^3.3.3",
+    "prettier-config-standard": "^7.0.0",
+    "typescript-eslint": "^8.8.1",
+    "@typescript-eslint/parser": "^8.8.1"
+  },
   "keywords": [],
   "engines": {
     "node": ">=16",
diff --git a/packages/client/.storybook/main.ts b/packages/client/.storybook/main.ts
index b6631c16e..eed860f87 100644
--- a/packages/client/.storybook/main.ts
+++ b/packages/client/.storybook/main.ts
@@ -1,16 +1,16 @@
-import type { StorybookConfig } from "storybook-solidjs-vite";
+import type { StorybookConfig } from 'storybook-solidjs-vite';
 
 const config: StorybookConfig = {
-  stories: ["../**/*.mdx", "../**/*.story.@(js|jsx|mjs|ts|tsx)"],
+  stories: ['../**/*.mdx', '../**/*.story.@(js|jsx|mjs|ts|tsx)'],
   // stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],
   addons: [
-    "@storybook/addon-links",
-    "@storybook/addon-essentials",
-    "@chromatic-com/storybook",
-    "@storybook/addon-interactions",
+    '@storybook/addon-links',
+    '@storybook/addon-essentials',
+    '@chromatic-com/storybook',
+    '@storybook/addon-interactions',
   ],
   framework: {
-    name: "storybook-solidjs-vite",
+    name: 'storybook-solidjs-vite',
     options: {},
   },
 };
diff --git a/packages/client/.storybook/preview.tsx b/packages/client/.storybook/preview.tsx
index 9be8a494c..1cb9a1396 100644
--- a/packages/client/.storybook/preview.tsx
+++ b/packages/client/.storybook/preview.tsx
@@ -1,7 +1,7 @@
-import { ApplyGlobalStyles, ThemeProvider, darkTheme } from "@revolt/ui";
-import "@revolt/ui/styles";
+import '@revolt/ui/styles';
+import './panda.css';
 
-import "./panda.css";
+import { ApplyGlobalStyles, darkTheme, ThemeProvider } from '@revolt/ui';
 
 const preview: Preview = {
   parameters: {
@@ -14,7 +14,7 @@ const preview: Preview = {
   },
   decorators: [
     (story) => (
-      <ThemeProvider theme={darkTheme("#FF5733", false)}>
+      <ThemeProvider theme={darkTheme('#FF5733', false)}>
         {story} <ApplyGlobalStyles />
       </ThemeProvider>
     ),
diff --git a/packages/client/codegen.plugin.ts b/packages/client/codegen.plugin.ts
index 0ec019d43..d0d591410 100644
--- a/packages/client/codegen.plugin.ts
+++ b/packages/client/codegen.plugin.ts
@@ -1,27 +1,27 @@
-import { readdirSync } from "node:fs";
+import { readdirSync } from 'node:fs';
 
 const fileRegex = /\.tsx$/;
 const codegenRegex = /\/\/ @codegen (.*)/g;
 
-const DIRECTIVES = readdirSync("./components/ui/directives")
-  .filter((x) => x !== "index.ts")
+const DIRECTIVES = readdirSync('./components/ui/directives')
+  .filter((x) => x !== 'index.ts')
   .map((x) => x.substring(0, x.length - 3));
 
-const directiveRegex = new RegExp("use:(" + DIRECTIVES.join("|") + ")");
+const directiveRegex = new RegExp('use:(' + DIRECTIVES.join('|') + ')');
 
 export default function codegenPlugin() {
   return {
-    name: "codegen",
-    enforce: "pre",
+    name: 'codegen',
+    enforce: 'pre' as const,
     transform(src: string, id: string) {
       if (fileRegex.test(id)) {
         src = src.replace(codegenRegex, (substring, group1) => {
-          const rawArgs: string[] = group1.split(" ");
+          const rawArgs: string[] = group1.split(' ');
           const type = rawArgs.shift();
 
           const args = rawArgs.reduce(
             (d, arg) => {
-              const [key, value] = arg.split("=");
+              const [key, value] = arg.split('=');
               return {
                 ...d,
                 [key]: value,
@@ -29,30 +29,30 @@ export default function codegenPlugin() {
             },
             { type }
           ) as {
-            type: "directives";
+            type: 'directives';
             props?: string;
             include?: string;
           };
 
           switch (args.type) {
-            case "directives":
+            case 'directives':
               // Generate directives forwarding
-              const source = args.props ?? "props";
+              const source = args.props ?? 'props';
               const permitted: string[] =
-                args.include?.split(",") ?? DIRECTIVES;
+                args.include?.split(',') ?? DIRECTIVES;
               return DIRECTIVES.filter((d) => permitted.includes(d))
                 .map((d) => `use:${d}={${source}["use:${d}"]}`)
-                .join("\n");
+                .join('\n');
             default:
               return substring;
           }
         });
 
         if (directiveRegex.test(src)) {
-          if (!id.endsWith("client/components/ui/index.tsx"))
+          if (!id.endsWith('client/components/ui/index.tsx'))
             src =
               `import { ${DIRECTIVES.join(
-                ", "
+                ', '
               )} } from "@revolt/ui/directives";\n` + src;
         }
 
diff --git a/packages/client/components/app/index.tsx b/packages/client/components/app/index.tsx
index 411a38df4..ef1a48177 100644
--- a/packages/client/components/app/index.tsx
+++ b/packages/client/components/app/index.tsx
@@ -1,6 +1,5 @@
-export { Message } from "./interface/channels/text/Message";
-export { Messages } from "./interface/channels/text/Messages";
-export { DraftMessages } from "./interface/channels/text/DraftMessages";
-
-export * from "./interface/settings";
-export * from "./menus";
+export { DraftMessages } from './interface/channels/text/DraftMessages';
+export { Message } from './interface/channels/text/Message';
+export { Messages } from './interface/channels/text/Messages';
+export * from './interface/settings';
+export * from './menus';
diff --git a/packages/client/components/app/interface/channels/text/DraftMessage.tsx b/packages/client/components/app/interface/channels/text/DraftMessage.tsx
index d3be1fbd2..c7ae33d06 100644
--- a/packages/client/components/app/interface/channels/text/DraftMessage.tsx
+++ b/packages/client/components/app/interface/channels/text/DraftMessage.tsx
@@ -1,13 +1,11 @@
-import { For } from "solid-js";
+import { useClient, useUser } from '@revolt/client';
+import { userInformation } from '@revolt/markdown/users';
+import type { UnsentMessage } from '@revolt/state/stores/Draft';
+import { Avatar, MessageContainer, MessageReply, Username } from '@revolt/ui';
+import type { Channel } from 'revolt.js';
+import { For } from 'solid-js';
 
-import type { Channel } from "revolt.js";
-
-import { useClient, useUser } from "@revolt/client";
-import { userInformation } from "@revolt/markdown/users";
-import type { UnsentMessage } from "@revolt/state/stores/Draft";
-import { Avatar, MessageContainer, MessageReply, Username } from "@revolt/ui";
-
-import { DraftMessageContextMenu } from "../../../menus/DraftMessageContextMenu";
+import { DraftMessageContextMenu } from '../../../menus/DraftMessageContextMenu';
 
 interface Props {
   draft: UnsentMessage;
@@ -31,13 +29,13 @@ export function DraftMessage(props: Props) {
       timestamp={
         // TODO
         // i18n missing
-        props.draft.status === "sending"
-          ? "Sending..."
-          : props.draft.status === "failed"
-          ? "Failed to send" // add icons here
-          : "Unsent message" // add icons here
+        props.draft.status === 'sending'
+          ? 'Sending...'
+          : props.draft.status === 'failed'
+            ? 'Failed to send' // add icons here
+            : 'Unsent message' // add icons here
       }
-      sendStatus={props.draft.status === "sending" ? "sending" : "failed"}
+      sendStatus={props.draft.status === 'sending' ? 'sending' : 'failed'}
       username={<Username username={userInfo().username} />}
       header={
         <For each={props.draft.replies}>
diff --git a/packages/client/components/app/interface/channels/text/DraftMessages.tsx b/packages/client/components/app/interface/channels/text/DraftMessages.tsx
index fb3766435..96c23e1eb 100644
--- a/packages/client/components/app/interface/channels/text/DraftMessages.tsx
+++ b/packages/client/components/app/interface/channels/text/DraftMessages.tsx
@@ -1,10 +1,8 @@
-import { For } from "solid-js";
+import { state } from '@revolt/state';
+import type { Channel } from 'revolt.js';
+import { For } from 'solid-js';
 
-import { Channel } from "revolt.js";
-
-import { state } from "@revolt/state";
-
-import { DraftMessage } from "./DraftMessage";
+import { DraftMessage } from './DraftMessage';
 
 interface Props {
   channel: Channel;
@@ -19,12 +17,12 @@ export function DraftMessages(props: Props) {
   const unsent = () =>
     state.draft
       .getPendingMessages(props.channel.id)
-      .filter((draft) => draft.status === "sending");
+      .filter((draft) => draft.status === 'sending');
 
   const failed = () =>
     state.draft
       .getPendingMessages(props.channel.id)
-      .filter((draft) => draft.status !== "sending");
+      .filter((draft) => draft.status !== 'sending');
 
   return (
     <>
diff --git a/packages/client/components/app/interface/channels/text/Message.tsx b/packages/client/components/app/interface/channels/text/Message.tsx
index 8224673b1..80cac2198 100644
--- a/packages/client/components/app/interface/channels/text/Message.tsx
+++ b/packages/client/components/app/interface/channels/text/Message.tsx
@@ -1,41 +1,38 @@
-import { For, Match, Show, Switch, onMount } from "solid-js";
-
-import { Message as MessageInterface, WebsiteEmbed } from "revolt.js";
-import { decodeTime } from "ulid";
-
-import { useClient } from "@revolt/client";
-import { dayjs, useTranslation } from "@revolt/i18n";
-import { Markdown } from "@revolt/markdown";
-import { state } from "@revolt/state";
+import MdCloud from '@material-design-icons/svg/filled/cloud.svg?component-solid';
+import MdLink from '@material-design-icons/svg/filled/link.svg?component-solid';
+import MdNotificationsOff from '@material-design-icons/svg/filled/notifications_off.svg?component-solid';
+import MdShield from '@material-design-icons/svg/filled/shield.svg?component-solid';
+import MdSmartToy from '@material-design-icons/svg/filled/smart_toy.svg?component-solid';
+import MdSpa from '@material-design-icons/svg/filled/spa.svg?component-solid';
+import { useClient } from '@revolt/client';
+import { dayjs, useTranslation } from '@revolt/i18n';
+import { Markdown } from '@revolt/markdown';
+import { state } from '@revolt/state';
 import {
   Attachment,
   Avatar,
   BreakText,
   Column,
   Embed,
+  iconSize,
   MessageContainer,
   MessageReply,
   Reactions,
+  styled,
   SystemMessage,
   SystemMessageIcon,
   Tooltip,
   Username,
-  iconSize,
-  styled,
-} from "@revolt/ui";
-
-import MdCloud from "@material-design-icons/svg/filled/cloud.svg?component-solid";
-import MdLink from "@material-design-icons/svg/filled/link.svg?component-solid";
-import MdNotificationsOff from "@material-design-icons/svg/filled/notifications_off.svg?component-solid";
-import MdShield from "@material-design-icons/svg/filled/shield.svg?component-solid";
-import MdSmartToy from "@material-design-icons/svg/filled/smart_toy.svg?component-solid";
-import MdSpa from "@material-design-icons/svg/filled/spa.svg?component-solid";
+} from '@revolt/ui';
+import type { Message as MessageInterface, WebsiteEmbed } from 'revolt.js';
+import { For, Match, onMount, Show, Switch } from 'solid-js';
+import { decodeTime } from 'ulid';
 
-import { MessageContextMenu } from "../../../menus/MessageContextMenu";
+import { MessageContextMenu } from '../../../menus/MessageContextMenu';
 import {
   floatingUserMenus,
   floatingUserMenusFromMessage,
-} from "../../../menus/UserContextMenu";
+} from '../../../menus/UserContextMenu';
 
 /**
  * Regex for matching URLs
@@ -73,10 +70,10 @@ export function Message(props: Props) {
   const isOnlyGIF = () =>
     props.message.embeds &&
     props.message.embeds.length === 1 &&
-    props.message.embeds[0].type === "Website" &&
-    (props.message.embeds[0] as WebsiteEmbed).specialContent?.type === "GIF" &&
+    props.message.embeds[0].type === 'Website' &&
+    (props.message.embeds[0] as WebsiteEmbed).specialContent?.type === 'GIF' &&
     props.message.content &&
-    !props.message.content.replace(RE_URL, "").length;
+    !props.message.content.replace(RE_URL, '').length;
 
   /**
    * React with an emoji
@@ -112,7 +109,7 @@ export function Message(props: Props) {
       edited={props.message.editedAt}
       mentioned={props.message.mentioned}
       highlight={props.highlight}
-      tail={props.tail || state.settings.getValue("appearance:compact_mode")}
+      tail={props.tail || state.settings.getValue('appearance:compact_mode')}
       header={
         <Show when={props.message.replyIds}>
           <For each={props.message.replyIds}>
@@ -145,46 +142,46 @@ export function Message(props: Props) {
           <Match
             when={
               props.message.masquerade &&
-              props.message.authorId === "01FHGJ3NPP7XANQQH8C2BE44ZY"
+              props.message.authorId === '01FHGJ3NPP7XANQQH8C2BE44ZY'
             }
           >
-            <Tooltip content={t("app.main.channel.bridged")} placement="top">
+            <Tooltip content={t('app.main.channel.bridged')} placement='top'>
               <MdLink {...iconSize(16)} />
             </Tooltip>
           </Match>
           <Match when={props.message.author?.privileged}>
-            <Tooltip content={t("app.main.channel.team")} placement="top">
+            <Tooltip content={t('app.main.channel.team')} placement='top'>
               <MdShield {...iconSize(16)} />
             </Tooltip>
           </Match>
           <Match when={props.message.author?.bot}>
-            <Tooltip content={t("app.main.channel.bot")} placement="top">
+            <Tooltip content={t('app.main.channel.bot')} placement='top'>
               <MdSmartToy {...iconSize(16)} />
             </Tooltip>
           </Match>
           <Match when={props.message.webhook}>
-            <Tooltip content={t("app.main.channel.webhook")} placement="top">
+            <Tooltip content={t('app.main.channel.webhook')} placement='top'>
               <MdCloud {...iconSize(16)} />
             </Tooltip>
           </Match>
           <Match when={props.message.webhook}>
-            <Tooltip content={t("app.main.channel.webhook")} placement="top">
+            <Tooltip content={t('app.main.channel.webhook')} placement='top'>
               <MdCloud {...iconSize(16)} />
             </Tooltip>
           </Match>
           <Match when={props.message.isSuppressed}>
-            <Tooltip content={"Silent" /* TODO: i18n */} placement="top">
+            <Tooltip content={'Silent' /* TODO: i18n */} placement='top'>
               <MdNotificationsOff {...iconSize(16)} />
             </Tooltip>
           </Match>
           <Match
             when={
               props.message.authorId &&
-              dayjs().diff(decodeTime(props.message.authorId), "day") < 1
+              dayjs().diff(decodeTime(props.message.authorId), 'day') < 1
             }
           >
             <NewUser>
-              <Tooltip content="New to Revolt" placement="top">
+              <Tooltip content='New to Revolt' placement='top'>
                 <MdSpa {...iconSize(16)} />
               </Tooltip>
             </NewUser>
@@ -192,16 +189,16 @@ export function Message(props: Props) {
           <Match
             when={
               props.message.member &&
-              dayjs().diff(props.message.member.joinedAt, "day") < 1
+              dayjs().diff(props.message.member.joinedAt, 'day') < 1
             }
           >
             <NewUser>
-              <Tooltip content="New to the server" placement="top">
+              <Tooltip content='New to the server' placement='top'>
                 <MdSpa {...iconSize(16)} />
               </Tooltip>
             </NewUser>
           </Match>
-          <Match when={props.message.authorId === "01EX2NCWQ0CHS3QJF0FEQS1GR4"}>
+          <Match when={props.message.authorId === '01EX2NCWQ0CHS3QJF0FEQS1GR4'}>
             <span />
             <span>he/him &middot; </span>
           </Match>
@@ -209,7 +206,7 @@ export function Message(props: Props) {
       }
       compact={
         !!props.message.systemMessage ||
-        state.settings.getValue("appearance:compact_mode")
+        state.settings.getValue('appearance:compact_mode')
       }
       infoMatch={
         <Match when={props.message.systemMessage}>
@@ -221,7 +218,7 @@ export function Message(props: Props) {
         </Match>
       }
     >
-      <Column gap="sm">
+      <Column gap='sm'>
         <Show when={props.message.systemMessage}>
           <SystemMessage
             systemMessage={props.message.systemMessage!}
diff --git a/packages/client/components/app/interface/channels/text/Messages.tsx b/packages/client/components/app/interface/channels/text/Messages.tsx
index 4f70f674e..93133a997 100644
--- a/packages/client/components/app/interface/channels/text/Messages.tsx
+++ b/packages/client/components/app/interface/channels/text/Messages.tsx
@@ -1,35 +1,32 @@
+import { useClient } from '@revolt/client';
+import { dayjs } from '@revolt/i18n';
+import {
+  BlockedMessage,
+  ConversationStart,
+  JumpToBottom,
+  ListView,
+  MessageDivider,
+  styled,
+} from '@revolt/ui';
+import isEqual from 'lodash.isequal';
+import type { Channel, Message as MessageInterface } from 'revolt.js';
+import type { Accessor, JSX } from 'solid-js';
 import {
-  Accessor,
-  For,
-  JSX,
-  Match,
-  Show,
-  Switch,
   batch,
   createEffect,
   createMemo,
   createSignal,
+  For,
+  Match,
   on,
   onCleanup,
   onMount,
+  Show,
   splitProps,
-} from "solid-js";
-
-import isEqual from "lodash.isequal";
-import { Channel, Message as MessageInterface } from "revolt.js";
-
-import { useClient } from "@revolt/client";
-import { dayjs } from "@revolt/i18n";
-import {
-  BlockedMessage,
-  ConversationStart,
-  JumpToBottom,
-  ListView,
-  MessageDivider,
-  styled,
-} from "@revolt/ui";
+  Switch,
+} from 'solid-js';
 
-import { Message } from "./Message";
+import { Message } from './Message';
 
 /**
  * Default fetch limit
@@ -110,7 +107,7 @@ export function Messages(props: Props) {
    * The current direction of fetching
    */
   const [fetching, setFetching] = createSignal<
-    "initial" | "upwards" | "downwards" | "jump_end" | "jump_msg"
+    'initial' | 'upwards' | 'downwards' | 'jump_end' | 'jump_msg'
   >();
 
   /**
@@ -185,7 +182,7 @@ export function Messages(props: Props) {
   async function caseInitialLoad(nearby?: string) {
     // Pre-empt any fetches
     preempt();
-    setFetching("initial");
+    setFetching('initial');
 
     // Handle incoming pre-emptions
     const preempted = newPreempted();
@@ -213,7 +210,7 @@ export function Messages(props: Props) {
 
       // Assume we are not at the end if we jumped to a message
       // NB. we set this late to not display the "jump to bottom" bar
-      if (typeof nearby === "string") {
+      if (typeof nearby === 'string') {
         setEnd(
           // If the messages fetched include the latest message,
           // then we are at the end and mark the channel as such.
@@ -262,7 +259,7 @@ export function Messages(props: Props) {
     if (atStart() || !canFetch()) return;
 
     // Indicate we are fetching upwards
-    setFetching("upwards");
+    setFetching('upwards');
 
     // Handle incoming pre-emptions
     const preempted = newPreempted();
@@ -334,7 +331,7 @@ export function Messages(props: Props) {
     if (atEnd() || !canFetch()) return;
 
     // Indicate we are fetching downwards
-    setFetching("downwards");
+    setFetching('downwards');
 
     // Handle incoming pre-emptions
     const preempted = newPreempted();
@@ -344,7 +341,7 @@ export function Messages(props: Props) {
       const result = await props.channel.fetchMessagesWithUsers({
         limit: props.fetchLimit,
         after: messages()[0].id,
-        sort: "Oldest",
+        sort: 'Oldest',
       });
 
       // Cancel if we've been pre-empted
@@ -407,7 +404,7 @@ export function Messages(props: Props) {
     function findScrollContainer(el: Element | null) {
       if (!el) {
         return null;
-      } else if (getComputedStyle(el).overflowY === "scroll") {
+      } else if (getComputedStyle(el).overflowY === 'scroll') {
         return el;
       } else {
         return el.parentElement;
@@ -418,15 +415,15 @@ export function Messages(props: Props) {
     if (atEnd()) {
       const containerChild = findScrollContainer(listRef!)!.children[0];
       containerChild!.scrollIntoView({
-        behavior: "smooth",
-        block: "end",
+        behavior: 'smooth',
+        block: 'end',
       });
     }
     // Otherwise fetch present messages
     else {
       // Pre-empty any fetches
       preempt();
-      setFetching("jump_end");
+      setFetching('jump_end');
 
       // Handle incoming pre-emptions
       const preempted = newPreempted();
@@ -470,14 +467,14 @@ export function Messages(props: Props) {
           const containerChild = findScrollContainer(listRef!)!.children[0];
 
           containerChild!.scrollIntoView({
-            behavior: "instant",
-            block: "start",
+            behavior: 'instant',
+            block: 'start',
           });
 
           setTimeout(() => {
             containerChild!.scrollIntoView({
-              behavior: "smooth",
-              block: "end",
+              behavior: 'smooth',
+              block: 'end',
             });
 
             // Mark as fetching has ended
@@ -505,8 +502,8 @@ export function Messages(props: Props) {
       ); // use localeCompare
 
       listRef!.children[index + (atStart() ? 1 : 0)].scrollIntoView({
-        behavior: "smooth",
-        block: "center",
+        behavior: 'smooth',
+        block: 'center',
       });
     };
 
@@ -517,7 +514,7 @@ export function Messages(props: Props) {
 
     // Pre-empty any fetches
     preempt();
-    setFetching("jump_msg");
+    setFetching('jump_msg');
 
     // Handle incoming pre-emptions
     const preempted = newPreempted();
@@ -611,14 +608,14 @@ export function Messages(props: Props) {
   // Add listener for messages
   onMount(() => {
     const c = client();
-    c.addListener("messageCreate", onMessage);
-    c.addListener("messageDelete", onMessageDelete);
+    c.addListener('messageCreate', onMessage);
+    c.addListener('messageDelete', onMessageDelete);
   });
 
   onCleanup(() => {
     const c = client();
-    c.removeListener("messageCreate", onMessage);
-    c.removeListener("messageDelete", onMessageDelete);
+    c.removeListener('messageCreate', onMessage);
+    c.removeListener('messageDelete', onMessageDelete);
   });
 
   // We need to cache created objects to prevent needless re-rendering
@@ -627,7 +624,7 @@ export function Messages(props: Props) {
   // Determine which messages have a tail and add message dividers
   const messagesWithTail = createMemo<ListEntry[]>(() => {
     const messagesWithTail: ListEntry[] = [];
-    const lastReadId = props.lastReadId() ?? "0";
+    const lastReadId = props.lastReadId() ?? '0';
 
     let blockedMessages = 0;
     let insertedUnreadDivider = false;
@@ -698,7 +695,7 @@ export function Messages(props: Props) {
         );
       }
 
-      if (message.author?.relationship === "Blocked") {
+      if (message.author?.relationship === 'Blocked') {
         blockedMessages++;
       } else {
         // Push any blocked messages if they haven't been yet
@@ -719,7 +716,7 @@ export function Messages(props: Props) {
         messagesWithTail.push(
           objectCache.get(date) ?? {
             t: 1,
-            date: dayjs(date).format("LL"),
+            date: dayjs(date).format('LL'),
           }
         );
       }
@@ -837,8 +834,8 @@ type ListEntry =
 /**
  * Render individual list entry
  */
-function Entry(props: ListEntry & Pick<Props, "highlightedMessageId">) {
-  const [local, other] = splitProps(props, ["t", "highlightedMessageId"]);
+function Entry(props: ListEntry & Pick<Props, 'highlightedMessageId'>) {
+  const [local, other] = splitProps(props, ['t', 'highlightedMessageId']);
 
   return (
     <Switch>
diff --git a/packages/client/components/app/interface/settings/Settings.tsx b/packages/client/components/app/interface/settings/Settings.tsx
index c91a7ac13..1da9c6406 100644
--- a/packages/client/components/app/interface/settings/Settings.tsx
+++ b/packages/client/components/app/interface/settings/Settings.tsx
@@ -1,17 +1,11 @@
-import {
-  Accessor,
-  createContext,
-  createSignal,
-  untrack,
-  useContext,
-} from "solid-js";
+import { Rerun } from '@solid-primitives/keyed';
+import type { Accessor } from 'solid-js';
+import { createContext, createSignal, untrack, useContext } from 'solid-js';
+import { Motion, Presence } from 'solid-motionone';
 
-import { Motion, Presence } from "@motionone/solid";
-import { Rerun } from "@solid-primitives/keyed";
-
-import { SettingsConfiguration, SettingsEntry } from ".";
-import { SettingsContent } from "./_layout/Content";
-import { SettingsSidebar } from "./_layout/Sidebar";
+import type { SettingsConfiguration, SettingsEntry } from '.';
+import { SettingsContent } from './_layout/Content';
+import { SettingsSidebar } from './_layout/Sidebar';
 
 export interface SettingsProps {
   /**
@@ -28,7 +22,7 @@ export interface SettingsProps {
 /**
  * Transition animation
  */
-export type SettingsTransition = "normal" | "to-child" | "to-parent";
+export type SettingsTransition = 'normal' | 'to-child' | 'to-parent';
 
 /**
  * Provide navigation to child components
@@ -44,18 +38,18 @@ const SettingsNavigationContext = createContext<{
 export function Settings(props: SettingsProps & SettingsConfiguration<never>) {
   const [page, setPage] = createSignal<undefined | string>();
   const [transition, setTransition] =
-    createSignal<SettingsTransition>("normal");
+    createSignal<SettingsTransition>('normal');
 
   /**
    * Navigate to a certain page
    */
   function navigate(entry: string | SettingsEntry) {
     let id;
-    if (typeof entry === "object") {
+    if (typeof entry === 'object') {
       if (entry.onClick) {
         entry.onClick();
       } else if (entry.href) {
-        window.open(entry.href, "_blank");
+        window.open(entry.href, '_blank');
       } else if (entry.id) {
         id = entry.id;
       }
@@ -67,11 +61,11 @@ export function Settings(props: SettingsProps & SettingsConfiguration<never>) {
 
     const current = page();
     if (current?.startsWith(id)) {
-      setTransition("to-parent");
+      setTransition('to-parent');
     } else if (current && id.startsWith(current)) {
-      setTransition("to-child");
+      setTransition('to-child');
     } else {
-      setTransition("normal");
+      setTransition('normal');
     }
 
     setPage(id);
@@ -95,20 +89,20 @@ export function Settings(props: SettingsProps & SettingsConfiguration<never>) {
           <Rerun on={page}>
             <Motion.div
               style={
-                untrack(transition) === "normal" ? {} : { visibility: "hidden" }
+                untrack(transition) === 'normal' ? {} : { visibility: 'hidden' }
               }
               ref={(el) =>
-                untrack(transition) !== "normal" &&
-                setTimeout(() => (el.style.visibility = "visible"), 250)
+                untrack(transition) !== 'normal' &&
+                setTimeout(() => (el.style.visibility = 'visible'), 250)
               }
               initial={
-                transition() === "normal"
+                transition() === 'normal'
                   ? { opacity: 0, y: 50 }
-                  : transition() === "to-child"
-                  ? {
-                      x: "100vw",
-                    }
-                  : { x: "-100vw" }
+                  : transition() === 'to-child'
+                    ? {
+                        x: '100vw',
+                      }
+                    : { x: '-100vw' }
               }
               animate={{
                 opacity: 1,
@@ -116,13 +110,13 @@ export function Settings(props: SettingsProps & SettingsConfiguration<never>) {
                 y: 0,
               }}
               exit={
-                transition() === "normal"
+                transition() === 'normal'
                   ? undefined
-                  : transition() === "to-child"
-                  ? {
-                      x: "-100vw",
-                    }
-                  : { x: "100vw" }
+                  : transition() === 'to-child'
+                    ? {
+                        x: '-100vw',
+                      }
+                    : { x: '100vw' }
               }
               transition={{ duration: 0.2, easing: [0.17, 0.67, 0.58, 0.98] }}
             >
diff --git a/packages/client/components/app/interface/settings/_layout/Content.tsx b/packages/client/components/app/interface/settings/_layout/Content.tsx
index f45e81400..a4a082552 100644
--- a/packages/client/components/app/interface/settings/_layout/Content.tsx
+++ b/packages/client/components/app/interface/settings/_layout/Content.tsx
@@ -1,12 +1,10 @@
-import { Accessor, JSX, Show } from "solid-js";
+import MdClose from '@material-design-icons/svg/outlined/close.svg?component-solid';
+import { Breadcrumbs, Column, iconSize, styled, Typography } from '@revolt/ui';
+import type { Accessor, JSX } from 'solid-js';
+import { Show } from 'solid-js';
+import { cva } from 'styled-system/css';
 
-import { cva } from "styled-system/css";
-
-import { Breadcrumbs, Column, Typography, iconSize, styled } from "@revolt/ui";
-
-import MdClose from "@material-design-icons/svg/outlined/close.svg?component-solid";
-
-import { useSettingsNavigation } from "../Settings";
+import { useSettingsNavigation } from '../Settings';
 
 /**
  * Content portion of the settings menu
@@ -22,19 +20,19 @@ export function SettingsContent(props: {
   return (
     <div
       use:scrollable={{
-        foreground: "var(--colours-settings-content-scroll-thumb)",
-        background: "var(--colours-settings-content-background)",
+        foreground: 'var(--colours-settings-content-scroll-thumb)',
+        background: 'var(--colours-settings-content-background)',
         class: base(),
       }}
     >
       <Show when={props.page()}>
         <InnerContent>
-          <InnerColumn gap="x">
-            <Typography variant="settings-title">
+          <InnerColumn gap='x'>
+            <Typography variant='settings-title'>
               <Breadcrumbs
-                elements={props.page()!.split("/")}
+                elements={props.page()!.split('/')}
                 renderElement={(key) => props.title(key)}
-                navigate={(keys) => navigate(keys.join("/"))}
+                navigate={(keys) => navigate(keys.join('/'))}
               />
             </Typography>
             {props.children}
@@ -58,17 +56,17 @@ export function SettingsContent(props: {
 const base = cva({
   base: {
     minWidth: 0,
-    flex: "1 1 800px",
-    flexDirection: "row",
+    flex: '1 1 800px',
+    flexDirection: 'row',
 
-    display: "flex",
-    background: "var(--colours-settings-content-background)",
+    display: 'flex',
+    background: 'var(--colours-settings-content-background)',
 
-    borderStartStartRadius: "30px",
-    borderEndStartRadius: "30px",
+    borderStartStartRadius: '30px',
+    borderEndStartRadius: '30px',
 
-    "& > a": {
-      textDecoration: "none",
+    '& > a': {
+      textDecoration: 'none',
     },
   },
 });
@@ -76,7 +74,7 @@ const base = cva({
 /**
  * Settings pane
  */
-const InnerContent = styled("div", "Pane")`
+const InnerContent = styled('div', 'Pane')`
   gap: 13px;
   min-width: 0;
   width: 100%;
@@ -106,22 +104,22 @@ const CloseAnchor = styled.a`
   justify-content: center;
 
   border-radius: ${(props) => props.theme!.borderRadius.full};
-  border: 3px solid ${(props) => props.theme!.colours["settings-close-anchor"]};
+  border: 3px solid ${(props) => props.theme!.colours['settings-close-anchor']};
   transition: ${(props) => props.theme!.transitions.fast} background-color;
 
   svg {
     transition: ${(props) => props.theme!.transitions.fast} background-color;
     color: ${(props) =>
-      props.theme!.colours["settings-close-anchor"]} !important;
+      props.theme!.colours['settings-close-anchor']} !important;
   }
 
   &:hover {
-    background: ${(props) => props.theme!.colours["settings-close-anchor"]};
+    background: ${(props) => props.theme!.colours['settings-close-anchor']};
   }
 
   &:hover svg {
     color: ${(props) =>
-      props.theme!.colours["settings-close-anchor-hover"]} !important;
+      props.theme!.colours['settings-close-anchor-hover']} !important;
   }
 
   &:active {
@@ -141,13 +139,13 @@ const CloseAction = styled.div`
   top: 0;
 
   &:after {
-    content: "ESC";
+    content: 'ESC';
     margin-top: 4px;
     display: flex;
     justify-content: center;
     width: 36px;
     font-weight: 600;
-    color: ${(props) => props.theme!.colours["settings-content-foreground"]};
+    color: ${(props) => props.theme!.colours['settings-content-foreground']};
     font-size: 0.75rem;
   }
 `;
diff --git a/packages/client/components/app/interface/settings/_layout/Sidebar.tsx b/packages/client/components/app/interface/settings/_layout/Sidebar.tsx
index 064f1c1fa..49994584e 100644
--- a/packages/client/components/app/interface/settings/_layout/Sidebar.tsx
+++ b/packages/client/components/app/interface/settings/_layout/Sidebar.tsx
@@ -1,17 +1,16 @@
-import { Accessor, For, Setter, Show, createMemo, onMount } from "solid-js";
-
-import { Column, OverflowingText, styled } from "@revolt/ui";
+import { Column, OverflowingText, styled } from '@revolt/ui';
+import type { Accessor, Setter } from 'solid-js';
+import { createMemo, For, onMount, Show } from 'solid-js';
 
 // import MdError from "@material-design-icons/svg/filled/error.svg?component-solid";
 // import MdOpenInNew from "@material-design-icons/svg/filled/open_in_new.svg?component-solid";
-import { SettingsList } from "..";
-import { useSettingsNavigation } from "../Settings";
-
+import type { SettingsList } from '..';
+import { useSettingsNavigation } from '../Settings';
 import {
   SidebarButton,
   SidebarButtonContent,
   SidebarButtonTitle,
-} from "./SidebarButton";
+} from './SidebarButton';
 
 /**
  * Settings Sidebar Layout
@@ -44,7 +43,7 @@ export function SettingsSidebar(props: {
     <Base>
       <div use:invisibleScrollable>
         <Content>
-          <Column gap="lg">
+          <Column gap='lg'>
             {list().prepend}
             <For each={list().entries}>
               {(category) => (
@@ -53,15 +52,15 @@ export function SettingsSidebar(props: {
                     <Show when={category.title}>
                       <CategoryTitle>{category.title}</CategoryTitle>
                     </Show>
-                    <Column gap="s">
+                    <Column gap='s'>
                       <For each={category.entries}>
                         {(entry) => (
                           <Show when={!entry.hidden}>
                             <SidebarButton
                               onClick={() => navigate(entry)}
                               aria-selected={
-                                props.page()?.split("/")[0] ===
-                                entry.id?.split("/")[0]
+                                props.page()?.split('/')[0] ===
+                                entry.id?.split('/')[0]
                               }
                             >
                               <SidebarButtonTitle>
@@ -102,19 +101,19 @@ export function SettingsSidebar(props: {
 /**
  * Base layout of the sidebar
  */
-const Base = styled("div", "Sidebar")`
+const Base = styled('div', 'Sidebar')`
   display: flex;
   flex: 1 0 218px;
   padding-left: 8px;
   justify-content: flex-end;
 
-  color: ${(props) => props.theme!.colours["settings-foreground"]};
+  color: ${(props) => props.theme!.colours['settings-foreground']};
 `;
 
 /**
  * Aligned content within the sidebar
  */
-const Content = styled("div", "Content")`
+const Content = styled('div', 'Content')`
   min-width: 230px;
   max-width: 300px;
   padding: 74px 0 8px;
@@ -137,5 +136,5 @@ const CategoryTitle = styled(OverflowingText)`
   font-weight: 700;
   margin: 0 8px;
   margin-inline-end: 20px;
-  color: ${(props) => props.theme!.colours["settings-sidebar-category"]};
+  color: ${(props) => props.theme!.colours['settings-sidebar-category']};
 `;
diff --git a/packages/client/components/app/interface/settings/_layout/SidebarButton.tsx b/packages/client/components/app/interface/settings/_layout/SidebarButton.tsx
index aca5b8eb9..b1b97ef9c 100644
--- a/packages/client/components/app/interface/settings/_layout/SidebarButton.tsx
+++ b/packages/client/components/app/interface/settings/_layout/SidebarButton.tsx
@@ -1,4 +1,4 @@
-import { styled } from "@revolt/ui";
+import { styled } from '@revolt/ui';
 
 // TODO: move to @revolt/ui package
 
@@ -19,11 +19,11 @@ export const SidebarButton = styled.a<Props>`
   font-size: 15px;
   user-select: none;
   transition: background-color 0.1s ease-in-out;
-  color: ${(props) => props.theme!.colours["settings-sidebar-foreground"]};
+  color: ${(props) => props.theme!.colours['settings-sidebar-foreground']};
   background: ${(props) =>
-    props["aria-selected"]
-      ? props.theme!.colours["settings-sidebar-button-hover"]
-      : "unset"};
+    props['aria-selected']
+      ? props.theme!.colours['settings-sidebar-button-hover']
+      : 'unset'};
 
   svg {
     flex-shrink: 0;
@@ -31,12 +31,12 @@ export const SidebarButton = styled.a<Props>`
 
   &:hover {
     background-color: ${(props) =>
-      props.theme!.colours["settings-sidebar-button-hover"]};
+      props.theme!.colours['settings-sidebar-button-hover']};
   }
 
   &:active {
     background-color: ${(props) =>
-      props.theme!.colours["settings-sidebar-button-active"]};
+      props.theme!.colours['settings-sidebar-button-active']};
   }
 `;
 
diff --git a/packages/client/components/app/interface/settings/channel/Webhooks.tsx b/packages/client/components/app/interface/settings/channel/Webhooks.tsx
index 630599106..94e1d4e06 100644
--- a/packages/client/components/app/interface/settings/channel/Webhooks.tsx
+++ b/packages/client/components/app/interface/settings/channel/Webhooks.tsx
@@ -1,20 +1,17 @@
-import { BiSolidCloud, BiSolidTrash } from "solid-icons/bi";
-import { For, Match, Show, Switch, createSignal, onMount } from "solid-js";
-
-import type { ChannelWebhook } from "revolt.js";
-
-import { useClient } from "@revolt/client";
+import { useClient } from '@revolt/client';
 import {
   Avatar,
   CategoryButton,
   Column,
   Preloader,
   Typography,
-} from "@revolt/ui";
-
-import { useSettingsNavigation } from "../Settings";
+} from '@revolt/ui';
+import type { ChannelWebhook } from 'revolt.js';
+import { BiSolidCloud, BiSolidTrash } from 'solid-icons/bi';
+import { createSignal, For, Match, onMount, Show, Switch } from 'solid-js';
 
-import { ChannelSettingsProps } from ".";
+import { useSettingsNavigation } from '../Settings';
+import type { ChannelSettingsProps } from '.';
 
 /**
  * Webhooks
@@ -37,9 +34,9 @@ export default function Webhooks(props: ChannelSettingsProps) {
   });
 
   return (
-    <Column gap="xl">
+    <Column gap='xl'>
       <CategoryButton
-        action="chevron"
+        action='chevron'
         icon={<BiSolidCloud size={24} />}
         onClick={() => void 0}
       >
@@ -48,8 +45,8 @@ export default function Webhooks(props: ChannelSettingsProps) {
 
       <Show when={!webhooks() || webhooks()!.length !== 0}>
         <Column>
-          <Typography variant="label">My Bots</Typography>
-          <Switch fallback={<Preloader type="ring" />}>
+          <Typography variant='label'>My Bots</Typography>
+          <Switch fallback={<Preloader type='ring' />}>
             <Match when={webhooks()?.length}>
               <For each={webhooks()}>
                 {(webhook) => (
@@ -57,7 +54,7 @@ export default function Webhooks(props: ChannelSettingsProps) {
                     icon={<Avatar src={webhook.avatarURL} size={24} />}
                     description={webhook.id}
                     onClick={() => navigate(`webhooks/${webhook.id}`)}
-                    action="chevron"
+                    action='chevron'
                   >
                     {webhook.name}
                   </CategoryButton>
@@ -76,9 +73,9 @@ export default function Webhooks(props: ChannelSettingsProps) {
  */
 export function Webhook(props: { webhook: ChannelWebhook }) {
   return (
-    <Column gap="xl">
+    <Column gap='xl'>
       <CategoryButton
-        action="chevron"
+        action='chevron'
         icon={<BiSolidTrash size={24} />}
         onClick={() => void 0}
       >
diff --git a/packages/client/components/app/interface/settings/channel/index.tsx b/packages/client/components/app/interface/settings/channel/index.tsx
index 436f0f93b..19bba9715 100644
--- a/packages/client/components/app/interface/settings/channel/index.tsx
+++ b/packages/client/components/app/interface/settings/channel/index.tsx
@@ -1,21 +1,18 @@
+import { useClient } from '@revolt/client';
+import { getController } from '@revolt/common';
+import { useTranslation } from '@revolt/i18n';
+import { TextWithEmoji } from '@revolt/markdown';
+import { ColouredText, useTheme } from '@revolt/ui';
+import type { Channel } from 'revolt.js';
 import {
   BiRegularListUl,
   BiSolidCloud,
   BiSolidInfoCircle,
   BiSolidTrash,
-} from "solid-icons/bi";
+} from 'solid-icons/bi';
 
-import { Channel } from "revolt.js";
-
-import { useClient } from "@revolt/client";
-import { getController } from "@revolt/common";
-import { useTranslation } from "@revolt/i18n";
-import { TextWithEmoji } from "@revolt/markdown";
-import { ColouredText, useTheme } from "@revolt/ui";
-
-import { SettingsConfiguration } from "..";
-
-import Webhooks, { Webhook } from "./Webhooks";
+import type { SettingsConfiguration } from '..';
+import Webhooks, { Webhook } from './Webhooks';
 
 const Config: SettingsConfiguration<Channel> = {
   /**
@@ -26,29 +23,28 @@ const Config: SettingsConfiguration<Channel> = {
     const t = useTranslation();
     const client = useClient();
 
-    if (key.startsWith("webhooks/")) {
+    if (key.startsWith('webhooks/')) {
       const webhook = client().channelWebhooks.get(key.substring(9));
       return webhook!.name;
     }
 
-    return t(`app.settings.channel_pages.${key.replaceAll("/", ".")}.title`);
+    return t(`app.settings.channel_pages.${key.replaceAll('/', '.')}.title`);
   },
 
   /**
    * Render the current channel settings page
    */
   render(props, channel) {
-    // eslint-disable-next-line solid/reactivity
     const id = props.page();
     const client = useClient();
 
-    if (id?.startsWith("webhooks/")) {
+    if (id?.startsWith('webhooks/')) {
       const webhook = client().channelWebhooks.get(id.substring(9));
       return <Webhook webhook={webhook!} />;
     }
 
     switch (id) {
-      case "webhooks":
+      case 'webhooks':
         return <Webhooks channel={channel} />;
       default:
         return null;
@@ -69,27 +65,27 @@ const Config: SettingsConfiguration<Channel> = {
           title: <TextWithEmoji content={channel.name} />,
           entries: [
             {
-              id: "overview",
+              id: 'overview',
               icon: <BiSolidInfoCircle size={20} />,
-              title: t("app.settings.channel_pages.overview.title"),
+              title: t('app.settings.channel_pages.overview.title'),
             },
             {
-              hidden: !channel.havePermission("ManagePermissions"),
-              id: "permissions",
+              hidden: !channel.havePermission('ManagePermissions'),
+              id: 'permissions',
               icon: <BiRegularListUl size={20} />,
-              title: t("app.settings.channel_pages.permissions.title"),
+              title: t('app.settings.channel_pages.permissions.title'),
             },
             {
-              hidden: !channel.havePermission("ManageWebhooks"),
-              id: "webhooks",
+              hidden: !channel.havePermission('ManageWebhooks'),
+              id: 'webhooks',
               icon: <BiSolidCloud size={20} />,
-              title: t("app.settings.channel_pages.webhooks.title"),
+              title: t('app.settings.channel_pages.webhooks.title'),
             },
           ],
         },
         {
           hidden: !(
-            channel.type !== "Group" && channel.havePermission("ManageChannel")
+            channel.type !== 'Group' && channel.havePermission('ManageChannel')
           ),
           entries: [
             {
@@ -101,15 +97,15 @@ const Config: SettingsConfiguration<Channel> = {
               ),
               title: (
                 <ColouredText colour={theme!.customColours.error.color}>
-                  {t("app.context_menu.delete_channel")}
+                  {t('app.context_menu.delete_channel')}
                 </ColouredText>
               ),
               /**
                * Handle server deletion request
                */
               onClick() {
-                getController("modal").push({
-                  type: "delete_channel",
+                getController('modal').push({
+                  type: 'delete_channel',
                   channel,
                 });
               },
@@ -123,9 +119,9 @@ const Config: SettingsConfiguration<Channel> = {
 
 export default Config;
 
-export type ChannelSettingsProps = {
+export interface ChannelSettingsProps {
   /**
    * Channel
    */
   channel: Channel;
-};
+}
diff --git a/packages/client/components/app/interface/settings/index.tsx b/packages/client/components/app/interface/settings/index.tsx
index adc2c1828..7d25f5bc2 100644
--- a/packages/client/components/app/interface/settings/index.tsx
+++ b/packages/client/components/app/interface/settings/index.tsx
@@ -1,13 +1,14 @@
-import { Accessor, JSX } from "solid-js";
+import type { Accessor, JSX } from 'solid-js';
 
-import { Settings, SettingsProps } from "./Settings";
-import channel from "./channel";
-import server from "./server";
-import user from "./user";
+import channel from './channel';
+import server from './server';
+import type { SettingsProps } from './Settings';
+import { Settings } from './Settings';
+import user from './user';
 
-export { Settings } from "./Settings";
+export { Settings } from './Settings';
 
-export type SettingsConfiguration<T> = {
+export interface SettingsConfiguration<T> {
   /**
    * Generate list of categories and entries
    * @returns List
@@ -28,12 +29,12 @@ export type SettingsConfiguration<T> = {
     props: { page: Accessor<undefined | string> },
     context: T
   ) => JSX.Element;
-};
+}
 
 /**
  * List of categories and entries
  */
-export type SettingsList = {
+export interface SettingsList {
   prepend?: JSX.Element;
   append?: JSX.Element;
   entries: {
@@ -41,12 +42,12 @@ export type SettingsList = {
     title?: JSX.Element;
     entries: SettingsEntry[];
   }[];
-};
+}
 
 /**
  * Individual settings entry
  */
-export type SettingsEntry = {
+export interface SettingsEntry {
   id?: string;
   href?: string;
   onClick?: () => void;
@@ -55,7 +56,7 @@ export type SettingsEntry = {
 
   icon: JSX.Element;
   title: JSX.Element;
-};
+}
 
 export const SettingsConfigurations: Record<
   string,
@@ -75,7 +76,7 @@ export function SettingsUsingConfiguration(
   props: SettingsProps & { configKey: string }
 ) {
   // eslint-disable-next-line solid/reactivity
-  const config = SettingsConfigurations[props.configKey ?? "client"];
+  const config = SettingsConfigurations[props.configKey ?? 'client'];
 
   return (
     <Settings
diff --git a/packages/client/components/app/interface/settings/server/Overview.tsx b/packages/client/components/app/interface/settings/server/Overview.tsx
index 516ded52b..720f9939c 100644
--- a/packages/client/components/app/interface/settings/server/Overview.tsx
+++ b/packages/client/components/app/interface/settings/server/Overview.tsx
@@ -1,9 +1,4 @@
-import { BiRegularAbacus, BiRegularGlobe, BiSolidFlag } from "solid-icons/bi";
-import { Show } from "solid-js";
-
-import { ServerFlags } from "revolt.js";
-
-import { useClient } from "@revolt/client";
+import { useClient } from '@revolt/client';
 import {
   CategoryButton,
   CategoryButtonGroup,
@@ -12,9 +7,12 @@ import {
   Column,
   FormGroup,
   Typography,
-} from "@revolt/ui";
+} from '@revolt/ui';
+import { ServerFlags } from 'revolt.js';
+import { BiRegularAbacus, BiRegularGlobe, BiSolidFlag } from 'solid-icons/bi';
+import { Show } from 'solid-js';
 
-import { ServerSettingsProps } from ".";
+import type { ServerSettingsProps } from '.';
 
 /**
  * Server overview
@@ -23,19 +21,19 @@ export default function ServerOverview(props: ServerSettingsProps) {
   const user = useClient();
 
   return (
-    <Column gap="xl">
+    <Column gap='xl'>
       <Show when={user().user?.privileged}>
         <Column>
-          <Typography variant="label">Platform</Typography>
+          <Typography variant='label'>Platform</Typography>
           <CategoryButtonGroup>
             <CategoryCollapse
-              title="Flags"
+              title='Flags'
               icon={<BiSolidFlag size={24} />}
-              description="Set visible badges on server"
+              description='Set visible badges on server'
             >
               <FormGroup>
                 <CategoryButton
-                  icon="blank"
+                  icon='blank'
                   action={
                     <Checkbox
                       value={!props.server.flags}
@@ -53,7 +51,7 @@ export default function ServerOverview(props: ServerSettingsProps) {
               </FormGroup>
               <FormGroup>
                 <CategoryButton
-                  icon="blank"
+                  icon='blank'
                   action={
                     <Checkbox
                       value={props.server.flags === ServerFlags.Official}
@@ -71,7 +69,7 @@ export default function ServerOverview(props: ServerSettingsProps) {
               </FormGroup>
               <FormGroup>
                 <CategoryButton
-                  icon="blank"
+                  icon='blank'
                   action={
                     <Checkbox
                       value={props.server.flags === ServerFlags.Verified}
@@ -90,7 +88,7 @@ export default function ServerOverview(props: ServerSettingsProps) {
             </CategoryCollapse>
             <FormGroup>
               <CategoryButton
-                description="Message counts will be collected for server"
+                description='Message counts will be collected for server'
                 icon={<BiRegularAbacus size={24} />}
                 action={
                   <Checkbox
@@ -109,7 +107,7 @@ export default function ServerOverview(props: ServerSettingsProps) {
             </FormGroup>
             <FormGroup>
               <CategoryButton
-                description="Server can be joined from Discover"
+                description='Server can be joined from Discover'
                 icon={<BiRegularGlobe size={24} />}
                 action={
                   <Checkbox
diff --git a/packages/client/components/app/interface/settings/server/index.tsx b/packages/client/components/app/interface/settings/server/index.tsx
index 522a76097..1bced4a78 100644
--- a/packages/client/components/app/interface/settings/server/index.tsx
+++ b/packages/client/components/app/interface/settings/server/index.tsx
@@ -1,3 +1,9 @@
+import { useUser } from '@revolt/client';
+import { getController } from '@revolt/common';
+import { useTranslation } from '@revolt/i18n';
+import { TextWithEmoji } from '@revolt/markdown';
+import { ColouredText, useTheme } from '@revolt/ui';
+import type { Server } from 'revolt.js';
 import {
   BiSolidEnvelope,
   BiSolidFlagAlt,
@@ -6,19 +12,10 @@ import {
   BiSolidInfoCircle,
   BiSolidTrash,
   BiSolidUserX,
-} from "solid-icons/bi";
+} from 'solid-icons/bi';
 
-import { Server } from "revolt.js";
-
-import { useUser } from "@revolt/client";
-import { getController } from "@revolt/common";
-import { useTranslation } from "@revolt/i18n";
-import { TextWithEmoji } from "@revolt/markdown";
-import { ColouredText, useTheme } from "@revolt/ui";
-
-import { SettingsConfiguration } from "..";
-
-import Overview from "./Overview";
+import type { SettingsConfiguration } from '..';
+import Overview from './Overview';
 
 const Config: SettingsConfiguration<Server> = {
   /**
@@ -28,7 +25,7 @@ const Config: SettingsConfiguration<Server> = {
   title(key) {
     const t = useTranslation();
     return t(
-      `app.settings.server_pages.${key.replaceAll("/", ".")}.title`,
+      `app.settings.server_pages.${key.replaceAll('/', '.')}.title`,
       undefined,
       key
     );
@@ -38,16 +35,15 @@ const Config: SettingsConfiguration<Server> = {
    * Render the current server settings page
    */
   render(props, server) {
-    // eslint-disable-next-line solid/reactivity
     const id = props.page();
 
     if (!server.$exists) {
-      getController("modal").pop();
+      getController('modal').pop();
       return null;
     }
 
     switch (id) {
-      case "overview":
+      case 'overview':
         return <Overview server={server} />;
       default:
         return null;
@@ -69,14 +65,14 @@ const Config: SettingsConfiguration<Server> = {
           title: <TextWithEmoji content={server.name} />,
           entries: [
             {
-              id: "overview",
+              id: 'overview',
               icon: <BiSolidInfoCircle size={20} />,
-              title: t("app.settings.server_pages.overview.title"),
+              title: t('app.settings.server_pages.overview.title'),
             },
             {
-              id: "members",
+              id: 'members',
               icon: <BiSolidGroup size={20} />,
-              title: t("app.settings.server_pages.members.title"),
+              title: t('app.settings.server_pages.members.title'),
             },
             /*{ TODO: deprecate
             id: "categories",
@@ -85,43 +81,43 @@ const Config: SettingsConfiguration<Server> = {
           },*/
             {
               hidden: !(
-                server.havePermission("ManageRole") ||
-                server.havePermission("AssignRoles")
+                server.havePermission('ManageRole') ||
+                server.havePermission('AssignRoles')
               ),
-              id: "roles",
+              id: 'roles',
               icon: <BiSolidFlagAlt size={20} />,
-              title: t("app.settings.server_pages.roles.title"),
+              title: t('app.settings.server_pages.roles.title'),
             },
           ],
         },
         {
-          hidden: !server.havePermission("ManageCustomisation"),
-          title: t("app.settings.server_pages.customisation.title"),
+          hidden: !server.havePermission('ManageCustomisation'),
+          title: t('app.settings.server_pages.customisation.title'),
           entries: [
             {
-              id: "emojis",
+              id: 'emojis',
               icon: <BiSolidHappyBeaming size={20} />,
-              title: t("app.settings.server_pages.emojis.title"),
+              title: t('app.settings.server_pages.emojis.title'),
             },
           ],
         },
         {
           hidden:
-            !server.havePermission("ManageServer") &&
-            !server.havePermission("BanMembers"),
-          title: t("app.settings.server_pages.management.title"),
+            !server.havePermission('ManageServer') &&
+            !server.havePermission('BanMembers'),
+          title: t('app.settings.server_pages.management.title'),
           entries: [
             {
-              hidden: !server.havePermission("ManageServer"),
-              id: "invites",
+              hidden: !server.havePermission('ManageServer'),
+              id: 'invites',
               icon: <BiSolidEnvelope size={20} />,
-              title: t("app.settings.server_pages.invites.title"),
+              title: t('app.settings.server_pages.invites.title'),
             },
             {
-              hidden: !server.havePermission("BanMembers"),
-              id: "bans",
+              hidden: !server.havePermission('BanMembers'),
+              id: 'bans',
               icon: <BiSolidUserX size={20} />,
-              title: t("app.settings.server_pages.bans.title"),
+              title: t('app.settings.server_pages.bans.title'),
             },
           ],
         },
@@ -137,15 +133,15 @@ const Config: SettingsConfiguration<Server> = {
               ),
               title: (
                 <ColouredText colour={theme!.customColours.error.color}>
-                  {t("app.context_menu.delete_server")}
+                  {t('app.context_menu.delete_server')}
                 </ColouredText>
               ),
               /**
                * Handle server deletion request
                */
               onClick() {
-                getController("modal").push({
-                  type: "delete_server",
+                getController('modal').push({
+                  type: 'delete_server',
                   server,
                 });
               },
@@ -159,9 +155,9 @@ const Config: SettingsConfiguration<Server> = {
 
 export default Config;
 
-export type ServerSettingsProps = {
+export interface ServerSettingsProps {
   /**
    * Server
    */
   server: Server;
-};
+}
diff --git a/packages/client/components/app/interface/settings/user/Accessibility.tsx b/packages/client/components/app/interface/settings/user/Accessibility.tsx
index 2fce479f6..ff667ee63 100644
--- a/packages/client/components/app/interface/settings/user/Accessibility.tsx
+++ b/packages/client/components/app/interface/settings/user/Accessibility.tsx
@@ -1,35 +1,36 @@
-import { useTranslation } from "@revolt/i18n";
+import MdAnimation from '@material-design-icons/svg/outlined/animation.svg?component-solid';
+import { useTranslation } from '@revolt/i18n';
 import {
-    CategoryButton,
-    CategoryButtonGroup,
-    Checkbox,
-    Column,
-    FormGroup,
-    iconSize,
-} from "@revolt/ui";
-
-import MdAnimation from "@material-design-icons/svg/outlined/animation.svg?component-solid";
+  CategoryButton,
+  CategoryButtonGroup,
+  Checkbox,
+  Column,
+  FormGroup,
+  iconSize,
+} from '@revolt/ui';
 
 /**
  * Accessibility settings page
  */
 export default function Accessibility() {
-    const t = useTranslation();
+  const t = useTranslation();
 
-    return (
-        <Column gap="lg">
-            <CategoryButtonGroup>
-                <FormGroup>
-                    <CategoryButton
-                        action={<Checkbox value onChange={(value) => void value} />}
-                        onClick={() => void 0}
-                        icon={<MdAnimation {...iconSize(22)} />}
-                        description={t("app.settings.pages.accessibility.descriptions.reduced_motion")}
-                    >
-                        {t("app.settings.pages.accessibility.reduced_motion")}
-                    </CategoryButton>
-                </FormGroup>
-            </CategoryButtonGroup>
-        </Column>
-    );
+  return (
+    <Column gap='lg'>
+      <CategoryButtonGroup>
+        <FormGroup>
+          <CategoryButton
+            action={<Checkbox value onChange={(value) => void value} />}
+            onClick={() => void 0}
+            icon={<MdAnimation {...iconSize(22)} />}
+            description={t(
+              'app.settings.pages.accessibility.descriptions.reduced_motion'
+            )}
+          >
+            {t('app.settings.pages.accessibility.reduced_motion')}
+          </CategoryButton>
+        </FormGroup>
+      </CategoryButtonGroup>
+    </Column>
+  );
 }
diff --git a/packages/client/components/app/interface/settings/user/Account.tsx b/packages/client/components/app/interface/settings/user/Account.tsx
index 2d58805c9..47dcdb9f4 100644
--- a/packages/client/components/app/interface/settings/user/Account.tsx
+++ b/packages/client/components/app/interface/settings/user/Account.tsx
@@ -1,47 +1,44 @@
-import {
-  Accessor,
-  Match,
-  Show,
-  Switch,
-  createMemo,
-  createSignal,
-  onMount,
-} from "solid-js";
-
-import { clientController, useClient } from "@revolt/client";
+import MdCakeFill from '@material-design-icons/svg/filled/cake.svg?component-solid';
+import MdAlternateEmail from '@material-design-icons/svg/outlined/alternate_email.svg?component-solid';
+import MdBlock from '@material-design-icons/svg/outlined/block.svg?component-solid';
+import MdDelete from '@material-design-icons/svg/outlined/delete.svg?component-solid';
+import MdDraw from '@material-design-icons/svg/outlined/draw.svg?component-solid';
+import MdEdit from '@material-design-icons/svg/outlined/edit.svg?component-solid';
+import MdLock from '@material-design-icons/svg/outlined/lock.svg?component-solid';
+import MdMail from '@material-design-icons/svg/outlined/mail.svg?component-solid';
+import MdPassword from '@material-design-icons/svg/outlined/password.svg?component-solid';
+import MdVerifiedUser from '@material-design-icons/svg/outlined/verified_user.svg?component-solid';
+import { clientController, useClient } from '@revolt/client';
 import {
   createMfaResource,
   createOwnProfileResource,
-} from "@revolt/client/resources";
-import { getController } from "@revolt/common";
-import { dayjs, useTranslation } from "@revolt/i18n";
+} from '@revolt/client/resources';
+import { getController } from '@revolt/common';
+import { dayjs, useTranslation } from '@revolt/i18n';
 import {
   Avatar,
   CategoryButton,
   CategoryButtonGroup,
   CategoryCollapse,
   Column,
-  Row,
-  Typography,
   iconSize,
+  Row,
   styled,
+  Typography,
   useTheme,
-} from "@revolt/ui";
-
-import MdCakeFill from "@material-design-icons/svg/filled/cake.svg?component-solid";
-import MdAlternateEmail from "@material-design-icons/svg/outlined/alternate_email.svg?component-solid";
-import MdBlock from "@material-design-icons/svg/outlined/block.svg?component-solid";
-import MdDelete from "@material-design-icons/svg/outlined/delete.svg?component-solid";
-import MdDraw from "@material-design-icons/svg/outlined/draw.svg?component-solid";
-import MdEdit from "@material-design-icons/svg/outlined/edit.svg?component-solid";
-import MdLock from "@material-design-icons/svg/outlined/lock.svg?component-solid";
-import MdMail from "@material-design-icons/svg/outlined/mail.svg?component-solid";
-import MdPassword from "@material-design-icons/svg/outlined/password.svg?component-solid";
-import MdVerifiedUser from "@material-design-icons/svg/outlined/verified_user.svg?component-solid";
-
-import { useSettingsNavigation } from "../Settings";
+} from '@revolt/ui';
+import {
+  type Accessor,
+  createMemo,
+  createSignal,
+  Match,
+  onMount,
+  Show,
+  Switch,
+} from 'solid-js';
 
-import { UserSummary } from "./account";
+import { useSettingsNavigation } from '../Settings';
+import { UserSummary } from './account/index';
 
 /**
  * Account Page
@@ -52,11 +49,11 @@ export default function MyAccount() {
   const { navigate } = useSettingsNavigation();
 
   return (
-    <Column gap="lg">
+    <Column gap='lg'>
       <UserSummary
         user={client().user!}
         bannerUrl={profile.data?.animatedBannerURL}
-        onEdit={() => navigate("profile")}
+        onEdit={() => navigate('profile')}
         showBadges
       />
       <EditAccount />
@@ -72,36 +69,36 @@ export default function MyAccount() {
 function EditAccount() {
   const t = useTranslation();
   const client = useClient();
-  const [email, setEmail] = createSignal("•••••••••••@•••••••••••");
+  const [email, setEmail] = createSignal('•••••••••••@•••••••••••');
 
   return (
     <CategoryButtonGroup>
       <CategoryButton
-        action="chevron"
+        action='chevron'
         onClick={() =>
-          getController("modal").push({
-            type: "edit_username",
+          getController('modal').push({
+            type: 'edit_username',
             client: client(),
           })
         }
         icon={<MdAlternateEmail {...iconSize(22)} />}
         description={client().user?.username}
       >
-        <Typography variant="label">{t("login.username")}</Typography>
+        <Typography variant='label'>{t('login.username')}</Typography>
       </CategoryButton>
       <CategoryButton
-        action="chevron"
+        action='chevron'
         onClick={() =>
-          getController("modal").push({
-            type: "edit_email",
+          getController('modal').push({
+            type: 'edit_email',
             client: client(),
           })
         }
         icon={<MdMail {...iconSize(22)} />}
         description={
           <Row>
-            {email()}{" "}
-            <Show when={email().startsWith("•")}>
+            {email()}{' '}
+            <Show when={email().startsWith('•')}>
               <a
                 onClick={(event) => {
                   event.stopPropagation();
@@ -114,20 +111,20 @@ function EditAccount() {
           </Row>
         }
       >
-        <Typography variant="label">{t("login.email")}</Typography>
+        <Typography variant='label'>{t('login.email')}</Typography>
       </CategoryButton>
       <CategoryButton
-        action="chevron"
+        action='chevron'
         onClick={() =>
-          getController("modal").push({
-            type: "edit_password",
+          getController('modal').push({
+            type: 'edit_password',
             client: client(),
           })
         }
         icon={<MdPassword {...iconSize(22)} />}
-        description={"•••••••••"}
+        description={'•••••••••'}
       >
-        <Typography variant="label">{t("login.password")}</Typography>
+        <Typography variant='label'>{t('login.password')}</Typography>
       </CategoryButton>
     </CategoryButtonGroup>
   );
@@ -144,12 +141,12 @@ function MultiFactorAuth() {
    * Show recovery codes
    */
   async function showRecoveryCodes() {
-    const modals = getController("modal");
+    const modals = getController('modal');
     const ticket = await modals.mfaFlow(mfa.data!);
 
     ticket!.fetchRecoveryCodes().then((codes) =>
-      getController("modal").push({
-        type: "mfa_recovery",
+      getController('modal').push({
+        type: 'mfa_recovery',
         mfa: mfa.data!,
         codes,
       })
@@ -160,12 +157,12 @@ function MultiFactorAuth() {
    * Generate recovery codes
    */
   async function generateRecoveryCodes() {
-    const modals = getController("modal");
+    const modals = getController('modal');
     const ticket = await modals.mfaFlow(mfa.data!);
 
     ticket!.generateRecoveryCodes().then((codes) =>
-      getController("modal").push({
-        type: "mfa_recovery",
+      getController('modal').push({
+        type: 'mfa_recovery',
         mfa: mfa.data!,
         codes,
       })
@@ -176,7 +173,7 @@ function MultiFactorAuth() {
    * Configure authenticator app
    */
   async function setupAuthenticatorApp() {
-    const modals = getController("modal");
+    const modals = getController('modal');
     const ticket = await modals.mfaFlow(mfa.data!);
     const secret = await ticket!.generateAuthenticatorSecret();
 
@@ -202,7 +199,7 @@ function MultiFactorAuth() {
    * Disable authenticator app
    */
   function disableAuthenticatorApp() {
-    getController("modal")
+    getController('modal')
       .mfaFlow(mfa.data!)
       .then((ticket) => ticket!.disableAuthenticator());
   }
@@ -211,16 +208,16 @@ function MultiFactorAuth() {
     <CategoryButtonGroup>
       <CategoryCollapse
         icon={<MdVerifiedUser {...iconSize(22)} />}
-        title="Recovery Codes"
-        description="Configure a way to get back into your account in case your 2FA is lost"
+        title='Recovery Codes'
+        description='Configure a way to get back into your account in case your 2FA is lost'
       >
         <Switch
           fallback={
             <CategoryButton
-              icon="blank"
+              icon='blank'
               disabled={mfa.isLoading}
               onClick={generateRecoveryCodes}
-              description="Setup recovery codes"
+              description='Setup recovery codes'
             >
               Generate Recovery Codes
             </CategoryButton>
@@ -228,15 +225,15 @@ function MultiFactorAuth() {
         >
           <Match when={!mfa.isLoading && mfa.data?.recoveryEnabled}>
             <CategoryButton
-              icon="blank"
-              description="Get active recovery codes"
+              icon='blank'
+              description='Get active recovery codes'
               onClick={showRecoveryCodes}
             >
               View Recovery Codes
             </CategoryButton>
             <CategoryButton
-              icon="blank"
-              description="Get a new set of recovery codes"
+              icon='blank'
+              description='Get a new set of recovery codes'
               onClick={generateRecoveryCodes}
             >
               Reset Recovery Codes
@@ -246,16 +243,16 @@ function MultiFactorAuth() {
       </CategoryCollapse>
       <CategoryCollapse
         icon={<MdLock {...iconSize(22)} />}
-        title="Authenticator App"
-        description="Configure one-time password authentication"
+        title='Authenticator App'
+        description='Configure one-time password authentication'
       >
         <Switch
           fallback={
             <CategoryButton
-              icon="blank"
+              icon='blank'
               disabled={mfa.isLoading}
               onClick={setupAuthenticatorApp}
-              description="Setup one-time password authenticator"
+              description='Setup one-time password authenticator'
             >
               Enable Authenticator
             </CategoryButton>
@@ -263,8 +260,8 @@ function MultiFactorAuth() {
         >
           <Match when={!mfa.isLoading && mfa.data?.authenticatorEnabled}>
             <CategoryButton
-              icon="blank"
-              description="Disable one-time password authenticator"
+              icon='blank'
+              description='Disable one-time password authenticator'
               onClick={disableAuthenticatorApp}
             >
               Remove Authenticator
@@ -295,7 +292,7 @@ function ManageAccount() {
    * Disable account
    */
   function disableAccount() {
-    getController("modal")
+    getController('modal')
       .mfaFlow(mfa.data!)
       .then((ticket) =>
         ticket!.disableAccount().then(() => clientController.logout())
@@ -306,7 +303,7 @@ function ManageAccount() {
    * Delete account
    */
   function deleteAccount() {
-    getController("modal")
+    getController('modal')
       .mfaFlow(mfa.data!)
       .then((ticket) =>
         ticket!.deleteAccount().then(() => clientController.logout())
@@ -316,29 +313,29 @@ function ManageAccount() {
   return (
     <CategoryButtonGroup>
       <CategoryButton
-        action="chevron"
+        action='chevron'
         disabled={mfa.isLoading}
         onClick={disableAccount}
         icon={
           <MdBlock {...iconSize(22)} fill={theme!.customColours.error.color} />
         }
-        description={t("app.settings.pages.account.manage.disable_description")}
+        description={t('app.settings.pages.account.manage.disable_description')}
       >
-        {t("app.settings.pages.account.manage.disable")}
+        {t('app.settings.pages.account.manage.disable')}
       </CategoryButton>
       <CategoryButton
-        action={stillOwnServers() ? undefined : "chevron"}
+        action={stillOwnServers() ? undefined : 'chevron'}
         disabled={mfa.isLoading || stillOwnServers()}
         onClick={deleteAccount}
         icon={
           <MdDelete {...iconSize(22)} fill={theme!.customColours.error.color} />
         }
-        description={t("app.settings.pages.account.manage.delete_description")}
+        description={t('app.settings.pages.account.manage.delete_description')}
       >
         {t(
           stillOwnServers()
-            ? "app.settings.pages.account.manage.delete_still_own_servers"
-            : "app.settings.pages.account.manage.delete"
+            ? 'app.settings.pages.account.manage.delete_still_own_servers'
+            : 'app.settings.pages.account.manage.delete'
         )}
       </CategoryButton>
     </CategoryButtonGroup>
diff --git a/packages/client/components/app/interface/settings/user/Appearance.tsx b/packages/client/components/app/interface/settings/user/Appearance.tsx
index ae40f9897..8fa34f4b8 100644
--- a/packages/client/components/app/interface/settings/user/Appearance.tsx
+++ b/packages/client/components/app/interface/settings/user/Appearance.tsx
@@ -1,20 +1,19 @@
+import MdBrush from '@material-design-icons/svg/outlined/brush.svg?component-solid';
+import MdDataObject from '@material-design-icons/svg/outlined/data_object.svg?component-solid';
+import MdFormatSize from '@material-design-icons/svg/outlined/format_size.svg?component-solid';
+import MdPalette from '@material-design-icons/svg/outlined/palette.svg?component-solid';
+import MdSentimentVerySatisfied from '@material-design-icons/svg/outlined/sentiment_very_satisfied.svg?component-solid';
+import MdWallpaper from '@material-design-icons/svg/outlined/wallpaper.svg?component-solid';
 import {
   CategoryButton,
   CategoryButtonGroup,
   Column,
-  Row,
   iconSize,
+  Row,
   styled,
-} from "@revolt/ui";
-
-import MdBrush from "@material-design-icons/svg/outlined/brush.svg?component-solid";
-import MdDataObject from "@material-design-icons/svg/outlined/data_object.svg?component-solid";
-import MdFormatSize from "@material-design-icons/svg/outlined/format_size.svg?component-solid";
-import MdPalette from "@material-design-icons/svg/outlined/palette.svg?component-solid";
-import MdSentimentVerySatisfied from "@material-design-icons/svg/outlined/sentiment_very_satisfied.svg?component-solid";
-import MdWallpaper from "@material-design-icons/svg/outlined/wallpaper.svg?component-solid";
+} from '@revolt/ui';
 
-import { useSettingsNavigation } from "../Settings";
+import { useSettingsNavigation } from '../Settings';
 
 /**
  * Appearance
@@ -22,61 +21,61 @@ import { useSettingsNavigation } from "../Settings";
 export default function Appearance() {
   const { navigate } = useSettingsNavigation();
   return (
-    <Column gap="lg">
+    <Column gap='lg'>
       <Row>
         <ThemePreview
-          src="https://app.revolt.chat/assets/dark.f38e16a0.svg"
+          src='https://app.revolt.chat/assets/dark.f38e16a0.svg'
           draggable={false}
         />
         <ThemeProperties>hello</ThemeProperties>
       </Row>
       <CategoryButtonGroup>
         <CategoryButton
-          action="chevron"
+          action='chevron'
           icon={<MdPalette {...iconSize(22)} />}
-          onClick={() => navigate("appearance/colours")}
-          description="Customise accent colour, additional colours, and transparency"
+          onClick={() => navigate('appearance/colours')}
+          description='Customise accent colour, additional colours, and transparency'
         >
           Colours
         </CategoryButton>
         <CategoryButton
-          action="chevron"
+          action='chevron'
           icon={<MdFormatSize {...iconSize(22)} />}
-          onClick={() => navigate("appearance/fonts")}
-          description="Customise display and text options"
+          onClick={() => navigate('appearance/fonts')}
+          description='Customise display and text options'
         >
           Display and fonts
         </CategoryButton>
         <CategoryButton
-          action="chevron"
+          action='chevron'
           icon={<MdWallpaper {...iconSize(22)} />}
-          onClick={() => navigate("appearance/wallpaper")}
-          description="Set a wallpaper for your chats"
+          onClick={() => navigate('appearance/wallpaper')}
+          description='Set a wallpaper for your chats'
         >
           Wallpaper
         </CategoryButton>
         <CategoryButton
-          action="chevron"
+          action='chevron'
           icon={<MdSentimentVerySatisfied {...iconSize(22)} />}
-          onClick={() => navigate("appearance/emoji")}
-          description="Change how your emojis look"
+          onClick={() => navigate('appearance/emoji')}
+          description='Change how your emojis look'
         >
           Emoji
         </CategoryButton>
         <CategoryButton
-          action="chevron"
+          action='chevron'
           icon={<MdDataObject {...iconSize(22)} />}
-          onClick={() => navigate("appearance/advanced_options")}
-          description="Customise theme variables and apply custom CSS"
+          onClick={() => navigate('appearance/advanced_options')}
+          description='Customise theme variables and apply custom CSS'
         >
           Advanced Options
         </CategoryButton>
       </CategoryButtonGroup>
       <CategoryButtonGroup>
         <CategoryButton
-          action="external"
+          action='external'
           icon={<MdBrush {...iconSize(22)} />}
-          description="Browse themes made by the community"
+          description='Browse themes made by the community'
         >
           Discover themes
         </CategoryButton>
@@ -101,6 +100,6 @@ const ThemeProperties = styled.div`
   display: flex;
   width: 100%;
   padding: 20px;
-  background: ${(props) => props.theme!.colours["temp-1"]};
+  background: ${(props) => props.theme!.colours['temp-1']};
   border-radius: ${(props) => props.theme!.borderRadius.xl};
 `;
diff --git a/packages/client/components/app/interface/settings/user/Experiments.tsx b/packages/client/components/app/interface/settings/user/Experiments.tsx
index 3b92b2483..d69adae5b 100644
--- a/packages/client/components/app/interface/settings/user/Experiments.tsx
+++ b/packages/client/components/app/interface/settings/user/Experiments.tsx
@@ -1,16 +1,15 @@
-import { For } from "solid-js";
-
-import { state } from "@revolt/state";
+import { state } from '@revolt/state';
 import {
   AVAILABLE_EXPERIMENTS,
   EXPERIMENTS,
-} from "@revolt/state/stores/Experiments";
+} from '@revolt/state/stores/Experiments';
 import {
   CategoryButton,
   CategoryButtonGroup,
   Checkbox,
   FormGroup,
-} from "@revolt/ui";
+} from '@revolt/ui';
+import { For } from 'solid-js';
 
 /**
  * Experiments
diff --git a/packages/client/components/app/interface/settings/user/Feedback.tsx b/packages/client/components/app/interface/settings/user/Feedback.tsx
index 5ab318016..6490cafac 100644
--- a/packages/client/components/app/interface/settings/user/Feedback.tsx
+++ b/packages/client/components/app/interface/settings/user/Feedback.tsx
@@ -1,17 +1,16 @@
-import { useTranslation } from "@revolt/i18n";
+import MdBugReport from '@material-design-icons/svg/outlined/bug_report.svg?component-solid';
+import MdExitToApp from '@material-design-icons/svg/outlined/exit_to_app.svg?component-solid';
+import MdFormatListNumbered from '@material-design-icons/svg/outlined/format_list_numbered.svg?component-solid';
+import MdStar from '@material-design-icons/svg/outlined/star_outline.svg?component-solid';
+import MdViewKanban from '@material-design-icons/svg/outlined/view_kanban.svg?component-solid';
+import { useTranslation } from '@revolt/i18n';
 import {
   CategoryButton,
   CategoryButtonGroup,
   Column,
   iconSize,
   styled,
-} from "@revolt/ui";
-
-import MdBugReport from "@material-design-icons/svg/outlined/bug_report.svg?component-solid";
-import MdExitToApp from "@material-design-icons/svg/outlined/exit_to_app.svg?component-solid";
-import MdFormatListNumbered from "@material-design-icons/svg/outlined/format_list_numbered.svg?component-solid";
-import MdStar from "@material-design-icons/svg/outlined/star_outline.svg?component-solid";
-import MdViewKanban from "@material-design-icons/svg/outlined/view_kanban.svg?component-solid";
+} from '@revolt/ui';
 
 /**
  * Feedback
@@ -20,14 +19,14 @@ export default function Feedback() {
   const t = useTranslation();
 
   return (
-    <Column gap="lg">
+    <Column gap='lg'>
       <CategoryButtonGroup>
         <Link
-          href="https://github.com/orgs/revoltchat/projects/6/views/4"
-          target="_blank"
+          href='https://github.com/orgs/revoltchat/projects/6/views/4'
+          target='_blank'
         >
           <CategoryButton
-            action="external"
+            action='external'
             icon={<MdViewKanban {...iconSize(22)} />}
             onClick={() => void 0}
             description="See what we're currently working on."
@@ -36,51 +35,51 @@ export default function Feedback() {
           </CategoryButton>
         </Link>
         <Link
-          href="https://github.com/orgs/revoltchat/discussions"
-          target="_blank"
+          href='https://github.com/orgs/revoltchat/discussions'
+          target='_blank'
         >
           <CategoryButton
-            action="external"
+            action='external'
             icon={<MdStar {...iconSize(22)} />}
             onClick={() => void 0}
-            description={t("app.settings.pages.feedback.suggest_desc")}
+            description={t('app.settings.pages.feedback.suggest_desc')}
           >
-            {t("app.settings.pages.feedback.suggest")}
+            {t('app.settings.pages.feedback.suggest')}
           </CategoryButton>
         </Link>
         <Link
-          href="https://github.com/revoltchat/frontend/issues/new/choose"
-          target="_blank"
+          href='https://github.com/revoltchat/frontend/issues/new/choose'
+          target='_blank'
         >
           <CategoryButton
-            action="external"
+            action='external'
             icon={<MdFormatListNumbered {...iconSize(22)} />}
             onClick={() => void 0}
-            description={t("app.settings.pages.feedback.issue_desc")}
+            description={t('app.settings.pages.feedback.issue_desc')}
           >
-            {t("app.settings.pages.feedback.issue")}
+            {t('app.settings.pages.feedback.issue')}
           </CategoryButton>
         </Link>
         <Link
-          href="https://github.com/orgs/revoltchat/projects/3"
-          target="_blank"
+          href='https://github.com/orgs/revoltchat/projects/3'
+          target='_blank'
         >
           <CategoryButton
-            action="external"
+            action='external'
             icon={<MdBugReport {...iconSize(22)} />}
             onClick={() => void 0}
-            description={t("app.settings.pages.feedback.bug_desc")}
+            description={t('app.settings.pages.feedback.bug_desc')}
           >
-            {t("app.settings.pages.feedback.bug")}
+            {t('app.settings.pages.feedback.bug')}
           </CategoryButton>
         </Link>
       </CategoryButtonGroup>
       <CategoryButtonGroup>
         <CategoryButton
-          action="chevron"
+          action='chevron'
           icon={<MdExitToApp {...iconSize(22)} />}
           onClick={() => void 0}
-          description="You can report issues and discuss improvements with us directly here."
+          description='You can report issues and discuss improvements with us directly here.'
         >
           Join the Revolt Lounge
         </CategoryButton>
diff --git a/packages/client/components/app/interface/settings/user/Keybinds.tsx b/packages/client/components/app/interface/settings/user/Keybinds.tsx
index bb60a4405..de6508519 100644
--- a/packages/client/components/app/interface/settings/user/Keybinds.tsx
+++ b/packages/client/components/app/interface/settings/user/Keybinds.tsx
@@ -1,17 +1,9 @@
-import {
-  BiSolidPencil,
-  BiSolidPlusCircle,
-  BiSolidXCircle,
-} from "solid-icons/bi";
-import { BiRegularReset } from "solid-icons/bi";
-import { For, Match, Switch, createMemo, createSignal } from "solid-js";
-
-import { getController } from "@revolt/common";
-import { useTranslation } from "@revolt/i18n";
-import { KeybindAction } from "@revolt/keybinds";
-import { KeyComboSequence } from "@revolt/keybinds";
-import { KeyCombo } from "@revolt/keybinds";
-import { state } from "@revolt/state";
+import { getController } from '@revolt/common';
+import { useTranslation } from '@revolt/i18n';
+import type { KeyComboSequence } from '@revolt/keybinds';
+import type { KeyCombo } from '@revolt/keybinds';
+import { KeybindAction } from '@revolt/keybinds';
+import { state } from '@revolt/state';
 import {
   Button,
   CategoryButton,
@@ -20,7 +12,14 @@ import {
   Input,
   KeySequence,
   styled,
-} from "@revolt/ui";
+} from '@revolt/ui';
+import {
+  BiSolidPencil,
+  BiSolidPlusCircle,
+  BiSolidXCircle,
+} from 'solid-icons/bi';
+import { BiRegularReset } from 'solid-icons/bi';
+import { createMemo, createSignal, For, Match, Switch } from 'solid-js';
 
 const categories: Record<string, KeybindAction[]> = {
   navigation: [
@@ -62,15 +61,15 @@ export default function Keybinds() {
 
   const translateCombo = (combo: KeyCombo, short: boolean) =>
     combo
-      .map((key) => t(`keys.${key}.${short ? "short" : "full"}`, {}, key))
-      .join("+");
+      .map((key) => t(`keys.${key}.${short ? 'short' : 'full'}`, {}, key))
+      .join('+');
 
   const translateSequence = (sequence: KeyComboSequence, short: boolean) =>
-    sequence.map((combo) => translateCombo(combo, short)).join(" ");
+    sequence.map((combo) => translateCombo(combo, short)).join(' ');
 
   const editKeybind = (action: KeybindAction, index: number) =>
-    getController("modal").push({
-      type: "edit_keybind",
+    getController('modal').push({
+      type: 'edit_keybind',
       action,
       onSubmit: (sequence) => {
         state.keybinds.setKeybind(action, index, sequence);
@@ -78,8 +77,8 @@ export default function Keybinds() {
     });
 
   const addKeybind = (action: KeybindAction) =>
-    getController("modal").push({
-      type: "edit_keybind",
+    getController('modal').push({
+      type: 'edit_keybind',
       action,
       onSubmit: (sequence) => {
         state.keybinds.addKeybind(action, sequence);
@@ -98,14 +97,13 @@ export default function Keybinds() {
         t(`app.settings.pages.keybinds.action.${action}.title`) as string,
         ...state.keybinds
           .getKeybinds()
-          [action].flatMap((sequence) => [
-            translateSequence(sequence, false),
-            translateSequence(sequence, true),
-          ]),
+          [
+            action
+          ].flatMap((sequence) => [translateSequence(sequence, false), translateSequence(sequence, true)]),
       ])
   );
 
-  const [searchText, setSearchText] = createSignal("");
+  const [searchText, setSearchText] = createSignal('');
 
   const filteredData = createMemo(() => {
     const foundActions = searchData()
@@ -128,9 +126,9 @@ export default function Keybinds() {
   return (
     <Column>
       <Input
-        type="text"
+        type='text'
         onInput={(e) => setSearchText(e.target.value)}
-        placeholder={t("app.settings.pages.keybinds.search")}
+        placeholder={t('app.settings.pages.keybinds.search')}
       />
       <For each={filteredData()}>
         {([category, actions]) => (
@@ -138,7 +136,7 @@ export default function Keybinds() {
             title={t(`app.settings.pages.keybinds.category.${category}`)}
             // TODO: open={category !== "advanced"}
           >
-            <Column group="6px">
+            <Column group='6px'>
               <For each={actions}>
                 {(action) => (
                   <ActionCategory>
@@ -165,8 +163,8 @@ export default function Keybinds() {
                           <CategoryButton
                             action={[
                               <Button
-                                size="fluid"
-                                variant="plain"
+                                size='fluid'
+                                variant='plain'
                                 onPress={() => editKeybind(action, index())}
                               >
                                 <BiSolidPencil size={24} />
@@ -176,8 +174,8 @@ export default function Keybinds() {
                                   when={!keybindIsDefault && indexIsDefault}
                                 >
                                   <Button
-                                    size="fluid"
-                                    variant="plain"
+                                    size='fluid'
+                                    variant='plain'
                                     // title={t(
                                     //   "app.settings.pages.keybinds.remove_keybind"
                                     // )}
@@ -190,8 +188,8 @@ export default function Keybinds() {
                                 </Match>
                                 <Match when={!keybindIsDefault}>
                                   <Button
-                                    size="fluid"
-                                    variant="plain"
+                                    size='fluid'
+                                    variant='plain'
                                     // title={t(
                                     //   "app.settings.pages.keybinds.remove_keybind"
                                     // )}
@@ -222,7 +220,7 @@ export default function Keybinds() {
 }
 
 // TODO: theming
-const ActionCategory = styled("section", "ActionCategory")`
+const ActionCategory = styled('section', 'ActionCategory')`
   display: grid;
   gap: 1px;
 
@@ -242,7 +240,7 @@ const ActionCategory = styled("section", "ActionCategory")`
     border-end-start-radius: 0;
   }
 `;
-const KeybindEntry = styled("article", "KeybindEntry")`
+const KeybindEntry = styled('article', 'KeybindEntry')`
   display: flex;
   gap: ${({ theme }) => theme?.gap.lg};
 
diff --git a/packages/client/components/app/interface/settings/user/Language.tsx b/packages/client/components/app/interface/settings/user/Language.tsx
index a4736c749..bf2cd928d 100644
--- a/packages/client/components/app/interface/settings/user/Language.tsx
+++ b/packages/client/components/app/interface/settings/user/Language.tsx
@@ -1,13 +1,19 @@
-import { For, Match, Switch, createMemo } from "solid-js";
-
+import MdErrorFill from '@material-design-icons/svg/filled/error.svg?component-solid';
+import MdVerifiedFill from '@material-design-icons/svg/filled/verified.svg?component-solid';
+import MdCalendarMonth from '@material-design-icons/svg/outlined/calendar_month.svg?component-solid';
+import MdKeyboardTab from '@material-design-icons/svg/outlined/keyboard_tab.svg?component-solid';
+import MdKeyboardTabRtl from '@material-design-icons/svg/outlined/keyboard_tab.svg?component-solid';
+import MdLanguage from '@material-design-icons/svg/outlined/language.svg?component-solid';
+import MdSchedule from '@material-design-icons/svg/outlined/schedule.svg?component-solid';
+import MdTranslate from '@material-design-icons/svg/outlined/translate.svg?component-solid';
 import {
-  Languages,
   browserPreferredLanguage,
   language,
-  loadAndSetLanguage,
+  Languages,
+  setLanguage,
   useTranslation,
-} from "@revolt/i18n";
-import { UnicodeEmoji } from "@revolt/markdown/emoji";
+} from '@revolt/i18n';
+import { UnicodeEmoji } from '@revolt/markdown/emoji';
 import {
   CategoryButton,
   CategoryButtonGroup,
@@ -15,27 +21,19 @@ import {
   Checkbox,
   Column,
   FormGroup,
+  iconSize,
   Row,
   Time,
-  iconSize,
   useTheme,
-} from "@revolt/ui";
-
-import MdErrorFill from "@material-design-icons/svg/filled/error.svg?component-solid";
-import MdVerifiedFill from "@material-design-icons/svg/filled/verified.svg?component-solid";
-import MdCalendarMonth from "@material-design-icons/svg/outlined/calendar_month.svg?component-solid";
-import MdKeyboardTab from "@material-design-icons/svg/outlined/keyboard_tab.svg?component-solid";
-import MdKeyboardTabRtl from "@material-design-icons/svg/outlined/keyboard_tab.svg?component-solid";
-import MdLanguage from "@material-design-icons/svg/outlined/language.svg?component-solid";
-import MdSchedule from "@material-design-icons/svg/outlined/schedule.svg?component-solid";
-import MdTranslate from "@material-design-icons/svg/outlined/translate.svg?component-solid";
+} from '@revolt/ui';
+import { createMemo, For, Match, Switch } from 'solid-js';
 
 /**
  * Language
  */
 export default function Language() {
   return (
-    <Column gap="lg">
+    <Column gap='lg'>
       <CategoryButtonGroup>
         <PickLanguage />
         {/* <ConfigureRTL /> */}
@@ -74,7 +72,7 @@ function PickLanguage() {
     if (preferredLanguage) {
       // This moves the user's system language to the top of the language list
       const prefLangKey = languages.find(
-        (lang) => lang[0].replace(/_/g, "-") == preferredLanguage
+        (lang) => lang[0].replace(/_/g, '-') == preferredLanguage
       );
 
       if (prefLangKey) {
@@ -92,7 +90,7 @@ function PickLanguage() {
   return (
     <CategoryCollapse
       icon={<MdLanguage {...iconSize(22)} />}
-      title={t("app.settings.pages.language.select")}
+      title={t('app.settings.pages.language.select')}
       description={currentLanguage().display}
       scrollable
     >
@@ -101,16 +99,16 @@ function PickLanguage() {
           <CategoryButton
             icon={<UnicodeEmoji emoji={lang.emoji} />}
             action={<Checkbox value={id === language()} />}
-            onClick={() => loadAndSetLanguage(id as never)}
+            onClick={() => setLanguage(id as never)}
           >
             <Row>
-              {lang.display}{" "}
+              {lang.display}{' '}
               {lang.verified && (
                 <MdVerifiedFill
                   {...iconSize(18)}
                   fill={theme!.colours.foreground}
                 />
-              )}{" "}
+              )}{' '}
               {lang.incomplete && (
                 <MdErrorFill
                   {...iconSize(18)}
@@ -135,35 +133,35 @@ function PickDateFormat() {
   return (
     <CategoryCollapse
       icon={<MdCalendarMonth {...iconSize(22)} />}
-      title="Select date format"
+      title='Select date format'
       description={`Traditional`}
     >
       <FormGroup>
         <CategoryButton
-          icon={"blank"}
+          icon={'blank'}
           onClick={() => void 0}
           action={<Checkbox value />}
-          description={<Time format="date" value={LastWeek} />}
+          description={<Time format='date' value={LastWeek} />}
         >
           Traditional (DD/MM/YYYY)
         </CategoryButton>
       </FormGroup>
       <FormGroup>
         <CategoryButton
-          icon={"blank"}
+          icon={'blank'}
           onClick={() => void 0}
           action={<Checkbox />}
-          description={<Time format="dateAmerican" value={LastWeek} />}
+          description={<Time format='dateAmerican' value={LastWeek} />}
         >
           American (MM/DD/YYYY)
         </CategoryButton>
       </FormGroup>
       <FormGroup>
         <CategoryButton
-          icon={"blank"}
+          icon={'blank'}
           onClick={() => void 0}
           action={<Checkbox />}
-          description={<Time format="iso8601" value={LastWeek} />}
+          description={<Time format='iso8601' value={LastWeek} />}
         >
           ISO8601 (YYYY/MM/DD)
         </CategoryButton>
@@ -179,25 +177,25 @@ function PickTimeFormat() {
   return (
     <CategoryCollapse
       icon={<MdSchedule {...iconSize(22)} />}
-      title="Select time format"
+      title='Select time format'
       description={`24 hours`}
     >
       <FormGroup>
         <CategoryButton
-          icon={"blank"}
+          icon={'blank'}
           onClick={() => void 0}
           action={<Checkbox value />}
-          description={<Time format="time24" value={new Date()} />}
+          description={<Time format='time24' value={new Date()} />}
         >
           24 hours
         </CategoryButton>
       </FormGroup>
       <FormGroup>
         <CategoryButton
-          icon={"blank"}
+          icon={'blank'}
           onClick={() => void 0}
           action={<Checkbox />}
-          description={<Time format="time12" value={new Date()} />}
+          description={<Time format='time12' value={new Date()} />}
         >
           12 hours
         </CategoryButton>
@@ -220,7 +218,7 @@ function ConfigureRTL() {
       fallback={
         <CategoryButton
           icon={<MdKeyboardTabRtl {...iconSize(22)} />}
-          description="Flip the user interface right to left"
+          description='Flip the user interface right to left'
           action={<Checkbox />}
           onClick={() => void 0}
         >
@@ -231,7 +229,7 @@ function ConfigureRTL() {
       <Match when={currentLanguage().rtl}>
         <CategoryButton
           icon={<MdKeyboardTab {...iconSize(22)} />}
-          description="Keep the user interface left to right"
+          description='Keep the user interface left to right'
           action={<Checkbox />}
           onClick={() => void 0}
         >
@@ -247,12 +245,12 @@ function ConfigureRTL() {
  */
 function ContributeLanguageLink() {
   return (
-    <a href="https://weblate.insrt.uk/engage/revolt/" target="_blank">
+    <a href='https://weblate.insrt.uk/engage/revolt/' target='_blank'>
       <CategoryButton
-        action="external"
+        action='external'
         icon={<MdTranslate {...iconSize(22)} />}
         onClick={() => void 0}
-        description="Help contribute to an existing or new language"
+        description='Help contribute to an existing or new language'
       >
         Contribute a language
       </CategoryButton>
diff --git a/packages/client/components/app/interface/settings/user/Native.tsx b/packages/client/components/app/interface/settings/user/Native.tsx
index c36f67779..dc9f99b3e 100644
--- a/packages/client/components/app/interface/settings/user/Native.tsx
+++ b/packages/client/components/app/interface/settings/user/Native.tsx
@@ -1,8 +1,7 @@
-import MdExitToApp from "@material-design-icons/svg/outlined/exit_to_app.svg?component-solid";
-import MdCancelPresentation from "@material-design-icons/svg/outlined/cancel_presentation.svg?component-solid";
-import MdWebAsset from "@material-design-icons/svg/outlined/web_asset.svg?component-solid";
-import MdDesktopWindows from "@material-design-icons/svg/outlined/desktop_windows.svg?component-solid";
-
+import MdCancelPresentation from '@material-design-icons/svg/outlined/cancel_presentation.svg?component-solid';
+import MdDesktopWindows from '@material-design-icons/svg/outlined/desktop_windows.svg?component-solid';
+import MdExitToApp from '@material-design-icons/svg/outlined/exit_to_app.svg?component-solid';
+import MdWebAsset from '@material-design-icons/svg/outlined/web_asset.svg?component-solid';
 import {
   CategoryButton,
   CategoryButtonGroup,
@@ -10,21 +9,21 @@ import {
   Column,
   FormGroup,
   iconSize,
-} from "@revolt/ui";
+} from '@revolt/ui';
 
 /**
  * Desktop Configuration Page
  */
 export default function Native() {
   return (
-    <Column gap="lg">
+    <Column gap='lg'>
       <CategoryButtonGroup>
         <FormGroup>
           <CategoryButton
             action={<Checkbox value onChange={(value) => void value} />}
             onClick={() => void 0}
             icon={<MdExitToApp {...iconSize(22)} />}
-            description="Launch Revolt when you log into your computer."
+            description='Launch Revolt when you log into your computer.'
           >
             Start with Computer
           </CategoryButton>
@@ -34,7 +33,7 @@ export default function Native() {
             action={<Checkbox value onChange={(value) => void value} />}
             onClick={() => void 0}
             icon={<MdCancelPresentation {...iconSize(22)} />}
-            description="Instead of closing, Revolt will hide in your tray."
+            description='Instead of closing, Revolt will hide in your tray.'
           >
             Minimise to Tray
           </CategoryButton>
@@ -46,7 +45,7 @@ export default function Native() {
             action={<Checkbox value onChange={(value) => void value} />}
             onClick={() => void 0}
             icon={<MdWebAsset {...iconSize(22)} />}
-            description="Let Revolt use its own custom titlebar."
+            description='Let Revolt use its own custom titlebar.'
           >
             Custom window frame
           </CategoryButton>
@@ -55,7 +54,7 @@ export default function Native() {
       <CategoryButtonGroup>
         <CategoryButton
           icon={<MdDesktopWindows {...iconSize(22)} />}
-          description="Version 1.0.0"
+          description='Version 1.0.0'
         >
           Revolt Desktop
         </CategoryButton>
diff --git a/packages/client/components/app/interface/settings/user/Notifications.tsx b/packages/client/components/app/interface/settings/user/Notifications.tsx
index 28a9baf67..2b489ba12 100644
--- a/packages/client/components/app/interface/settings/user/Notifications.tsx
+++ b/packages/client/components/app/interface/settings/user/Notifications.tsx
@@ -1,8 +1,7 @@
-import MdNotifications from "@material-design-icons/svg/outlined/notifications.svg?component-solid";
-import MdMarkUnreadChatAlt from "@material-design-icons/svg/outlined/mark_unread_chat_alt.svg?component-solid";
-import MdSpeaker from "@material-design-icons/svg/outlined/speaker.svg?component-solid";
-
-import { useTranslation } from "@revolt/i18n";
+import MdMarkUnreadChatAlt from '@material-design-icons/svg/outlined/mark_unread_chat_alt.svg?component-solid';
+import MdNotifications from '@material-design-icons/svg/outlined/notifications.svg?component-solid';
+import MdSpeaker from '@material-design-icons/svg/outlined/speaker.svg?component-solid';
+import { useTranslation } from '@revolt/i18n';
 import {
   CategoryButton,
   CategoryButtonGroup,
@@ -10,7 +9,7 @@ import {
   Checkbox,
   FormGroup,
   iconSize,
-} from "@revolt/ui";
+} from '@revolt/ui';
 
 /**
  * Notifications Page
@@ -26,10 +25,10 @@ export default function Notifications() {
           onClick={() => void 0}
           icon={<MdNotifications {...iconSize(22)} />}
           description={t(
-            "app.settings.pages.notifications.descriptions.enable_desktop"
+            'app.settings.pages.notifications.descriptions.enable_desktop'
           )}
         >
-          {t("app.settings.pages.notifications.enable_desktop")}
+          {t('app.settings.pages.notifications.enable_desktop')}
         </CategoryButton>
       </FormGroup>
       <FormGroup>
@@ -38,50 +37,50 @@ export default function Notifications() {
           onClick={() => void 0}
           icon={<MdMarkUnreadChatAlt {...iconSize(22)} />}
           description={t(
-            "app.settings.pages.notifications.descriptions.enable_push"
+            'app.settings.pages.notifications.descriptions.enable_push'
           )}
         >
-          {t("app.settings.pages.notifications.enable_push")}
+          {t('app.settings.pages.notifications.enable_push')}
         </CategoryButton>
       </FormGroup>
       <CategoryCollapse
-        title={t("app.settings.pages.notifications.sounds")}
+        title={t('app.settings.pages.notifications.sounds')}
         icon={<MdSpeaker {...iconSize(22)} />}
       >
         <FormGroup>
           <CategoryButton
             action={<Checkbox value onChange={(value) => void value} />}
             onClick={() => void 0}
-            icon="blank"
+            icon='blank'
           >
-            {t("app.settings.pages.notifications.sound.message")}
+            {t('app.settings.pages.notifications.sound.message')}
           </CategoryButton>
         </FormGroup>
         <FormGroup>
           <CategoryButton
             action={<Checkbox onChange={(value) => void value} />}
             onClick={() => void 0}
-            icon="blank"
+            icon='blank'
           >
-            {t("app.settings.pages.notifications.sound.outbound")}
+            {t('app.settings.pages.notifications.sound.outbound')}
           </CategoryButton>
         </FormGroup>
         <FormGroup>
           <CategoryButton
             action={<Checkbox value onChange={(value) => void value} />}
             onClick={() => void 0}
-            icon="blank"
+            icon='blank'
           >
-            {t("app.settings.pages.notifications.sound.call_join")}
+            {t('app.settings.pages.notifications.sound.call_join')}
           </CategoryButton>
         </FormGroup>
         <FormGroup>
           <CategoryButton
             action={<Checkbox value onChange={(value) => void value} />}
             onClick={() => void 0}
-            icon="blank"
+            icon='blank'
           >
-            {t("app.settings.pages.notifications.sound.call_leave")}
+            {t('app.settings.pages.notifications.sound.call_leave')}
           </CategoryButton>
         </FormGroup>
       </CategoryCollapse>
diff --git a/packages/client/components/app/interface/settings/user/Sessions.tsx b/packages/client/components/app/interface/settings/user/Sessions.tsx
index 516854b43..98a6fed25 100644
--- a/packages/client/components/app/interface/settings/user/Sessions.tsx
+++ b/packages/client/components/app/interface/settings/user/Sessions.tsx
@@ -1,38 +1,28 @@
-import {
-  BiLogosAndroid,
-  BiLogosApple,
-  BiLogosWindows,
-  BiRegularQuestionMark,
-} from "solid-icons/bi";
-import { FaBrandsLinux } from "solid-icons/fa";
-import {
-  Accessor,
-  For,
-  Match,
-  Show,
-  Switch,
-  createMemo,
-  onMount,
-} from "solid-js";
-
-import { Session } from "revolt.js";
-
-import { useClient } from "@revolt/client";
-import { getController } from "@revolt/common";
+import MdAutoMode from '@material-design-icons/svg/outlined/auto_mode.svg?component-solid';
+import MdLogout from '@material-design-icons/svg/outlined/logout.svg?component-solid';
+import { useClient } from '@revolt/client';
+import { getController } from '@revolt/common';
 import {
   CategoryButton,
   CategoryButtonGroup,
   CategoryCollapse,
   Column,
-  Preloader,
-  Time,
   iconSize,
+  Preloader,
   styled,
+  Time,
   useTheme,
-} from "@revolt/ui";
-
-import MdAutoMode from "@material-design-icons/svg/outlined/auto_mode.svg?component-solid";
-import MdLogout from "@material-design-icons/svg/outlined/logout.svg?component-solid";
+} from '@revolt/ui';
+import type { Session } from 'revolt.js';
+import {
+  BiLogosAndroid,
+  BiLogosApple,
+  BiLogosWindows,
+  BiRegularQuestionMark,
+} from 'solid-icons/bi';
+import { FaBrandsLinux } from 'solid-icons/fa';
+import type { Accessor } from 'solid-js';
+import { createMemo, For, Match, onMount, Show, Switch } from 'solid-js';
 
 /**
  * Sessions
@@ -51,8 +41,8 @@ export default function Sessions() {
   );
 
   return (
-    <Column gap="lg">
-      <Switch fallback={<Preloader type="ring" />}>
+    <Column gap='lg'>
+      <Switch fallback={<Preloader type='ring' />}>
         <Match when={client().sessions.size()}>
           <ManageCurrentSession otherSessions={otherSessions} />
           <ListOtherSessions otherSessions={otherSessions} />
@@ -77,17 +67,17 @@ function ManageCurrentSession(props: { otherSessions: Accessor<Session[]> }) {
   return (
     <CategoryButtonGroup>
       <CategoryCollapse
-        title="Current Session"
+        title='Current Session'
         description={currentSession()?.name}
         icon={<SessionIcon session={currentSession()} />}
       >
         <CategoryButton
-          icon="blank"
-          action="chevron"
+          icon='blank'
+          action='chevron'
           onClick={() =>
             currentSession() &&
-            getController("modal").push({
-              type: "rename_session",
+            getController('modal').push({
+              type: 'rename_session',
               session: currentSession()!,
             })
           }
@@ -96,23 +86,23 @@ function ManageCurrentSession(props: { otherSessions: Accessor<Session[]> }) {
         </CategoryButton>
       </CategoryCollapse>
       <CategoryButton
-        action="chevron"
+        action='chevron'
         icon={
           <MdAutoMode
             {...iconSize(24)}
             fill={theme.customColours.error.color}
           />
         }
-        description="Keeps your last sessions active and automatically logs you out of other ones"
+        description='Keeps your last sessions active and automatically logs you out of other ones'
       >
         Keep Last Active Sessions
       </CategoryButton>
       <Show when={props.otherSessions().length}>
         <CategoryButton
-          action="chevron"
+          action='chevron'
           onClick={() =>
-            getController("modal").push({
-              type: "sign_out_sessions",
+            getController('modal').push({
+              type: 'sign_out_sessions',
               client: client(),
             })
           }
@@ -122,7 +112,7 @@ function ManageCurrentSession(props: { otherSessions: Accessor<Session[]> }) {
               fill={theme.customColours.error.color}
             />
           }
-          description="Logs you out of all sessions except this device."
+          description='Logs you out of all sessions except this device.'
         >
           Log Out Other Sessions
         </CategoryButton>
@@ -146,16 +136,16 @@ function ListOtherSessions(props: { otherSessions: Accessor<Session[]> }) {
                 title={<Capitalise>{session.name}</Capitalise>}
                 description={
                   <>
-                    Created <Time value={session.createdAt} format="relative" />
+                    Created <Time value={session.createdAt} format='relative' />
                   </>
                 }
               >
                 <CategoryButton
-                  icon="blank"
-                  action="chevron"
+                  icon='blank'
+                  action='chevron'
                   onClick={() =>
-                    getController("modal").push({
-                      type: "rename_session",
+                    getController('modal').push({
+                      type: 'rename_session',
                       session,
                     })
                   }
@@ -163,8 +153,8 @@ function ListOtherSessions(props: { otherSessions: Accessor<Session[]> }) {
                   Rename
                 </CategoryButton>
                 <CategoryButton
-                  icon="blank"
-                  action="chevron"
+                  icon='blank'
+                  action='chevron'
                   onClick={() => session.delete()}
                 >
                   Log Out
@@ -191,16 +181,16 @@ const Capitalise = styled.div`
 function SessionIcon(props: { session?: Session }) {
   return (
     <Switch fallback={<BiRegularQuestionMark size={22} />}>
-      <Match when={/linux/i.test(props.session?.name ?? "")}>
+      <Match when={/linux/i.test(props.session?.name ?? '')}>
         <FaBrandsLinux size={22} />
       </Match>
-      <Match when={/windows/i.test(props.session?.name ?? "")}>
+      <Match when={/windows/i.test(props.session?.name ?? '')}>
         <BiLogosWindows size={22} />
       </Match>
-      <Match when={/android/i.test(props.session?.name ?? "")}>
+      <Match when={/android/i.test(props.session?.name ?? '')}>
         <BiLogosAndroid size={22} />
       </Match>
-      <Match when={/mac.*os|i(Pad)?os/i.test(props.session?.name ?? "")}>
+      <Match when={/mac.*os|i(Pad)?os/i.test(props.session?.name ?? '')}>
         <BiLogosApple size={22} />
       </Match>
     </Switch>
diff --git a/packages/client/components/app/interface/settings/user/Sync.tsx b/packages/client/components/app/interface/settings/user/Sync.tsx
index 5016018b7..02626b496 100644
--- a/packages/client/components/app/interface/settings/user/Sync.tsx
+++ b/packages/client/components/app/interface/settings/user/Sync.tsx
@@ -1,17 +1,16 @@
-import { useTranslation } from "@revolt/i18n";
+import MdBrush from '@material-design-icons/svg/outlined/brush.svg?component-solid';
+import MdLanguage from '@material-design-icons/svg/outlined/language.svg?component-solid';
+import MdPalette from '@material-design-icons/svg/outlined/palette.svg?component-solid';
+import { useTranslation } from '@revolt/i18n';
 import {
   CategoryButton,
   CategoryButtonGroup,
   Checkbox,
   Column,
   FormGroup,
-  Time,
   iconSize,
-} from "@revolt/ui";
-
-import MdBrush from "@material-design-icons/svg/outlined/brush.svg?component-solid";
-import MdLanguage from "@material-design-icons/svg/outlined/language.svg?component-solid";
-import MdPalette from "@material-design-icons/svg/outlined/palette.svg?component-solid";
+  Time,
+} from '@revolt/ui';
 
 /**
  * Sync Configuration Page
@@ -20,16 +19,16 @@ export default function Sync() {
   const t = useTranslation();
 
   return (
-    <Column gap="lg">
+    <Column gap='lg'>
       <CategoryButtonGroup>
         <FormGroup>
           <CategoryButton
             action={<Checkbox value onChange={(value) => void value} />}
             onClick={() => void 0}
             icon={<MdPalette {...iconSize(22)} />}
-            description={t("app.settings.pages.sync.descriptions.appearance")}
+            description={t('app.settings.pages.sync.descriptions.appearance')}
           >
-            {t("app.settings.pages.appearance.title")}
+            {t('app.settings.pages.appearance.title')}
           </CategoryButton>
         </FormGroup>
         <FormGroup>
@@ -37,9 +36,9 @@ export default function Sync() {
             action={<Checkbox value onChange={(value) => void value} />}
             onClick={() => void 0}
             icon={<MdBrush {...iconSize(22)} />}
-            description={t("app.settings.pages.sync.descriptions.theme")}
+            description={t('app.settings.pages.sync.descriptions.theme')}
           >
-            {t("app.settings.pages.appearance.theme")}
+            {t('app.settings.pages.appearance.theme')}
           </CategoryButton>
         </FormGroup>
         <FormGroup>
@@ -47,15 +46,15 @@ export default function Sync() {
             action={<Checkbox value onChange={(value) => void value} />}
             onClick={() => void 0}
             icon={<MdLanguage {...iconSize(22)} />}
-            description={t("app.settings.pages.sync.descriptions.locale")}
+            description={t('app.settings.pages.sync.descriptions.locale')}
           >
-            {t("app.settings.pages.language.title")}
+            {t('app.settings.pages.language.title')}
           </CategoryButton>
         </FormGroup>
       </CategoryButtonGroup>
       <CategoryButtonGroup>
         <CategoryButton>
-          Last sync <Time format="relative" value={0} />
+          Last sync <Time format='relative' value={0} />
         </CategoryButton>
       </CategoryButtonGroup>
     </Column>
diff --git a/packages/client/components/app/interface/settings/user/_AccountCard.tsx b/packages/client/components/app/interface/settings/user/_AccountCard.tsx
index 97fae9565..3ba1e8424 100644
--- a/packages/client/components/app/interface/settings/user/_AccountCard.tsx
+++ b/packages/client/components/app/interface/settings/user/_AccountCard.tsx
@@ -1,14 +1,14 @@
-import { useClient } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
-import { Avatar, OverflowingText, Typography } from "@revolt/ui";
+import { useClient } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
+import { Avatar, OverflowingText, Typography } from '@revolt/ui';
 
-// import MdError from "@material-design-icons/svg/filled/error.svg?component-solid";
-import { useSettingsNavigation } from "../Settings";
 import {
   SidebarButton,
   SidebarButtonContent,
   SidebarButtonTitle,
-} from "../_layout/SidebarButton";
+} from '../_layout/SidebarButton';
+// import MdError from "@material-design-icons/svg/filled/error.svg?component-solid";
+import { useSettingsNavigation } from '../Settings';
 
 /**
  * Account Card
@@ -21,19 +21,19 @@ export function AccountCard() {
 
   return (
     <SidebarButton
-      onClick={() => navigate("account")}
-      aria-selected={page() === "account"}
+      onClick={() => navigate('account')}
+      aria-selected={page() === 'account'}
     >
       <SidebarButtonTitle>
         <Avatar size={36} src={client().user!.animatedAvatarURL} />
         <SidebarButtonContent>
           <OverflowingText>
-            <Typography variant="settings-account-card-title">
+            <Typography variant='settings-account-card-title'>
               {client().user!.displayName}
             </Typography>
           </OverflowingText>
-          <Typography variant="settings-account-card-subtitle">
-            {t("app.settings.pages.account.title")}
+          <Typography variant='settings-account-card-subtitle'>
+            {t('app.settings.pages.account.title')}
           </Typography>
         </SidebarButtonContent>
       </SidebarButtonTitle>
diff --git a/packages/client/components/app/interface/settings/user/account/UserSummary.tsx b/packages/client/components/app/interface/settings/user/account/UserSummary.tsx
index 3777625c2..e373ce3c4 100644
--- a/packages/client/components/app/interface/settings/user/account/UserSummary.tsx
+++ b/packages/client/components/app/interface/settings/user/account/UserSummary.tsx
@@ -1,14 +1,11 @@
-import { Accessor, Show } from "solid-js";
-
-import dayjs from "dayjs";
-import { User } from "revolt.js";
-import { cva } from "styled-system/css";
-import { styled } from "styled-system/jsx";
-
-import { Avatar, Button, CategoryButtonGroup, iconSize } from "@revolt/ui";
-
-import MdCakeFill from "@material-design-icons/svg/filled/cake.svg?component-solid";
-import MdEdit from "@material-design-icons/svg/outlined/edit.svg?component-solid";
+import MdCakeFill from '@material-design-icons/svg/filled/cake.svg?component-solid';
+import MdEdit from '@material-design-icons/svg/outlined/edit.svg?component-solid';
+import { Avatar, Button, CategoryButtonGroup, iconSize } from '@revolt/ui';
+import dayjs from 'dayjs';
+import type { User } from 'revolt.js';
+import { Accessor, Show } from 'solid-js';
+import { cva } from 'styled-system/css';
+import { styled } from 'styled-system/jsx';
 
 export function UserSummary(props: {
   user: User;
@@ -19,7 +16,7 @@ export function UserSummary(props: {
   const bannerStyle = () =>
     props.bannerUrl
       ? {
-          "background-image": `linear-gradient(rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0.7)), url("${props.bannerUrl}")`,
+          'background-image': `linear-gradient(rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0.7)), url("${props.bannerUrl}")`,
         }
       : {
           background: `var(--colours-settings-background)`,
@@ -37,7 +34,7 @@ export function UserSummary(props: {
             </span>
           </Username>
           <Show when={props.onEdit}>
-            <Button size="fab" onPress={props.onEdit}>
+            <Button size='fab' onPress={props.onEdit}>
               <MdEdit />
             </Button>
           </Show>
@@ -54,9 +51,9 @@ export function UserSummary(props: {
               <span
                 use:floating={{
                   tooltip: {
-                    placement: "top",
+                    placement: 'top',
                     content: dayjs(props.user.createdAt).format(
-                      "[Account created] Do MMMM YYYY [at] HH:mm"
+                      '[Account created] Do MMMM YYYY [at] HH:mm'
                     ),
                   },
                 }}
@@ -71,70 +68,70 @@ export function UserSummary(props: {
   );
 }
 
-const AccountBox = styled("div", {
+const AccountBox = styled('div', {
   base: {
-    display: "flex",
-    padding: "var(--gap-lg)",
-    flexDirection: "column",
+    display: 'flex',
+    padding: 'var(--gap-lg)',
+    flexDirection: 'column',
 
-    backgroundSize: "cover",
-    backgroundPosition: "center",
+    backgroundSize: 'cover',
+    backgroundPosition: 'center',
   },
 });
 
-const ProfileDetails = styled("div", {
+const ProfileDetails = styled('div', {
   base: {
-    display: "flex",
-    gap: "var(--gap-lg)",
-    alignItems: "center",
+    display: 'flex',
+    gap: 'var(--gap-lg)',
+    alignItems: 'center',
   },
 });
 
-const Username = styled("div", {
+const Username = styled('div', {
   base: {
     flexGrow: 1,
 
-    display: "flex",
-    flexDirection: "column",
+    display: 'flex',
+    flexDirection: 'column',
 
     // Display Name
-    "& :nth-child(1)": {
-      fontSize: "18px",
+    '& :nth-child(1)': {
+      fontSize: '18px',
       fontWeight: 600,
     },
 
     // Username#Discrim
-    "& :nth-child(2)": {
-      fontSize: "14px",
+    '& :nth-child(2)': {
+      fontSize: '14px',
       fontWeight: 400,
     },
   },
 });
 
-const BottomBar = styled("div", {
+const BottomBar = styled('div', {
   base: {
-    display: "flex",
+    display: 'flex',
   },
 });
 
-const DummyPadding = styled("div", {
+const DummyPadding = styled('div', {
   base: {
     flexShrink: 0,
     // Matches with avatar size
-    width: "58px",
+    width: '58px',
     // Matches with ProfileDetails
-    marginInlineEnd: "var(--gap-lg)",
+    marginInlineEnd: 'var(--gap-lg)',
   },
 });
 
-const ProfileBadges = styled("div", {
+const ProfileBadges = styled('div', {
   base: {
-    display: "flex",
-    gap: "var(--gap-sm)",
-    width: "fit-content",
-    padding: "var(--gap-sm) var(--gap-sm)",
-    borderRadius: "var(--borderRadius-md)",
+    display: 'flex',
+    gap: 'var(--gap-sm)',
+    width: 'fit-content',
+    padding: 'var(--gap-sm) var(--gap-sm)',
+    borderRadius: 'var(--borderRadius-md)',
 
-    background: "var(--colours-settings-background)",
+    background: 'var(--colours-settings-background)',
   },
 });
diff --git a/packages/client/components/app/interface/settings/user/account/index.ts b/packages/client/components/app/interface/settings/user/account/index.ts
index b647066cb..589126b01 100644
--- a/packages/client/components/app/interface/settings/user/account/index.ts
+++ b/packages/client/components/app/interface/settings/user/account/index.ts
@@ -1 +1 @@
-export { UserSummary } from "./UserSummary";
+export { UserSummary } from './UserSummary';
diff --git a/packages/client/components/app/interface/settings/user/bots/MyBots.tsx b/packages/client/components/app/interface/settings/user/bots/MyBots.tsx
index 03f539285..4ce528ca3 100644
--- a/packages/client/components/app/interface/settings/user/bots/MyBots.tsx
+++ b/packages/client/components/app/interface/settings/user/bots/MyBots.tsx
@@ -1,28 +1,26 @@
-import { ErrorBoundary, For, Suspense } from "solid-js";
-
-import { useClient } from "@revolt/client";
-import { createOwnBotsResource } from "@revolt/client/resources";
-import { modalController } from "@revolt/modal";
+import MdLibraryBooks from '@material-design-icons/svg/outlined/library_books.svg?component-solid';
+import MdSmartToy from '@material-design-icons/svg/outlined/smart_toy.svg?component-solid';
+import { useClient } from '@revolt/client';
+import { createOwnBotsResource } from '@revolt/client/resources';
+import { modalController } from '@revolt/modal';
 import {
   Avatar,
   CategoryButton,
   CategoryButtonGroup,
   Column,
-  Preloader,
   iconSize,
-} from "@revolt/ui";
-
-import MdLibraryBooks from "@material-design-icons/svg/outlined/library_books.svg?component-solid";
-import MdSmartToy from "@material-design-icons/svg/outlined/smart_toy.svg?component-solid";
+  Preloader,
+} from '@revolt/ui';
+import { ErrorBoundary, For, Suspense } from 'solid-js';
 
-import { useSettingsNavigation } from "../../Settings";
+import { useSettingsNavigation } from '../../Settings';
 
 /**
  * View all owned bots
  */
 export function MyBots() {
   return (
-    <Column gap="lg">
+    <Column gap='lg'>
       <CreateBot />
       <ListBots />
     </Column>
@@ -39,26 +37,26 @@ function CreateBot() {
   return (
     <CategoryButtonGroup>
       <CategoryButton
-        action="chevron"
+        action='chevron'
         icon={<MdSmartToy {...iconSize(22)} />}
         onClick={() =>
           modalController.push({
-            type: "create_bot",
+            type: 'create_bot',
             client: client(),
             onCreate(bot) {
               navigate(`bots/${bot.id}`);
             },
           })
         }
-        description="You agree that your bot is subject to the Acceptable Usage Policy."
+        description='You agree that your bot is subject to the Acceptable Usage Policy.'
       >
         Create Bot
       </CategoryButton>
       <CategoryButton
-        action="external"
+        action='external'
         icon={<MdLibraryBooks {...iconSize(22)} />}
-        onClick={() => window.open("https://developers.revolt.chat", "_blank")}
-        description="Learn more about how to create bots on Revolt."
+        onClick={() => window.open('https://developers.revolt.chat', '_blank')}
+        description='Learn more about how to create bots on Revolt.'
       >
         Developer Documentation
       </CategoryButton>
@@ -74,8 +72,8 @@ function ListBots() {
   const bots = createOwnBotsResource();
 
   return (
-    <ErrorBoundary fallback="Failed to load bots...">
-      <Suspense fallback={<Preloader type="ring" />}>
+    <ErrorBoundary fallback='Failed to load bots...'>
+      <Suspense fallback={<Preloader type='ring' />}>
         <CategoryButtonGroup>
           <For each={bots.data}>
             {(bot) => (
@@ -88,7 +86,7 @@ function ListBots() {
                   />
                 }
                 onClick={() => navigate(`bots/${bot.id}`)}
-                action="chevron"
+                action='chevron'
                 // description={bot.id}
               >
                 {bot.user!.displayName}
diff --git a/packages/client/components/app/interface/settings/user/bots/ViewBot.tsx b/packages/client/components/app/interface/settings/user/bots/ViewBot.tsx
index 421d1f97b..a9fd09baf 100644
--- a/packages/client/components/app/interface/settings/user/bots/ViewBot.tsx
+++ b/packages/client/components/app/interface/settings/user/bots/ViewBot.tsx
@@ -1,20 +1,19 @@
-import { useClient } from "@revolt/client";
-import { createProfileResource } from "@revolt/client/resources";
+import MdLink from '@material-design-icons/svg/outlined/link.svg?component-solid';
+import MdPersonAdd from '@material-design-icons/svg/outlined/person_add.svg?component-solid';
+import MdPublic from '@material-design-icons/svg/outlined/public.svg?component-solid';
+import MdToken from '@material-design-icons/svg/outlined/token.svg?component-solid';
+import { useClient } from '@revolt/client';
+import { createProfileResource } from '@revolt/client/resources';
 import {
   CategoryButton,
   CategoryButtonGroup,
   Column,
   iconSize,
-} from "@revolt/ui";
+} from '@revolt/ui';
 
-import MdLink from "@material-design-icons/svg/outlined/link.svg?component-solid";
-import MdPersonAdd from "@material-design-icons/svg/outlined/person_add.svg?component-solid";
-import MdPublic from "@material-design-icons/svg/outlined/public.svg?component-solid";
-import MdToken from "@material-design-icons/svg/outlined/token.svg?component-solid";
-
-import { useSettingsNavigation } from "../../Settings";
-import { UserSummary } from "../account";
-import { EditProfileButtons } from "../profile/EditProfileButtons";
+import { useSettingsNavigation } from '../../Settings';
+import { UserSummary } from '../account/index';
+import { EditProfileButtons } from '../profile/EditProfileButtons';
 
 /**
  * View a specific bot
@@ -23,11 +22,11 @@ export function ViewBot() {
   const client = useClient();
   const { page } = useSettingsNavigation();
 
-  const bot = () => client().bots.get(page()!.substring("bots/".length))!;
+  const bot = () => client().bots.get(page()!.substring('bots/'.length))!;
   const profile = createProfileResource(bot().user!);
 
   return (
-    <Column gap="lg">
+    <Column gap='lg'>
       <UserSummary
         user={bot().user!}
         showBadges
@@ -40,28 +39,28 @@ export function ViewBot() {
 
       <CategoryButtonGroup>
         <CategoryButton
-          description="Generate a new token if it gets lost or compromised"
+          description='Generate a new token if it gets lost or compromised'
           icon={<MdToken {...iconSize(22)} />}
-          action="chevron"
+          action='chevron'
         >
           Reset Token
         </CategoryButton>
         <CategoryButton
-          description="Allow others to add your bot to their servers from Discover"
+          description='Allow others to add your bot to their servers from Discover'
           icon={<MdPublic {...iconSize(22)} />}
-          action="chevron"
+          action='chevron'
         >
           Submit to Discover
         </CategoryButton>
       </CategoryButtonGroup>
 
       <CategoryButtonGroup>
-        <CategoryButton icon={<MdLink {...iconSize(22)} />} action="copy">
+        <CategoryButton icon={<MdLink {...iconSize(22)} />} action='copy'>
           Copy Invite
         </CategoryButton>
         <CategoryButton
           icon={<MdPersonAdd {...iconSize(22)} />}
-          action="chevron"
+          action='chevron'
         >
           Invite Bot
         </CategoryButton>
diff --git a/packages/client/components/app/interface/settings/user/bots/index.ts b/packages/client/components/app/interface/settings/user/bots/index.ts
index 645bc0cf1..d52fb65be 100644
--- a/packages/client/components/app/interface/settings/user/bots/index.ts
+++ b/packages/client/components/app/interface/settings/user/bots/index.ts
@@ -1,2 +1,2 @@
-export { MyBots } from "./MyBots";
-export { ViewBot } from "./ViewBot";
+export { MyBots } from './MyBots';
+export { ViewBot } from './ViewBot';
diff --git a/packages/client/components/app/interface/settings/user/index.tsx b/packages/client/components/app/interface/settings/user/index.tsx
index 798e6397b..d8b183b84 100644
--- a/packages/client/components/app/interface/settings/user/index.tsx
+++ b/packages/client/components/app/interface/settings/user/index.tsx
@@ -1,66 +1,63 @@
-import { Component, Show } from "solid-js";
-
-import { Server } from "revolt.js";
-
-import { getController } from "@revolt/common";
-import { useTranslation } from "@revolt/i18n";
-import { useUser } from "@revolt/markdown/users";
-import { ColouredText, Column, iconSize, useTheme } from "@revolt/ui";
-import { ColourSwatches } from "@revolt/ui/components/design/atoms/inputs/ColourSwatches";
-
 // Filled Icons
-import MdAccountCircleFill from "@material-design-icons/svg/filled/account_circle.svg?component-solid";
-import MdDesktopWindowsFill from "@material-design-icons/svg/filled/desktop_windows.svg?component-solid";
-import MdExtensionFill from "@material-design-icons/svg/filled/extension.svg?component-solid";
-import MdFormatListBulletedFill from "@material-design-icons/svg/filled/format_list_bulleted.svg?component-solid";
-import MdLanguageFill from "@material-design-icons/svg/filled/language.svg?component-solid";
-import MdLocalCafeFill from "@material-design-icons/svg/filled/local_cafe.svg?component-solid";
-import MdLogoutFill from "@material-design-icons/svg/filled/logout.svg?component-solid";
-import MdMemoryFill from "@material-design-icons/svg/filled/memory.svg?component-solid";
-import MdNotificationsFill from "@material-design-icons/svg/filled/notifications.svg?component-solid";
-import MdPaletteFill from "@material-design-icons/svg/filled/palette.svg?component-solid";
-import MdRateReviewFill from "@material-design-icons/svg/filled/rate_review.svg?component-solid";
-import MdScienceFill from "@material-design-icons/svg/filled/science.svg?component-solid";
-import MdSmartToyFill from "@material-design-icons/svg/filled/smart_toy.svg?component-solid";
-import MdSpeakerFill from "@material-design-icons/svg/filled/speaker.svg?component-solid";
-import MdSyncFill from "@material-design-icons/svg/filled/sync.svg?component-solid";
-import MdVerifiedUserFill from "@material-design-icons/svg/filled/verified_user.svg?component-solid";
-import MdAccessibility from "@material-design-icons/svg/outlined/accessibility.svg?component-solid";
+import MdAccountCircleFill from '@material-design-icons/svg/filled/account_circle.svg?component-solid';
+import MdDesktopWindowsFill from '@material-design-icons/svg/filled/desktop_windows.svg?component-solid';
+import MdExtensionFill from '@material-design-icons/svg/filled/extension.svg?component-solid';
+import MdFormatListBulletedFill from '@material-design-icons/svg/filled/format_list_bulleted.svg?component-solid';
+import MdLanguageFill from '@material-design-icons/svg/filled/language.svg?component-solid';
+import MdLocalCafeFill from '@material-design-icons/svg/filled/local_cafe.svg?component-solid';
+import MdLogoutFill from '@material-design-icons/svg/filled/logout.svg?component-solid';
+import MdMemoryFill from '@material-design-icons/svg/filled/memory.svg?component-solid';
+import MdNotificationsFill from '@material-design-icons/svg/filled/notifications.svg?component-solid';
+import MdPaletteFill from '@material-design-icons/svg/filled/palette.svg?component-solid';
+import MdRateReviewFill from '@material-design-icons/svg/filled/rate_review.svg?component-solid';
+import MdScienceFill from '@material-design-icons/svg/filled/science.svg?component-solid';
+import MdSmartToyFill from '@material-design-icons/svg/filled/smart_toy.svg?component-solid';
+import MdSpeakerFill from '@material-design-icons/svg/filled/speaker.svg?component-solid';
+import MdSyncFill from '@material-design-icons/svg/filled/sync.svg?component-solid';
+import MdVerifiedUserFill from '@material-design-icons/svg/filled/verified_user.svg?component-solid';
+import MdAccessibility from '@material-design-icons/svg/outlined/accessibility.svg?component-solid';
 // Outlined Icons
-import MdAccountCircle from "@material-design-icons/svg/outlined/account_circle.svg?component-solid";
-import MdDesktopWindows from "@material-design-icons/svg/outlined/desktop_windows.svg?component-solid";
-import MdExtension from "@material-design-icons/svg/outlined/extension.svg?component-solid";
-import MdFormatListBulleted from "@material-design-icons/svg/outlined/format_list_bulleted.svg?component-solid";
-import MdKeybinds from "@material-design-icons/svg/outlined/keyboard.svg?component-solid";
-import MdLanguage from "@material-design-icons/svg/outlined/language.svg?component-solid";
-import MdLocalCafe from "@material-design-icons/svg/outlined/local_cafe.svg?component-solid";
-import MdLogout from "@material-design-icons/svg/outlined/logout.svg?component-solid";
-import MdMemory from "@material-design-icons/svg/outlined/memory.svg?component-solid";
-import MdNotifications from "@material-design-icons/svg/outlined/notifications.svg?component-solid";
-import MdPalette from "@material-design-icons/svg/outlined/palette.svg?component-solid";
-import MdRateReview from "@material-design-icons/svg/outlined/rate_review.svg?component-solid";
-import MdScience from "@material-design-icons/svg/outlined/science.svg?component-solid";
-import MdSmartToy from "@material-design-icons/svg/outlined/smart_toy.svg?component-solid";
-import MdSpeaker from "@material-design-icons/svg/outlined/speaker.svg?component-solid";
-import MdSync from "@material-design-icons/svg/outlined/sync.svg?component-solid";
-import MdVerifiedUser from "@material-design-icons/svg/outlined/verified_user.svg?component-solid";
-
-import { SettingsConfiguration } from "..";
+import MdAccountCircle from '@material-design-icons/svg/outlined/account_circle.svg?component-solid';
+import MdDesktopWindows from '@material-design-icons/svg/outlined/desktop_windows.svg?component-solid';
+import MdExtension from '@material-design-icons/svg/outlined/extension.svg?component-solid';
+import MdFormatListBulleted from '@material-design-icons/svg/outlined/format_list_bulleted.svg?component-solid';
+import MdKeybinds from '@material-design-icons/svg/outlined/keyboard.svg?component-solid';
+import MdLanguage from '@material-design-icons/svg/outlined/language.svg?component-solid';
+import MdLocalCafe from '@material-design-icons/svg/outlined/local_cafe.svg?component-solid';
+import MdLogout from '@material-design-icons/svg/outlined/logout.svg?component-solid';
+import MdMemory from '@material-design-icons/svg/outlined/memory.svg?component-solid';
+import MdNotifications from '@material-design-icons/svg/outlined/notifications.svg?component-solid';
+import MdPalette from '@material-design-icons/svg/outlined/palette.svg?component-solid';
+import MdRateReview from '@material-design-icons/svg/outlined/rate_review.svg?component-solid';
+import MdScience from '@material-design-icons/svg/outlined/science.svg?component-solid';
+import MdSmartToy from '@material-design-icons/svg/outlined/smart_toy.svg?component-solid';
+import MdSpeaker from '@material-design-icons/svg/outlined/speaker.svg?component-solid';
+import MdSync from '@material-design-icons/svg/outlined/sync.svg?component-solid';
+import MdVerifiedUser from '@material-design-icons/svg/outlined/verified_user.svg?component-solid';
+import { getController } from '@revolt/common';
+import { useTranslation } from '@revolt/i18n';
+import { useUser } from '@revolt/markdown/users';
+import { ColouredText, Column, iconSize, useTheme } from '@revolt/ui';
+import { ColourSwatches } from '@revolt/ui/components/design/atoms/inputs/ColourSwatches';
+import type { Server } from 'revolt.js';
+import type { Component } from 'solid-js';
+import { Show } from 'solid-js';
 
-import accessibility from "./Accessibility";
-import account from "./Account";
-import appearance from "./Appearance";
-import experiments from "./Experiments";
-import feedback from "./Feedback";
-import keybinds from "./Keybinds";
-import language from "./Language";
-import native from "./Native";
-import notifications from "./Notifications";
-import sessions from "./Sessions";
-import sync from "./Sync";
-import { AccountCard } from "./_AccountCard";
-import { MyBots, ViewBot } from "./bots";
-import { EditProfile } from "./profile";
+import type { SettingsConfiguration } from '..';
+import { AccountCard } from './_AccountCard';
+import accessibility from './Accessibility';
+import account from './Account';
+import appearance from './Appearance';
+import { MyBots, ViewBot } from './bots';
+import experiments from './Experiments';
+import feedback from './Feedback';
+import keybinds from './Keybinds';
+import language from './Language';
+import native from './Native';
+import notifications from './Notifications';
+import { EditProfile } from './profile';
+import sessions from './Sessions';
+import sync from './Sync';
 
 /**
  * All the available routes for client settings
@@ -72,12 +69,12 @@ const ClientSettingsRouting: Record<string, Component> = {
 
   // Bots
   bots: MyBots,
-  "bots/view": ViewBot,
+  'bots/view': ViewBot,
 
   feedback,
   audio: () => null,
   appearance,
-  "appearance/colours": () => <ColourSwatches />,
+  'appearance/colours': () => <ColourSwatches />,
   accessibility,
   notifications,
   language,
@@ -93,8 +90,8 @@ const ClientSettingsRouting: Record<string, Component> = {
  * @returns New Id
  */
 function mapRoutingId(id: string) {
-  if (id.startsWith("bots/")) {
-    return "bots/view";
+  if (id.startsWith('bots/')) {
+    return 'bots/view';
   }
 
   return id;
@@ -108,13 +105,13 @@ const Config: SettingsConfiguration<{ server: Server }> = {
   title(key) {
     const t = useTranslation();
 
-    if (key.startsWith("bots/")) {
+    if (key.startsWith('bots/')) {
       const user = useUser(key.substring(5));
       return user()!.username;
     }
 
     return t(
-      `app.settings.pages.${key.replaceAll("/", ".")}.title`,
+      `app.settings.pages.${key.replaceAll('/', '.')}.title`,
       undefined,
       key
     );
@@ -147,55 +144,55 @@ const Config: SettingsConfiguration<{ server: Server }> = {
 
     return {
       prepend: (
-        <Column gap="s">
+        <Column gap='s'>
           <AccountCard />
           <div />
         </Column>
       ),
       entries: [
         {
-          title: t("app.settings.categories.user_settings"),
+          title: t('app.settings.categories.user_settings'),
           entries: [
             {
-              id: "account",
+              id: 'account',
               icon: <></>,
               title: <></>,
               hidden: true,
             },
             {
-              id: "profile",
+              id: 'profile',
               icon: <MdAccountCircle {...iconSize(20)} />,
-              title: t("app.settings.pages.profile.title"),
+              title: t('app.settings.pages.profile.title'),
             },
             {
-              id: "sessions",
+              id: 'sessions',
               icon: <MdVerifiedUser {...iconSize(20)} />,
-              title: t("app.settings.pages.sessions.title"),
+              title: t('app.settings.pages.sessions.title'),
             },
           ],
         },
         {
-          title: "Revolt",
+          title: 'Revolt',
           entries: [
             {
-              id: "bots",
+              id: 'bots',
               icon: <MdSmartToy {...iconSize(20)} />,
-              title: t("app.settings.pages.bots.title"),
+              title: t('app.settings.pages.bots.title'),
             },
             {
-              id: "feedback",
+              id: 'feedback',
               icon: <MdRateReview {...iconSize(20)} />,
-              title: t("app.settings.pages.feedback.title"),
+              title: t('app.settings.pages.feedback.title'),
             },
             {
-              href: "https://insrt.uk/donate",
+              href: 'https://insrt.uk/donate',
               icon: <MdLocalCafe {...iconSize(20)} />,
-              title: t("app.settings.pages.donate.title"),
+              title: t('app.settings.pages.donate.title'),
             },
           ],
         },
         {
-          title: t("app.settings.categories.client_settings"),
+          title: t('app.settings.categories.client_settings'),
           entries: [
             // {
             //   id: "audio",
@@ -231,9 +228,9 @@ const Config: SettingsConfiguration<{ server: Server }> = {
             //   title: t("app.settings.pages.keybinds.title"),
             // },
             {
-              id: "language",
+              id: 'language',
               icon: <MdLanguage {...iconSize(20)} />,
-              title: t("app.settings.pages.language.title"),
+              title: t('app.settings.pages.language.title'),
             },
             // {
             //   id: "sync",
@@ -247,9 +244,9 @@ const Config: SettingsConfiguration<{ server: Server }> = {
             //   title: t("app.settings.pages.native.title"),
             // },
             {
-              id: "experiments",
+              id: 'experiments',
               icon: <MdScience {...iconSize(20)} />,
-              title: t("app.settings.pages.experiments.title"),
+              title: t('app.settings.pages.experiments.title'),
             },
           ],
         },
@@ -262,12 +259,12 @@ const Config: SettingsConfiguration<{ server: Server }> = {
             //   title: t("app.special.modals.changelogs.title"),
             // },
             {
-              href: "https://github.com/revoltchat",
+              href: 'https://github.com/revoltchat',
               icon: <MdMemory {...iconSize(20)} />,
-              title: t("app.settings.pages.source_code"),
+              title: t('app.settings.pages.source_code'),
             },
             {
-              id: "logout",
+              id: 'logout',
               icon: (
                 <MdLogout
                   {...iconSize(20)}
@@ -276,12 +273,12 @@ const Config: SettingsConfiguration<{ server: Server }> = {
               ),
               title: (
                 <ColouredText colour={theme!.customColours.error.color}>
-                  {t("app.settings.pages.logOut")}
+                  {t('app.settings.pages.logOut')}
                 </ColouredText>
               ),
               onClick: () => {
-                getController("modal").pop();
-                getController("client").logout();
+                getController('modal').pop();
+                getController('client').logout();
               },
             },
           ],
diff --git a/packages/client/components/app/interface/settings/user/profile/EditProfile.tsx b/packages/client/components/app/interface/settings/user/profile/EditProfile.tsx
index 30d04683e..533dbc840 100644
--- a/packages/client/components/app/interface/settings/user/profile/EditProfile.tsx
+++ b/packages/client/components/app/interface/settings/user/profile/EditProfile.tsx
@@ -1,8 +1,7 @@
-import { For } from "solid-js";
-
-import { useClient } from "@revolt/client";
-import { createOwnProfileResource } from "@revolt/client/resources";
-import { modalController } from "@revolt/modal";
+import MdGroups from '@material-design-icons/svg/outlined/groups.svg?component-solid';
+import { useClient } from '@revolt/client';
+import { createOwnProfileResource } from '@revolt/client/resources';
+import { modalController } from '@revolt/modal';
 import {
   Avatar,
   CategoryButton,
@@ -10,13 +9,11 @@ import {
   CategoryCollapse,
   Column,
   iconSize,
-} from "@revolt/ui";
-
-import MdGroups from "@material-design-icons/svg/outlined/groups.svg?component-solid";
-
-import { UserSummary } from "../account";
+} from '@revolt/ui';
+import { For } from 'solid-js';
 
-import { EditProfileButtons } from "./EditProfileButtons";
+import { UserSummary } from '../account/index';
+import { EditProfileButtons } from './EditProfileButtons';
 
 /**
  * Edit profile
@@ -26,7 +23,7 @@ export function EditProfile() {
   const profile = createOwnProfileResource();
 
   return (
-    <Column gap="lg">
+    <Column gap='lg'>
       <UserSummary
         user={client().user!}
         bannerUrl={profile.data?.animatedBannerURL}
@@ -37,8 +34,8 @@ export function EditProfile() {
       <CategoryButtonGroup>
         <CategoryCollapse
           icon={<MdGroups {...iconSize(22)} />}
-          title="Server Identities"
-          description="Change your profile per-server"
+          title='Server Identities'
+          description='Change your profile per-server'
           scrollable
         >
           <For each={client().servers.toList()}>
@@ -53,7 +50,7 @@ export function EditProfile() {
                 }
                 onClick={() =>
                   modalController.push({
-                    type: "server_identity",
+                    type: 'server_identity',
                     member: server.member!,
                   })
                 }
diff --git a/packages/client/components/app/interface/settings/user/profile/EditProfileButtons.tsx b/packages/client/components/app/interface/settings/user/profile/EditProfileButtons.tsx
index 230e8e64f..475cd6022 100644
--- a/packages/client/components/app/interface/settings/user/profile/EditProfileButtons.tsx
+++ b/packages/client/components/app/interface/settings/user/profile/EditProfileButtons.tsx
@@ -1,44 +1,41 @@
-import { Match, Switch } from "solid-js";
-
-import { User } from "revolt.js";
-
-import { useClient } from "@revolt/client";
-import { createOwnProfileResource } from "@revolt/client/resources";
-import { modalController } from "@revolt/modal";
+import MdBadge from '@material-design-icons/svg/outlined/badge.svg?component-solid';
+import MdCrop169 from '@material-design-icons/svg/outlined/crop_16_9.svg?component-solid';
+import MdDelete from '@material-design-icons/svg/outlined/delete.svg?component-solid';
+import MdReplaceImage from '@material-design-icons/svg/outlined/edit.svg?component-solid';
+import MdEditNote from '@material-design-icons/svg/outlined/edit_note.svg?component-solid';
+import MdImage from '@material-design-icons/svg/outlined/image.svg?component-solid';
+import { useClient } from '@revolt/client';
+import { createOwnProfileResource } from '@revolt/client/resources';
+import { modalController } from '@revolt/modal';
 import {
   CategoryButton,
   CategoryButtonGroup,
   CategoryCollapse,
   iconSize,
-} from "@revolt/ui";
-
-import MdBadge from "@material-design-icons/svg/outlined/badge.svg?component-solid";
-import MdCrop169 from "@material-design-icons/svg/outlined/crop_16_9.svg?component-solid";
-import MdDelete from "@material-design-icons/svg/outlined/delete.svg?component-solid";
-import MdReplaceImage from "@material-design-icons/svg/outlined/edit.svg?component-solid";
-import MdEditNote from "@material-design-icons/svg/outlined/edit_note.svg?component-solid";
-import MdImage from "@material-design-icons/svg/outlined/image.svg?component-solid";
+} from '@revolt/ui';
+import type { User } from 'revolt.js';
+import { Match, Switch } from 'solid-js';
 
 export function EditProfileButtons(props: { user: User }) {
   const client = useClient();
   const profile = createOwnProfileResource();
 
   function selectImage(tag: string, cb: (id: string) => void) {
-    const el = document.createElement("input");
-    el.type = "file";
-    el.accept = "image/*";
+    const el = document.createElement('input');
+    el.type = 'file';
+    el.accept = 'image/*';
 
     el.onchange = async () => {
       if (el.files) {
         const [file] = el.files;
         if (file) {
           const body = new FormData();
-          body.append("file", file);
+          body.append('file', file);
 
           const data = await fetch(
             `${client().configuration?.features.autumn.url}/${tag}`,
             {
-              method: "POST",
+              method: 'POST',
               body,
             }
           ).then((res) => res.json());
@@ -57,11 +54,11 @@ export function EditProfileButtons(props: { user: User }) {
   }
 
   function replaceAvatar() {
-    selectImage("avatars", (avatar) => props.user.edit({ avatar }));
+    selectImage('avatars', (avatar) => props.user.edit({ avatar }));
   }
 
   function replaceBanner() {
-    selectImage("backgrounds", (background) =>
+    selectImage('backgrounds', (background) =>
       props.user.edit({ profile: { background } }).then(() => profile.refetch())
     );
   }
@@ -69,12 +66,12 @@ export function EditProfileButtons(props: { user: User }) {
   return (
     <CategoryButtonGroup>
       <CategoryButton
-        description="Set a global name"
+        description='Set a global name'
         icon={<MdBadge {...iconSize(22)} />}
-        action="chevron"
+        action='chevron'
         onClick={() =>
           modalController.push({
-            type: "edit_display_name",
+            type: 'edit_display_name',
             user: props.user,
           })
         }
@@ -84,9 +81,9 @@ export function EditProfileButtons(props: { user: User }) {
       <Switch
         fallback={
           <CategoryButton
-            description="Set a profile picture"
+            description='Set a profile picture'
             icon={<MdImage {...iconSize(22)} />}
-            action="chevron"
+            action='chevron'
             onClick={replaceAvatar}
           >
             Avatar
@@ -96,22 +93,22 @@ export function EditProfileButtons(props: { user: User }) {
         <Match when={props.user.avatar}>
           <CategoryCollapse
             icon={<MdImage {...iconSize(22)} />}
-            title="Avatar"
-            description="Change or remove your profile picture"
+            title='Avatar'
+            description='Change or remove your profile picture'
           >
             <CategoryButton
-              description="Set a new picture"
+              description='Set a new picture'
               icon={<MdReplaceImage {...iconSize(22)} />}
-              action="chevron"
+              action='chevron'
               onClick={replaceAvatar}
             >
               Replace Avatar
             </CategoryButton>
             <CategoryButton
-              description="Remove your current avatar"
+              description='Remove your current avatar'
               icon={<MdDelete {...iconSize(22)} />}
-              action="chevron"
-              onClick={() => props.user.edit({ remove: ["Avatar"] })}
+              action='chevron'
+              onClick={() => props.user.edit({ remove: ['Avatar'] })}
             >
               Remove Avatar
             </CategoryButton>
@@ -121,9 +118,9 @@ export function EditProfileButtons(props: { user: User }) {
       <Switch
         fallback={
           <CategoryButton
-            description="Set a profile banner"
+            description='Set a profile banner'
             icon={<MdCrop169 {...iconSize(22)} />}
-            action="chevron"
+            action='chevron'
             onClick={replaceBanner}
           >
             Banner
@@ -133,22 +130,22 @@ export function EditProfileButtons(props: { user: User }) {
         <Match when={profile.data?.banner}>
           <CategoryCollapse
             icon={<MdCrop169 {...iconSize(22)} />}
-            title="Banner"
-            description="Change or remove your profile banner"
+            title='Banner'
+            description='Change or remove your profile banner'
           >
             <CategoryButton
-              description="Set a new banner"
+              description='Set a new banner'
               icon={<MdReplaceImage {...iconSize(22)} />}
-              action="chevron"
+              action='chevron'
               onClick={replaceBanner}
             >
               Replace Banner
             </CategoryButton>
             <CategoryButton
-              description="Remove your current banner"
+              description='Remove your current banner'
               icon={<MdDelete {...iconSize(22)} />}
-              action="chevron"
-              onClick={() => props.user.edit({ remove: ["ProfileBackground"] })}
+              action='chevron'
+              onClick={() => props.user.edit({ remove: ['ProfileBackground'] })}
             >
               Remove Banner
             </CategoryButton>
@@ -156,9 +153,9 @@ export function EditProfileButtons(props: { user: User }) {
         </Match>
       </Switch>
       <CategoryButton
-        description="Set a profile description"
+        description='Set a profile description'
         icon={<MdEditNote {...iconSize(22)} />}
-        action="chevron"
+        action='chevron'
       >
         Bio
       </CategoryButton>
diff --git a/packages/client/components/app/interface/settings/user/profile/index.ts b/packages/client/components/app/interface/settings/user/profile/index.ts
index 30d571ff9..a839133bf 100644
--- a/packages/client/components/app/interface/settings/user/profile/index.ts
+++ b/packages/client/components/app/interface/settings/user/profile/index.ts
@@ -1 +1 @@
-export * from "./EditProfile";
+export * from './EditProfile';
diff --git a/packages/client/components/app/menus/ChannelContextMenu.tsx b/packages/client/components/app/menus/ChannelContextMenu.tsx
index 9975646d6..3c94a6bd0 100644
--- a/packages/client/components/app/menus/ChannelContextMenu.tsx
+++ b/packages/client/components/app/menus/ChannelContextMenu.tsx
@@ -1,25 +1,22 @@
-import { Show } from "solid-js";
-
-import { Channel } from "revolt.js";
-
-import { getController } from "@revolt/common";
-import { useTranslation } from "@revolt/i18n";
-
-import MdBadge from "@material-design-icons/svg/outlined/badge.svg?component-solid";
-import MdDelete from "@material-design-icons/svg/outlined/delete.svg?component-solid";
-import MdGroupAdd from "@material-design-icons/svg/outlined/group_add.svg?component-solid";
-import MdLibraryAdd from "@material-design-icons/svg/outlined/library_add.svg?component-solid";
-import MdLogout from "@material-design-icons/svg/outlined/logout.svg?component-solid";
-import MdMarkChatRead from "@material-design-icons/svg/outlined/mark_chat_read.svg?component-solid";
-import MdSettings from "@material-design-icons/svg/outlined/settings.svg?component-solid";
-import MdShare from "@material-design-icons/svg/outlined/share.svg?component-solid";
-import MdShield from "@material-design-icons/svg/outlined/shield.svg?component-solid";
+import MdBadge from '@material-design-icons/svg/outlined/badge.svg?component-solid';
+import MdDelete from '@material-design-icons/svg/outlined/delete.svg?component-solid';
+import MdGroupAdd from '@material-design-icons/svg/outlined/group_add.svg?component-solid';
+import MdLibraryAdd from '@material-design-icons/svg/outlined/library_add.svg?component-solid';
+import MdLogout from '@material-design-icons/svg/outlined/logout.svg?component-solid';
+import MdMarkChatRead from '@material-design-icons/svg/outlined/mark_chat_read.svg?component-solid';
+import MdSettings from '@material-design-icons/svg/outlined/settings.svg?component-solid';
+import MdShare from '@material-design-icons/svg/outlined/share.svg?component-solid';
+import MdShield from '@material-design-icons/svg/outlined/shield.svg?component-solid';
+import { getController } from '@revolt/common';
+import { useTranslation } from '@revolt/i18n';
+import type { Channel } from 'revolt.js';
+import { Show } from 'solid-js';
 
 import {
   ContextMenu,
   ContextMenuButton,
   ContextMenuDivider,
-} from "./ContextMenu";
+} from './ContextMenu';
 
 /**
  * Context menu for channels
@@ -38,8 +35,8 @@ export function ChannelContextMenu(props: { channel: Channel }) {
    * Create a new invite
    */
   function createInvite() {
-    getController("modal").push({
-      type: "create_invite",
+    getController('modal').push({
+      type: 'create_invite',
       channel: props.channel,
     });
   }
@@ -48,8 +45,8 @@ export function ChannelContextMenu(props: { channel: Channel }) {
    * Create a new channel
    */
   function createChannel() {
-    getController("modal").push({
-      type: "create_channel",
+    getController('modal').push({
+      type: 'create_channel',
       server: props.channel.server!,
     });
   }
@@ -58,9 +55,9 @@ export function ChannelContextMenu(props: { channel: Channel }) {
    * Edit channel
    */
   function editChannel() {
-    getController("modal").push({
-      type: "settings",
-      config: "channel",
+    getController('modal').push({
+      type: 'settings',
+      config: 'channel',
       context: props.channel,
     });
   }
@@ -69,8 +66,8 @@ export function ChannelContextMenu(props: { channel: Channel }) {
    * Delete channel
    */
   function deleteChannel() {
-    getController("modal").push({
-      type: "delete_channel",
+    getController('modal').push({
+      type: 'delete_channel',
       channel: props.channel,
     });
   }
@@ -81,7 +78,7 @@ export function ChannelContextMenu(props: { channel: Channel }) {
   function openAdminPanel() {
     window.open(
       `https://admin.revolt.chat/panel/inspect/channel/${props.channel.id}`,
-      "_blank"
+      '_blank'
     );
   }
 
@@ -91,7 +88,7 @@ export function ChannelContextMenu(props: { channel: Channel }) {
   function copyLink() {
     navigator.clipboard.writeText(
       `${location.origin}${
-        props.channel.server ? `/server/${props.channel.server?.id}` : ""
+        props.channel.server ? `/server/${props.channel.server?.id}` : ''
       }/channel/${props.channel.id}`
     );
   }
@@ -107,48 +104,48 @@ export function ChannelContextMenu(props: { channel: Channel }) {
     <ContextMenu>
       <Show
         when={
-          props.channel.unread || props.channel.havePermission("InviteOthers")
+          props.channel.unread || props.channel.havePermission('InviteOthers')
         }
       >
         <Show when={props.channel.unread}>
           <ContextMenuButton icon={MdMarkChatRead} onClick={markAsRead}>
-            {t("app.context_menu.mark_as_read")}
+            {t('app.context_menu.mark_as_read')}
           </ContextMenuButton>
         </Show>
-        <Show when={props.channel.havePermission("InviteOthers")}>
+        <Show when={props.channel.havePermission('InviteOthers')}>
           <ContextMenuButton icon={MdGroupAdd} onClick={createInvite}>
-            {t("app.context_menu.create_invite")}
+            {t('app.context_menu.create_invite')}
           </ContextMenuButton>
         </Show>
         <ContextMenuDivider />
       </Show>
 
-      <Show when={props.channel.server?.havePermission("ManageChannel")}>
+      <Show when={props.channel.server?.havePermission('ManageChannel')}>
         <ContextMenuButton icon={MdLibraryAdd} onClick={createChannel}>
-          {t("app.context_menu.create_channel")}
+          {t('app.context_menu.create_channel')}
         </ContextMenuButton>
       </Show>
-      <Show when={props.channel.havePermission("ManageChannel")}>
+      <Show when={props.channel.havePermission('ManageChannel')}>
         <ContextMenuButton icon={MdSettings} onClick={editChannel}>
-          {t("app.context_menu.open_channel_settings")}
+          {t('app.context_menu.open_channel_settings')}
         </ContextMenuButton>
         <ContextMenuButton
-          icon={props.channel.type === "Group" ? MdLogout : MdDelete}
+          icon={props.channel.type === 'Group' ? MdLogout : MdDelete}
           onClick={deleteChannel}
           destructive
         >
           {t(
-            props.channel.type === "Group"
-              ? "app.context_menu.leave_group"
-              : "app.context_menu.delete_channel"
+            props.channel.type === 'Group'
+              ? 'app.context_menu.leave_group'
+              : 'app.context_menu.delete_channel'
           )}
         </ContextMenuButton>
       </Show>
 
       <Show
         when={
-          props.channel.server?.havePermission("ManageChannel") ||
-          props.channel.havePermission("ManageChannel")
+          props.channel.server?.havePermission('ManageChannel') ||
+          props.channel.havePermission('ManageChannel')
         }
       >
         <ContextMenuDivider />
@@ -158,10 +155,10 @@ export function ChannelContextMenu(props: { channel: Channel }) {
         Admin Panel
       </ContextMenuButton>
       <ContextMenuButton icon={MdShare} onClick={copyLink}>
-        {t("app.context_menu.copy_link")}
+        {t('app.context_menu.copy_link')}
       </ContextMenuButton>
       <ContextMenuButton icon={MdBadge} onClick={copyId}>
-        {t("app.context_menu.copy_cid")}
+        {t('app.context_menu.copy_cid')}
       </ContextMenuButton>
     </ContextMenu>
   );
diff --git a/packages/client/components/app/menus/ContextMenu.tsx b/packages/client/components/app/menus/ContextMenu.tsx
index 9edac6ffc..f60bb6e44 100644
--- a/packages/client/components/app/menus/ContextMenu.tsx
+++ b/packages/client/components/app/menus/ContextMenu.tsx
@@ -1,6 +1,6 @@
-import { Component, ComponentProps, JSX, splitProps } from "solid-js";
-
-import { iconSize, styled } from "@revolt/ui";
+import { iconSize, styled } from '@revolt/ui';
+import type { Component, ComponentProps, JSX } from 'solid-js';
+import { splitProps } from 'solid-js';
 
 export const ContextMenu = styled.div`
   display: flex;
@@ -10,29 +10,29 @@ export const ContextMenu = styled.div`
   overflow: hidden;
   border-radius: ${(props) => props.theme!.borderRadius.md};
   background: ${(props) =>
-    props.theme!.colours["component-context-menu-background"]};
+    props.theme!.colours['component-context-menu-background']};
   color: ${(props) =>
-    props.theme!.colours["component-context-menu-foreground"]};
-  fill: ${(props) => props.theme!.colours["component-context-menu-foreground"]};
+    props.theme!.colours['component-context-menu-foreground']};
+  fill: ${(props) => props.theme!.colours['component-context-menu-foreground']};
 
   box-shadow: 0 0 3px
-    ${(props) => props.theme!.colours["component-context-menu-shadow"]};
+    ${(props) => props.theme!.colours['component-context-menu-shadow']};
 `;
 
 export const ContextMenuDivider = styled.div`
   height: 1px;
   margin: ${(props) => props.theme!.gap.sm} 0;
   background: ${(props) =>
-    props.theme!.colours["component-context-menu-divider"]};
+    props.theme!.colours['component-context-menu-divider']};
 `;
 
-export const ContextMenuItem = styled("a", "MenuItem")`
+export const ContextMenuItem = styled('a', 'MenuItem')`
   display: block;
   padding: ${(props) => props.theme!.gap.md} ${(props) => props.theme!.gap.lg};
 
   &:hover {
     background: ${(props) =>
-      props.theme!.colours["component-context-menu-item-hover-background"]};
+      props.theme!.colours['component-context-menu-item-hover-background']};
   }
 `;
 
@@ -52,7 +52,7 @@ const ButtonBase = styled(ContextMenuItem)<{ destructive?: boolean }>`
       ? `fill: ${props.theme!.customColours.error.color}; color: ${
           props.theme!.customColours.error.color
         };`
-      : ""}
+      : ''}
 `;
 
 type ButtonProps = ComponentProps<typeof ContextMenuItem> & {
@@ -61,11 +61,11 @@ type ButtonProps = ComponentProps<typeof ContextMenuItem> & {
 };
 
 export function ContextMenuButton(props: ButtonProps) {
-  const [local, remote] = splitProps(props, ["icon", "children"]);
+  const [local, remote] = splitProps(props, ['icon', 'children']);
 
   return (
     <ButtonBase {...remote}>
-      {local.icon?.(iconSize("1.2em"))}
+      {local.icon?.(iconSize('1.2em'))}
       <span>{local.children}</span>
     </ButtonBase>
   );
diff --git a/packages/client/components/app/menus/DraftMessageContextMenu.tsx b/packages/client/components/app/menus/DraftMessageContextMenu.tsx
index 1a6025357..898e9fb59 100644
--- a/packages/client/components/app/menus/DraftMessageContextMenu.tsx
+++ b/packages/client/components/app/menus/DraftMessageContextMenu.tsx
@@ -1,17 +1,14 @@
-import { Show } from "solid-js";
+import MdClose from '@material-design-icons/svg/outlined/close.svg?component-solid';
+import MdDelete from '@material-design-icons/svg/outlined/delete.svg?component-solid';
+import MdRefresh from '@material-design-icons/svg/outlined/refresh.svg?component-solid';
+import { useClient } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
+import { state } from '@revolt/state';
+import type { UnsentMessage } from '@revolt/state/stores/Draft';
+import type { Channel } from 'revolt.js';
+import { Show } from 'solid-js';
 
-import { Channel } from "revolt.js";
-
-import { useClient } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
-import { state } from "@revolt/state";
-import { UnsentMessage } from "@revolt/state/stores/Draft";
-
-import MdClose from "@material-design-icons/svg/outlined/close.svg?component-solid";
-import MdDelete from "@material-design-icons/svg/outlined/delete.svg?component-solid";
-import MdRefresh from "@material-design-icons/svg/outlined/refresh.svg?component-solid";
-
-import { ContextMenu, ContextMenuButton } from "./ContextMenu";
+import { ContextMenu, ContextMenuButton } from './ContextMenu';
 
 interface Props {
   draft: UnsentMessage;
@@ -40,27 +37,27 @@ export function DraftMessageContextMenu(props: Props) {
   }
 
   return (
-    <Show when={props.draft.status !== "sending"}>
+    <Show when={props.draft.status !== 'sending'}>
       <ContextMenu>
         <Show when={false}>
           <ContextMenuButton icon={MdClose} onClick={deleteMessage} destructive>
-            {t("app.context_menu.cancel_message")}
+            {t('app.context_menu.cancel_message')}
           </ContextMenuButton>
         </Show>
         <Show
           when={
-            props.draft.status === "failed" || props.draft.status === "unsent"
+            props.draft.status === 'failed' || props.draft.status === 'unsent'
           }
         >
           <ContextMenuButton icon={MdRefresh} onClick={retrySend}>
-            {t("app.context_menu.retry_message")}
+            {t('app.context_menu.retry_message')}
           </ContextMenuButton>
           <ContextMenuButton
             icon={MdDelete}
             onClick={deleteMessage}
             destructive
           >
-            {t("app.context_menu.delete_message")}
+            {t('app.context_menu.delete_message')}
           </ContextMenuButton>
         </Show>
       </ContextMenu>
diff --git a/packages/client/components/app/menus/MessageContextMenu.tsx b/packages/client/components/app/menus/MessageContextMenu.tsx
index f6cb0c67f..43abe244e 100644
--- a/packages/client/components/app/menus/MessageContextMenu.tsx
+++ b/packages/client/components/app/menus/MessageContextMenu.tsx
@@ -1,26 +1,23 @@
-import { Show } from "solid-js";
-
-import { Message } from "revolt.js";
-
-import { useClient, useUser } from "@revolt/client";
-import { getController } from "@revolt/common";
-import { useTranslation } from "@revolt/i18n";
-import { state } from "@revolt/state";
-
-import MdBadge from "@material-design-icons/svg/outlined/badge.svg?component-solid";
-import MdContentCopy from "@material-design-icons/svg/outlined/content_copy.svg?component-solid";
-import MdDelete from "@material-design-icons/svg/outlined/delete.svg?component-solid";
-import MdMarkChatUnread from "@material-design-icons/svg/outlined/mark_chat_unread.svg?component-solid";
-import MdReply from "@material-design-icons/svg/outlined/reply.svg?component-solid";
-import MdReport from "@material-design-icons/svg/outlined/report.svg?component-solid";
-import MdShare from "@material-design-icons/svg/outlined/share.svg?component-solid";
-import MdShield from "@material-design-icons/svg/outlined/shield.svg?component-solid";
+import MdBadge from '@material-design-icons/svg/outlined/badge.svg?component-solid';
+import MdContentCopy from '@material-design-icons/svg/outlined/content_copy.svg?component-solid';
+import MdDelete from '@material-design-icons/svg/outlined/delete.svg?component-solid';
+import MdMarkChatUnread from '@material-design-icons/svg/outlined/mark_chat_unread.svg?component-solid';
+import MdReply from '@material-design-icons/svg/outlined/reply.svg?component-solid';
+import MdReport from '@material-design-icons/svg/outlined/report.svg?component-solid';
+import MdShare from '@material-design-icons/svg/outlined/share.svg?component-solid';
+import MdShield from '@material-design-icons/svg/outlined/shield.svg?component-solid';
+import { useClient, useUser } from '@revolt/client';
+import { getController } from '@revolt/common';
+import { useTranslation } from '@revolt/i18n';
+import { state } from '@revolt/state';
+import type { Message } from 'revolt.js';
+import { Show } from 'solid-js';
 
 import {
   ContextMenu,
   ContextMenuButton,
   ContextMenuDivider,
-} from "./ContextMenu";
+} from './ContextMenu';
 
 /**
  * Context menu for messages
@@ -55,8 +52,8 @@ export function MessageContextMenu(props: { message: Message }) {
    * Report the message
    */
   function report() {
-    getController("modal").push({
-      type: "report_content",
+    getController('modal').push({
+      type: 'report_content',
       target: props.message,
       client: client(),
     });
@@ -69,8 +66,8 @@ export function MessageContextMenu(props: { message: Message }) {
     if (ev.shiftKey) {
       props.message.delete();
     } else {
-      getController("modal").push({
-        type: "delete_message",
+      getController('modal').push({
+        type: 'delete_message',
         message: props.message,
       });
     }
@@ -82,7 +79,7 @@ export function MessageContextMenu(props: { message: Message }) {
   function openAdminPanel() {
     window.open(
       `https://admin.revolt.chat/panel/inspect/message/${props.message.id}`,
-      "_blank"
+      '_blank'
     );
   }
 
@@ -92,7 +89,7 @@ export function MessageContextMenu(props: { message: Message }) {
   function copyLink() {
     navigator.clipboard.writeText(
       `${location.origin}${
-        props.message.server ? `/server/${props.message.server?.id}` : ""
+        props.message.server ? `/server/${props.message.server?.id}` : ''
       }/channel/${props.message.channelId}/${props.message.id}`
     );
   }
@@ -107,28 +104,28 @@ export function MessageContextMenu(props: { message: Message }) {
   return (
     <ContextMenu>
       <ContextMenuButton icon={MdReply} onClick={reply}>
-        {t("app.context_menu.reply_message")}
+        {t('app.context_menu.reply_message')}
       </ContextMenuButton>
       <ContextMenuButton icon={MdMarkChatUnread} onClick={markAsUnread}>
-        {t("app.context_menu.mark_unread")}
+        {t('app.context_menu.mark_unread')}
       </ContextMenuButton>
       <ContextMenuButton icon={MdContentCopy} onClick={copyText}>
-        {t("app.context_menu.copy_text")}
+        {t('app.context_menu.copy_text')}
       </ContextMenuButton>
       <ContextMenuDivider />
       <Show when={!props.message.author?.self}>
         <ContextMenuButton icon={MdReport} onClick={report} destructive>
-          {t("app.context_menu.report_message")}
+          {t('app.context_menu.report_message')}
         </ContextMenuButton>
       </Show>
       <Show
         when={
           props.message.author?.self ||
-          props.message.channel?.havePermission("ManageMessages")
+          props.message.channel?.havePermission('ManageMessages')
         }
       >
         <ContextMenuButton icon={MdDelete} onClick={deleteMessage} destructive>
-          {t("app.context_menu.delete_message")}
+          {t('app.context_menu.delete_message')}
         </ContextMenuButton>
       </Show>
       <ContextMenuDivider />
@@ -136,10 +133,10 @@ export function MessageContextMenu(props: { message: Message }) {
         Admin Panel
       </ContextMenuButton>
       <ContextMenuButton icon={MdShare} onClick={copyLink}>
-        {t("app.context_menu.copy_link")}
+        {t('app.context_menu.copy_link')}
       </ContextMenuButton>
       <ContextMenuButton icon={MdBadge} onClick={copyId}>
-        {t("app.context_menu.copy_mid")}
+        {t('app.context_menu.copy_mid')}
       </ContextMenuButton>
     </ContextMenu>
   );
diff --git a/packages/client/components/app/menus/ServerContextMenu.tsx b/packages/client/components/app/menus/ServerContextMenu.tsx
index 45fd8dd47..3b839a1de 100644
--- a/packages/client/components/app/menus/ServerContextMenu.tsx
+++ b/packages/client/components/app/menus/ServerContextMenu.tsx
@@ -1,25 +1,22 @@
-import { Show } from "solid-js";
-
-import { Server } from "revolt.js";
-
-import { useClient } from "@revolt/client";
-import { getController } from "@revolt/common";
-import { useTranslation } from "@revolt/i18n";
-
-import MdBadge from "@material-design-icons/svg/outlined/badge.svg?component-solid";
-import MdFace from "@material-design-icons/svg/outlined/face.svg?component-solid";
-import MdLogout from "@material-design-icons/svg/outlined/logout.svg?component-solid";
-import MdMarkChatRead from "@material-design-icons/svg/outlined/mark_chat_read.svg?component-solid";
-import MdPersonAdd from "@material-design-icons/svg/outlined/person_add.svg?component-solid";
-import MdReport from "@material-design-icons/svg/outlined/report.svg?component-solid";
-import MdSettings from "@material-design-icons/svg/outlined/settings.svg?component-solid";
-import MdShield from "@material-design-icons/svg/outlined/shield.svg?component-solid";
+import MdBadge from '@material-design-icons/svg/outlined/badge.svg?component-solid';
+import MdFace from '@material-design-icons/svg/outlined/face.svg?component-solid';
+import MdLogout from '@material-design-icons/svg/outlined/logout.svg?component-solid';
+import MdMarkChatRead from '@material-design-icons/svg/outlined/mark_chat_read.svg?component-solid';
+import MdPersonAdd from '@material-design-icons/svg/outlined/person_add.svg?component-solid';
+import MdReport from '@material-design-icons/svg/outlined/report.svg?component-solid';
+import MdSettings from '@material-design-icons/svg/outlined/settings.svg?component-solid';
+import MdShield from '@material-design-icons/svg/outlined/shield.svg?component-solid';
+import { useClient } from '@revolt/client';
+import { getController } from '@revolt/common';
+import { useTranslation } from '@revolt/i18n';
+import type { Server } from 'revolt.js';
+import { Show } from 'solid-js';
 
 import {
   ContextMenu,
   ContextMenuButton,
   ContextMenuDivider,
-} from "./ContextMenu";
+} from './ContextMenu';
 
 /**
  * Context menu for servers
@@ -43,13 +40,13 @@ export function ServerContextMenu(props: { server: Server }) {
     const channel = props.server.orderedChannels
       .find((category) =>
         category.channels.find((channel) =>
-          channel.havePermission("InviteOthers")
+          channel.havePermission('InviteOthers')
         )
       )!
-      .channels.find((channel) => channel.havePermission("InviteOthers"))!;
+      .channels.find((channel) => channel.havePermission('InviteOthers'))!;
 
-    getController("modal").push({
-      type: "create_invite",
+    getController('modal').push({
+      type: 'create_invite',
       channel,
     });
   }
@@ -58,8 +55,8 @@ export function ServerContextMenu(props: { server: Server }) {
    * Open server settings
    */
   function editIdentity() {
-    getController("modal").push({
-      type: "server_identity",
+    getController('modal').push({
+      type: 'server_identity',
       member: props.server.member!,
     });
   }
@@ -68,9 +65,9 @@ export function ServerContextMenu(props: { server: Server }) {
    * Open server settings
    */
   function openSettings() {
-    getController("modal").push({
-      type: "settings",
-      config: "server",
+    getController('modal').push({
+      type: 'settings',
+      config: 'server',
       context: props.server,
     });
   }
@@ -79,8 +76,8 @@ export function ServerContextMenu(props: { server: Server }) {
    * Report the server
    */
   function report() {
-    getController("modal").push({
-      type: "report_content",
+    getController('modal').push({
+      type: 'report_content',
       target: props.server,
       client: client(),
     });
@@ -90,8 +87,8 @@ export function ServerContextMenu(props: { server: Server }) {
    * Leave the server
    */
   function leave() {
-    getController("modal").push({
-      type: "leave_server",
+    getController('modal').push({
+      type: 'leave_server',
       server: props.server,
     });
   }
@@ -102,7 +99,7 @@ export function ServerContextMenu(props: { server: Server }) {
   function openAdminPanel() {
     window.open(
       `https://admin.revolt.chat/panel/inspect/server/${props.server.id}`,
-      "_blank"
+      '_blank'
     );
   }
 
@@ -118,54 +115,54 @@ export function ServerContextMenu(props: { server: Server }) {
    */
   const permissionInviteOthers = () =>
     props.server.channels.find((channel) =>
-      channel.havePermission("InviteOthers")
+      channel.havePermission('InviteOthers')
     );
 
   /**
    * Determine whether we can edit our identity
    */
   const permissionEditIdentity = () =>
-    props.server.havePermission("ChangeNickname") ||
-    props.server.havePermission("ChangeAvatar");
+    props.server.havePermission('ChangeNickname') ||
+    props.server.havePermission('ChangeAvatar');
 
   /**
    * Determine whether we can access settings
    */
   const permissionServerSettings = () =>
     props.server.owner?.self ||
-    props.server.havePermission("AssignRoles") ||
-    props.server.havePermission("BanMembers") ||
-    props.server.havePermission("KickMembers") ||
-    props.server.havePermission("ManageChannel") ||
-    props.server.havePermission("ManageCustomisation") ||
-    props.server.havePermission("ManageNicknames") ||
-    props.server.havePermission("ManagePermissions") ||
-    props.server.havePermission("ManageRole") ||
-    props.server.havePermission("ManageServer") ||
-    props.server.havePermission("ManageWebhooks");
+    props.server.havePermission('AssignRoles') ||
+    props.server.havePermission('BanMembers') ||
+    props.server.havePermission('KickMembers') ||
+    props.server.havePermission('ManageChannel') ||
+    props.server.havePermission('ManageCustomisation') ||
+    props.server.havePermission('ManageNicknames') ||
+    props.server.havePermission('ManagePermissions') ||
+    props.server.havePermission('ManageRole') ||
+    props.server.havePermission('ManageServer') ||
+    props.server.havePermission('ManageWebhooks');
 
   return (
     <ContextMenu>
       <Show when={props.server.unread}>
         <ContextMenuButton icon={MdMarkChatRead} onClick={markAsRead}>
-          {t("app.context_menu.mark_as_read")}
+          {t('app.context_menu.mark_as_read')}
         </ContextMenuButton>
         <ContextMenuDivider />
       </Show>
 
       <Show when={permissionInviteOthers()}>
         <ContextMenuButton icon={MdPersonAdd} onClick={createInvite}>
-          {t("app.context_menu.create_invite")}
+          {t('app.context_menu.create_invite')}
         </ContextMenuButton>
       </Show>
       <Show when={permissionEditIdentity()}>
         <ContextMenuButton icon={MdFace} onClick={editIdentity}>
-          {t("app.context_menu.edit_your_identity")}
+          {t('app.context_menu.edit_your_identity')}
         </ContextMenuButton>
       </Show>
       <Show when={permissionServerSettings()}>
         <ContextMenuButton icon={MdSettings} onClick={openSettings}>
-          {t("app.context_menu.open_server_settings")}
+          {t('app.context_menu.open_server_settings')}
         </ContextMenuButton>
       </Show>
       <Show
@@ -179,11 +176,11 @@ export function ServerContextMenu(props: { server: Server }) {
       </Show>
 
       <ContextMenuButton icon={MdReport} onClick={report} destructive>
-        {t("app.context_menu.report_server")}
+        {t('app.context_menu.report_server')}
       </ContextMenuButton>
       <Show when={!props.server.owner?.self}>
         <ContextMenuButton icon={MdLogout} onClick={leave} destructive>
-          {t("app.context_menu.leave_server")}
+          {t('app.context_menu.leave_server')}
         </ContextMenuButton>
       </Show>
       <ContextMenuDivider />
@@ -191,7 +188,7 @@ export function ServerContextMenu(props: { server: Server }) {
         Admin Panel
       </ContextMenuButton>
       <ContextMenuButton icon={MdBadge} onClick={copyId}>
-        {t("app.context_menu.copy_sid")}
+        {t('app.context_menu.copy_sid')}
       </ContextMenuButton>
     </ContextMenu>
   );
diff --git a/packages/client/components/app/menus/ServerSidebarContextMenu.tsx b/packages/client/components/app/menus/ServerSidebarContextMenu.tsx
index b0d837904..a5916ec03 100644
--- a/packages/client/components/app/menus/ServerSidebarContextMenu.tsx
+++ b/packages/client/components/app/menus/ServerSidebarContextMenu.tsx
@@ -1,13 +1,10 @@
-import { Show } from "solid-js";
+import MdLibraryAdd from '@material-design-icons/svg/outlined/library_add.svg?component-solid';
+import { getController } from '@revolt/common';
+import { useTranslation } from '@revolt/i18n';
+import type { Server } from 'revolt.js';
+import { Show } from 'solid-js';
 
-import { Server } from "revolt.js";
-
-import { getController } from "@revolt/common";
-import { useTranslation } from "@revolt/i18n";
-
-import MdLibraryAdd from "@material-design-icons/svg/outlined/library_add.svg?component-solid";
-
-import { ContextMenu, ContextMenuButton } from "./ContextMenu";
+import { ContextMenu, ContextMenuButton } from './ContextMenu';
 
 /**
  * Context menu for server sidebar
@@ -19,17 +16,17 @@ export function ServerSidebarContextMenu(props: { server: Server }) {
    * Create a new channel
    */
   function createChannel() {
-    getController("modal").push({
-      type: "create_channel",
+    getController('modal').push({
+      type: 'create_channel',
       server: props.server!,
     });
   }
 
   return (
     <ContextMenu>
-      <Show when={props.server?.havePermission("ManageChannel")}>
+      <Show when={props.server?.havePermission('ManageChannel')}>
         <ContextMenuButton icon={MdLibraryAdd} onClick={createChannel}>
-          {t("app.context_menu.create_channel")}
+          {t('app.context_menu.create_channel')}
         </ContextMenuButton>
       </Show>
     </ContextMenu>
diff --git a/packages/client/components/app/menus/UserContextMenu.tsx b/packages/client/components/app/menus/UserContextMenu.tsx
index 2c6dd3f90..436903f07 100644
--- a/packages/client/components/app/menus/UserContextMenu.tsx
+++ b/packages/client/components/app/menus/UserContextMenu.tsx
@@ -1,29 +1,27 @@
-import { JSX, Show } from "solid-js";
-
-import { Channel, Message, ServerMember, User } from "revolt.js";
-
-import { useClient } from "@revolt/client";
-import { getController } from "@revolt/common";
-import { useTranslation } from "@revolt/i18n";
-
-import MdAddCircleOutline from "@material-design-icons/svg/outlined/add_circle_outline.svg?component-solid";
-import MdAdminPanelSettings from "@material-design-icons/svg/outlined/admin_panel_settings.svg?component-solid";
-import MdAlternateEmail from "@material-design-icons/svg/outlined/alternate_email.svg?component-solid";
-import MdBadge from "@material-design-icons/svg/outlined/badge.svg?component-solid";
-import MdBlock from "@material-design-icons/svg/outlined/block.svg?component-solid";
-import MdCancel from "@material-design-icons/svg/outlined/cancel.svg?component-solid";
-import MdClose from "@material-design-icons/svg/outlined/close.svg?component-solid";
-import MdDoNotDisturbOn from "@material-design-icons/svg/outlined/do_not_disturb_on.svg?component-solid";
-import MdFace from "@material-design-icons/svg/outlined/face.svg?component-solid";
-import MdPersonAddAlt from "@material-design-icons/svg/outlined/person_add_alt.svg?component-solid";
-import MdPersonRemove from "@material-design-icons/svg/outlined/person_remove.svg?component-solid";
-import MdReport from "@material-design-icons/svg/outlined/report.svg?component-solid";
+import MdAddCircleOutline from '@material-design-icons/svg/outlined/add_circle_outline.svg?component-solid';
+import MdAdminPanelSettings from '@material-design-icons/svg/outlined/admin_panel_settings.svg?component-solid';
+import MdAlternateEmail from '@material-design-icons/svg/outlined/alternate_email.svg?component-solid';
+import MdBadge from '@material-design-icons/svg/outlined/badge.svg?component-solid';
+import MdBlock from '@material-design-icons/svg/outlined/block.svg?component-solid';
+import MdCancel from '@material-design-icons/svg/outlined/cancel.svg?component-solid';
+import MdClose from '@material-design-icons/svg/outlined/close.svg?component-solid';
+import MdDoNotDisturbOn from '@material-design-icons/svg/outlined/do_not_disturb_on.svg?component-solid';
+import MdFace from '@material-design-icons/svg/outlined/face.svg?component-solid';
+import MdPersonAddAlt from '@material-design-icons/svg/outlined/person_add_alt.svg?component-solid';
+import MdPersonRemove from '@material-design-icons/svg/outlined/person_remove.svg?component-solid';
+import MdReport from '@material-design-icons/svg/outlined/report.svg?component-solid';
+import { useClient } from '@revolt/client';
+import { getController } from '@revolt/common';
+import { useTranslation } from '@revolt/i18n';
+import type { Channel, Message, ServerMember, User } from 'revolt.js';
+import type { JSX } from 'solid-js';
+import { Show } from 'solid-js';
 
 import {
   ContextMenu,
   ContextMenuButton,
   ContextMenuDivider,
-} from "./ContextMenu";
+} from './ContextMenu';
 
 /**
  * Context menu for users
@@ -43,8 +41,8 @@ export function UserContextMenu(props: {
    * Delete channel
    */
   function closeDm() {
-    getController("modal").push({
-      type: "delete_channel",
+    getController('modal').push({
+      type: 'delete_channel',
       channel: props.channel!,
     });
   }
@@ -53,15 +51,15 @@ export function UserContextMenu(props: {
    * Mention the user
    */
   function mention() {
-    getController("state").draft.insertText(props.user.toString());
+    getController('state').draft.insertText(props.user.toString());
   }
 
   /**
    * Edit server identity for user
    */
   function editIdentity() {
-    getController("modal").push({
-      type: "server_identity",
+    getController('modal').push({
+      type: 'server_identity',
       member: props.member!,
     });
   }
@@ -70,8 +68,8 @@ export function UserContextMenu(props: {
    * Report the user
    */
   function reportUser() {
-    getController("modal").push({
-      type: "report_content",
+    getController('modal').push({
+      type: 'report_content',
       target: props.user!,
       client: client(),
       contextMessage: props.contextMessage,
@@ -82,8 +80,8 @@ export function UserContextMenu(props: {
    * Kick the member
    */
   function kickMember() {
-    getController("modal").push({
-      type: "kick_member",
+    getController('modal').push({
+      type: 'kick_member',
       member: props.member!,
     });
   }
@@ -92,8 +90,8 @@ export function UserContextMenu(props: {
    * Ban the member
    */
   function banMember() {
-    getController("modal").push({
-      type: "ban_member",
+    getController('modal').push({
+      type: 'ban_member',
       member: props.member!,
     });
   }
@@ -132,7 +130,7 @@ export function UserContextMenu(props: {
   function openAdminPanel() {
     window.open(
       `https://admin.revolt.chat/panel/inspect/user/${props.user.id}`,
-      "_blank"
+      '_blank'
     );
   }
 
@@ -147,12 +145,12 @@ export function UserContextMenu(props: {
     <ContextMenu>
       <Show when={props.channel}>
         <ContextMenuButton icon={MdClose} onClick={closeDm}>
-          {t("app.context_menu.close_dm")}
+          {t('app.context_menu.close_dm')}
         </ContextMenuButton>
       </Show>
       <Show when={!props.channel}>
         <ContextMenuButton icon={MdAlternateEmail} onClick={mention}>
-          {t("app.context_menu.mention")}
+          {t('app.context_menu.mention')}
         </ContextMenuButton>
       </Show>
       <ContextMenuDivider />
@@ -161,17 +159,17 @@ export function UserContextMenu(props: {
         when={
           props.member &&
           (props.user.self
-            ? props.member!.server!.havePermission("ChangeNickname") ||
-              props.member!.server!.havePermission("ChangeAvatar")
-            : (props.member!.server!.havePermission("ManageNicknames") ||
-                props.member!.server!.havePermission("RemoveAvatars")) &&
+            ? props.member!.server!.havePermission('ChangeNickname') ||
+              props.member!.server!.havePermission('ChangeAvatar')
+            : (props.member!.server!.havePermission('ManageNicknames') ||
+                props.member!.server!.havePermission('RemoveAvatars')) &&
               props.member!.inferiorTo(props.member!.server!.member!))
         }
       >
         <ContextMenuButton icon={MdFace} onClick={editIdentity}>
           {t(
             `app.context_menu.${
-              props.user.self ? "edit_your_identity" : "edit_identity"
+              props.user.self ? 'edit_your_identity' : 'edit_identity'
             }`
           )}
         </ContextMenuButton>
@@ -181,7 +179,7 @@ export function UserContextMenu(props: {
         <Show
           when={
             !props.user.self &&
-            props.member?.server?.havePermission("KickMembers") &&
+            props.member?.server?.havePermission('KickMembers') &&
             props.member.inferiorTo(props.member.server.member!)
           }
         >
@@ -190,13 +188,13 @@ export function UserContextMenu(props: {
             onClick={kickMember}
             destructive
           >
-            {t("app.context_menu.kick_member")}
+            {t('app.context_menu.kick_member')}
           </ContextMenuButton>
         </Show>
         <Show
           when={
             !props.user.self &&
-            props.member?.server?.havePermission("BanMembers") &&
+            props.member?.server?.havePermission('BanMembers') &&
             props.member.inferiorTo(props.member.server.member!)
           }
         >
@@ -205,7 +203,7 @@ export function UserContextMenu(props: {
             onClick={banMember}
             destructive
           >
-            {t("app.context_menu.ban_member")}
+            {t('app.context_menu.ban_member')}
           </ContextMenuButton>
         </Show>
       </Show>
@@ -215,42 +213,42 @@ export function UserContextMenu(props: {
 
       <Show when={!props.user.self}>
         <ContextMenuButton icon={MdReport} onClick={reportUser} destructive>
-          {t("app.context_menu.report_user")}
+          {t('app.context_menu.report_user')}
         </ContextMenuButton>
         {/* TODO: #286 show profile / message */}
-        <Show when={props.user.relationship === "None" && !props.user.bot}>
+        <Show when={props.user.relationship === 'None' && !props.user.bot}>
           <ContextMenuButton icon={MdPersonAddAlt} onClick={addFriend}>
-            {t("app.context_menu.add_friend")}
+            {t('app.context_menu.add_friend')}
           </ContextMenuButton>
         </Show>
-        <Show when={props.user.relationship === "Friend"}>
+        <Show when={props.user.relationship === 'Friend'}>
           <ContextMenuButton icon={MdPersonRemove} onClick={removeFriend}>
-            {t("app.context_menu.remove_friend")}
+            {t('app.context_menu.remove_friend')}
           </ContextMenuButton>
         </Show>
-        <Show when={props.user.relationship === "Incoming"}>
+        <Show when={props.user.relationship === 'Incoming'}>
           <ContextMenuButton icon={MdPersonAddAlt} onClick={addFriend}>
-            {t("app.context_menu.accept_friend")}
+            {t('app.context_menu.accept_friend')}
           </ContextMenuButton>
         </Show>
-        <Show when={props.user.relationship === "Incoming"}>
+        <Show when={props.user.relationship === 'Incoming'}>
           <ContextMenuButton icon={MdCancel} onClick={removeFriend}>
-            {t("app.context_menu.reject_friend")}
+            {t('app.context_menu.reject_friend')}
           </ContextMenuButton>
         </Show>
-        <Show when={props.user.relationship === "Outgoing"}>
+        <Show when={props.user.relationship === 'Outgoing'}>
           <ContextMenuButton icon={MdCancel} onClick={removeFriend}>
-            {t("app.context_menu.cancel_friend")}
+            {t('app.context_menu.cancel_friend')}
           </ContextMenuButton>
         </Show>
-        <Show when={props.user.relationship !== "Blocked"}>
+        <Show when={props.user.relationship !== 'Blocked'}>
           <ContextMenuButton icon={MdBlock} onClick={blockUser}>
-            {t("app.context_menu.block_user")}
+            {t('app.context_menu.block_user')}
           </ContextMenuButton>
         </Show>
-        <Show when={props.user.relationship === "Blocked"}>
+        <Show when={props.user.relationship === 'Blocked'}>
           <ContextMenuButton icon={MdAddCircleOutline} onClick={unblockUser}>
-            {t("app.context_menu.unblock_user")}
+            {t('app.context_menu.unblock_user')}
           </ContextMenuButton>
         </Show>
         <ContextMenuDivider />
@@ -260,7 +258,7 @@ export function UserContextMenu(props: {
         Admin Panel
       </ContextMenuButton>
       <ContextMenuButton icon={MdBadge} onClick={copyId}>
-        {t("app.context_menu.copy_uid")}
+        {t('app.context_menu.copy_uid')}
       </ContextMenuButton>
     </ContextMenu>
   );
@@ -275,7 +273,7 @@ export function floatingUserMenus(
   user: User,
   member?: ServerMember,
   contextMessage?: Message
-): JSX.Directives["floating"] & object {
+): JSX.Directives['floating'] & object {
   return {
     userCard: {
       user,
diff --git a/packages/client/components/app/menus/index.tsx b/packages/client/components/app/menus/index.tsx
index e25bf8f50..6110f9b58 100644
--- a/packages/client/components/app/menus/index.tsx
+++ b/packages/client/components/app/menus/index.tsx
@@ -1,5 +1,5 @@
-export { MessageContextMenu } from "./MessageContextMenu";
-export { UserContextMenu } from "./UserContextMenu";
-export { ServerContextMenu } from "./ServerContextMenu";
-export { ChannelContextMenu } from "./ChannelContextMenu";
-export { ServerSidebarContextMenu } from "./ServerSidebarContextMenu";
+export { ChannelContextMenu } from './ChannelContextMenu';
+export { MessageContextMenu } from './MessageContextMenu';
+export { ServerContextMenu } from './ServerContextMenu';
+export { ServerSidebarContextMenu } from './ServerSidebarContextMenu';
+export { UserContextMenu } from './UserContextMenu';
diff --git a/packages/client/components/auth/index.tsx b/packages/client/components/auth/index.tsx
index 66bc7085e..48277fbd3 100644
--- a/packages/client/components/auth/index.tsx
+++ b/packages/client/components/auth/index.tsx
@@ -1,3 +1,3 @@
-import "../ui/styled.d.ts";
+import '../ui/styled.d.ts';
 
-export { AuthPage } from "./src/AuthPage";
+export { AuthPage } from './src/AuthPage';
diff --git a/packages/client/components/auth/src/AuthPage.tsx b/packages/client/components/auth/src/AuthPage.tsx
index 9e6bc9421..eb1293a8a 100644
--- a/packages/client/components/auth/src/AuthPage.tsx
+++ b/packages/client/components/auth/src/AuthPage.tsx
@@ -1,41 +1,37 @@
-import { BiLogosGithub, BiLogosMastodon, BiLogosTwitter } from "solid-icons/bi";
-import { JSX } from "solid-js";
-
-import { styled } from "styled-system/jsx";
-
-import { useTranslation } from "@revolt/i18n";
-import { Button, iconSize } from "@revolt/ui";
-
-import MdDarkMode from "@material-design-icons/svg/filled/dark_mode.svg?component-solid";
-
-import background from "./background.jpg";
-import { FlowBase } from "./flows/Flow";
-
+import MdDarkMode from '@material-design-icons/svg/filled/dark_mode.svg?component-solid';
+import { useTranslation } from '@revolt/i18n';
+import { Button, iconSize } from '@revolt/ui';
+import { BiLogosGithub, BiLogosMastodon, BiLogosTwitter } from 'solid-icons/bi';
+import type { JSX } from 'solid-js';
+import { styled } from 'styled-system/jsx';
+
+import background from './background.jpg';
+import { FlowBase } from './flows/Flow';
 /**
  * Authentication page layout
  */
-const Base = styled("div", {
+const Base = styled('div', {
   base: {
-    width: "100%",
-    height: "100%",
-    padding: "40px 35px",
+    width: '100%',
+    height: '100%',
+    padding: '40px 35px',
 
-    userSelect: "none",
-    overflowY: "scroll",
+    userSelect: 'none',
+    overflowY: 'scroll',
 
-    color: "white",
+    color: 'white',
     background: `var(--url)`,
-    backgroundPosition: "center",
-    backgroundRepeat: "no-repeat",
-    backgroundSize: "cover",
+    backgroundPosition: 'center',
+    backgroundRepeat: 'no-repeat',
+    backgroundSize: 'cover',
 
-    display: "flex",
-    flexDirection: "column",
-    justifyContent: "space-between",
+    display: 'flex',
+    flexDirection: 'column',
+    justifyContent: 'space-between',
 
     mdDown: {
-      padding: "30px 20px",
-      background: "var(--colours-background)",
+      padding: '30px 20px',
+      background: 'var(--colours-background)',
     },
   },
 });
@@ -43,19 +39,19 @@ const Base = styled("div", {
 /**
  * Top and bottom navigation bars
  */
-const Nav = styled("div", {
+const Nav = styled('div', {
   base: {
-    height: "32px",
-    display: "flex",
-    alignItems: "center",
-    flexDirection: "row",
-    justifyContent: "space-between",
+    height: '32px',
+    display: 'flex',
+    alignItems: 'center',
+    flexDirection: 'row',
+    justifyContent: 'space-between',
 
-    color: "white",
-    textDecoration: "none",
+    color: 'white',
+    textDecoration: 'none',
 
     mdDown: {
-      color: "var(--colours-foreground)",
+      color: 'var(--colours-foreground)',
     },
   },
 });
@@ -65,51 +61,51 @@ const Nav = styled("div", {
  */
 const NavItems = styled(`div`, {
   base: {
-    gap: "10px",
-    display: "flex",
-    alignItems: "center",
+    gap: '10px',
+    display: 'flex',
+    alignItems: 'center',
 
-    fontSize: "0.9em",
+    fontSize: '0.9em',
   },
   variants: {
     variant: {
       default: {},
       stack: {
         mdDown: {
-          flexDirection: "column",
+          flexDirection: 'column',
         },
       },
       hide: {
         mdDown: {
-          display: "none",
+          display: 'none',
         },
       },
     },
   },
   defaultVariants: {
-    variant: "default",
+    variant: 'default',
   },
 });
 
 /**
  * Link with an icon inside
  */
-const LinkWithIcon = styled("a", {
-  base: { height: "24px" },
+const LinkWithIcon = styled('a', {
+  base: { height: '24px' },
 });
 
 /**
  * Middot-like bullet
  */
-const Bullet = styled("div", {
+const Bullet = styled('div', {
   base: {
-    height: "5px",
-    width: "5px",
-    background: "grey",
-    borderRadius: "50%",
+    height: '5px',
+    width: '5px',
+    background: 'grey',
+    borderRadius: '50%',
 
     mdDown: {
-      display: "none",
+      display: 'none',
     },
   },
 });
@@ -117,9 +113,9 @@ const Bullet = styled("div", {
 /**
  * Revolt Wordmark
  */
-const Logo = styled("img", {
+const Logo = styled('img', {
   base: {
-    height: "24px",
+    height: '24px',
   },
 });
 
@@ -132,17 +128,17 @@ export function AuthPage(props: { children: JSX.Element }) {
   const t = useTranslation();
 
   return (
-    <Base style={{ "--url": `url('${background}')` }}>
+    <Base style={{ '--url': `url('${background}')` }}>
       <Nav>
         <div />
         <Button
-          size="icon"
+          size='icon'
           onClick={() => {
             a = !a;
             (window as any)._demo_setDarkMode(a);
           }}
         >
-          <MdDarkMode {...iconSize("24px")} />
+          <MdDarkMode {...iconSize('24px')} />
         </Button>
       </Nav>
       {/*<Nav>
@@ -151,38 +147,38 @@ export function AuthPage(props: { children: JSX.Element }) {
       </Nav>*/}
       <FlowBase>{props.children}</FlowBase>
       <Nav>
-        <NavItems variant="stack">
+        <NavItems variant='stack'>
           <NavItems>
-            <LinkWithIcon href="https://github.com/revoltchat" target="_blank">
+            <LinkWithIcon href='https://github.com/revoltchat' target='_blank'>
               <BiLogosGithub size={24} />
             </LinkWithIcon>
-            <LinkWithIcon href="https://twitter.com/revoltchat" target="_blank">
+            <LinkWithIcon href='https://twitter.com/revoltchat' target='_blank'>
               <BiLogosTwitter size={24} />
             </LinkWithIcon>
             <LinkWithIcon
-              href="https://mastodon.social/web/@revoltchat"
-              target="_blank"
+              href='https://mastodon.social/web/@revoltchat'
+              target='_blank'
             >
               <BiLogosMastodon size={24} />
             </LinkWithIcon>
           </NavItems>
           <Bullet />
           <NavItems>
-            <a href="https://revolt.chat/about" target="_blank">
-              {t("general.about")}
+            <a href='https://revolt.chat/about' target='_blank'>
+              {t('general.about')}
             </a>
-            <a href="https://revolt.chat/terms" target="_blank">
-              {t("general.tos")}
+            <a href='https://revolt.chat/terms' target='_blank'>
+              {t('general.tos')}
             </a>
-            <a href="https://revolt.chat/privacy" target="_blank">
-              {t("general.privacy")}
+            <a href='https://revolt.chat/privacy' target='_blank'>
+              {t('general.privacy')}
             </a>
           </NavItems>
         </NavItems>
-        <NavItems variant="hide">
-          {t("general.image_by")} @fakurian
+        <NavItems variant='hide'>
+          {t('general.image_by')} @fakurian
           <Bullet />
-          <a href="https://unsplash.com/" target="_blank" rel="noreferrer">
+          <a href='https://unsplash.com/' target='_blank' rel='noreferrer'>
             unsplash.com
           </a>
         </NavItems>
diff --git a/packages/client/components/auth/src/LocaleSelector.tsx b/packages/client/components/auth/src/LocaleSelector.tsx
index 019ba7328..4ccff04e8 100644
--- a/packages/client/components/auth/src/LocaleSelector.tsx
+++ b/packages/client/components/auth/src/LocaleSelector.tsx
@@ -1,8 +1,8 @@
-import { For } from "solid-js";
-
-import { Language, Languages } from "@revolt/i18n/locales/Languages";
-import { state } from "@revolt/state";
-import { ComboBox } from "@revolt/ui";
+import type { Language } from '@revolt/i18n/locales/Languages';
+import { Languages } from '@revolt/i18n/locales/Languages';
+import { state } from '@revolt/state';
+import { ComboBox } from '@revolt/ui';
+import { For } from 'solid-js';
 
 /**
  * Dropdown box for selecting the current language
@@ -10,7 +10,7 @@ import { ComboBox } from "@revolt/ui";
 export function LocaleSelector() {
   return (
     <ComboBox
-      value={state.get("locale").lang}
+      value={state.get('locale').lang}
       onChange={(e) => state.locale.switch(e.currentTarget.value as Language)}
     >
       <For each={Object.keys(Languages)}>
diff --git a/packages/client/components/auth/src/flows/Flow.tsx b/packages/client/components/auth/src/flows/Flow.tsx
index 5e0c1d531..114ed5f32 100644
--- a/packages/client/components/auth/src/flows/Flow.tsx
+++ b/packages/client/components/auth/src/flows/Flow.tsx
@@ -1,10 +1,10 @@
-import { JSX, Show } from "solid-js";
-import { keyframes, styled } from "solid-styled-components";
+import { Column, Row, Typography } from '@revolt/ui';
+import type { JSX } from 'solid-js';
+import { Show } from 'solid-js';
+import { keyframes, styled } from 'solid-styled-components';
 
-import { Column, Row, Typography } from "@revolt/ui";
-
-import envelope from "./envelope.svg";
-import wave from "./wave.svg";
+import envelope from './envelope.svg';
+import wave from './wave.svg';
 
 /**
  * Container for authentication page flows
@@ -13,10 +13,10 @@ export const FlowBase = styled(Column)`
   background: ${
     (props) =>
       props.theme!.colours[
-        "messaging-message-box-background"
+        'messaging-message-box-background'
       ] /* TODO: change and in other places */
   };
-  color: ${(props) => props.theme!.colours["messaging-message-box-foreground"]};
+  color: ${(props) => props.theme!.colours['messaging-message-box-foreground']};
 
   /* background-color: rgba(36, 36, 36, 0.75);
    backdrop-filter: blur(20px); */
@@ -120,23 +120,23 @@ const Mail = styled.img`
 export function FlowTitle(props: {
   children: JSX.Element;
   subtitle?: JSX.Element;
-  emoji?: "wave" | "mail";
+  emoji?: 'wave' | 'mail';
 }) {
   return (
     <Column>
-      <Row align gap="sm">
-        <Show when={props.emoji === "wave"}>
+      <Row align gap='sm'>
+        <Show when={props.emoji === 'wave'}>
           <Wave src={wave} />
         </Show>
-        <Show when={props.emoji === "mail"}>
+        <Show when={props.emoji === 'mail'}>
           <Mail src={envelope} />
         </Show>
-        <Typography variant="legacy-settings-title">
+        <Typography variant='legacy-settings-title'>
           {props.children}
         </Typography>
       </Row>
       <Show when={props.subtitle}>
-        <Typography variant="legacy-settings-description">
+        <Typography variant='legacy-settings-description'>
           {props.subtitle}
         </Typography>
       </Show>
diff --git a/packages/client/components/auth/src/flows/FlowCheck.tsx b/packages/client/components/auth/src/flows/FlowCheck.tsx
index 6ab8adf83..82aca18dc 100644
--- a/packages/client/components/auth/src/flows/FlowCheck.tsx
+++ b/packages/client/components/auth/src/flows/FlowCheck.tsx
@@ -1,18 +1,16 @@
-import { Show } from "solid-js";
+import MdArrowBack from '@material-design-icons/svg/filled/arrow_back.svg?component-solid';
+import { useTranslation } from '@revolt/i18n';
+import { useNavigate } from '@revolt/routing';
+import { Button, iconSize, Row } from '@revolt/ui';
+import { Show } from 'solid-js';
 
-import { useTranslation } from "@revolt/i18n";
-import { useNavigate } from "@revolt/routing";
-import { Button, Row, iconSize } from "@revolt/ui";
-
-import MdArrowBack from "@material-design-icons/svg/filled/arrow_back.svg?component-solid";
-
-import { FlowTitle } from "./Flow";
-import { MailProvider } from "./MailProvider";
+import { FlowTitle } from './Flow';
+import { MailProvider } from './MailProvider';
 
 /**
  * Keep track of email within the same session
  */
-let email = "postmaster@revolt.wtf";
+let email = 'postmaster@revolt.wtf';
 
 /**
  * Persist email information temporarily
@@ -30,13 +28,13 @@ export default function FlowCheck() {
 
   return (
     <>
-      <FlowTitle subtitle={t("login.email_delay")} emoji="mail">
-        {t("login.check_mail")}
+      <FlowTitle subtitle={t('login.email_delay')} emoji='mail'>
+        {t('login.check_mail')}
       </FlowTitle>
-      <Row align justify="center">
-        <a href="..">
-          <Button variant="plain">
-            <MdArrowBack {...iconSize("1.2em")} /> Back
+      <Row align justify='center'>
+        <a href='..'>
+          <Button variant='plain'>
+            <MdArrowBack {...iconSize('1.2em')} /> Back
           </Button>
         </a>
         <Show when={email}>
@@ -46,15 +44,15 @@ export default function FlowCheck() {
       {import.meta.env.DEV && (
         <div
           style={{
-            position: "fixed",
+            position: 'fixed',
             top: 0,
             left: 0,
-            background: "white",
-            color: "black",
-            cursor: "pointer",
+            background: 'white',
+            color: 'black',
+            cursor: 'pointer',
           }}
           onClick={() => {
-            navigate("/login/verify/abc", { replace: true });
+            navigate('/login/verify/abc', { replace: true });
           }}
         >
           Mock Verify
diff --git a/packages/client/components/auth/src/flows/FlowConfirmReset.tsx b/packages/client/components/auth/src/flows/FlowConfirmReset.tsx
index ac1994c42..b8b024030 100644
--- a/packages/client/components/auth/src/flows/FlowConfirmReset.tsx
+++ b/packages/client/components/auth/src/flows/FlowConfirmReset.tsx
@@ -1,10 +1,10 @@
-import { clientController } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
-import { useNavigate, useParams } from "@revolt/routing";
-import { Button, Typography } from "@revolt/ui";
+import { clientController } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
+import { useNavigate, useParams } from '@revolt/routing';
+import { Button, Typography } from '@revolt/ui';
 
-import { FlowTitle } from "./Flow";
-import { Fields, Form } from "./Form";
+import { FlowTitle } from './Flow';
+import { Fields, Form } from './Form';
 
 /**
  * Flow for confirming a new password
@@ -19,27 +19,27 @@ export default function FlowConfirmReset() {
    * @param data Form Data
    */
   async function reset(data: FormData) {
-    const password = data.get("new-password") as string;
-    const remove_sessions = !!(data.get("log-out") as "on" | undefined);
+    const password = data.get('new-password') as string;
+    const remove_sessions = !!(data.get('log-out') as 'on' | undefined);
 
-    await clientController.api.patch("/auth/account/reset_password", {
+    await clientController.api.patch('/auth/account/reset_password', {
       password,
       token,
       remove_sessions,
     });
 
-    navigate("/login/auth", { replace: true });
+    navigate('/login/auth', { replace: true });
   }
 
   return (
     <>
-      <FlowTitle>{t("login.reset")}</FlowTitle>
+      <FlowTitle>{t('login.reset')}</FlowTitle>
       <Form onSubmit={reset}>
-        <Fields fields={["new-password", "log-out"]} />
-        <Button type="submit">{t("login.reset")}</Button>
+        <Fields fields={['new-password', 'log-out']} />
+        <Button type='submit'>{t('login.reset')}</Button>
       </Form>
-      <Typography variant="legacy-settings-description">
-        <a href="/login/auth">{t("login.remembered")}</a>
+      <Typography variant='legacy-settings-description'>
+        <a href='/login/auth'>{t('login.remembered')}</a>
       </Typography>
     </>
   );
diff --git a/packages/client/components/auth/src/flows/FlowCreate.tsx b/packages/client/components/auth/src/flows/FlowCreate.tsx
index 6084c3640..85985e313 100644
--- a/packages/client/components/auth/src/flows/FlowCreate.tsx
+++ b/packages/client/components/auth/src/flows/FlowCreate.tsx
@@ -1,15 +1,13 @@
-import { CONFIGURATION } from "@revolt/common";
-import { useTranslation } from "@revolt/i18n";
-import { useNavigate } from "@revolt/routing";
-import { Button, Row, iconSize } from "@revolt/ui";
+import MdArrowBack from '@material-design-icons/svg/filled/arrow_back.svg?component-solid';
+import { CONFIGURATION } from '@revolt/common';
+import { useTranslation } from '@revolt/i18n';
+import { useNavigate } from '@revolt/routing';
+import { Button, iconSize, Row } from '@revolt/ui';
 
-import MdArrowBack from "@material-design-icons/svg/filled/arrow_back.svg?component-solid";
-
-import { clientController } from "../../../client";
-
-import { FlowTitle } from "./Flow";
-import { setFlowCheckEmail } from "./FlowCheck";
-import { Fields, Form } from "./Form";
+import { clientController } from '../../../client';
+import { FlowTitle } from './Flow';
+import { setFlowCheckEmail } from './FlowCheck';
+import { Fields, Form } from './Form';
 
 /**
  * Flow for creating a new account
@@ -23,11 +21,11 @@ export default function FlowCreate() {
    * @param data Form Data
    */
   async function create(data: FormData) {
-    const email = data.get("email") as string;
-    const password = data.get("password") as string;
-    const captcha = data.get("captcha") as string;
+    const email = data.get('email') as string;
+    const password = data.get('password') as string;
+    const captcha = data.get('captcha') as string;
 
-    await clientController.api.post("/auth/account/create", {
+    await clientController.api.post('/auth/account/create', {
       email,
       password,
       captcha,
@@ -39,38 +37,38 @@ export default function FlowCreate() {
     // TODO: log straight in if no email confirmation?
 
     setFlowCheckEmail(email);
-    navigate("/login/check", { replace: true });
+    navigate('/login/check', { replace: true });
   }
 
   return (
     <>
-      <FlowTitle subtitle={t("login.subtitle2")} emoji="wave">
-        {t("login.welcome2")}
+      <FlowTitle subtitle={t('login.subtitle2')} emoji='wave'>
+        {t('login.welcome2')}
       </FlowTitle>
       <Form onSubmit={create} captcha={CONFIGURATION.HCAPTCHA_SITEKEY}>
-        <Fields fields={["email", "password"]} />
-        <Row align justify="center">
-          <a href="..">
-            <Button variant="plain">
-              <MdArrowBack {...iconSize("1.2em")} /> Back
+        <Fields fields={['email', 'password']} />
+        <Row align justify='center'>
+          <a href='..'>
+            <Button variant='plain'>
+              <MdArrowBack {...iconSize('1.2em')} /> Back
             </Button>
           </a>
-          <Button type="submit">{t("login.register")}</Button>
+          <Button type='submit'>{t('login.register')}</Button>
         </Row>
       </Form>
       {import.meta.env.DEV && (
         <div
           style={{
-            position: "fixed",
+            position: 'fixed',
             top: 0,
             left: 0,
-            background: "white",
-            color: "black",
-            cursor: "pointer",
+            background: 'white',
+            color: 'black',
+            cursor: 'pointer',
           }}
           onClick={() => {
-            setFlowCheckEmail("insert@revolt.chat");
-            navigate("/login/check", { replace: true });
+            setFlowCheckEmail('insert@revolt.chat');
+            navigate('/login/check', { replace: true });
           }}
         >
           Mock Submission
diff --git a/packages/client/components/auth/src/flows/FlowHome.tsx b/packages/client/components/auth/src/flows/FlowHome.tsx
index 2de63cc65..ba66cec57 100644
--- a/packages/client/components/auth/src/flows/FlowHome.tsx
+++ b/packages/client/components/auth/src/flows/FlowHome.tsx
@@ -1,16 +1,15 @@
-import { Show } from "solid-js";
+import { clientController } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
+import { Navigate } from '@revolt/routing';
+import { Button, Column, styled } from '@revolt/ui';
+import { Show } from 'solid-js';
 
-import { clientController } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
-import { Navigate } from "@revolt/routing";
-import { Button, Column, styled } from "@revolt/ui";
+// import RevoltSvg from "../../../../public/assets/wordmark_wide_500px.svg?component-solid";
 
-import RevoltSvg from "../../../../public/assets/wordmark_wide_500px.svg?component-solid";
-
-const Logo = styled(RevoltSvg)`
+const Logo = styled('div')`
   width: 100%;
   object-fit: contain;
-  fill: ${(props) => props.theme!.colours["messaging-message-box-foreground"]};
+  fill: ${(props) => props.theme!.colours['messaging-message-box-foreground']};
 `;
 
 /**
@@ -22,41 +21,41 @@ export default function FlowHome() {
   return (
     <>
       <Show when={clientController.isLoggedIn()}>
-        <Navigate href="/app" />
+        <Navigate href='/app' />
       </Show>
 
-      <Column gap="xl">
+      <Column gap='xl'>
         <Logo />
 
         <Column>
           <b
             style={{
-              "font-weight": 800,
-              "font-size": "1.4em",
-              display: "flex",
-              "flex-direction": "column",
-              "align-items": "center",
+              'font-weight': 800,
+              'font-size': '1.4em',
+              display: 'flex',
+              'flex-direction': 'column',
+              'align-items': 'center',
             }}
           >
             <span>Find your community,</span>
             <br />
             <span>connect with the world.</span>
           </b>
-          <span style={{ "text-align": "center", opacity: "0.5" }}>
+          <span style={{ 'text-align': 'center', opacity: '0.5' }}>
             Revolt is one of the best ways to stay connected with your friends
             and community, anywhere, anytime.
           </span>
         </Column>
 
         <Column>
-          <a href="/login/auth">
+          <a href='/login/auth'>
             <Column>
               <Button>Log In</Button>
             </Column>
           </a>
-          <a href="/login/create">
+          <a href='/login/create'>
             <Column>
-              <Button variant="secondary">Sign Up</Button>
+              <Button variant='secondary'>Sign Up</Button>
             </Column>
           </a>
         </Column>
diff --git a/packages/client/components/auth/src/flows/FlowLogin.tsx b/packages/client/components/auth/src/flows/FlowLogin.tsx
index 968553a8a..5073348a9 100644
--- a/packages/client/components/auth/src/flows/FlowLogin.tsx
+++ b/packages/client/components/auth/src/flows/FlowLogin.tsx
@@ -1,32 +1,28 @@
-import { Match, Show, Switch } from "solid-js";
-
-import { styled } from "styled-system/jsx";
-
-import { State, TransitionType } from "@revolt/client/Controller";
-import { useTranslation } from "@revolt/i18n";
-import { Navigate } from "@revolt/routing";
+import MdArrowBack from '@material-design-icons/svg/filled/arrow_back.svg?component-solid';
+import { State, TransitionType } from '@revolt/client/Controller';
+import { useTranslation } from '@revolt/i18n';
+import { Navigate } from '@revolt/routing';
 import {
   Button,
   Column,
+  iconSize,
   Preloader,
   Row,
   Typography,
-  iconSize,
-} from "@revolt/ui";
-
-import MdArrowBack from "@material-design-icons/svg/filled/arrow_back.svg?component-solid";
-
-import RevoltSvg from "../../../../public/assets/wordmark_wide_500px.svg?component-solid";
-import { clientController } from "../../../client";
+} from '@revolt/ui';
+import { Match, Show, Switch } from 'solid-js';
+import { styled } from 'styled-system/jsx';
 
-import { FlowTitle } from "./Flow";
-import { Fields, Form } from "./Form";
+// import RevoltSvg from "../../../../public/assets/wordmark_wide_500px.svg?component-solid";
+import { clientController } from '../../../client';
+import { FlowTitle } from './Flow';
+import { Fields, Form } from './Form';
 
-const Logo = styled(RevoltSvg, {
+const Logo = styled('div', {
   base: {
-    height: "0.8em",
-    display: "inline",
-    fill: "var(--colours-messaging-message-box-foreground)",
+    height: '0.8em',
+    display: 'inline',
+    fill: 'var(--colours-messaging-message-box-foreground)',
   },
 });
 
@@ -41,8 +37,8 @@ export default function FlowLogin() {
    * @param data Form Data
    */
   async function login(data: FormData) {
-    const email = data.get("email") as string;
-    const password = data.get("password") as string;
+    const email = data.get('email') as string;
+    const password = data.get('password') as string;
 
     await clientController.login({
       email,
@@ -55,7 +51,7 @@ export default function FlowLogin() {
    * @param data Form Data
    */
   async function select(data: FormData) {
-    const username = data.get("username") as string;
+    const username = data.get('username') as string;
     await clientController.selectUsername(username);
   }
 
@@ -64,62 +60,62 @@ export default function FlowLogin() {
       <Switch
         fallback={
           <>
-            <FlowTitle subtitle={t("login.subtitle")} emoji="wave">
-              {t("login.welcome")}
+            <FlowTitle subtitle={t('login.subtitle')} emoji='wave'>
+              {t('login.welcome')}
             </FlowTitle>
 
             <Form onSubmit={login}>
-              <Fields fields={["email", "password"]} />
-              <Row align justify="center">
-                <a href="..">
-                  <Button variant="plain">
-                    <MdArrowBack {...iconSize("1.2em")} /> Back
+              <Fields fields={['email', 'password']} />
+              <Row align justify='center'>
+                <a href='..'>
+                  <Button variant='plain'>
+                    <MdArrowBack {...iconSize('1.2em')} /> Back
                   </Button>
                 </a>
-                <Button type="submit">{t("login.title")}</Button>
+                <Button type='submit'>{t('login.title')}</Button>
               </Row>
             </Form>
 
             <Column>
-              <Typography variant="legacy-settings-description">
-                <a href="/login/reset">{t("login.reset")}</a>
+              <Typography variant='legacy-settings-description'>
+                <a href='/login/reset'>{t('login.reset')}</a>
               </Typography>
 
-              <Typography variant="legacy-settings-description">
-                <a href="/login/resend">{t("login.resend")}</a>
+              <Typography variant='legacy-settings-description'>
+                <a href='/login/resend'>{t('login.resend')}</a>
               </Typography>
             </Column>
           </>
         }
       >
         <Match when={clientController.isLoggedIn()}>
-          <Navigate href="/app" />
+          <Navigate href='/app' />
         </Match>
         <Match when={clientController.lifecycle.state() === State.LoggingIn}>
-          <Preloader type="ring" />
+          <Preloader type='ring' />
         </Match>
         <Match when={clientController.lifecycle.state() === State.Onboarding}>
-          <FlowTitle subtitle={t("app.special.modals.onboarding.pick")}>
-            <Row gap="sm">
-              {t("app.special.modals.onboarding.welcome")} <Logo />
+          <FlowTitle subtitle={t('app.special.modals.onboarding.pick')}>
+            <Row gap='sm'>
+              {t('app.special.modals.onboarding.welcome')} <Logo />
             </Row>
           </FlowTitle>
 
           <Form onSubmit={select}>
-            <Fields fields={["username"]} />
-            <Row align justify="center">
+            <Fields fields={['username']} />
+            <Row align justify='center'>
               <Button
-                variant="plain"
+                variant='plain'
                 onClick={() =>
                   clientController.lifecycle.transition({
                     type: TransitionType.Cancel,
                   })
                 }
               >
-                <MdArrowBack {...iconSize("1.2em")} /> Cancel
+                <MdArrowBack {...iconSize('1.2em')} /> Cancel
               </Button>
-              <Button type="submit">
-                {t("app.special.modals.actions.confirm")}
+              <Button type='submit'>
+                {t('app.special.modals.actions.confirm')}
               </Button>
             </Row>
           </Form>
diff --git a/packages/client/components/auth/src/flows/FlowResend.tsx b/packages/client/components/auth/src/flows/FlowResend.tsx
index 7c7fd015e..c0411dbb1 100644
--- a/packages/client/components/auth/src/flows/FlowResend.tsx
+++ b/packages/client/components/auth/src/flows/FlowResend.tsx
@@ -1,12 +1,12 @@
-import { clientController } from "@revolt/client";
-import { CONFIGURATION } from "@revolt/common";
-import { useTranslation } from "@revolt/i18n";
-import { useNavigate } from "@revolt/routing";
-import { Button, Typography } from "@revolt/ui";
+import { clientController } from '@revolt/client';
+import { CONFIGURATION } from '@revolt/common';
+import { useTranslation } from '@revolt/i18n';
+import { useNavigate } from '@revolt/routing';
+import { Button, Typography } from '@revolt/ui';
 
-import { FlowTitle } from "./Flow";
-import { setFlowCheckEmail } from "./FlowCheck";
-import { Fields, Form } from "./Form";
+import { FlowTitle } from './Flow';
+import { setFlowCheckEmail } from './FlowCheck';
+import { Fields, Form } from './Form';
 
 /**
  * Flow for resending email verification
@@ -20,27 +20,27 @@ export default function FlowResend() {
    * @param data Form Data
    */
   async function resend(data: FormData) {
-    const email = data.get("email") as string;
-    const captcha = data.get("captcha") as string;
+    const email = data.get('email') as string;
+    const captcha = data.get('captcha') as string;
 
-    await clientController.api.post("/auth/account/reverify", {
+    await clientController.api.post('/auth/account/reverify', {
       email,
       captcha,
     });
 
     setFlowCheckEmail(email);
-    navigate("/login/check", { replace: true });
+    navigate('/login/check', { replace: true });
   }
 
   return (
     <>
-      <FlowTitle>{t("login.resend")}</FlowTitle>
+      <FlowTitle>{t('login.resend')}</FlowTitle>
       <Form onSubmit={resend} captcha={CONFIGURATION.HCAPTCHA_SITEKEY}>
-        <Fields fields={["email"]} />
-        <Button type="submit">{t("login.resend")}</Button>
+        <Fields fields={['email']} />
+        <Button type='submit'>{t('login.resend')}</Button>
       </Form>
-      <Typography variant="legacy-settings-description">
-        <a href="/login/auth">{t("login.remembered")}</a>
+      <Typography variant='legacy-settings-description'>
+        <a href='/login/auth'>{t('login.remembered')}</a>
       </Typography>
     </>
   );
diff --git a/packages/client/components/auth/src/flows/FlowReset.tsx b/packages/client/components/auth/src/flows/FlowReset.tsx
index 8ddbc0b13..61f610635 100644
--- a/packages/client/components/auth/src/flows/FlowReset.tsx
+++ b/packages/client/components/auth/src/flows/FlowReset.tsx
@@ -1,12 +1,12 @@
-import { clientController } from "@revolt/client";
-import { CONFIGURATION } from "@revolt/common";
-import { useTranslation } from "@revolt/i18n";
-import { useNavigate } from "@revolt/routing";
-import { Button, Typography } from "@revolt/ui";
+import { clientController } from '@revolt/client';
+import { CONFIGURATION } from '@revolt/common';
+import { useTranslation } from '@revolt/i18n';
+import { useNavigate } from '@revolt/routing';
+import { Button, Typography } from '@revolt/ui';
 
-import { FlowTitle } from "./Flow";
-import { setFlowCheckEmail } from "./FlowCheck";
-import { Fields, Form } from "./Form";
+import { FlowTitle } from './Flow';
+import { setFlowCheckEmail } from './FlowCheck';
+import { Fields, Form } from './Form';
 
 /**
  * Flow for sending password reset
@@ -20,40 +20,40 @@ export default function FlowReset() {
    * @param data Form Data
    */
   async function reset(data: FormData) {
-    const email = data.get("email") as string;
-    const captcha = data.get("captcha") as string;
+    const email = data.get('email') as string;
+    const captcha = data.get('captcha') as string;
 
-    await clientController.api.post("/auth/account/reset_password", {
+    await clientController.api.post('/auth/account/reset_password', {
       email,
       captcha,
     });
 
     setFlowCheckEmail(email);
-    navigate("/login/check", { replace: true });
+    navigate('/login/check', { replace: true });
   }
 
   return (
     <>
-      <FlowTitle>{t("login.reset")}</FlowTitle>
+      <FlowTitle>{t('login.reset')}</FlowTitle>
       <Form onSubmit={reset} captcha={CONFIGURATION.HCAPTCHA_SITEKEY}>
-        <Fields fields={["email"]} />
-        <Button type="submit">{t("login.reset")}</Button>
+        <Fields fields={['email']} />
+        <Button type='submit'>{t('login.reset')}</Button>
       </Form>
-      <Typography variant="legacy-settings-description">
-        <a href="/login/auth">{t("login.remembered")}</a>
+      <Typography variant='legacy-settings-description'>
+        <a href='/login/auth'>{t('login.remembered')}</a>
       </Typography>
       {import.meta.env.DEV && (
         <div
           style={{
-            position: "fixed",
+            position: 'fixed',
             top: 0,
             left: 0,
-            background: "white",
-            color: "black",
-            cursor: "pointer",
+            background: 'white',
+            color: 'black',
+            cursor: 'pointer',
           }}
           onClick={() => {
-            navigate("/login/reset/abc", { replace: true });
+            navigate('/login/reset/abc', { replace: true });
           }}
         >
           Mock Reset Screen
diff --git a/packages/client/components/auth/src/flows/FlowVerify.tsx b/packages/client/components/auth/src/flows/FlowVerify.tsx
index a403d9f11..ea82dfbbe 100644
--- a/packages/client/components/auth/src/flows/FlowVerify.tsx
+++ b/packages/client/components/auth/src/flows/FlowVerify.tsx
@@ -1,22 +1,21 @@
-import { Match, Show, Switch, createSignal, onMount } from "solid-js";
+import { clientController, mapAnyError } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
+import { useNavigate, useParams } from '@revolt/routing';
+import { Button, Preloader, Typography } from '@revolt/ui';
+import { createSignal, Match, onMount, Show, Switch } from 'solid-js';
 
-import { clientController, mapAnyError } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
-import { useNavigate, useParams } from "@revolt/routing";
-import { Button, Preloader, Typography } from "@revolt/ui";
-
-import { FlowTitle } from "./Flow";
+import { FlowTitle } from './Flow';
 
 type State =
   | {
-      state: "verifying";
+      state: 'verifying';
     }
   | {
-      state: "error";
+      state: 'error';
       error: string;
     }
   | {
-      state: "success";
+      state: 'success';
       mfa_ticket?: string;
     };
 
@@ -29,17 +28,17 @@ export default function FlowVerify() {
   const navigate = useNavigate();
 
   const [state, setState] = createSignal<State>({
-    state: "verifying",
+    state: 'verifying',
   });
 
   onMount(async () => {
     try {
       if (import.meta.env.DEV) {
-        if (confirm("Mock verification?")) {
-          if (confirm("Successful verification?")) {
-            setState({ state: "success", mfa_ticket: "token" });
+        if (confirm('Mock verification?')) {
+          if (confirm('Successful verification?')) {
+            setState({ state: 'success', mfa_ticket: 'token' });
           } else {
-            setState({ state: "error", error: "InvalidToken" });
+            setState({ state: 'error', error: 'InvalidToken' });
           }
 
           return;
@@ -50,9 +49,9 @@ export default function FlowVerify() {
         `/auth/account/verify/${params.token}`
       )) as { ticket?: { token: string } };
 
-      setState({ state: "success", mfa_ticket: data.ticket?.token });
+      setState({ state: 'success', mfa_ticket: data.ticket?.token });
     } catch (err) {
-      setState({ state: "error", error: mapAnyError(err) });
+      setState({ state: 'error', error: mapAnyError(err) });
     }
   });
 
@@ -61,41 +60,41 @@ export default function FlowVerify() {
    */
   async function login() {
     const v = state();
-    if (v.state === "success" && v.mfa_ticket) {
+    if (v.state === 'success' && v.mfa_ticket) {
       await clientController.login({
         mfa_ticket: v.mfa_ticket,
       });
 
-      navigate("/login/auth", { replace: true });
+      navigate('/login/auth', { replace: true });
     }
   }
 
   return (
     <Switch>
-      <Match when={state().state === "verifying"}>
-        <FlowTitle>{t("login.verifying_account")}</FlowTitle>
-        <Preloader type="ring" />
+      <Match when={state().state === 'verifying'}>
+        <FlowTitle>{t('login.verifying_account')}</FlowTitle>
+        <Preloader type='ring' />
       </Match>
-      <Match when={state().state === "error"}>
-        <FlowTitle>{t("login.error.verify")}</FlowTitle>
-        <Typography variant="legacy-settings-description">
+      <Match when={state().state === 'error'}>
+        <FlowTitle>{t('login.error.verify')}</FlowTitle>
+        <Typography variant='legacy-settings-description'>
           {t(
-            `error.${(state() as State & { state: "error" }).error}`,
+            `error.${(state() as State & { state: 'error' }).error}`,
             undefined,
-            (state() as State & { state: "error" }).error
+            (state() as State & { state: 'error' }).error
           )}
         </Typography>
-        <Typography variant="legacy-settings-description">
-          <a href="/login/auth">{t("login.remembered")}</a>
+        <Typography variant='legacy-settings-description'>
+          <a href='/login/auth'>{t('login.remembered')}</a>
         </Typography>
       </Match>
-      <Match when={state().state === "success"}>
-        <FlowTitle>{t("login.verified_account")}</FlowTitle>
-        <Show when={"mfa_ticket" in state()}>
-          <Button onClick={login}>{t("login.verified_continue")}</Button>
+      <Match when={state().state === 'success'}>
+        <FlowTitle>{t('login.verified_account')}</FlowTitle>
+        <Show when={'mfa_ticket' in state()}>
+          <Button onClick={login}>{t('login.verified_continue')}</Button>
         </Show>
-        <Typography variant="legacy-settings-description">
-          <a href="/login/auth">{t("login.remembered")}</a>
+        <Typography variant='legacy-settings-description'>
+          <a href='/login/auth'>{t('login.remembered')}</a>
         </Typography>
       </Match>
     </Switch>
diff --git a/packages/client/components/auth/src/flows/Form.tsx b/packages/client/components/auth/src/flows/Form.tsx
index b1e565882..7603c0dc0 100644
--- a/packages/client/components/auth/src/flows/Form.tsx
+++ b/packages/client/components/auth/src/flows/Form.tsx
@@ -1,16 +1,16 @@
-import HCaptcha, { HCaptchaFunctions } from "solid-hcaptcha";
-import { For, JSX, Show, createSignal } from "solid-js";
-
-import { cva } from "styled-system/css";
-
-import { mapAnyError } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
-import { Checkbox, Column, FormGroup, Input, Typography } from "@revolt/ui";
+import { mapAnyError } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
+import { Checkbox, Column, FormGroup, Input, Typography } from '@revolt/ui';
+import type { HCaptchaFunctions } from 'solid-hcaptcha';
+import HCaptcha from 'solid-hcaptcha';
+import type { JSX } from 'solid-js';
+import { createSignal, For, Show } from 'solid-js';
+import { cva } from 'styled-system/css';
 
 /**
  * Available field types
  */
-type Field = "email" | "password" | "new-password" | "log-out" | "username";
+type Field = 'email' | 'password' | 'new-password' | 'log-out' | 'username';
 
 /**
  * Properties to apply to fields
@@ -20,41 +20,41 @@ const useFieldConfiguration = () => {
 
   return {
     email: {
-      type: "email",
-      name: () => t("login.email"),
-      placeholder: () => t("login.enter.email"),
+      type: 'email',
+      name: () => t('login.email'),
+      placeholder: () => t('login.enter.email'),
     },
     password: {
       minLength: 8,
-      type: "password",
-      name: () => t("login.password"),
-      placeholder: () => t("login.enter.password"),
+      type: 'password',
+      name: () => t('login.password'),
+      placeholder: () => t('login.enter.password'),
     },
-    "new-password": {
+    'new-password': {
       minLength: 8,
-      type: "password",
-      autocomplete: "new-password",
-      name: () => t("login.new_password"),
-      placeholder: () => t("login.enter.new_password"),
+      type: 'password',
+      autocomplete: 'new-password',
+      name: () => t('login.new_password'),
+      placeholder: () => t('login.enter.new_password'),
     },
-    "log-out": {
-      name: () => t("login.log_out_other"),
+    'log-out': {
+      name: () => t('login.log_out_other'),
     },
     username: {
       minLength: 2,
-      type: "text",
-      autocomplete: "none",
-      name: () => t("login.username"),
-      placeholder: () => t("login.enter.username"),
+      type: 'text',
+      autocomplete: 'none',
+      name: () => t('login.username'),
+      placeholder: () => t('login.enter.username'),
     },
   };
 };
 
 const labelRow = cva({
   base: {
-    gap: "var(--gap-sm)",
-    display: "flex",
-    alignItems: "center",
+    gap: 'var(--gap-sm)',
+    display: 'flex',
+    alignItems: 'center',
   },
 });
 
@@ -83,16 +83,16 @@ export function Fields(props: FieldProps) {
     <For each={props.fields}>
       {(field) => (
         <FormGroup>
-          {field === "log-out" ? (
+          {field === 'log-out' ? (
             <label class={labelRow()}>
-              <Checkbox name="log-out" />
-              <Typography variant="label">
-                {fieldConfiguration["log-out"].name()}
+              <Checkbox name='log-out' />
+              <Typography variant='label'>
+                {fieldConfiguration['log-out'].name()}
               </Typography>
             </label>
           ) : (
             <>
-              <Typography variant="label">
+              <Typography variant='label'>
                 {fieldConfiguration[field].name()}
               </Typography>
               <Input
@@ -133,7 +133,7 @@ interface Props {
  */
 export function Form(props: Props) {
   const t = useTranslation();
-  const [error, setError] = createSignal("");
+  const [error, setError] = createSignal('');
   let hcaptcha: HCaptchaFunctions | undefined;
 
   /**
@@ -146,9 +146,9 @@ export function Form(props: Props) {
     const formData = new FormData(event.currentTarget as HTMLFormElement);
 
     if (props.captcha) {
-      if (!hcaptcha) return alert("hCaptcha not loaded!");
+      if (!hcaptcha) return alert('hCaptcha not loaded!');
       const response = await hcaptcha.execute();
-      formData.set("captcha", response!.response);
+      formData.set('captcha', response!.response);
     }
 
     try {
@@ -163,7 +163,7 @@ export function Form(props: Props) {
       <Column>
         {props.children}
         <Show when={error()}>
-          <Typography variant="legacy-settings-description">
+          <Typography variant='legacy-settings-description'>
             {t(`error.${error()}`, undefined, error())}
           </Typography>
         </Show>
@@ -172,7 +172,7 @@ export function Form(props: Props) {
         <HCaptcha
           sitekey={props.captcha!}
           onLoad={(instance) => (hcaptcha = instance)}
-          size="invisible"
+          size='invisible'
         />
       </Show>
     </form>
diff --git a/packages/client/components/auth/src/flows/MailProvider.tsx b/packages/client/components/auth/src/flows/MailProvider.tsx
index 8831ffa1c..099849d9a 100644
--- a/packages/client/components/auth/src/flows/MailProvider.tsx
+++ b/packages/client/components/auth/src/flows/MailProvider.tsx
@@ -1,7 +1,6 @@
-import { Show } from "solid-js";
-
-import { useTranslation } from "@revolt/i18n";
-import { Button } from "@revolt/ui";
+import { useTranslation } from '@revolt/i18n';
+import { Button } from '@revolt/ui';
+import { Show } from 'solid-js';
 
 interface Props {
   email?: string;
@@ -20,91 +19,91 @@ function mapMailProvider(email?: string): [string, string] | undefined {
 
   const domain = match[1];
   switch (domain) {
-    case "gmail.com":
-    case "googlemail.com":
-      return ["Gmail", "https://gmail.com"];
-    case "tuta.io":
-      return ["Tutanota", "https://mail.tutanota.com"];
-    case "outlook.com":
-    case "hotmail.com":
-    case "outlook.jp":
-    case "outlook.fr":
-    case "outlook.dk":
-    case "outlook.com.ar":
-    case "outlook.com.au":
-    case "outlook.at":
-    case "outlook.be":
-    case "outlook.com.br":
-    case "outlook.cl":
-    case "outlook.cz":
-    case "outlook.com.gr":
-    case "outlook.co.il":
-    case "outlook.in":
-    case "outlook.co.id":
-    case "outlook.ie":
-    case "outlook.it":
-    case "outlook.hu":
-    case "outlook.kr":
-    case "outlook.lv":
-    case "outlook.my":
-    case "outlook.co.nz":
-    case "outlook.com.pe":
-    case "outlook.ph":
-    case "outlook.pt":
-    case "outlook.sa":
-    case "outlook.sg":
-    case "outlook.sk":
-    case "outlook.es":
-    case "outlook.co.th":
-    case "outlook.com.tr":
-    case "outlook.com.vn":
-      return ["Outlook", "https://outlook.live.com"];
-    case "yahoo.com":
-      return ["Yahoo", "https://mail.yahoo.com"];
-    case "wp.pl":
-      return ["WP Poczta", "https://poczta.wp.pl"];
-    case "protonmail.com":
-    case "protonmail.ch":
-    case "pm.me":
-      return ["ProtonMail", "https://mail.protonmail.com"];
-    case "seznam.cz":
-    case "email.cz":
-    case "post.cz":
-      return ["Seznam", "https://email.seznam.cz"];
-    case "zoho.com":
-      return ["Zoho Mail", "https://mail.zoho.com/zm/"];
-    case "aol.com":
-    case "aim.com":
-      return ["AOL Mail", "https://mail.aol.com/"];
-    case "icloud.com":
-      return ["iCloud Mail", "https://mail.icloud.com/"];
-    case "mail.com":
-    case "email.com":
-      return ["mail.com", "https://www.mail.com/mail/"];
-    case "yandex.ru":
-    case "yandex.by":
-    case "yandex.ua":
-    case "yandex.com":
-      return ["Yandex Mail", "https://mail.yandex.com/"];
-    case "hey.com":
-      return ["HEY", "https://app.hey.com/"];
-    case "mail.ru":
-    case "bk.ru":
-    case "inbox.ru":
-    case "list.ru":
-    case "internet.ru":
-      return ["Mail.ru", "https://mail.ru/"];
-    case "rambler.ru":
-    case "lenta.ru":
-    case "autorambler.ru":
-    case "myrambler.ru":
-    case "ro.ru":
-    case "rambler.ua":
-      return ["Rambler", "https://rambler.ru/"];
-    case "revolt.chat":
-    case "revolt.wtf":
-    case "insert.moe":
-      return ["Revolt Mail", "https://webmail.revolt.wtf"];
+    case 'gmail.com':
+    case 'googlemail.com':
+      return ['Gmail', 'https://gmail.com'];
+    case 'tuta.io':
+      return ['Tutanota', 'https://mail.tutanota.com'];
+    case 'outlook.com':
+    case 'hotmail.com':
+    case 'outlook.jp':
+    case 'outlook.fr':
+    case 'outlook.dk':
+    case 'outlook.com.ar':
+    case 'outlook.com.au':
+    case 'outlook.at':
+    case 'outlook.be':
+    case 'outlook.com.br':
+    case 'outlook.cl':
+    case 'outlook.cz':
+    case 'outlook.com.gr':
+    case 'outlook.co.il':
+    case 'outlook.in':
+    case 'outlook.co.id':
+    case 'outlook.ie':
+    case 'outlook.it':
+    case 'outlook.hu':
+    case 'outlook.kr':
+    case 'outlook.lv':
+    case 'outlook.my':
+    case 'outlook.co.nz':
+    case 'outlook.com.pe':
+    case 'outlook.ph':
+    case 'outlook.pt':
+    case 'outlook.sa':
+    case 'outlook.sg':
+    case 'outlook.sk':
+    case 'outlook.es':
+    case 'outlook.co.th':
+    case 'outlook.com.tr':
+    case 'outlook.com.vn':
+      return ['Outlook', 'https://outlook.live.com'];
+    case 'yahoo.com':
+      return ['Yahoo', 'https://mail.yahoo.com'];
+    case 'wp.pl':
+      return ['WP Poczta', 'https://poczta.wp.pl'];
+    case 'protonmail.com':
+    case 'protonmail.ch':
+    case 'pm.me':
+      return ['ProtonMail', 'https://mail.protonmail.com'];
+    case 'seznam.cz':
+    case 'email.cz':
+    case 'post.cz':
+      return ['Seznam', 'https://email.seznam.cz'];
+    case 'zoho.com':
+      return ['Zoho Mail', 'https://mail.zoho.com/zm/'];
+    case 'aol.com':
+    case 'aim.com':
+      return ['AOL Mail', 'https://mail.aol.com/'];
+    case 'icloud.com':
+      return ['iCloud Mail', 'https://mail.icloud.com/'];
+    case 'mail.com':
+    case 'email.com':
+      return ['mail.com', 'https://www.mail.com/mail/'];
+    case 'yandex.ru':
+    case 'yandex.by':
+    case 'yandex.ua':
+    case 'yandex.com':
+      return ['Yandex Mail', 'https://mail.yandex.com/'];
+    case 'hey.com':
+      return ['HEY', 'https://app.hey.com/'];
+    case 'mail.ru':
+    case 'bk.ru':
+    case 'inbox.ru':
+    case 'list.ru':
+    case 'internet.ru':
+      return ['Mail.ru', 'https://mail.ru/'];
+    case 'rambler.ru':
+    case 'lenta.ru':
+    case 'autorambler.ru':
+    case 'myrambler.ru':
+    case 'ro.ru':
+    case 'rambler.ua':
+      return ['Rambler', 'https://rambler.ru/'];
+    case 'revolt.chat':
+    case 'revolt.wtf':
+    case 'insert.moe':
+      return ['Revolt Mail', 'https://webmail.revolt.wtf'];
     default:
       return [domain, `https://${domain}`];
   }
@@ -124,9 +123,9 @@ export function MailProvider(props: Props) {
 
   return (
     <Show when={provider()}>
-      <a href={provider()![1]} target="_blank" rel="noreferrer">
+      <a href={provider()![1]} target='_blank' rel='noreferrer'>
         <Button>
-          {t("login.open_mail_provider", { provider: provider()![0] })}
+          {t('login.open_mail_provider', { provider: provider()![0] })}
         </Button>
       </a>
     </Show>
diff --git a/packages/client/components/client/Controller.ts b/packages/client/components/client/Controller.ts
index fd7411aa6..38e35d46a 100644
--- a/packages/client/components/client/Controller.ts
+++ b/packages/client/components/client/Controller.ts
@@ -1,15 +1,14 @@
-import { Accessor, Setter, createSignal } from "solid-js";
-
-import { detect } from "detect-browser";
-import { API, Client, ConnectionState } from "revolt.js";
-
 import {
   CONFIGURATION,
   getController,
   registerController,
-} from "@revolt/common";
-import { state } from "@revolt/state";
-import type { Session } from "@revolt/state/stores/Auth";
+} from '@revolt/common';
+import { state } from '@revolt/state';
+import type { Session } from '@revolt/state/stores/Auth';
+import { detect } from 'detect-browser';
+import { API, Client, ConnectionState } from 'revolt.js';
+import type { Accessor, Setter } from 'solid-js';
+import { createSignal } from 'solid-js';
 
 export enum State {
   Ready,
@@ -134,12 +133,12 @@ class Lifecycle {
       ws: CONFIGURATION.DEFAULT_WS_URL,
     };
 
-    this.client.events.on("state", this.onState);
-    this.client.on("ready", this.onReady);
+    this.client.events.on('state', this.onState);
+    this.client.on('ready', this.onReady);
   }
 
   #enter(nextState: State) {
-    console.debug("Entering state", nextState);
+    console.debug('Entering state', nextState);
     this.#setStateSetter(nextState);
 
     // Clean up retry timer
@@ -150,7 +149,7 @@ class Lifecycle {
 
     switch (nextState) {
       case State.LoggingIn:
-        this.client.api.get("/onboard/hello").then(({ onboarding }) => {
+        this.client.api.get('/onboard/hello').then(({ onboarding }) => {
           if (onboarding) {
             this.transition({
               type: TransitionType.NoUser,
@@ -190,9 +189,9 @@ class Lifecycle {
             (0.8 + Math.random() * 0.4);
 
           console.info(
-            "Will try to reconnect in",
+            'Will try to reconnect in',
             retryIn.toFixed(2),
-            "seconds!"
+            'seconds!'
           );
 
           this.#retryTimeout = setTimeout(() => {
@@ -207,7 +206,7 @@ class Lifecycle {
   }
 
   transition(transition: Transition) {
-    console.debug("Received transition", transition.type);
+    console.debug('Received transition', transition.type);
 
     const currentState = this.state();
     switch (currentState) {
@@ -329,9 +328,9 @@ class Lifecycle {
 
     if (currentState === this.state()) {
       console.error(
-        "An unhandled transition occurred!",
+        'An unhandled transition occurred!',
         transition,
-        "was received on",
+        'was received on',
         currentState
       );
     }
@@ -385,7 +384,7 @@ export default class ClientController {
 
     this.lifecycle = new Lifecycle();
 
-    registerController("client", this);
+    registerController('client', this);
   }
 
   getCurrentClient() {
@@ -413,64 +412,64 @@ export default class ClientController {
     let friendly_name;
     if (browser) {
       let { name, os } = browser as { name: string; os: string };
-      if (name === "ios") {
-        name = "safari";
-      } else if (name === "fxios") {
-        name = "firefox";
-      } else if (name === "crios") {
-        name = "chrome";
-      } else if (os === "Mac OS" && navigator.maxTouchPoints > 0) {
-        os = "iPadOS";
+      if (name === 'ios') {
+        name = 'safari';
+      } else if (name === 'fxios') {
+        name = 'firefox';
+      } else if (name === 'crios') {
+        name = 'chrome';
+      } else if (os === 'Mac OS' && navigator.maxTouchPoints > 0) {
+        os = 'iPadOS';
       }
 
       friendly_name = `Revolt Web (${name} on ${os})`;
     } else {
-      friendly_name = "Revolt Web (Unknown Device)";
+      friendly_name = 'Revolt Web (Unknown Device)';
     }
 
     // Try to login with given credentials
-    let session = await this.api.post("/auth/session/login", {
+    let session = await this.api.post('/auth/session/login', {
       ...credentials,
       friendly_name,
     });
 
     // Prompt for MFA verification if necessary
-    if (session.result === "MFA") {
+    if (session.result === 'MFA') {
       const { allowed_methods } = session;
-      while (session.result === "MFA") {
+      while (session.result === 'MFA') {
         const mfa_response: API.MFAResponse | undefined = await new Promise(
           (callback) =>
-            getController("modal").push({
-              type: "mfa_flow",
-              state: "unknown",
+            getController('modal').push({
+              type: 'mfa_flow',
+              state: 'unknown',
               available_methods: allowed_methods,
               callback,
             })
         );
 
-        if (typeof mfa_response === "undefined") {
+        if (typeof mfa_response === 'undefined') {
           break;
         }
 
         try {
-          session = await this.api.post("/auth/session/login", {
+          session = await this.api.post('/auth/session/login', {
             mfa_response,
             mfa_ticket: session.ticket,
             friendly_name,
           });
         } catch (err) {
-          console.error("Failed login:", err);
+          console.error('Failed login:', err);
         }
       }
 
-      if (session.result === "MFA") {
-        throw "Cancelled";
+      if (session.result === 'MFA') {
+        throw 'Cancelled';
       }
     }
 
-    if (session.result === "Disabled") {
+    if (session.result === 'Disabled') {
       // TODO
-      alert("Account is disabled, run special logic here.");
+      alert('Account is disabled, run special logic here.');
       return;
     }
 
@@ -489,7 +488,7 @@ export default class ClientController {
   }
 
   async selectUsername(username: string) {
-    await this.lifecycle.client.api.post("/onboard/complete", {
+    await this.lifecycle.client.api.post('/onboard/complete', {
       username,
     });
 
diff --git a/packages/client/components/client/error.ts b/packages/client/components/client/error.ts
index 580f5de7c..a5e705468 100644
--- a/packages/client/components/client/error.ts
+++ b/packages/client/components/client/error.ts
@@ -3,7 +3,7 @@
  * @param error Error object
  */
 export function mapAnyError(error: any) {
-  console.error("Encountered an error:", error);
+  console.error('Encountered an error:', error);
 
   // Check if Axios error
   if (error.response) {
@@ -16,19 +16,19 @@ export function mapAnyError(error: any) {
     // Otherwise infer from status
     switch (error.response.status) {
       case 429:
-        return "TooManyRequests";
+        return 'TooManyRequests';
       case 401:
       case 403:
-        return "Unauthorized";
+        return 'Unauthorized';
       default:
-        return "UnknownError";
+        return 'UnknownError';
     }
     // Check if network issue
   } else if (error.request) {
-    return "NetworkError";
+    return 'NetworkError';
   }
 
-  return typeof error === "string" ? error : "UnknownError";
+  return typeof error === 'string' ? error : 'UnknownError';
 }
 
 /**
diff --git a/packages/client/components/client/index.tsx b/packages/client/components/client/index.tsx
index 0af4f7b15..ce6757c24 100644
--- a/packages/client/components/client/index.tsx
+++ b/packages/client/components/client/index.tsx
@@ -1,12 +1,10 @@
-import { Accessor } from "solid-js";
+import type { Client, User } from 'revolt.js';
+import type { Accessor } from 'solid-js';
 
-import type { Client, User } from "revolt.js";
+import ClientController from './Controller';
 
-import ClientController from "./Controller";
-
-export type { default as ClientController } from "./Controller";
-
-export { mapAnyError, mapAndRethrowError } from "./error";
+export type { default as ClientController } from './Controller';
+export { mapAndRethrowError, mapAnyError } from './error';
 
 /**
  * Global client controller
@@ -38,8 +36,8 @@ export function useApi() {
 }
 
 export const IS_REVOLT =
-  import.meta.env.VITE_API_URL === "https://api.revolt.chat" ||
-  import.meta.env.VITE_API_URL === "https://revolt.chat/api" ||
-  typeof import.meta.env.VITE_API_URL !== "string";
+  import.meta.env.VITE_API_URL === 'https://api.revolt.chat' ||
+  import.meta.env.VITE_API_URL === 'https://revolt.chat/api' ||
+  typeof import.meta.env.VITE_API_URL !== 'string';
 
 export const IS_DEV = import.meta.env.DEV;
diff --git a/packages/client/components/client/resources.ts b/packages/client/components/client/resources.ts
index 10b0b0570..d65a6e5b2 100644
--- a/packages/client/components/client/resources.ts
+++ b/packages/client/components/client/resources.ts
@@ -1,7 +1,7 @@
-import { createQuery } from "@tanstack/solid-query";
-import { User } from "revolt.js";
+import { createQuery } from '@tanstack/solid-query';
+import type { User } from 'revolt.js';
 
-import { useClient } from ".";
+import { useClient } from '.';
 
 /**
  * Create a new resource for current account's MFA configuration
@@ -11,7 +11,7 @@ export function createMfaResource() {
   const client = useClient();
 
   return createQuery(() => ({
-    queryKey: ["mfa", client().user!.id],
+    queryKey: ['mfa', client().user!.id],
     queryFn: () => client().account.mfa(),
     throwOnError: true,
   }));
@@ -24,7 +24,7 @@ export function createMfaResource() {
  */
 export function createProfileResource(user: User) {
   return createQuery(() => ({
-    queryKey: ["profile", user.id],
+    queryKey: ['profile', user.id],
     queryFn: () => user!.fetchProfile(),
     throwOnError: true,
   }));
@@ -46,7 +46,7 @@ export function createOwnProfileResource() {
 export function createOwnBotsResource() {
   const client = useClient();
   return createQuery(() => ({
-    queryKey: ["bots", client().user!.id],
+    queryKey: ['bots', client().user!.id],
     queryFn: () => client().bots.fetchOwned(),
     throwOnError: true,
   }));
diff --git a/packages/client/components/common/index.tsx b/packages/client/components/common/index.tsx
index 3bac97318..cd134cd58 100644
--- a/packages/client/components/common/index.tsx
+++ b/packages/client/components/common/index.tsx
@@ -1,4 +1,4 @@
-export { insecureUniqueId } from "./lib/unique";
-export { registerController, getController } from "./lib/controllers";
-export { default as CONFIGURATION } from "./lib/env";
-export { debounce } from "./lib/debounce";
+export { getController, registerController } from './lib/controllers';
+export { debounce } from './lib/debounce';
+export { default as CONFIGURATION } from './lib/env';
+export { insecureUniqueId } from './lib/unique';
diff --git a/packages/client/components/common/lib/controllers.ts b/packages/client/components/common/lib/controllers.ts
index 2e57dcda4..9370d7785 100644
--- a/packages/client/components/common/lib/controllers.ts
+++ b/packages/client/components/common/lib/controllers.ts
@@ -1,6 +1,6 @@
-import type { ClientController } from "@revolt/client";
-import type { ModalControllerExtended } from "@revolt/modal";
-import type { State } from "@revolt/state";
+import type { ClientController } from '@revolt/client';
+import type { ModalControllerExtended } from '@revolt/modal';
+import type { State } from '@revolt/state';
 
 /**
  * Single source of truth for global state controllers
diff --git a/packages/client/components/common/lib/env.ts b/packages/client/components/common/lib/env.ts
index 4cec8f93b..691a37060 100644
--- a/packages/client/components/common/lib/env.ts
+++ b/packages/client/components/common/lib/env.ts
@@ -5,28 +5,28 @@ export default {
   DEFAULT_API_URL:
     (import.meta.env.DEV ? import.meta.env.VITE_DEV_API_URL : undefined) ??
     (import.meta.env.VITE_API_URL as string) ??
-    "https://revolt.chat/api",
+    'https://revolt.chat/api',
   /**
    * What WS server to connect to by default.
    */
   DEFAULT_WS_URL:
     (import.meta.env.DEV ? import.meta.env.VITE_DEV_WS_URL : undefined) ??
     (import.meta.env.VITE_WS_URL as string) ??
-    "wss://revolt.chat/events",
+    'wss://revolt.chat/events',
   /**
    * What media server to connect to by default.
    */
   DEFAULT_MEDIA_URL:
     (import.meta.env.DEV ? import.meta.env.VITE_DEV_WS_URL : undefined) ??
     (import.meta.env.VITE_WS_URL as string) ??
-    "https://autumn.revolt.chat",
+    'https://autumn.revolt.chat',
   /**
    * What proxy server to connect to by default.
    */
   DEFAULT_PROXY_URL:
     (import.meta.env.DEV ? import.meta.env.VITE_DEV_WS_URL : undefined) ??
     (import.meta.env.VITE_WS_URL as string) ??
-    "https://jan.revolt.chat",
+    'https://jan.revolt.chat',
   /**
    * hCaptcha site key to use if enabled
    */
diff --git a/packages/client/components/i18n/__tests__/translationComponent.test.tsx b/packages/client/components/i18n/__tests__/translationComponent.test.tsx
index f7b05971b..4949ee43e 100644
--- a/packages/client/components/i18n/__tests__/translationComponent.test.tsx
+++ b/packages/client/components/i18n/__tests__/translationComponent.test.tsx
@@ -1,23 +1,23 @@
-import { render, screen } from "@solidjs/testing-library";
-import { describe, expect, it } from "vitest";
+import { render, screen } from '@solidjs/testing-library';
+import { describe, expect, it } from 'vitest';
 
-import { I18nContext, default as i18n, useTranslation } from "..";
+import { default as i18n, I18nContext, useTranslation } from '..';
 
 const TranslatedText = () => {
   const t = useTranslation();
 
-  return <div>{t("login.welcome")}</div>;
+  return <div>{t('login.welcome')}</div>;
 };
 
-describe("Translation component", () => {
-  it("should translate the text", () => {
+describe('Translation component', () => {
+  it('should translate the text', () => {
     render(() => (
       <I18nContext.Provider value={i18n}>
         <TranslatedText />
       </I18nContext.Provider>
     ));
 
-    const textElm = screen.getByText("Welcome!");
+    const textElm = screen.getByText('Welcome!');
     expect(textElm).toBeInTheDocument();
   });
 });
diff --git a/packages/client/components/i18n/dayjs.ts b/packages/client/components/i18n/dayjs.ts
index 123357c6a..2d4823f7f 100644
--- a/packages/client/components/i18n/dayjs.ts
+++ b/packages/client/components/i18n/dayjs.ts
@@ -1,8 +1,8 @@
-import dayJS from "dayjs";
-import advancedFormat from "dayjs/plugin/advancedFormat";
-import calendar from "dayjs/plugin/calendar";
-import localizedFormat from "dayjs/plugin/localizedFormat";
-import relativeTime from "dayjs/plugin/relativeTime";
+import dayJS from 'dayjs';
+import advancedFormat from 'dayjs/plugin/advancedFormat';
+import calendar from 'dayjs/plugin/calendar';
+import localizedFormat from 'dayjs/plugin/localizedFormat';
+import relativeTime from 'dayjs/plugin/relativeTime';
 
 /**
  * Export our dayjs function
diff --git a/packages/client/components/i18n/index.tsx b/packages/client/components/i18n/index.tsx
index 787ece4e3..734eb292a 100644
--- a/packages/client/components/i18n/index.tsx
+++ b/packages/client/components/i18n/index.tsx
@@ -1,49 +1,59 @@
-import { createSignal } from "solid-js";
+import * as i18n from '@solid-primitives/i18n';
+import {
+  createContext,
+  createSignal,
+  useContext,
+  useTransition,
+} from 'solid-js';
 
-import { createI18nContext, useI18n } from "@solid-primitives/i18n";
-import defaultsDeep from "lodash.defaultsdeep";
+import en from './locales/en.json';
+import { Language, Languages } from './locales/Languages';
 
-import { Language, Languages } from "./locales/Languages";
-import en from "./locales/en.json";
-
-export { Language, Languages } from "./locales/Languages";
-export { I18nContext, useI18n } from "@solid-primitives/i18n";
-export * from "./dayjs";
+export * from './dayjs';
+export { Language, Languages } from './locales/Languages';
 
 /**
  * Default dictionary object
  */
-const dict = {
+export const dict = {
   en,
 };
 
+export type RawDictionary = typeof dict.en;
+export type Dictionary = i18n.Flatten<RawDictionary>;
+
 /**
  * Currently set language
  */
-const [language, setLanguage] = createSignal<Language>("en" as Language);
+const [language, _setLanguage] = createSignal<Language>('en' as Language);
 export { language };
 
-/**
- * i18n Context
- */
-const context = createI18nContext(dict, "en");
-export default context;
-
 /**
  * Use translation function as a hook
  */
-export const useTranslation = () => useI18n()[0];
+
+export const I18nContext = createContext(
+  i18n.translator(() => i18n.flatten(dict.en), i18n.resolveTemplate)
+);
+
+export const useTranslation = () => useContext(I18nContext);
+
+const [duringI18nTransition, startI18nTransition] = useTransition();
+
+export { duringI18nTransition };
+
+export async function fetchLanguage(key: Language): Promise<Dictionary> {
+  const data = (await import(
+    `./locales/${Languages[key].i18n}.json`
+  )) as typeof dict.en;
+  return i18n.flatten(data);
+}
 
 /**
- * Load and set a language by the given key
+ * set a language by the given key
  */
-export async function loadAndSetLanguage(key: Language) {
-  if (language() === key) return;
-  setLanguage(key);
-
-  const data = await import(`./locales/${Languages[key].i18n}.json`);
-  context[1].add(key, defaultsDeep({}, data, en));
-  context[1].locale(key);
+export function setLanguage(key: Language) {
+  startI18nTransition(() => _setLanguage(key));
 }
 
 /**
@@ -59,10 +69,10 @@ export function browserPreferredLanguage() {
   // matches first, otherwise check for partial matches
   return (
     navigator.languages
-      .map((lang) => languages.find((l) => l[0].replace(/_/g, "-") == lang))
+      .map((lang) => languages.find((l) => l[0].replace(/_/g, '-') == lang))
       .filter((lang) => lang)[0]?.[0] ??
     navigator.languages
-      .map((x) => x.split("-")[0])
+      .map((x) => x.split('-')[0])
       .map((lang) => languages.find((l) => l[0] == lang))
       .filter((lang) => lang)[0]?.[0] ??
     Language.ENGLISH
@@ -74,8 +84,8 @@ export function browserPreferredLanguage() {
  */
 export const useQuantity = () => {
   const t = useTranslation();
-  return (id: string, count: number) =>
-    t(`quantities.${id}.${count > 1 ? "many" : "one"}`, {
+  return (id: 'members' | 'dropFiles', count: number) =>
+    t(`quantities.${id}.${count > 1 ? 'many' : 'one'}`, {
       count: count.toString(),
     });
 };
diff --git a/packages/client/components/keybinds/actions.ts b/packages/client/components/keybinds/actions.ts
index 7212331d3..8fbddf706 100644
--- a/packages/client/components/keybinds/actions.ts
+++ b/packages/client/components/keybinds/actions.ts
@@ -1,30 +1,30 @@
-import { KeyComboSequence } from ".";
+import type { KeyComboSequence } from '.';
 
 export enum KeybindAction {
   // Navigation
-  NavigateChannelUp = "navigate_channel_up",
-  NavigateChannelDown = "navigate_channel_down",
-  NavigateServerUp = "navigate_server_up",
-  NavigateServerDown = "navigate_server_down",
+  NavigateChannelUp = 'navigate_channel_up',
+  NavigateChannelDown = 'navigate_channel_down',
+  NavigateServerUp = 'navigate_server_up',
+  NavigateServerDown = 'navigate_server_down',
 
-  AutoCompleteUp = "auto_complete_up",
-  AutoCompleteDown = "auto_complete_down",
-  AutoCompleteSelect = "auto_complete_select",
+  AutoCompleteUp = 'auto_complete_up',
+  AutoCompleteDown = 'auto_complete_down',
+  AutoCompleteSelect = 'auto_complete_select',
 
-  NavigatePreviousContext = "navigate_previous_context",
-  NavigatePreviousContextModal = "navigate_previous_context_modal",
-  NavigatePreviousContextSettings = "navigate_previous_context_settings",
+  NavigatePreviousContext = 'navigate_previous_context',
+  NavigatePreviousContextModal = 'navigate_previous_context_modal',
+  NavigatePreviousContextSettings = 'navigate_previous_context_settings',
 
-  InputSubmit = "input_submit",
-  InputCancel = "input_cancel",
-  InputForceSubmit = "input_force_submit",
+  InputSubmit = 'input_submit',
+  InputCancel = 'input_cancel',
+  InputForceSubmit = 'input_force_submit',
 
-  MessagingMarkChannelRead = "messaging_mark_channel_read",
-  MessagingScrollToBottom = "messaging_scroll_to_bottom",
-  MessagingEditPreviousMessage = "messaging_edit_previous_message",
+  MessagingMarkChannelRead = 'messaging_mark_channel_read',
+  MessagingScrollToBottom = 'messaging_scroll_to_bottom',
+  MessagingEditPreviousMessage = 'messaging_edit_previous_message',
 
   // Developer
-  DeveloperToggleAllExperiments = "developer_toggle_all_experiments",
+  DeveloperToggleAllExperiments = 'developer_toggle_all_experiments',
 }
 
 export type KeybindActions = Record<KeybindAction, KeyComboSequence[]>;
diff --git a/packages/client/components/keybinds/index.ts b/packages/client/components/keybinds/index.ts
index 661dbbaff..a0e1285bf 100644
--- a/packages/client/components/keybinds/index.ts
+++ b/packages/client/components/keybinds/index.ts
@@ -1,7 +1,7 @@
-import { debounce } from "@revolt/common";
+import { debounce } from '@revolt/common';
 
 // note: order dependent!
-export const KEYBINDING_MODIFIER_KEYS = ["Control", "Alt", "Meta", "Shift"];
+export const KEYBINDING_MODIFIER_KEYS = ['Control', 'Alt', 'Meta', 'Shift'];
 
 /**
  * Keys that must be pressed at the same time, order should not matter.
@@ -17,7 +17,7 @@ export const KeyCombo = {
     );
 
     if (!KEYBINDING_MODIFIER_KEYS.includes(event.key)) {
-      pressed.push(event.key.replace(" ", "Space"));
+      pressed.push(event.key.replace(' ', 'Space'));
     }
 
     return pressed;
@@ -44,12 +44,12 @@ export const KeybindSequence = {
    * ```
    */
   parse(sequence: string): KeyComboSequence {
-    return sequence.split(" ").map((expr) => expr.split("+"));
+    return sequence.split(' ').map((expr) => expr.split('+'));
   },
 
   /** Stringify a keybind sequence */
   stringify(sequence: KeyComboSequence) {
-    return sequence.map((combo) => combo.join("+")).join(" ");
+    return sequence.map((combo) => combo.join('+')).join(' ');
   },
 
   /** Checks to see if two key sequences match */
@@ -63,13 +63,16 @@ export const KeybindSequence = {
 
 // having the type be 'keybind' would be more idiomatic but this works better as an api
 export class KeybindEvent<T extends string> extends KeyboardEvent {
-  constructor(public action: T, eventInitDict?: KeyboardEventInit | undefined) {
+  constructor(
+    public action: T,
+    eventInitDict?: KeyboardEventInit | undefined
+  ) {
     super(action, eventInitDict);
   }
 }
 
 export class KeybindEventHandler<
-  KeybindAction extends string
+  KeybindAction extends string,
 > extends EventTarget {
   possibleSequences = new Map<KeyComboSequence, KeyCombo[]>();
 
@@ -106,7 +109,7 @@ export class KeybindEventHandler<
             this.possibleSequences.set(sequence, expectedSequence.slice(1));
           } else {
             this.possibleSequences.delete(sequence);
-            console.info("dispatch", action, event);
+            console.info('dispatch', action, event);
             this.dispatchEvent(
               new KeybindEvent(action as KeybindAction, event)
             );
@@ -145,4 +148,4 @@ export class KeybindEventHandler<
   ) => void;
 }
 
-export * from "./actions";
+export * from './actions';
diff --git a/packages/client/components/markdown/elements.ts b/packages/client/components/markdown/elements.ts
index b0c09f3dd..d717de70f 100644
--- a/packages/client/components/markdown/elements.ts
+++ b/packages/client/components/markdown/elements.ts
@@ -1,147 +1,147 @@
-import { cva } from "styled-system/css";
-import { styled } from "styled-system/jsx";
-import type { SystemStyleObject } from "styled-system/types";
+import { cva } from 'styled-system/css';
+import { styled } from 'styled-system/jsx';
+import type { SystemStyleObject } from 'styled-system/types';
 
 const inlineCodeStyles: SystemStyleObject = {
   flexShrink: 0,
-  padding: "1px 4px",
-  borderRadius: "var(--borderRadius-md)",
+  padding: '1px 4px',
+  borderRadius: 'var(--borderRadius-md)',
 
-  color: "var(--colours-messaging-component-code-block-foreground)",
-  background: "var(--colours-messaging-component-code-block-background)",
+  color: 'var(--colours-messaging-component-code-block-foreground)',
+  background: 'var(--colours-messaging-component-code-block-background)',
 };
 
-export const paragraph = styled("p", {
+export const paragraph = styled('p', {
   base: {
-    "&>code": inlineCodeStyles,
+    '&>code': inlineCodeStyles,
   },
   variants: {
     emojiSize: {
       small: {
-        "--emoji-size": "var(--layout-emoji-small)",
+        '--emoji-size': 'var(--layout-emoji-small)',
       },
       medium: {
-        "--emoji-size": "var(--layout-emoji-medium)",
+        '--emoji-size': 'var(--layout-emoji-medium)',
       },
       large: {
-        "--emoji-size": "var(--layout-emoji-large)",
+        '--emoji-size': 'var(--layout-emoji-large)',
       },
     },
   },
 });
 
-export const emphasis = styled("em", {
+export const emphasis = styled('em', {
   base: {
-    fontStyle: "italic",
+    fontStyle: 'italic',
   },
 });
 
-export const heading1 = styled("h1", {
+export const heading1 = styled('h1', {
   base: {
-    fontSize: "2em",
+    fontSize: '2em',
     fontWeight: 600,
   },
 });
 
-export const heading2 = styled("h2", {
+export const heading2 = styled('h2', {
   base: {
-    fontSize: "1.6em",
+    fontSize: '1.6em',
     fontWeight: 600,
   },
 });
 
-export const heading3 = styled("h3", {
+export const heading3 = styled('h3', {
   base: {
-    fontSize: "1.4em",
+    fontSize: '1.4em',
     fontWeight: 600,
   },
 });
 
-export const heading4 = styled("h4", {
+export const heading4 = styled('h4', {
   base: {
-    fontSize: "1.2em",
+    fontSize: '1.2em',
     fontWeight: 600,
   },
 });
 
-export const heading5 = styled("h5", {
+export const heading5 = styled('h5', {
   base: {
-    fontSize: "1em",
+    fontSize: '1em',
     fontWeight: 600,
   },
 });
 
-export const heading6 = styled("h6", {
+export const heading6 = styled('h6', {
   base: {
-    fontSize: "0.8em",
+    fontSize: '0.8em',
     fontWeight: 600,
   },
 });
 
-export const listItem = styled("li", {
+export const listItem = styled('li', {
   base: {},
 });
 
-export const unorderedList = styled("ul", {
+export const unorderedList = styled('ul', {
   base: {
-    listStylePosition: "outside",
-    paddingLeft: "1.5em",
+    listStylePosition: 'outside',
+    paddingLeft: '1.5em',
 
-    "& li": {
-      listStyleType: "disc",
+    '& li': {
+      listStyleType: 'disc',
     },
 
-    "& li li": {
-      listStyleType: "circle",
+    '& li li': {
+      listStyleType: 'circle',
     },
   },
 });
 
-export const orderedList = styled("ol", {
+export const orderedList = styled('ol', {
   base: {
-    listStylePosition: "outside",
-    paddingLeft: "1.5em",
+    listStylePosition: 'outside',
+    paddingLeft: '1.5em',
 
-    listStyleType: "decimal",
+    listStyleType: 'decimal',
   },
 });
 
-export const blockquote = styled("blockquote", {
+export const blockquote = styled('blockquote', {
   base: {
-    margin: "var(--gap-sm) 0",
-    padding: "var(--gap-sm) var(--gap-md)",
-    borderRadius: "var(--borderRadius-md)",
-    color: "var(--colours-messaging-component-blockquote-foreground)",
-    background: "var(--colours-messaging-component-blockquote-background)",
+    margin: 'var(--gap-sm) 0',
+    padding: 'var(--gap-sm) var(--gap-md)',
+    borderRadius: 'var(--borderRadius-md)',
+    color: 'var(--colours-messaging-component-blockquote-foreground)',
+    background: 'var(--colours-messaging-component-blockquote-background)',
     borderInlineStart:
-      "var(--gap-sm) solid var(--colours-messaging-component-blockquote-foreground)",
+      'var(--gap-sm) solid var(--colours-messaging-component-blockquote-foreground)',
   },
 });
 
-export const table = styled("table", {
+export const table = styled('table', {
   base: {
-    borderCollapse: "collapse",
+    borderCollapse: 'collapse',
   },
 });
 
-export const tableHeader = styled("th", {
+export const tableHeader = styled('th', {
   base: {
     fontWeight: 600,
-    padding: "var(--gap-sm)",
-    border: "1px solid var(--colours-foreground)",
+    padding: 'var(--gap-sm)',
+    border: '1px solid var(--colours-foreground)',
   },
 });
 
-export const tableElement = styled("td", {
+export const tableElement = styled('td', {
   base: {
-    padding: "var(--gap-sm)",
-    border: "1px solid var(--colours-foreground)",
+    padding: 'var(--gap-sm)',
+    border: '1px solid var(--colours-foreground)',
   },
 });
 
-export const code = styled("code", {
+export const code = styled('code', {
   base: {
-    fontFamily: "var(--fonts-monospace)",
+    fontFamily: 'var(--fonts-monospace)',
   },
 });
 
diff --git a/packages/client/components/markdown/emoji/CustomEmoji.tsx b/packages/client/components/markdown/emoji/CustomEmoji.tsx
index 5c96a33a2..ec54446ee 100644
--- a/packages/client/components/markdown/emoji/CustomEmoji.tsx
+++ b/packages/client/components/markdown/emoji/CustomEmoji.tsx
@@ -1,8 +1,8 @@
-import { ComponentProps, splitProps } from "solid-js";
+import { useClient } from '@revolt/client';
+import type { ComponentProps } from 'solid-js';
+import { splitProps } from 'solid-js';
 
-import { useClient } from "@revolt/client";
-
-import { EmojiBase } from ".";
+import { EmojiBase } from '.';
 
 /**
  * Display custom emoji
@@ -10,10 +10,10 @@ import { EmojiBase } from ".";
 export function CustomEmoji(
   props: { id: string } & Omit<
     ComponentProps<typeof EmojiBase>,
-    "loading" | "class" | "draggable" | "src"
+    'loading' | 'class' | 'draggable' | 'src'
   >
 ) {
-  const [local, remote] = splitProps(props, ["id"]);
+  const [local, remote] = splitProps(props, ['id']);
   const client = useClient();
 
   /**
@@ -25,8 +25,8 @@ export function CustomEmoji(
   return (
     <EmojiBase
       {...remote}
-      loading="lazy"
-      class="emoji"
+      loading='lazy'
+      class='emoji'
       draggable={false}
       src={url()}
       alt={`:${local.id}:`}
diff --git a/packages/client/components/markdown/emoji/Emoji.tsx b/packages/client/components/markdown/emoji/Emoji.tsx
index 8ae8687a2..e8369ddf5 100644
--- a/packages/client/components/markdown/emoji/Emoji.tsx
+++ b/packages/client/components/markdown/emoji/Emoji.tsx
@@ -1,12 +1,12 @@
-import { Match, Switch } from "solid-js";
-import { styled } from "solid-styled-components";
+import { Match, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { CustomEmoji, UnicodeEmoji } from ".";
+import { CustomEmoji, UnicodeEmoji } from '.';
 
 /**
  * Image component for rendering emojis
  */
-export const EmojiBase = styled("img", "Emoji")`
+export const EmojiBase = styled('img', 'Emoji')`
   object-fit: contain;
 
   display: inline;
@@ -16,7 +16,7 @@ export const EmojiBase = styled("img", "Emoji")`
   vertical-align: -0.3em;
 
   img:before {
-    content: " ";
+    content: ' ';
     display: block;
     position: absolute;
     height: 50px;
diff --git a/packages/client/components/markdown/emoji/TextWithEmoji.tsx b/packages/client/components/markdown/emoji/TextWithEmoji.tsx
index a7c93c210..eaf0f9305 100644
--- a/packages/client/components/markdown/emoji/TextWithEmoji.tsx
+++ b/packages/client/components/markdown/emoji/TextWithEmoji.tsx
@@ -1,6 +1,6 @@
-import { JSX } from "solid-js";
+import type { JSX } from 'solid-js';
 
-import { CustomEmoji, RE_ANY_EMOJI, UnicodeEmoji } from ".";
+import { CustomEmoji, RE_ANY_EMOJI, UnicodeEmoji } from '.';
 
 /**
  * Convert any arbitrary text to rich text with emoji
diff --git a/packages/client/components/markdown/emoji/UnicodeEmoji.tsx b/packages/client/components/markdown/emoji/UnicodeEmoji.tsx
index 3728278c6..c22bf7367 100644
--- a/packages/client/components/markdown/emoji/UnicodeEmoji.tsx
+++ b/packages/client/components/markdown/emoji/UnicodeEmoji.tsx
@@ -1,6 +1,7 @@
-import { ComponentProps, splitProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
+import { splitProps } from 'solid-js';
 
-import { EmojiBase, toCodepoint } from ".";
+import { EmojiBase, toCodepoint } from '.';
 
 /**
  * Display Unicode emoji
@@ -8,16 +9,16 @@ import { EmojiBase, toCodepoint } from ".";
 export function UnicodeEmoji(
   props: { emoji: string } & Omit<
     ComponentProps<typeof EmojiBase>,
-    "loading" | "class" | "alt" | "draggable" | "src"
+    'loading' | 'class' | 'alt' | 'draggable' | 'src'
   >
 ) {
-  const [local, remote] = splitProps(props, ["emoji"]);
+  const [local, remote] = splitProps(props, ['emoji']);
 
   return (
     <EmojiBase
       {...remote}
-      loading="lazy"
-      class="emoji"
+      loading='lazy'
+      class='emoji'
       alt={local.emoji}
       draggable={false}
       src={`https://static.revolt.chat/emoji/fluent-3d/${toCodepoint(
diff --git a/packages/client/components/markdown/emoji/index.ts b/packages/client/components/markdown/emoji/index.ts
index b70cebe74..092fe9828 100644
--- a/packages/client/components/markdown/emoji/index.ts
+++ b/packages/client/components/markdown/emoji/index.ts
@@ -1,4 +1,4 @@
-export { CustomEmoji } from "./CustomEmoji";
-export { UnicodeEmoji } from "./UnicodeEmoji";
-export { EmojiBase, Emoji } from "./Emoji";
-export * from "./util";
+export { CustomEmoji } from './CustomEmoji';
+export { Emoji, EmojiBase } from './Emoji';
+export { UnicodeEmoji } from './UnicodeEmoji';
+export * from './util';
diff --git a/packages/client/components/markdown/emoji/util.ts b/packages/client/components/markdown/emoji/util.ts
index 5238f9893..d8939ed33 100644
--- a/packages/client/components/markdown/emoji/util.ts
+++ b/packages/client/components/markdown/emoji/util.ts
@@ -1,6 +1,6 @@
-import emojiRegex from "emoji-regex";
+import emojiRegex from 'emoji-regex';
 
-import { MarkdownProps } from "..";
+import type { MarkdownProps } from '..';
 
 /**
  * Regex for custom emoji
@@ -11,8 +11,8 @@ export const RE_CUSTOM_EMOJI = /:([0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}):/g;
  * Regex for any emoji
  */
 export const RE_ANY_EMOJI = new RegExp(
-  RE_CUSTOM_EMOJI.source + "|" + emojiRegex().source,
-  "g"
+  RE_CUSTOM_EMOJI.source + '|' + emojiRegex().source,
+  'g'
 );
 
 /**
@@ -21,7 +21,7 @@ export const RE_ANY_EMOJI = new RegExp(
  * @returns Whether it is only emoji
  */
 export function isOnlyEmoji(text: string) {
-  return text.replaceAll(RE_ANY_EMOJI, "").trim().length === 0;
+  return text.replaceAll(RE_ANY_EMOJI, '').trim().length === 0;
 }
 
 /**
@@ -33,7 +33,7 @@ export function injectEmojiSize(
   props: MarkdownProps,
   hastNode: { children?: { properties: Record<string, string> }[] }
 ) {
-  const content = props.content ?? "";
+  const content = props.content ?? '';
 
   // inject emoji size information
   const properties = (
@@ -48,15 +48,15 @@ export function injectEmojiSize(
       RE_ANY_EMOJI.exec(content);
 
       // large by default
-      let size = "large";
+      let size = 'large';
 
       // check if we match more than one
       // if so, make it slightly smaller
       if (RE_ANY_EMOJI.exec(content)) {
-        size = "medium";
+        size = 'medium';
       }
 
-      properties["emojiSize"] = size;
+      properties['emojiSize'] = size;
     }
   }
 }
@@ -94,8 +94,8 @@ export function toCodepoint(input: string) {
       }
     }
 
-    return pairs.map((char) => char.toString(16)).join("-");
+    return pairs.map((char) => char.toString(16)).join('-');
   }
 
-  return "";
+  return '';
 }
diff --git a/packages/client/components/markdown/hast.ts b/packages/client/components/markdown/hast.ts
index 4109066fa..a2c08740d 100644
--- a/packages/client/components/markdown/hast.ts
+++ b/packages/client/components/markdown/hast.ts
@@ -1,5 +1,5 @@
-import { passThroughComponents } from "./plugins/remarkRegexComponent";
-import { timestampHandler } from "./plugins/timestamps";
+import { passThroughComponents } from './plugins/remarkRegexComponent';
+import { timestampHandler } from './plugins/timestamps';
 
 export const handlers = {
   // ...passThroughComponents("uemoji", "cemoji", "spoiler", "mention", "channel"),
diff --git a/packages/client/components/markdown/index.tsx b/packages/client/components/markdown/index.tsx
index c6fa50b6a..78706f707 100644
--- a/packages/client/components/markdown/index.tsx
+++ b/packages/client/components/markdown/index.tsx
@@ -1,46 +1,46 @@
-import { createEffect, createSignal, on } from "solid-js";
-import { styled } from "solid-styled-components";
-
-import "katex/dist/katex.min.css";
-import { html } from "property-information";
-import rehypeHighlight from "rehype-highlight";
-import rehypeKatex from "rehype-katex";
-import remarkBreaks from "remark-breaks";
-import remarkGfm from "remark-gfm";
-import remarkMath from "remark-math";
-import remarkParse from "remark-parse";
-import remarkRehype from "remark-rehype";
-import { unified } from "unified";
-import { VFile } from "vfile";
-
-import * as elements from "./elements";
-import { injectEmojiSize } from "./emoji/util";
-import { handlers } from "./hast";
-import { RenderCodeblock } from "./plugins/Codeblock";
-import { RenderAnchor } from "./plugins/anchors";
-import { remarkChannels } from "./plugins/channels";
-import { RenderCustomEmoji, remarkCustomEmoji } from "./plugins/customEmoji";
-import { remarkHtmlToText } from "./plugins/htmlToText";
+import 'katex/dist/katex.min.css';
+
+import { html } from 'property-information';
+import rehypeHighlight from 'rehype-highlight';
+import rehypeKatex from 'rehype-katex';
+import remarkBreaks from 'remark-breaks';
+import remarkGfm from 'remark-gfm';
+import remarkMath from 'remark-math';
+import remarkParse from 'remark-parse';
+import remarkRehype from 'remark-rehype';
+import { createEffect, createSignal, on } from 'solid-js';
+import { styled } from 'solid-styled-components';
+import { unified } from 'unified';
+import { VFile } from 'vfile';
+
+import * as elements from './elements';
+import { injectEmojiSize } from './emoji/util';
+import { handlers } from './hast';
+import { RenderAnchor } from './plugins/anchors';
+import { remarkChannels } from './plugins/channels';
+import { RenderCodeblock } from './plugins/Codeblock';
+import { remarkCustomEmoji, RenderCustomEmoji } from './plugins/customEmoji';
+import { remarkHtmlToText } from './plugins/htmlToText';
 import {
-  RenderMention,
   mentionHandler,
   remarkMentions,
-} from "./plugins/mentions";
-import { passThroughComponents } from "./plugins/remarkRegexComponent";
+  RenderMention,
+} from './plugins/mentions';
+import { passThroughComponents } from './plugins/remarkRegexComponent';
 import {
-  RenderSpoiler,
   remarkSpoiler,
+  RenderSpoiler,
   spoilerHandler,
-} from "./plugins/spoiler";
+} from './plugins/spoiler';
 import {
-  RenderTimestamp,
   remarkTimestamps,
+  RenderTimestamp,
   timestampHandler,
-} from "./plugins/timestamps";
-import { RenderUnicodeEmoji, remarkUnicodeEmoji } from "./plugins/unicodeEmoji";
-import { remarkInsertBreaks, sanitise } from "./sanitise";
-import { childrenToSolid } from "./solid-markdown/ast-to-solid";
-import { defaults } from "./solid-markdown/defaults";
+} from './plugins/timestamps';
+import { remarkUnicodeEmoji, RenderUnicodeEmoji } from './plugins/unicodeEmoji';
+import { remarkInsertBreaks, sanitise } from './sanitise';
+import { childrenToSolid } from './solid-markdown/ast-to-solid';
+import { defaults } from './solid-markdown/defaults';
 
 /**
  * Empty component
@@ -123,8 +123,8 @@ const pipeline = unified()
     maxExpand: 2,
     trust: false,
     strict: false,
-    output: "html",
-    errorColor: "var(--customColours-error-color)",
+    output: 'html',
+    errorColor: 'var(--customColours-error-color)',
   })
   .use(rehypeHighlight);
 
@@ -140,8 +140,8 @@ export interface MarkdownProps {
   disallowBigEmoji?: boolean;
 }
 
-export { TextWithEmoji } from "./emoji/TextWithEmoji";
-export { Emoji } from "./emoji/Emoji";
+export { Emoji } from './emoji/Emoji';
+export { TextWithEmoji } from './emoji/TextWithEmoji';
 
 /**
  * Remark renderer component
@@ -151,14 +151,14 @@ export function Markdown(props: MarkdownProps) {
    * Render some given Markdown content
    * @param content content
    */
-  function render(content = "") {
+  function render(content = '') {
     const file = new VFile();
     file.value = sanitise(content);
 
     const hastNode = pipeline.runSync(pipeline.parse(file), file);
 
-    if (hastNode.type !== "root") {
-      throw new TypeError("Expected a `root` node");
+    if (hastNode.type !== 'root') {
+      throw new TypeError('Expected a `root` node');
     }
 
     injectEmojiSize(props, hastNode as any);
diff --git a/packages/client/components/markdown/plugins/Codeblock.tsx b/packages/client/components/markdown/plugins/Codeblock.tsx
index 3fadd281c..137a77734 100644
--- a/packages/client/components/markdown/plugins/Codeblock.tsx
+++ b/packages/client/components/markdown/plugins/Codeblock.tsx
@@ -1,21 +1,20 @@
-import { JSX } from "solid-js";
+import type { JSX } from 'solid-js';
+import { styled } from 'styled-system/jsx';
 
-import { styled } from "styled-system/jsx";
-
-const Codeblock = styled("pre", {
+const Codeblock = styled('pre', {
   base: {
-    color: "#c9d1d9",
-    background: "#0d1117",
+    color: '#c9d1d9',
+    background: '#0d1117',
 
-    padding: "var(--gap-md)",
-    borderRadius: "var(--borderRadius-md)",
+    padding: 'var(--gap-md)',
+    borderRadius: 'var(--borderRadius-md)',
 
-    wordWrap: "break-word",
-    whiteSpace: "pre-wrap",
+    wordWrap: 'break-word',
+    whiteSpace: 'pre-wrap',
 
-    "&> code": {
-      color: "inherit !important",
-      background: "transparent !important",
+    '&> code': {
+      color: 'inherit !important',
+      background: 'transparent !important',
     },
   },
 });
diff --git a/packages/client/components/markdown/plugins/anchors.tsx b/packages/client/components/markdown/plugins/anchors.tsx
index f12112818..18813a497 100644
--- a/packages/client/components/markdown/plugins/anchors.tsx
+++ b/packages/client/components/markdown/plugins/anchors.tsx
@@ -1,58 +1,56 @@
-import { JSX, Switch, splitProps } from "solid-js";
-
-import { cva } from "styled-system/css";
-
-import { useClient } from "@revolt/client";
-import { paramsFromPathname } from "@revolt/routing";
-import { Avatar, iconSize } from "@revolt/ui";
-
-import MdChat from "@material-design-icons/svg/outlined/chat.svg?component-solid";
-import MdChevronRight from "@material-design-icons/svg/outlined/chevron_right.svg?component-solid";
+import MdChat from '@material-design-icons/svg/outlined/chat.svg?component-solid';
+import MdChevronRight from '@material-design-icons/svg/outlined/chevron_right.svg?component-solid';
 // import { determineLink } from "../../../lib/links";
 // import { modalController } from "../../../controllers/modals/ModalController";
-import MdTag from "@material-design-icons/svg/outlined/tag.svg?component-solid";
+import MdTag from '@material-design-icons/svg/outlined/tag.svg?component-solid';
+import { useClient } from '@revolt/client';
+import { paramsFromPathname } from '@revolt/routing';
+import { Avatar, iconSize } from '@revolt/ui';
+import type { JSX } from 'solid-js';
+import { splitProps, Switch } from 'solid-js';
+import { cva } from 'styled-system/css';
 
 const link = cva({
   base: {
-    color: "#0088ce !important",
+    color: '#0088ce !important',
   },
 });
 
 const internalLink = cva({
   base: {
-    verticalAlign: "bottom",
+    verticalAlign: 'bottom',
 
-    gap: "4px",
-    paddingLeft: "2px",
-    paddingRight: "6px",
-    alignItems: "center",
-    display: "inline-flex",
-    textDecoration: "none !important",
+    gap: '4px',
+    paddingLeft: '2px',
+    paddingRight: '6px',
+    alignItems: 'center',
+    display: 'inline-flex',
+    textDecoration: 'none !important',
 
-    cursor: "pointer",
+    cursor: 'pointer',
     fontWeight: 600,
-    borderRadius: "var(--borderRadius-lg)",
-    color: "var(--colours-messaging-component-mention-foreground)",
-    background: "var(--colours-messaging-component-mention-background)",
+    borderRadius: 'var(--borderRadius-lg)',
+    color: 'var(--colours-messaging-component-mention-foreground)',
+    background: 'var(--colours-messaging-component-mention-background)',
   },
 });
 
 export function RenderAnchor(
   props: JSX.AnchorHTMLAttributes<HTMLAnchorElement>
 ) {
-  const [localProps, remoteProps] = splitProps(props, ["href"]);
+  const [localProps, remoteProps] = splitProps(props, ['href']);
 
   // Pass-through no href or if anchor
   if (!localProps.href) return <a href={localProps.href} {...props} />;
 
-  let internal = false;
+  const internal = false;
   try {
     const url = new URL(localProps.href);
     if (
       [
         location.origin,
-        "https://app.revolt.chat",
-        "https://revolt.chat",
+        'https://app.revolt.chat',
+        'https://revolt.chat',
       ].includes(url.origin)
     ) {
       const newUrl = new URL(url.pathname, location.origin);
@@ -62,12 +60,12 @@ export function RenderAnchor(
       if (params.exactChannel) {
         return (
           <a class={internalLink()} href={newUrl.toString()}>
-            <MdTag {...iconSize("1em")} />
+            <MdTag {...iconSize('1em')} />
             {client().channels.get(params.channelId!)?.name}
             {params.exactMessage && (
               <>
-                <MdChevronRight {...iconSize("1em")} />
-                <MdChat {...iconSize("1em")} />
+                <MdChevronRight {...iconSize('1em')} />
+                <MdChat {...iconSize('1em')} />
               </>
             )}
           </a>
@@ -85,7 +83,7 @@ export function RenderAnchor(
             {...remoteProps}
             class={link()}
             href={newUrl.toString()}
-            rel="noreferrer"
+            rel='noreferrer'
           />
         );
       }
@@ -108,8 +106,8 @@ export function RenderAnchor(
       {...remoteProps}
       class={link()}
       href={localProps.href}
-      target={"_blank"}
-      rel="noreferrer"
+      target={'_blank'}
+      rel='noreferrer'
       // onClick={(ev) => modalController.openLink(href) && ev.preventDefault()}
     />
   );
diff --git a/packages/client/components/markdown/plugins/channels.tsx b/packages/client/components/markdown/plugins/channels.tsx
index 03a47f3d5..b49c5d061 100644
--- a/packages/client/components/markdown/plugins/channels.tsx
+++ b/packages/client/components/markdown/plugins/channels.tsx
@@ -1,38 +1,37 @@
-import { Plugin } from "unified";
-import { visit } from "unist-util-visit";
-
-import { clientController } from "@revolt/client";
+import { clientController } from '@revolt/client';
+import type { Plugin } from 'unified';
+import { visit } from 'unist-util-visit';
 
 const RE_CHANNEL = /<#([A-z0-9]{26})>/g;
 
 export const remarkChannels: Plugin = () => (tree) => {
   visit(
     tree,
-    "text",
+    'text',
     (
-      node: { type: "text"; value: string },
+      node: { type: 'text'; value: string },
       idx,
       parent: { children: any[] }
     ) => {
-      let elements = node.value.split(RE_CHANNEL);
+      const elements = node.value.split(RE_CHANNEL);
       if (elements.length === 1) return; // no matches
 
       const client = clientController.getCurrentClient();
-      let newNodes = elements.map((value, index) => {
+      const newNodes = elements.map((value, index) => {
         if (index % 2) {
           const channel = client.channels.get(value);
           if (channel) {
             return {
-              type: "link",
+              type: 'link',
               url: `${location.origin}${
-                channel.server ? `/server/${channel.serverId}` : ""
+                channel.server ? `/server/${channel.serverId}` : ''
               }/channel/${channel.id}`,
             };
           }
         }
 
         return {
-          type: "text",
+          type: 'text',
           value,
         };
       });
diff --git a/packages/client/components/markdown/plugins/customEmoji.tsx b/packages/client/components/markdown/plugins/customEmoji.tsx
index 464b0ba8e..69bf090b5 100644
--- a/packages/client/components/markdown/plugins/customEmoji.tsx
+++ b/packages/client/components/markdown/plugins/customEmoji.tsx
@@ -1,14 +1,10 @@
-import { Match, Switch, createSignal, onMount } from "solid-js";
+import { useClient } from '@revolt/client';
+import { Avatar, Column, Row, styled } from '@revolt/ui';
+import { createSignal, Match, onMount, Switch } from 'solid-js';
 
-import { useClient } from "@revolt/client";
-import { Avatar, Column, Row, styled } from "@revolt/ui";
-
-import { CustomEmoji, Emoji, RE_CUSTOM_EMOJI } from "../emoji";
-
-import {
-  CustomComponentProps,
-  createRegexComponent,
-} from "./remarkRegexComponent";
+import { CustomEmoji, Emoji, RE_CUSTOM_EMOJI } from '../emoji';
+import type { CustomComponentProps } from './remarkRegexComponent';
+import { createRegexComponent } from './remarkRegexComponent';
 
 /**
  * Render a custom emoji
@@ -30,7 +26,7 @@ export function RenderCustomEmoji(props: CustomComponentProps) {
    */
   const server = () =>
     client()!.servers.get(
-      (emoji()!.parent as { type: "Server"; id: string }).id
+      (emoji()!.parent as { type: 'Server'; id: string }).id
     )!;
 
   return (
@@ -39,10 +35,10 @@ export function RenderCustomEmoji(props: CustomComponentProps) {
         <TooltipTrigger
           use:floating={{
             tooltip: {
-              placement: "top",
+              placement: 'top',
               content: () => (
-                <Row align gap="lg">
-                  <span style={{ "--emoji-size": "3em" }}>
+                <Row align gap='lg'>
+                  <span style={{ '--emoji-size': '3em' }}>
                     <Emoji emoji={props.match} />
                   </span>
                   <Switch
@@ -53,10 +49,10 @@ export function RenderCustomEmoji(props: CustomComponentProps) {
                       </>
                     }
                   >
-                    <Match when={emoji()?.parent.type === "Server"}>
+                    <Match when={emoji()?.parent.type === 'Server'}>
                       <Column align>
                         <span>{`:${emoji()!.name}:`}</span>
-                        <Switch fallback="Private Server">
+                        <Switch fallback='Private Server'>
                           <Match when={server()}>
                             <Row align>
                               <Avatar
@@ -73,11 +69,11 @@ export function RenderCustomEmoji(props: CustomComponentProps) {
                 </Row>
               ),
               aria:
-                emoji()?.parent.type === "Server"
+                emoji()?.parent.type === 'Server'
                   ? `:${emoji()!.name}: from ${
-                      server()?.name ?? "Private Server"
+                      server()?.name ?? 'Private Server'
                     }`
-                  : "Unknown emote",
+                  : 'Unknown emote',
             },
           }}
         >
@@ -105,6 +101,6 @@ function FetchEmote(props: { id: string }) {
 }
 
 export const remarkCustomEmoji = createRegexComponent(
-  "cemoji",
+  'cemoji',
   RE_CUSTOM_EMOJI
 );
diff --git a/packages/client/components/markdown/plugins/htmlToText.ts b/packages/client/components/markdown/plugins/htmlToText.ts
index cc787346d..009526a7c 100644
--- a/packages/client/components/markdown/plugins/htmlToText.ts
+++ b/packages/client/components/markdown/plugins/htmlToText.ts
@@ -1,10 +1,10 @@
-import { Plugin } from "unified";
-import { visit } from "unist-util-visit";
+import type { Plugin } from 'unified';
+import { visit } from 'unist-util-visit';
 
 export const remarkHtmlToText: Plugin = () => {
   return (tree) => {
-    visit(tree, "html", (node: { type: string; value: string }) => {
-      node.type = "text";
+    visit(tree, 'html', (node: { type: string; value: string }) => {
+      node.type = 'text';
     });
   };
 };
diff --git a/packages/client/components/markdown/plugins/mentions.tsx b/packages/client/components/markdown/plugins/mentions.tsx
index 37df7e010..73eee72cc 100644
--- a/packages/client/components/markdown/plugins/mentions.tsx
+++ b/packages/client/components/markdown/plugins/mentions.tsx
@@ -1,36 +1,34 @@
-import { Match, Show, Switch } from "solid-js";
+import { UserContextMenu } from '@revolt/app';
+import { Avatar, ColouredText } from '@revolt/ui';
+import type { Handler } from 'mdast-util-to-hast';
+import { Match, Show, Switch } from 'solid-js';
+import { cva } from 'styled-system/css';
+import type { Plugin } from 'unified';
+import { visit } from 'unist-util-visit';
 
-import { Handler } from "mdast-util-to-hast";
-import { cva } from "styled-system/css";
-import { Plugin } from "unified";
-import { visit } from "unist-util-visit";
-
-import { UserContextMenu } from "@revolt/app";
-import { Avatar, ColouredText } from "@revolt/ui";
-
-import { useUser } from "../users";
+import { useUser } from '../users';
 
 const mention = cva({
   base: {
-    verticalAlign: "bottom",
+    verticalAlign: 'bottom',
 
-    gap: "4px",
-    paddingLeft: "2px",
-    paddingRight: "6px",
-    alignItems: "center",
-    display: "inline-flex",
+    gap: '4px',
+    paddingLeft: '2px',
+    paddingRight: '6px',
+    alignItems: 'center',
+    display: 'inline-flex',
 
-    cursor: "pointer",
+    cursor: 'pointer',
     fontWeight: 600,
-    borderRadius: "var(--borderRadius-lg)",
-    color: "var(--colours-messaging-component-mention-foreground)",
-    background: "var(--colours-messaging-component-mention-background)",
+    borderRadius: 'var(--borderRadius-lg)',
+    color: 'var(--colours-messaging-component-mention-foreground)',
+    background: 'var(--colours-messaging-component-mention-background)',
   },
   variants: {
     valid: {
       false: {
-        paddingLeft: "6px",
-        cursor: "not-allowed",
+        paddingLeft: '6px',
+        cursor: 'not-allowed',
       },
     },
   },
@@ -59,7 +57,7 @@ export function RenderMention(props: { userId: string }) {
           <Avatar size={16} src={user().avatar} fallback={user().username} />
           <ColouredText
             colour={user().colour!}
-            clip={user().colour?.includes("gradient")}
+            clip={user().colour?.includes('gradient')}
           >
             {user().username}
           </ColouredText>
@@ -77,12 +75,12 @@ export const remarkMentions: Plugin = () => (tree) => {
   // chain, so instead we just convert these links where appropriate!
   visit(
     tree,
-    "link",
-    (node: { type: "link"; url: string }, idx, parent: { children: any[] }) => {
+    'link',
+    (node: { type: 'link'; url: string }, idx, parent: { children: any[] }) => {
       const match = RE_MENTION.exec(node.url);
       if (match) {
         parent.children.splice(idx, 1, {
-          type: "mention",
+          type: 'mention',
           userId: match[1],
         });
       }
@@ -121,8 +119,8 @@ export const remarkMentions: Plugin = () => (tree) => {
 
 export const mentionHandler: Handler = (h, node) => {
   return {
-    type: "element" as const,
-    tagName: "mention",
+    type: 'element' as const,
+    tagName: 'mention',
     children: [],
     properties: {
       userId: node.userId,
diff --git a/packages/client/components/markdown/plugins/remarkRegexComponent.ts b/packages/client/components/markdown/plugins/remarkRegexComponent.ts
index 14eaf1fa1..bfbf354f2 100644
--- a/packages/client/components/markdown/plugins/remarkRegexComponent.ts
+++ b/packages/client/components/markdown/plugins/remarkRegexComponent.ts
@@ -1,6 +1,6 @@
-import type { Handler } from "mdast-util-to-hast";
-import type { Plugin } from "unified";
-import { visit } from "unist-util-visit";
+import type { Handler } from 'mdast-util-to-hast';
+import type { Plugin } from 'unified';
+import { visit } from 'unist-util-visit';
 
 /**
  * Props given to custom components
@@ -28,11 +28,11 @@ export function createRegexComponent(
    */
   return () => {
     return (tree) => {
-      console.info("the tree", tree);
+      console.info('the tree', tree);
 
       visit(
         tree,
-        "text",
+        'text',
         (
           node: { value: string },
           index: number,
@@ -51,7 +51,7 @@ export function createRegexComponent(
 
               if (start !== position) {
                 result.push({
-                  type: "text",
+                  type: 'text',
                   value: node.value.slice(start, position),
                 });
               }
@@ -68,10 +68,10 @@ export function createRegexComponent(
             match = regex.exec(node.value);
           }
 
-          if (result.length > 0 && parent && typeof index === "number") {
+          if (result.length > 0 && parent && typeof index === 'number') {
             if (start < node.value.length) {
               result.push({
-                type: "text",
+                type: 'text',
                 value: node.value.slice(start),
               });
             }
@@ -92,13 +92,13 @@ export function createRegexComponent(
  */
 export const passThroughRehype: (name: string) => Handler = (name: string) => {
   return (h, node, parent) => {
-    console.info("Build", h, node, parent);
+    console.info('Build', h, node, parent);
     return {
-      type: "element",
-      tagName: "spoiler",
+      type: 'element',
+      tagName: 'spoiler',
       children: [
         {
-          type: "raw",
+          type: 'raw',
           value: node.match,
         },
       ],
diff --git a/packages/client/components/markdown/plugins/spoiler.tsx b/packages/client/components/markdown/plugins/spoiler.tsx
index 09a5cc28a..131863826 100644
--- a/packages/client/components/markdown/plugins/spoiler.tsx
+++ b/packages/client/components/markdown/plugins/spoiler.tsx
@@ -1,26 +1,25 @@
-import { createSignal } from "solid-js";
-import { styled } from "solid-styled-components";
+import type { Handler } from 'mdast-util-to-hast';
+import { createSignal } from 'solid-js';
+import { styled } from 'solid-styled-components';
+import type { Plugin } from 'unified';
+import { visit } from 'unist-util-visit';
 
-import { Handler } from "mdast-util-to-hast";
-import { Plugin } from "unified";
-import { visit } from "unist-util-visit";
+import type { CustomComponentProps } from './remarkRegexComponent';
 
-import { CustomComponentProps } from "./remarkRegexComponent";
-
-const Spoiler = styled("span", "Spoiler")<{ shown: boolean }>`
+const Spoiler = styled('span', 'Spoiler')<{ shown: boolean }>`
   padding: 0 2px;
   border-radius: ${(props) => props.theme!.borderRadius.md};
 
-  cursor: ${(props) => (props.shown ? "auto" : "pointer")};
-  user-select: ${(props) => (props.shown ? "all" : "none")};
+  cursor: ${(props) => (props.shown ? 'auto' : 'pointer')};
+  user-select: ${(props) => (props.shown ? 'all' : 'none')};
   color: ${(props) =>
-    props.shown ? props.theme!.colours.background : "transparent"};
+    props.shown ? props.theme!.colours.background : 'transparent'};
   background: ${(props) =>
-    props.shown ? props.theme!.colours.foreground : "#151515"};
+    props.shown ? props.theme!.colours.foreground : '#151515'};
 
   > * {
     opacity: ${(props) => (props.shown ? 1 : 0)};
-    pointer-events: ${(props) => (props.shown ? "unset" : "none")};
+    pointer-events: ${(props) => (props.shown ? 'unset' : 'none')};
   }
 `;
 
@@ -37,13 +36,13 @@ export function RenderSpoiler(props: CustomComponentProps & { children: any }) {
 export const remarkSpoiler: Plugin = () => (tree) => {
   visit(
     tree,
-    "paragraph",
+    'paragraph',
     (
       node: {
         children: (
-          | { type: "text"; value: string }
-          | { type: "paragraph"; children: any[] }
-          | { type: "spoiler"; children: any[] }
+          | { type: 'text'; value: string }
+          | { type: 'paragraph'; children: any[] }
+          | { type: 'spoiler'; children: any[] }
         )[];
       },
       idx,
@@ -58,8 +57,8 @@ export const remarkSpoiler: Plugin = () => (tree) => {
         const child = node.children[i];
 
         // Find the next text element to start a spoiler from
-        if (child.type === "text") {
-          const components = child.value.split("||");
+        if (child.type === 'text') {
+          const components = child.value.split('||');
           if (components.length === 1) continue; // no spoilers
 
           // Handle terminating spoiler tag
@@ -72,12 +71,12 @@ export const remarkSpoiler: Plugin = () => (tree) => {
 
             // Create a spoiler
             node.children.splice(i, 0, {
-              type: "spoiler",
+              type: 'spoiler',
               children: [
                 ...spoilerContent,
                 ...elements,
                 {
-                  type: "text",
+                  type: 'text',
                   value: components.shift(),
                 },
               ],
@@ -104,16 +103,16 @@ export const remarkSpoiler: Plugin = () => (tree) => {
                 i + 1,
                 0,
                 {
-                  type: "spoiler",
+                  type: 'spoiler',
                   children: [
                     {
-                      type: "text",
+                      type: 'text',
                       value: components.shift(),
                     },
                   ],
                 },
                 {
-                  type: "text",
+                  type: 'text',
                   value: components.shift()!,
                 }
               );
@@ -126,7 +125,7 @@ export const remarkSpoiler: Plugin = () => (tree) => {
           if (spillOver) {
             searchingForEnd = i + 1;
             spoilerContent.push({
-              type: "text",
+              type: 'text',
               value: components.pop(),
             });
           }
@@ -138,10 +137,10 @@ export const remarkSpoiler: Plugin = () => (tree) => {
 
 export const spoilerHandler: Handler = (h, node) => {
   return {
-    type: "element" as const,
-    tagName: "spoiler",
+    type: 'element' as const,
+    tagName: 'spoiler',
     children: h.all({
-      type: "paragraph",
+      type: 'paragraph',
       children: node.children,
     }),
     properties: {},
diff --git a/packages/client/components/markdown/plugins/timestamps.tsx b/packages/client/components/markdown/plugins/timestamps.tsx
index 47ba4c768..a3744974c 100644
--- a/packages/client/components/markdown/plugins/timestamps.tsx
+++ b/packages/client/components/markdown/plugins/timestamps.tsx
@@ -1,13 +1,11 @@
-import { createEffect, createSignal } from "solid-js";
+import { dayjs } from '@revolt/i18n';
+import type { Dayjs } from 'dayjs';
+import type { Handler } from 'mdast-util-to-hast';
+import { createEffect, createSignal } from 'solid-js';
+import type { Plugin } from 'unified';
+import { visit } from 'unist-util-visit';
 
-import { Dayjs } from "dayjs";
-import type { Handler } from "mdast-util-to-hast";
-import { Plugin } from "unified";
-import { visit } from "unist-util-visit";
-
-import { dayjs } from "@revolt/i18n";
-
-import { time as Time } from "../elements";
+import { time as Time } from '../elements';
 
 export function RenderTimestamp(props: { format: string; date: Dayjs }) {
   /**
@@ -15,18 +13,18 @@ export function RenderTimestamp(props: { format: string; date: Dayjs }) {
    */
   function format() {
     switch (props.format) {
-      case "t":
-        return props.date.format("hh:mm");
-      case "T":
-        return props.date.format("hh:mm:ss");
-      case "R":
+      case 't':
+        return props.date.format('hh:mm');
+      case 'T':
+        return props.date.format('hh:mm:ss');
+      case 'R':
         return props.date.fromNow();
-      case "D":
-        return props.date.format("DD MMMM YYYY");
-      case "F":
-        return props.date.format("dddd, DD MMMM YYYY hh:mm");
+      case 'D':
+        return props.date.format('DD MMMM YYYY');
+      case 'F':
+        return props.date.format('dddd, DD MMMM YYYY hh:mm');
       default:
-        return props.date.format("DD MMMM YYYY hh:mm");
+        return props.date.format('DD MMMM YYYY hh:mm');
     }
   }
 
@@ -36,8 +34,8 @@ export function RenderTimestamp(props: { format: string; date: Dayjs }) {
 
   createEffect(() => {
     // Update every second if we are rendering relative time
-    if (props.format === "R") {
-      let interval = setInterval(update, 1000);
+    if (props.format === 'R') {
+      const interval = setInterval(update, 1000);
       return () => clearInterval(interval);
     }
   });
@@ -47,7 +45,7 @@ export function RenderTimestamp(props: { format: string; date: Dayjs }) {
       class={Time()}
       use:floating={{
         tooltip: {
-          placement: "top",
+          placement: 'top',
           content: props.date.toString(),
         },
       }}
@@ -65,26 +63,26 @@ const RE_TIMESTAMP = /<t:([0-9]+)(?::(\w))?>/g;
 export const remarkTimestamps: Plugin = () => (tree) => {
   visit(
     tree,
-    "text",
+    'text',
     (
-      node: { type: "text"; value: string },
+      node: { type: 'text'; value: string },
       idx,
       parent: { children: any[] }
     ) => {
-      let elements = node.value.split(RE_TIMESTAMP);
+      const elements = node.value.split(RE_TIMESTAMP);
       if (elements.length === 1) return; // no matches
 
       // Generate initial node
       const newNodes: (
-        | { type: "text"; value: string }
+        | { type: 'text'; value: string }
         | {
-            type: "timestamp";
+            type: 'timestamp';
             format: string;
             date: Dayjs;
           }
       )[] = [
         {
-          type: "text",
+          type: 'text',
           value: elements.shift()!,
         },
       ];
@@ -96,13 +94,13 @@ export const remarkTimestamps: Plugin = () => (tree) => {
 
         // Insert components
         newNodes.push({
-          type: "timestamp",
+          type: 'timestamp',
           format: elements[i * 3 + 1],
           date,
         });
 
         newNodes.push({
-          type: "text",
+          type: 'text',
           value: elements[i * 3 + 2],
         });
       }
@@ -115,8 +113,8 @@ export const remarkTimestamps: Plugin = () => (tree) => {
 
 export const timestampHandler: Handler = (h, node) => {
   return {
-    type: "element" as const,
-    tagName: "timestamp",
+    type: 'element' as const,
+    tagName: 'timestamp',
     children: [],
     properties: {
       format: node.format,
diff --git a/packages/client/components/markdown/plugins/unicodeEmoji.tsx b/packages/client/components/markdown/plugins/unicodeEmoji.tsx
index ad4a267e5..27a0b2fdb 100644
--- a/packages/client/components/markdown/plugins/unicodeEmoji.tsx
+++ b/packages/client/components/markdown/plugins/unicodeEmoji.tsx
@@ -1,11 +1,8 @@
-import emojiRegex from "emoji-regex";
+import emojiRegex from 'emoji-regex';
 
-import { UnicodeEmoji } from "../emoji";
-
-import {
-  CustomComponentProps,
-  createRegexComponent,
-} from "./remarkRegexComponent";
+import { UnicodeEmoji } from '../emoji';
+import type { CustomComponentProps } from './remarkRegexComponent';
+import { createRegexComponent } from './remarkRegexComponent';
 
 /**
  * Render Unicode emoji
@@ -14,4 +11,4 @@ export function RenderUnicodeEmoji(props: CustomComponentProps) {
   return <UnicodeEmoji emoji={props.str} />;
 }
 
-export const remarkUnicodeEmoji = createRegexComponent("uemoji", emojiRegex());
+export const remarkUnicodeEmoji = createRegexComponent('uemoji', emojiRegex());
diff --git a/packages/client/components/markdown/sanitise.ts b/packages/client/components/markdown/sanitise.ts
index f95f52ffa..f8285cf10 100644
--- a/packages/client/components/markdown/sanitise.ts
+++ b/packages/client/components/markdown/sanitise.ts
@@ -1,5 +1,3 @@
-import { Root } from "hast";
-
 /**
  * Regex for matching execessive recursion of blockquotes and lists
  */
@@ -50,7 +48,7 @@ export function sanitise(content: string) {
       // Replace empty lines with non-breaking space
       // because remark renderer is collapsing empty
       // or otherwise whitespace-only lines of text
-      .replace(RE_EMPTY_LINE, "\uF800\n")
+      .replace(RE_EMPTY_LINE, '\uF800\n')
 
       // Ensure empty line after blockquotes for correct rendering
       .replace(RE_BLOCKQUOTE, (match) => `${match}\n`)
@@ -61,18 +59,18 @@ export function sanitise(content: string) {
  * Replace \uF800 with break elements
  */
 export function remarkInsertBreaks() {
-  return (tree: Root) => {
+  return (tree: import('hast').Root) => {
     /**
      * Process element and sub-tree
      * @param element Element
      * @returns Element
      */
     function recurse(element: any): any {
-      if (element.type === "text") {
-        if (element.value === "\uF800") {
+      if (element.type === 'text') {
+        if (element.value === '\uF800') {
           return {
-            type: "element",
-            tagName: "br",
+            type: 'element',
+            tagName: 'br',
             properties: {},
             children: [],
           };
diff --git a/packages/client/components/markdown/solid-markdown/ast-to-solid.tsx b/packages/client/components/markdown/solid-markdown/ast-to-solid.tsx
index 7d91e2dad..fcacf1038 100644
--- a/packages/client/components/markdown/solid-markdown/ast-to-solid.tsx
+++ b/packages/client/components/markdown/solid-markdown/ast-to-solid.tsx
@@ -373,7 +373,7 @@ function addProperty(
   let result = value;
 
   // Ignore nullish and `NaN` values.
-  // eslint-disable-next-line no-self-compare
+   
   if (result === null || result === undefined || result !== result) {
     return;
   }
diff --git a/packages/client/components/markdown/users.ts b/packages/client/components/markdown/users.ts
index 7c1905ee5..47174ff5a 100644
--- a/packages/client/components/markdown/users.ts
+++ b/packages/client/components/markdown/users.ts
@@ -1,9 +1,8 @@
-import { Accessor, createMemo } from "solid-js";
-
-import { ServerMember, User } from "revolt.js";
-
-import { useClient } from "@revolt/client";
-import { useParams } from "@revolt/routing";
+import { useClient } from '@revolt/client';
+import { useParams } from '@revolt/routing';
+import type { ServerMember, User } from 'revolt.js';
+import type { Accessor } from 'solid-js';
+import { createMemo } from 'solid-js';
 
 // TODO: move to @revolt/common?
 
@@ -45,7 +44,7 @@ interface UserInformation {
  */
 export function userInformation(user?: User, member?: ServerMember) {
   return {
-    username: member?.nickname ?? user?.displayName ?? "Unknown User",
+    username: member?.nickname ?? user?.displayName ?? 'Unknown User',
     avatar: member?.animatedAvatarURL ?? user?.animatedAvatarURL,
     colour: member?.roleColour,
     user,
@@ -71,7 +70,7 @@ export function useUsers(
   // eslint-disable-next-line solid/reactivity
   return createMemo(() => {
     const client = clientAccessor()!;
-    const list = (typeof ids === "function" ? ids() : ids).map((id) => {
+    const list = (typeof ids === 'function' ? ids() : ids).map((id) => {
       const user = client.users.get(id)!;
 
       if (user) {
@@ -98,5 +97,5 @@ export function useUsers(
  */
 export function useUser(id: string): Accessor<UserInformation> {
   const users = useUsers([id]);
-  return () => users()[0] ?? { username: "Unknown User" };
+  return () => users()[0] ?? { username: 'Unknown User' };
 }
diff --git a/packages/client/components/modal/form.tsx b/packages/client/components/modal/form.tsx
index b8cdbdb36..c819dd190 100644
--- a/packages/client/components/modal/form.tsx
+++ b/packages/client/components/modal/form.tsx
@@ -1,26 +1,25 @@
-import { Show, createSignal, splitProps } from "solid-js";
-import { createStore } from "solid-js/store";
-
-import { mapAnyError } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
-import { Column, Form, Typography, styled } from "@revolt/ui";
+import { mapAnyError } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
+import { Column, Form, styled, Typography } from '@revolt/ui';
 import type {
   Action,
   Props as ModalProps,
-} from "@revolt/ui/components/design/atoms/display/Modal";
-import { getInitialValues } from "@revolt/ui/components/tools/Form";
+} from '@revolt/ui/components/design/atoms/display/Modal';
 import type {
-  Props as FormProps,
   FormTemplate,
   MapFormToValues,
-} from "@revolt/ui/components/tools/Form";
+  Props as FormProps,
+} from '@revolt/ui/components/tools/Form';
+import { getInitialValues } from '@revolt/ui/components/tools/Form';
+import { createSignal, Show, splitProps } from 'solid-js';
+import { createStore } from 'solid-js/store';
 
-import { modalController } from ".";
-import { Modals, PropGenerator } from "./types";
+import { modalController } from '.';
+import type { Modals, PropGenerator } from './types';
 
 type Props<T extends FormTemplate> = Omit<
   FormProps<T>,
-  "onChange" | "store" | "setStore" | "submitBtn" | "onSubmit"
+  'onChange' | 'store' | 'setStore' | 'submitBtn' | 'onSubmit'
 > & {
   /**
    * Form submission callback
@@ -30,7 +29,7 @@ type Props<T extends FormTemplate> = Omit<
   /**
    * Submit button properties
    */
-  submit?: Omit<Action, "onClick" | "confirmation">;
+  submit?: Omit<Action, 'onClick' | 'confirmation'>;
 
   /**
    * Custom actions after submit button
@@ -40,7 +39,7 @@ type Props<T extends FormTemplate> = Omit<
   /**
    * Props for the modal
    */
-  modalProps?: Omit<ModalProps, "disabled" | "actions">;
+  modalProps?: Omit<ModalProps, 'disabled' | 'actions'>;
 };
 
 /**
@@ -48,14 +47,14 @@ type Props<T extends FormTemplate> = Omit<
  */
 export function createFormModal<
   T extends FormTemplate,
-  P extends Modals["type"]
+  P extends Modals['type'],
 >(props: Props<T>): ReturnType<PropGenerator<P>> {
   const t = useTranslation();
   const [localProps, formProps] = splitProps(props, [
-    "callback",
-    "submit",
-    "actions",
-    "modalProps",
+    'callback',
+    'submit',
+    'actions',
+    'modalProps',
   ]);
 
   const [store, setStore] = createStore(
@@ -83,15 +82,15 @@ export function createFormModal<
     actions: [
       {
         onClick: onSubmit,
-        children: t("actions.submit"),
+        children: t('actions.submit'),
         confirmation: true,
         ...props.submit,
       },
       ...(props.actions ?? [
         {
           onClick: () => true,
-          children: t("app.special.modals.actions.cancel"),
-          variant: "plain",
+          children: t('app.special.modals.actions.cancel'),
+          variant: 'plain',
         },
       ]),
     ],
@@ -109,7 +108,7 @@ export function createFormModal<
         />
         <Show when={error()}>
           <Error>
-            <Typography variant="label">
+            <Typography variant='label'>
               {t(`error.${error()}`, undefined, error())}
             </Typography>
           </Error>
diff --git a/packages/client/components/modal/index.tsx b/packages/client/components/modal/index.tsx
index 1ba8578da..f61ffafe6 100644
--- a/packages/client/components/modal/index.tsx
+++ b/packages/client/components/modal/index.tsx
@@ -1,16 +1,15 @@
-import { For } from "solid-js";
-import { SetStoreFunction, createStore } from "solid-js/store";
+import '../ui/styled.d.ts';
 
-import type { MFA, MFATicket } from "revolt.js";
+import { registerController } from '@revolt/common';
+import type { MFA, MFATicket } from 'revolt.js';
+import { For } from 'solid-js';
+import type { SetStoreFunction } from 'solid-js/store';
+import { createStore } from 'solid-js/store';
 
-import { registerController } from "@revolt/common";
+import { RenderModal } from './modals';
+import type { Modals } from './types';
 
-import "../ui/styled.d.ts";
-
-import { RenderModal } from "./modals";
-import { Modals } from "./types";
-
-export type ActiveModal = {
+export interface ActiveModal {
   /**
    * Unique modal Id
    */
@@ -25,7 +24,7 @@ export type ActiveModal = {
    * Props to pass to modal
    */
   props: Modals;
-};
+}
 
 /**
  * Global modal controller for layering and displaying one or more modal to the user
@@ -54,12 +53,12 @@ export class ModalController {
      * @param event Event
      */
     function keyDown(event: KeyboardEvent) {
-      if (event.key === "Escape") {
+      if (event.key === 'Escape') {
         modalController.pop();
       }
     }
 
-    document.addEventListener("keydown", keyDown);
+    document.addEventListener('keydown', keyDown);
   }
 
   /**
@@ -93,7 +92,7 @@ export class ModalController {
    * Close modal by id
    */
   remove(id: string) {
-    this.setModals((entry) => entry.id === id, "show", false);
+    this.setModals((entry) => entry.id === id, 'show', false);
 
     setTimeout(() => {
       this.setModals(this.modals.filter((entry) => entry.id !== id));
@@ -118,7 +117,7 @@ export class ModalControllerExtended extends ModalController {
    */
   constructor() {
     super();
-    registerController("modal", this);
+    registerController('modal', this);
   }
 
   /**
@@ -128,8 +127,8 @@ export class ModalControllerExtended extends ModalController {
   mfaFlow(mfa: MFA) {
     return new Promise((callback: (ticket?: MFATicket) => void) =>
       this.push({
-        type: "mfa_flow",
-        state: "known",
+        type: 'mfa_flow',
+        state: 'known',
         mfa,
         callback,
       })
@@ -143,7 +142,7 @@ export class ModalControllerExtended extends ModalController {
   mfaEnableTOTP(secret: string, identifier: string) {
     return new Promise((callback: (value?: string) => void) =>
       this.push({
-        type: "mfa_enable_totp",
+        type: 'mfa_enable_totp',
         identifier,
         secret,
         callback,
@@ -160,7 +159,7 @@ export class ModalControllerExtended extends ModalController {
       navigator.clipboard.writeText(text);
     } else {
       this.push({
-        type: "clipboard",
+        type: 'clipboard',
         text,
       });
     }
diff --git a/packages/client/components/modal/modals/AddFriend.tsx b/packages/client/components/modal/modals/AddFriend.tsx
index 4bf3e6a0b..13bd35068 100644
--- a/packages/client/components/modal/modals/AddFriend.tsx
+++ b/packages/client/components/modal/modals/AddFriend.tsx
@@ -1,30 +1,30 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal for adding another user as a friend
  */
-const AddFriend: PropGenerator<"add_friend"> = (props) => {
+const AddFriend: PropGenerator<'add_friend'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: t("app.context_menu.add_friend"),
+      title: t('app.context_menu.add_friend'),
     },
     schema: {
-      username: "text",
+      username: 'text',
     },
     data: {
       username: {
-        field: "Username",
+        field: 'Username',
       },
     },
     callback: async ({ username }) =>
       void (await props.client.api.post(`/users/friend`, { username })),
     submit: {
-      children: t("app.special.modals.actions.ok"),
+      children: t('app.special.modals.actions.ok'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/BanMember.tsx b/packages/client/components/modal/modals/BanMember.tsx
index b5a7a0217..bb5609158 100644
--- a/packages/client/components/modal/modals/BanMember.tsx
+++ b/packages/client/components/modal/modals/BanMember.tsx
@@ -1,36 +1,36 @@
-import { useTranslation } from "@revolt/i18n";
-import { Avatar, Column } from "@revolt/ui";
+import { useTranslation } from '@revolt/i18n';
+import { Avatar, Column } from '@revolt/ui';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to ban server member
  */
-const BanMember: PropGenerator<"ban_member"> = (props) => {
+const BanMember: PropGenerator<'ban_member'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: t("app.context_menu.ban_member"),
+      title: t('app.context_menu.ban_member'),
     },
     schema: {
-      member: "custom",
-      reason: "text",
+      member: 'custom',
+      reason: 'text',
     },
     data: {
       member: {
         element: (
-          <Column align="center">
+          <Column align='center'>
             <Avatar src={props.member.user?.animatedAvatarURL} size={64} />
-            {t("app.special.modals.prompt.confirm_ban", {
+            {t('app.special.modals.prompt.confirm_ban', {
               name: props.member.user?.username as string,
             })}
           </Column>
         ),
       },
       reason: {
-        field: t("app.special.modals.prompt.confirm_ban_reason"),
+        field: t('app.special.modals.prompt.confirm_ban_reason'),
       },
     },
     callback: async ({ reason }) =>
@@ -38,8 +38,8 @@ const BanMember: PropGenerator<"ban_member"> = (props) => {
         reason,
       })),
     submit: {
-      variant: "error",
-      children: t("app.special.modals.actions.ban"),
+      variant: 'error',
+      children: t('app.special.modals.actions.ban'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/Changelog.tsx b/packages/client/components/modal/modals/Changelog.tsx
index 43ef20998..24f93aa1c 100644
--- a/packages/client/components/modal/modals/Changelog.tsx
+++ b/packages/client/components/modal/modals/Changelog.tsx
@@ -1,10 +1,9 @@
-import { For, Match, Switch, createSignal } from "solid-js";
+import { dayjs, useTranslation } from '@revolt/i18n';
+import { CategoryButton, Column, styled } from '@revolt/ui';
+import type { Action } from '@revolt/ui/components/design/atoms/display/Modal';
+import { createSignal, For, Match, Switch } from 'solid-js';
 
-import { dayjs, useTranslation } from "@revolt/i18n";
-import { CategoryButton, Column, styled } from "@revolt/ui";
-import type { Action } from "@revolt/ui/components/design/atoms/display/Modal";
-
-import { PropGenerator } from "../types";
+import type { PropGenerator } from '../types';
 
 /**
  * Changelog element
@@ -12,7 +11,7 @@ import { PropGenerator } from "../types";
 type Element =
   | string
   | {
-      type: "image";
+      type: 'image';
       src: string;
     };
 
@@ -28,10 +27,9 @@ export interface ChangelogPost {
 /**
  * Modal to display changelog
  */
-const Changelog: PropGenerator<"changelog"> = (props) => {
+const Changelog: PropGenerator<'changelog'> = (props) => {
   const t = useTranslation();
 
-  // eslint-disable-next-line solid/reactivity
   const [log, setLog] = createSignal(props.initial);
 
   /**
@@ -39,16 +37,16 @@ const Changelog: PropGenerator<"changelog"> = (props) => {
    * @returns Log
    */
   const currentLog = () =>
-    typeof log() !== "undefined" ? props.posts[log()!] : undefined;
+    typeof log() !== 'undefined' ? props.posts[log()!] : undefined;
 
   return {
     title: (
-      <Switch fallback={t("app.special.modals.changelogs.title")}>
+      <Switch fallback={t('app.special.modals.changelogs.title')}>
         <Match when={currentLog()}>{currentLog()!.title}</Match>
       </Switch>
     ),
     description: (
-      <Switch fallback={t("app.special.modals.changelogs.description")}>
+      <Switch fallback={t('app.special.modals.changelogs.description')}>
         <Match when={currentLog()}>
           {dayjs(currentLog()!.date).calendar()}
         </Match>
@@ -57,16 +55,16 @@ const Changelog: PropGenerator<"changelog"> = (props) => {
     actions: () => {
       const actions: Action[] = [
         {
-          variant: "primary",
-          children: t("app.special.modals.actions.close"),
+          variant: 'primary',
+          children: t('app.special.modals.actions.close'),
           onClick: () => true,
         },
       ];
 
       if (currentLog()) {
         actions.push({
-          variant: "plain",
-          children: t("app.special.modals.changelogs.older"),
+          variant: 'plain',
+          children: t('app.special.modals.changelogs.older'),
           onClick: () => {
             setLog(undefined);
             return false;
@@ -114,8 +112,8 @@ function RenderLog(props: { post: ChangelogPost }) {
       <For each={props.post.content}>
         {(entry) => (
           <Switch>
-            <Match when={typeof entry === "string"}>{entry as string}</Match>
-            <Match when={typeof entry === "object" && entry.type === "image"}>
+            <Match when={typeof entry === 'string'}>{entry as string}</Match>
+            <Match when={typeof entry === 'object' && entry.type === 'image'}>
               <Image src={(entry as { src: string }).src} />
             </Match>
           </Switch>
diff --git a/packages/client/components/modal/modals/ChannelInfo.tsx b/packages/client/components/modal/modals/ChannelInfo.tsx
index a7ed85ae6..0fb00e8ef 100644
--- a/packages/client/components/modal/modals/ChannelInfo.tsx
+++ b/packages/client/components/modal/modals/ChannelInfo.tsx
@@ -1,21 +1,20 @@
-import { BiRegularX } from "solid-icons/bi";
+import { Markdown } from '@revolt/markdown';
+import { Button, Column, Row, Typography } from '@revolt/ui';
+import { BiRegularX } from 'solid-icons/bi';
 
-import { Markdown } from "@revolt/markdown";
-import { Button, Column, Row, Typography } from "@revolt/ui";
-
-import { PropGenerator } from "../types";
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to display channel information
  */
-const ChannelInfo: PropGenerator<"channel_info"> = (props, onClose) => {
+const ChannelInfo: PropGenerator<'channel_info'> = (props, onClose) => {
   return {
     title: (
-      <Row align="center">
+      <Row align='center'>
         <Column grow>
-          <Typography variant="legacy-modal-title">{`#${props.channel.name}`}</Typography>
+          <Typography variant='legacy-modal-title'>{`#${props.channel.name}`}</Typography>
         </Column>
-        <Button size="icon" variant="plain" onClick={onClose}>
+        <Button size='icon' variant='plain' onClick={onClose}>
           <BiRegularX size={36} />
         </Button>
       </Row>
diff --git a/packages/client/components/modal/modals/Clipboard.tsx b/packages/client/components/modal/modals/Clipboard.tsx
index c534722ed..1210dcf55 100644
--- a/packages/client/components/modal/modals/Clipboard.tsx
+++ b/packages/client/components/modal/modals/Clipboard.tsx
@@ -1,31 +1,31 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { PropGenerator } from "../types";
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to display some text which could not be written to the browser clipboard
  */
-const Clipboard: PropGenerator<"clipboard"> = (props) => {
+const Clipboard: PropGenerator<'clipboard'> = (props) => {
   const t = useTranslation();
 
   return {
-    title: t("app.special.modals.clipboard.unavailable"),
+    title: t('app.special.modals.clipboard.unavailable'),
     description:
-      location.protocol !== "https:"
-        ? t("app.special.modals.clipboard.https")
+      location.protocol !== 'https:'
+        ? t('app.special.modals.clipboard.https')
         : undefined,
     actions: [
       {
         onClick: () => true,
         confirmation: true,
-        children: t("app.special.modals.actions.close"),
+        children: t('app.special.modals.actions.close'),
       },
     ],
     children: (
       <>
-        {t("app.special.modals.clipboard.copy")}
+        {t('app.special.modals.clipboard.copy')}
         <br />
-        <code style={{ "user-select": "all", "word-break": "break-all" }}>
+        <code style={{ 'user-select': 'all', 'word-break': 'break-all' }}>
           {props.text}
         </code>
       </>
diff --git a/packages/client/components/modal/modals/CreateBot.tsx b/packages/client/components/modal/modals/CreateBot.tsx
index ed2d0dc10..fbcb103c7 100644
--- a/packages/client/components/modal/modals/CreateBot.tsx
+++ b/packages/client/components/modal/modals/CreateBot.tsx
@@ -1,25 +1,25 @@
-import { mapAndRethrowError } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
+import { mapAndRethrowError } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to create a new bot
  */
-const CreateBot: PropGenerator<"create_bot"> = (props) => {
+const CreateBot: PropGenerator<'create_bot'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: t("app.special.popovers.create_bot.title"),
+      title: t('app.special.popovers.create_bot.title'),
     },
     schema: {
-      name: "text",
+      name: 'text',
     },
     data: {
       name: {
-        field: t("login.username"),
+        field: t('login.username'),
       },
     },
     callback: async ({ name }) => {
@@ -30,7 +30,7 @@ const CreateBot: PropGenerator<"create_bot"> = (props) => {
       props.onCreate(bot);
     },
     submit: {
-      children: t("app.special.modals.actions.create"),
+      children: t('app.special.modals.actions.create'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/CreateCategory.tsx b/packages/client/components/modal/modals/CreateCategory.tsx
index d910b1cee..d837ba5d9 100644
--- a/packages/client/components/modal/modals/CreateCategory.tsx
+++ b/packages/client/components/modal/modals/CreateCategory.tsx
@@ -1,27 +1,26 @@
-import { ulid } from "ulid";
+import { mapAndRethrowError } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
+import { ulid } from 'ulid';
 
-import { mapAndRethrowError } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
-
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to create a new category
  */
-const CreateCategory: PropGenerator<"create_category"> = (props) => {
+const CreateCategory: PropGenerator<'create_category'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: t("app.context_menu.create_category"),
+      title: t('app.context_menu.create_category'),
     },
     schema: {
-      name: "text",
+      name: 'text',
     },
     data: {
       name: {
-        field: t("app.main.servers.channel_name"),
+        field: t('app.main.servers.channel_name'),
       },
     },
     callback: async ({ name }) => {
@@ -39,7 +38,7 @@ const CreateCategory: PropGenerator<"create_category"> = (props) => {
         .catch(mapAndRethrowError);
     },
     submit: {
-      children: t("app.special.modals.actions.create"),
+      children: t('app.special.modals.actions.create'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/CreateChannel.tsx b/packages/client/components/modal/modals/CreateChannel.tsx
index f2bc5d59f..9c7ee9a47 100644
--- a/packages/client/components/modal/modals/CreateChannel.tsx
+++ b/packages/client/components/modal/modals/CreateChannel.tsx
@@ -1,50 +1,50 @@
-import { mapAndRethrowError } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
-import { useNavigate } from "@revolt/routing";
+import { mapAndRethrowError } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
+import { useNavigate } from '@revolt/routing';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to create a new server channel
  */
-const CreateChannel: PropGenerator<"create_channel"> = (props) => {
+const CreateChannel: PropGenerator<'create_channel'> = (props) => {
   const t = useTranslation();
   const navigate = useNavigate();
 
   return createFormModal({
     modalProps: {
-      title: t("app.context_menu.create_channel"),
+      title: t('app.context_menu.create_channel'),
     },
     schema: {
-      name: "text",
-      type: "radio",
+      name: 'text',
+      type: 'radio',
     },
     data: {
       name: {
-        field: t("app.main.servers.channel_name"),
+        field: t('app.main.servers.channel_name'),
       },
       type: {
-        field: t("app.main.servers.channel_type"),
+        field: t('app.main.servers.channel_type'),
         choices: [
           {
-            name: t("app.main.servers.text_channel"),
-            value: "Text",
+            name: t('app.main.servers.text_channel'),
+            value: 'Text',
           },
           {
-            name: t("app.main.servers.voice_channel"),
-            value: "Voice",
+            name: t('app.main.servers.voice_channel'),
+            value: 'Voice',
           },
         ],
       },
     },
     defaults: {
-      type: "Text",
+      type: 'Text',
     },
     callback: async ({ name, type }) => {
       const channel = await props.server
         .createChannel({
-          type: type as "Text" | "Voice",
+          type: type as 'Text' | 'Voice',
           name,
         })
         .catch((err) => {
@@ -58,7 +58,7 @@ const CreateChannel: PropGenerator<"create_channel"> = (props) => {
       }
     },
     submit: {
-      children: t("app.special.modals.actions.create"),
+      children: t('app.special.modals.actions.create'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/CreateGroup.tsx b/packages/client/components/modal/modals/CreateGroup.tsx
index ea5556223..1d2aab447 100644
--- a/packages/client/components/modal/modals/CreateGroup.tsx
+++ b/packages/client/components/modal/modals/CreateGroup.tsx
@@ -1,27 +1,27 @@
-import { mapAndRethrowError } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
-import { useNavigate } from "@revolt/routing";
+import { mapAndRethrowError } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
+import { useNavigate } from '@revolt/routing';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to create a new group channel
  */
-const CreateGroup: PropGenerator<"create_group"> = (props) => {
+const CreateGroup: PropGenerator<'create_group'> = (props) => {
   const t = useTranslation();
   const navigate = useNavigate();
 
   return createFormModal({
     modalProps: {
-      title: t("app.main.groups.create"),
+      title: t('app.main.groups.create'),
     },
     schema: {
-      name: "text",
+      name: 'text',
     },
     data: {
       name: {
-        field: t("app.main.groups.name"),
+        field: t('app.main.groups.name'),
       },
     },
     callback: async ({ name }) => {
@@ -32,7 +32,7 @@ const CreateGroup: PropGenerator<"create_group"> = (props) => {
       navigate(`/channel/${group.id}`);
     },
     submit: {
-      children: t("app.special.modals.actions.create"),
+      children: t('app.special.modals.actions.create'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/CreateInvite.tsx b/packages/client/components/modal/modals/CreateInvite.tsx
index 23ccd2f83..092385f0a 100644
--- a/packages/client/components/modal/modals/CreateInvite.tsx
+++ b/packages/client/components/modal/modals/CreateInvite.tsx
@@ -1,12 +1,11 @@
-import { Match, Switch, createSignal, onMount } from "solid-js";
+import { IS_REVOLT, mapAnyError } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
+import { Column, styled } from '@revolt/ui';
+import { createSignal, Match, onMount, Switch } from 'solid-js';
 
-import { IS_REVOLT, mapAnyError } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
-import { Column, styled } from "@revolt/ui";
-
-import { modalController } from "..";
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { modalController } from '..';
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Code block which displays invite
@@ -24,11 +23,11 @@ const Invite = styled(Column)`
 /**
  * Modal to create a new invite
  */
-const CreateInvite: PropGenerator<"create_invite"> = (props) => {
+const CreateInvite: PropGenerator<'create_invite'> = (props) => {
   const t = useTranslation();
 
   const [processing, setProcessing] = createSignal(false);
-  const [link, setLink] = createSignal("...");
+  const [link, setLink] = createSignal('...');
 
   // Generate an invite code
   onMount(() => {
@@ -44,27 +43,27 @@ const CreateInvite: PropGenerator<"create_invite"> = (props) => {
         )
       )
       .catch((err) =>
-        modalController.push({ type: "error", error: mapAnyError(err) })
+        modalController.push({ type: 'error', error: mapAnyError(err) })
       )
       .finally(() => setProcessing(false));
   });
 
   return createFormModal({
     modalProps: {
-      title: t("app.context_menu.create_invite"),
+      title: t('app.context_menu.create_invite'),
     },
     schema: {
-      invite: "custom",
+      invite: 'custom',
     },
     data: {
       invite: {
         element: (
           <Switch
-            fallback={t("app.special.modals.prompt.create_invite_generate")}
+            fallback={t('app.special.modals.prompt.create_invite_generate')}
           >
             <Match when={!processing()}>
               <Invite>
-                {t("app.special.modals.prompt.create_invite_created")}
+                {t('app.special.modals.prompt.create_invite_created')}
                 <code>{link()}</code>
               </Invite>
             </Match>
@@ -74,11 +73,11 @@ const CreateInvite: PropGenerator<"create_invite"> = (props) => {
     },
     callback: async () => void 0,
     submit: {
-      children: t("app.special.modals.actions.ok"),
+      children: t('app.special.modals.actions.ok'),
     },
     actions: [
       {
-        children: t("app.context_menu.copy_link"),
+        children: t('app.context_menu.copy_link'),
         onClick: () => modalController.writeText(link()),
       },
     ],
diff --git a/packages/client/components/modal/modals/CreateOrJoinServer.tsx b/packages/client/components/modal/modals/CreateOrJoinServer.tsx
index 730cc2d5d..34fc62710 100644
--- a/packages/client/components/modal/modals/CreateOrJoinServer.tsx
+++ b/packages/client/components/modal/modals/CreateOrJoinServer.tsx
@@ -1,27 +1,26 @@
-import { useTranslation } from "@revolt/i18n";
-import { iconSize, styled } from "@revolt/ui";
+import MdAdd from '@material-design-icons/svg/outlined/add.svg?component-solid';
+import MdLink from '@material-design-icons/svg/outlined/link.svg?component-solid';
+import { useTranslation } from '@revolt/i18n';
+import { iconSize, styled } from '@revolt/ui';
 
-import MdAdd from "@material-design-icons/svg/outlined/add.svg?component-solid";
-import MdLink from "@material-design-icons/svg/outlined/link.svg?component-solid";
-
-import { modalController } from "..";
-import { PropGenerator } from "../types";
+import { modalController } from '..';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to create or join a server
  */
-const CreateOrJoinServer: PropGenerator<"create_or_join_server"> = (props) => {
+const CreateOrJoinServer: PropGenerator<'create_or_join_server'> = (props) => {
   const t = useTranslation();
 
   return {
-    title: "Create or join a server",
+    title: 'Create or join a server',
     description: (
       <Base>
         <a
           onClick={() => {
             modalController.pop();
             modalController.push({
-              type: "create_server",
+              type: 'create_server',
               client: props.client,
             });
           }}
@@ -32,7 +31,7 @@ const CreateOrJoinServer: PropGenerator<"create_or_join_server"> = (props) => {
         <a
           onClick={() => {
             modalController.pop();
-            modalController.push({ type: "join_server", client: props.client });
+            modalController.push({ type: 'join_server', client: props.client });
           }}
         >
           <MdLink {...iconSize(48)} />
@@ -60,7 +59,7 @@ const Base = styled.div`
 
     border-radius: 8px;
     background: ${(props) =>
-      props.theme!.colours["sidebar-channels-background"]};
+      props.theme!.colours['sidebar-channels-background']};
   }
 `;
 
diff --git a/packages/client/components/modal/modals/CreateRole.tsx b/packages/client/components/modal/modals/CreateRole.tsx
index f7e0ff5d3..cd60fc801 100644
--- a/packages/client/components/modal/modals/CreateRole.tsx
+++ b/packages/client/components/modal/modals/CreateRole.tsx
@@ -1,24 +1,24 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to create a new server role
  */
-const CreateInvite: PropGenerator<"create_role"> = (props) => {
+const CreateInvite: PropGenerator<'create_role'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: t("app.settings.permissions.create_role"),
+      title: t('app.settings.permissions.create_role'),
     },
     schema: {
-      name: "text",
+      name: 'text',
     },
     data: {
       name: {
-        field: t("app.settings.permissions.role_name"),
+        field: t('app.settings.permissions.role_name'),
       },
     },
     callback: async ({ name }) => {
@@ -26,7 +26,7 @@ const CreateInvite: PropGenerator<"create_role"> = (props) => {
       props.callback(role.id);
     },
     submit: {
-      children: t("app.special.modals.actions.create"),
+      children: t('app.special.modals.actions.create'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/CreateServer.tsx b/packages/client/components/modal/modals/CreateServer.tsx
index 80632bcb3..368935d86 100644
--- a/packages/client/components/modal/modals/CreateServer.tsx
+++ b/packages/client/components/modal/modals/CreateServer.tsx
@@ -1,24 +1,24 @@
-import { mapAndRethrowError } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
-import { useNavigate } from "@revolt/routing";
+import { mapAndRethrowError } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
+import { useNavigate } from '@revolt/routing';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to create a new server
  */
-const CreateServer: PropGenerator<"create_server"> = (props) => {
+const CreateServer: PropGenerator<'create_server'> = (props) => {
   const t = useTranslation();
   const navigate = useNavigate();
 
   return createFormModal({
     modalProps: {
-      title: t("app.main.servers.create"),
+      title: t('app.main.servers.create'),
       description: (
         <>
-          By creating this server, you agree to the{" "}
-          <a href="https://revolt.chat/aup" target="_blank" rel="noreferrer">
+          By creating this server, you agree to the{' '}
+          <a href='https://revolt.chat/aup' target='_blank' rel='noreferrer'>
             Acceptable Use Policy
           </a>
           .
@@ -26,11 +26,11 @@ const CreateServer: PropGenerator<"create_server"> = (props) => {
       ),
     },
     schema: {
-      name: "text",
+      name: 'text',
     },
     data: {
       name: {
-        field: t("app.main.servers.name"),
+        field: t('app.main.servers.name'),
       },
     },
     callback: async ({ name }) => {
@@ -43,7 +43,7 @@ const CreateServer: PropGenerator<"create_server"> = (props) => {
       setTimeout(() => navigate(`/server/${server.id}`));
     },
     submit: {
-      children: t("app.special.modals.actions.create"),
+      children: t('app.special.modals.actions.create'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/CustomStatus.tsx b/packages/client/components/modal/modals/CustomStatus.tsx
index 33d141a97..9b0297f5f 100644
--- a/packages/client/components/modal/modals/CustomStatus.tsx
+++ b/packages/client/components/modal/modals/CustomStatus.tsx
@@ -1,28 +1,28 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal for editing user's custom status
  */
-const CustomStatus: PropGenerator<"custom_status"> = (props) => {
+const CustomStatus: PropGenerator<'custom_status'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: t("app.context_menu.set_custom_status"),
+      title: t('app.context_menu.set_custom_status'),
     },
     schema: {
-      text: "text",
+      text: 'text',
     },
     defaults: {
       text: props.client.user?.status?.text as string,
     },
     data: {
       text: {
-        field: t("app.context_menu.custom_status"),
-        "use:autoComplete": true,
+        field: t('app.context_menu.custom_status'),
+        'use:autoComplete': true,
       },
     },
     callback: ({ text }) =>
@@ -33,7 +33,7 @@ const CustomStatus: PropGenerator<"custom_status"> = (props) => {
         },
       }),
     submit: {
-      children: t("app.special.modals.actions.save"),
+      children: t('app.special.modals.actions.save'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/DeleteBot.tsx b/packages/client/components/modal/modals/DeleteBot.tsx
index cb795045f..f188ff3e5 100644
--- a/packages/client/components/modal/modals/DeleteBot.tsx
+++ b/packages/client/components/modal/modals/DeleteBot.tsx
@@ -1,27 +1,27 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to delete a bot
  */
-const DeleteBot: PropGenerator<"delete_bot"> = (props) => {
+const DeleteBot: PropGenerator<'delete_bot'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: t("app.special.modals.prompt.confirm_delete", {
+      title: t('app.special.modals.prompt.confirm_delete', {
         name: props.bot.user!.displayName,
       }),
-      description: t("app.special.modals.prompt.confirm_delete_long"),
+      description: t('app.special.modals.prompt.confirm_delete_long'),
     },
     schema: {},
     data: {},
     callback: () => props.bot.delete(),
     submit: {
-      variant: "error",
-      children: t("app.special.modals.actions.delete"),
+      variant: 'error',
+      children: t('app.special.modals.actions.delete'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/DeleteChannel.tsx b/packages/client/components/modal/modals/DeleteChannel.tsx
index 63583d0b6..a8657ebfa 100644
--- a/packages/client/components/modal/modals/DeleteChannel.tsx
+++ b/packages/client/components/modal/modals/DeleteChannel.tsx
@@ -1,40 +1,40 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to delete a channel
  */
-const DeleteChannel: PropGenerator<"delete_channel"> = (props) => {
+const DeleteChannel: PropGenerator<'delete_channel'> = (props) => {
   const t = useTranslation();
   const i18nKey = `app.special.modals.prompt.${
-    props.channel.type === "DirectMessage"
-      ? "confirm_close_dm"
-      : props.channel.type === "Group"
-      ? "confirm_leave"
-      : "confirm_delete"
+    props.channel.type === 'DirectMessage'
+      ? 'confirm_close_dm'
+      : props.channel.type === 'Group'
+        ? 'confirm_leave'
+        : 'confirm_delete'
   }`;
 
   const i18nKeyAction =
-    props.channel.type === "DirectMessage"
-      ? "close"
-      : props.channel.type === "Group"
-      ? "leave"
-      : "delete";
+    props.channel.type === 'DirectMessage'
+      ? 'close'
+      : props.channel.type === 'Group'
+        ? 'leave'
+        : 'delete';
 
   return createFormModal({
     modalProps: {
       title: t(i18nKey, {
         name: props.channel.name ?? props.channel.recipient?.displayName,
       }),
-      description: t(i18nKey + "_long"),
+      description: t(i18nKey + '_long'),
     },
     schema: {},
     data: {},
     callback: () => props.channel.delete(),
     submit: {
-      variant: "error",
+      variant: 'error',
       children: t(`app.special.modals.actions.${i18nKeyAction}`),
     },
   });
diff --git a/packages/client/components/modal/modals/DeleteMessage.tsx b/packages/client/components/modal/modals/DeleteMessage.tsx
index 661fd2911..e1cfaec75 100644
--- a/packages/client/components/modal/modals/DeleteMessage.tsx
+++ b/packages/client/components/modal/modals/DeleteMessage.tsx
@@ -1,32 +1,32 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to delete a message
  */
-const DeleteMessage: PropGenerator<"delete_message"> = (props) => {
+const DeleteMessage: PropGenerator<'delete_message'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: t("app.context_menu.delete_message"),
-      description: t("app.special.modals.prompt.confirm_delete_message_long"),
+      title: t('app.context_menu.delete_message'),
+      description: t('app.special.modals.prompt.confirm_delete_message_long'),
     },
     schema: {
-      message: "custom",
+      message: 'custom',
     },
     data: {
       message: {
         // TODO: find a fix or render part of it?
-        element: "MESSAGE",
+        element: 'MESSAGE',
       },
     },
     callback: () => props.message.delete(),
     submit: {
-      variant: "error",
-      children: t("app.special.modals.actions.delete"),
+      variant: 'error',
+      children: t('app.special.modals.actions.delete'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/DeleteServer.tsx b/packages/client/components/modal/modals/DeleteServer.tsx
index 9672bbc75..b7cf505d1 100644
--- a/packages/client/components/modal/modals/DeleteServer.tsx
+++ b/packages/client/components/modal/modals/DeleteServer.tsx
@@ -1,23 +1,23 @@
-import { useClient } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
+import { useClient } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
 
-import { modalController } from "..";
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { modalController } from '..';
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to delete a server
  */
-const DeleteServer: PropGenerator<"delete_server"> = (props) => {
+const DeleteServer: PropGenerator<'delete_server'> = (props) => {
   const t = useTranslation();
   const client = useClient();
 
   return createFormModal({
     modalProps: {
-      title: t("app.special.modals.prompt.confirm_delete", {
+      title: t('app.special.modals.prompt.confirm_delete', {
         name: props.server.name,
       }),
-      description: t("app.special.modals.prompt.confirm_delete_long"),
+      description: t('app.special.modals.prompt.confirm_delete_long'),
     },
     schema: {},
     data: {},
@@ -27,8 +27,8 @@ const DeleteServer: PropGenerator<"delete_server"> = (props) => {
       await props.server.delete(); // TODO: should use ticket in API
     },
     submit: {
-      variant: "error",
-      children: t("app.special.modals.actions.delete"),
+      variant: 'error',
+      children: t('app.special.modals.actions.delete'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/EditDisplayName.tsx b/packages/client/components/modal/modals/EditDisplayName.tsx
index 561583a82..9a8d6742f 100644
--- a/packages/client/components/modal/modals/EditDisplayName.tsx
+++ b/packages/client/components/modal/modals/EditDisplayName.tsx
@@ -1,12 +1,12 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal for editing display name
  */
-const EditDisplayName: PropGenerator<"edit_display_name"> = (props) => {
+const EditDisplayName: PropGenerator<'edit_display_name'> = (props) => {
   const t = useTranslation();
 
   async function applyName(display_name?: string) {
@@ -15,33 +15,33 @@ const EditDisplayName: PropGenerator<"edit_display_name"> = (props) => {
     } else {
       await props.user.edit({
         // @ts-expect-error missing in types
-        remove: ["DisplayName"],
+        remove: ['DisplayName'],
       });
     }
   }
 
   return createFormModal({
     modalProps: {
-      title: t("app.special.modals.account.change.display_name"),
+      title: t('app.special.modals.account.change.display_name'),
     },
     schema: {
-      display_name: "text",
+      display_name: 'text',
     },
     data: {
       display_name: {
-        field: "Display Name",
-        placeholder: "Choose a display name",
+        field: 'Display Name',
+        placeholder: 'Choose a display name',
       },
     },
     callback: ({ display_name }) => applyName(display_name),
     submit: {
-      children: t("app.special.modals.actions.update"),
+      children: t('app.special.modals.actions.update'),
     },
     actions: [
       {
-        type: "button",
-        variant: "plain",
-        children: "Clear",
+        type: 'button',
+        variant: 'plain',
+        children: 'Clear',
         async onClick() {
           await applyName();
           return true;
diff --git a/packages/client/components/modal/modals/EditEmail.tsx b/packages/client/components/modal/modals/EditEmail.tsx
index eea1b1c12..d16feefea 100644
--- a/packages/client/components/modal/modals/EditEmail.tsx
+++ b/packages/client/components/modal/modals/EditEmail.tsx
@@ -1,36 +1,36 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal for editing email
  */
-const EditEmail: PropGenerator<"edit_email"> = (props) => {
+const EditEmail: PropGenerator<'edit_email'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: t("app.special.modals.account.change.email"),
+      title: t('app.special.modals.account.change.email'),
     },
     schema: {
-      email: "text",
-      currentPassword: "password",
+      email: 'text',
+      currentPassword: 'password',
     },
     data: {
       email: {
-        field: t("login.email"),
-        placeholder: t("login.enter.username"),
+        field: t('login.email'),
+        placeholder: t('login.enter.username'),
       },
       currentPassword: {
-        field: t("login.current_password"),
-        placeholder: t("login.enter.current_password"),
+        field: t('login.current_password'),
+        placeholder: t('login.enter.current_password'),
       },
     },
     callback: async ({ email, currentPassword }) =>
       void (await props.client.account.changeEmail(email, currentPassword)),
     submit: {
-      children: t("app.special.modals.actions.update"),
+      children: t('app.special.modals.actions.update'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/EditKeybind.tsx b/packages/client/components/modal/modals/EditKeybind.tsx
index 28d800faa..4386f9727 100644
--- a/packages/client/components/modal/modals/EditKeybind.tsx
+++ b/packages/client/components/modal/modals/EditKeybind.tsx
@@ -1,22 +1,19 @@
-import { BiRegularReset } from "solid-icons/bi";
-import { createSignal, onMount } from "solid-js";
+import { useTranslation } from '@revolt/i18n';
+import type { KeyComboSequence as TKeySequence } from '@revolt/keybinds';
+import { KEYBINDING_MODIFIER_KEYS } from '@revolt/keybinds';
+import { Button, KeySequence, styled } from '@revolt/ui';
+import { BiRegularReset } from 'solid-icons/bi';
+import { createSignal, onMount } from 'solid-js';
 
-import { useTranslation } from "@revolt/i18n";
-import {
-  KEYBINDING_MODIFIER_KEYS,
-  KeyComboSequence as TKeySequence,
-} from "@revolt/keybinds";
-import { Button, KeySequence, styled } from "@revolt/ui";
+import type { PropGenerator } from '../types';
 
-import { PropGenerator } from "../types";
-
-const Container = styled("div", "EditKeybind-Container")`
+const Container = styled('div', 'EditKeybind-Container')`
   display: flex;
   gap: 1ch;
   place-items: center;
 `;
 
-const KeybindInput = styled("output", "EditKeybind-KeybindInput")`
+const KeybindInput = styled('output', 'EditKeybind-KeybindInput')`
   cursor: pointer;
   display: flex;
   align-items: center;
@@ -34,11 +31,11 @@ const KeybindInput = styled("output", "EditKeybind-KeybindInput")`
 `;
 
 const REPLACEMENTS: Record<string, string> = {
-  " ": "Space",
+  ' ': 'Space',
 };
 
 // TODO: maybe add warning if the user doesn't have a modifier included?
-export const EditKeybind: PropGenerator<"edit_keybind"> = (props) => {
+export const EditKeybind: PropGenerator<'edit_keybind'> = (props) => {
   const t = useTranslation();
 
   const [sequence, setSequence] = createSignal<TKeySequence>([]);
@@ -118,7 +115,7 @@ export const EditKeybind: PropGenerator<"edit_keybind"> = (props) => {
 
   return {
     // TODO: the way this reads and looks is awkward, find a better way
-    title: t("app.special.modals.edit_keybind.title", {
+    title: t('app.special.modals.edit_keybind.title', {
       action: t(`app.settings.pages.keybinds.action.${props.action}.title`),
     }),
     actions: [
@@ -129,12 +126,12 @@ export const EditKeybind: PropGenerator<"edit_keybind"> = (props) => {
           return true;
         },
         confirmation: true,
-        children: t("app.special.modals.actions.ok"),
+        children: t('app.special.modals.actions.ok'),
       },
       {
         onClick: () => true,
         confirmation: false,
-        children: t("app.special.modals.actions.cancel"),
+        children: t('app.special.modals.actions.cancel'),
       },
     ],
     children: (
@@ -152,7 +149,7 @@ export const EditKeybind: PropGenerator<"edit_keybind"> = (props) => {
           // title="clear input"
           onPress={reset}
         >
-          <BiRegularReset size={20}></BiRegularReset>
+          <BiRegularReset size={20} />
         </Button>
       </Container>
     ),
diff --git a/packages/client/components/modal/modals/EditPassword.tsx b/packages/client/components/modal/modals/EditPassword.tsx
index f16a9bbd2..180e051c4 100644
--- a/packages/client/components/modal/modals/EditPassword.tsx
+++ b/packages/client/components/modal/modals/EditPassword.tsx
@@ -1,30 +1,30 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal for editing password
  */
-const EditPassword: PropGenerator<"edit_password"> = (props) => {
+const EditPassword: PropGenerator<'edit_password'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: t("app.special.modals.account.change.password"),
+      title: t('app.special.modals.account.change.password'),
     },
     schema: {
-      password: "password",
-      currentPassword: "password",
+      password: 'password',
+      currentPassword: 'password',
     },
     data: {
       password: {
-        field: t("login.password"),
-        placeholder: t("login.enter.password"),
+        field: t('login.password'),
+        placeholder: t('login.enter.password'),
       },
       currentPassword: {
-        field: t("login.current_password"),
-        placeholder: t("login.enter.current_password"),
+        field: t('login.current_password'),
+        placeholder: t('login.enter.current_password'),
       },
     },
     callback: async ({ password, currentPassword }) =>
@@ -33,7 +33,7 @@ const EditPassword: PropGenerator<"edit_password"> = (props) => {
         currentPassword
       )),
     submit: {
-      children: t("app.special.modals.actions.update"),
+      children: t('app.special.modals.actions.update'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/EditUsername.tsx b/packages/client/components/modal/modals/EditUsername.tsx
index 765e0bab1..8ec487a54 100644
--- a/packages/client/components/modal/modals/EditUsername.tsx
+++ b/packages/client/components/modal/modals/EditUsername.tsx
@@ -1,36 +1,36 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal for editing username
  */
-const EditUsername: PropGenerator<"edit_username"> = (props) => {
+const EditUsername: PropGenerator<'edit_username'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: t("app.special.modals.account.change.username"),
+      title: t('app.special.modals.account.change.username'),
     },
     schema: {
-      username: "text",
-      password: "password",
+      username: 'text',
+      password: 'password',
     },
     data: {
       username: {
-        field: "Username",
-        placeholder: t("login.enter.username"),
+        field: 'Username',
+        placeholder: t('login.enter.username'),
       },
       password: {
-        field: "Current Password",
-        placeholder: t("login.enter.current_password"),
+        field: 'Current Password',
+        placeholder: t('login.enter.current_password'),
       },
     },
     callback: async ({ username, password }) =>
       void (await props.client.user!.changeUsername(username, password)),
     submit: {
-      children: t("app.special.modals.actions.update"),
+      children: t('app.special.modals.actions.update'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/Error.tsx b/packages/client/components/modal/modals/Error.tsx
index 7545560e0..617deabe4 100644
--- a/packages/client/components/modal/modals/Error.tsx
+++ b/packages/client/components/modal/modals/Error.tsx
@@ -1,20 +1,20 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { PropGenerator } from "../types";
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to notify the user they've been signed out
  */
-const Error: PropGenerator<"error"> = (props) => {
+const Error: PropGenerator<'error'> = (props) => {
   const t = useTranslation();
 
   return {
-    title: t("app.special.modals.signed_out"),
+    title: t('app.special.modals.signed_out'),
     children: <span>{props.error}</span>,
     actions: [
       {
-        children: t("app.special.modals.actions.ok"),
-        palette: "secondary",
+        children: t('app.special.modals.actions.ok'),
+        palette: 'secondary',
         onClick() {
           return true;
         },
diff --git a/packages/client/components/modal/modals/ImageViewer.tsx b/packages/client/components/modal/modals/ImageViewer.tsx
index ba4442095..2067633b2 100644
--- a/packages/client/components/modal/modals/ImageViewer.tsx
+++ b/packages/client/components/modal/modals/ImageViewer.tsx
@@ -1,9 +1,9 @@
-import { PropGenerator } from "../types";
+import type { PropGenerator } from '../types';
 
 /**
  * Modal for viewing images
  */
-const ImageViewer: PropGenerator<"image_viewer"> = (props) => {
+const ImageViewer: PropGenerator<'image_viewer'> = (props) => {
   return {
     _children(props) {
       return <h1>hi!</h1>;
diff --git a/packages/client/components/modal/modals/JoinServer.tsx b/packages/client/components/modal/modals/JoinServer.tsx
index 7f9f91c9c..1087efb39 100644
--- a/packages/client/components/modal/modals/JoinServer.tsx
+++ b/packages/client/components/modal/modals/JoinServer.tsx
@@ -1,30 +1,30 @@
-import { useTranslation } from "@revolt/i18n";
-import { useNavigate } from "@revolt/routing";
+import { useTranslation } from '@revolt/i18n';
+import { useNavigate } from '@revolt/routing';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 const RE_INVITE_URL = /(?:invite|rvlt.gg)\/([a-z0-9]+)/gi;
 
 /**
  * Modal to join a server
  */
-const JoinServer: PropGenerator<"join_server"> = (props) => {
+const JoinServer: PropGenerator<'join_server'> = (props) => {
   const t = useTranslation();
   const navigate = useNavigate();
 
   return createFormModal({
     modalProps: {
-      title: "Join a server",
+      title: 'Join a server',
       description: <>Use a code or invite link</>,
     },
     schema: {
-      link: "text",
+      link: 'text',
     },
     data: {
       link: {
-        field: "code",
-        placeholder: "rvlt.gg/wVEJDGVs",
+        field: 'code',
+        placeholder: 'rvlt.gg/wVEJDGVs',
       },
     },
     callback: async ({ link }) => {
@@ -37,7 +37,7 @@ const JoinServer: PropGenerator<"join_server"> = (props) => {
 
       // TODO: replace
       const result = await props.client.api.post(`/invites/${code}`);
-      if (result.type === "Server") {
+      if (result.type === 'Server') {
         navigate(`/server/${result.server._id}`);
       } else {
         // TODO: group
@@ -45,7 +45,7 @@ const JoinServer: PropGenerator<"join_server"> = (props) => {
       }
     },
     submit: {
-      children: "Join",
+      children: 'Join',
     },
   });
 };
diff --git a/packages/client/components/modal/modals/KickMember.tsx b/packages/client/components/modal/modals/KickMember.tsx
index 7b7511778..9016c7df4 100644
--- a/packages/client/components/modal/modals/KickMember.tsx
+++ b/packages/client/components/modal/modals/KickMember.tsx
@@ -1,28 +1,28 @@
-import { useTranslation } from "@revolt/i18n";
-import { Avatar, Column } from "@revolt/ui";
+import { useTranslation } from '@revolt/i18n';
+import { Avatar, Column } from '@revolt/ui';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to kick server member
  */
-const KickMember: PropGenerator<"kick_member"> = (props) => {
+const KickMember: PropGenerator<'kick_member'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: t("app.context_menu.kick_member"),
+      title: t('app.context_menu.kick_member'),
     },
     schema: {
-      member: "custom",
+      member: 'custom',
     },
     data: {
       member: {
         element: (
-          <Column align="center">
+          <Column align='center'>
             <Avatar src={props.member.user?.animatedAvatarURL} size={64} />
-            {t("app.special.modals.prompt.confirm_kick", {
+            {t('app.special.modals.prompt.confirm_kick', {
               name: props.member.user?.username as string,
             })}
           </Column>
@@ -31,8 +31,8 @@ const KickMember: PropGenerator<"kick_member"> = (props) => {
     },
     callback: () => props.member.kick(),
     submit: {
-      variant: "error",
-      children: t("app.special.modals.actions.ban"),
+      variant: 'error',
+      children: t('app.special.modals.actions.ban'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/LeaveServer.tsx b/packages/client/components/modal/modals/LeaveServer.tsx
index 387558cf2..93ba7f8a0 100644
--- a/packages/client/components/modal/modals/LeaveServer.tsx
+++ b/packages/client/components/modal/modals/LeaveServer.tsx
@@ -1,34 +1,34 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to leave a server
  */
-const LeaveServer: PropGenerator<"leave_server"> = (props) => {
+const LeaveServer: PropGenerator<'leave_server'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: t("app.special.modals.prompt.confirm_leave", {
+      title: t('app.special.modals.prompt.confirm_leave', {
         name: props.server.name,
       }),
-      description: t("app.special.modals.prompt.confirm_leave_long"),
+      description: t('app.special.modals.prompt.confirm_leave_long'),
     },
     schema: {
-      silent: "checkbox",
+      silent: 'checkbox',
     },
     data: {
       silent: {
-        title: t("app.special.modals.prompt.silent_leave"),
-        description: t("app.special.modals.prompt.members_not_notified"),
+        title: t('app.special.modals.prompt.silent_leave'),
+        description: t('app.special.modals.prompt.members_not_notified'),
       },
     },
     callback: (data) => props.server.delete(data.silent),
     submit: {
-      variant: "error",
-      children: t("app.special.modals.actions.leave"),
+      variant: 'error',
+      children: t('app.special.modals.actions.leave'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/MFAEnableTOTP.tsx b/packages/client/components/modal/modals/MFAEnableTOTP.tsx
index e3c0efd5e..bb9cda1ca 100644
--- a/packages/client/components/modal/modals/MFAEnableTOTP.tsx
+++ b/packages/client/components/modal/modals/MFAEnableTOTP.tsx
@@ -1,10 +1,9 @@
-import { createSignal } from "solid-js";
-import { QRCodeSVG } from "solid-qr-code";
+import { useTranslation } from '@revolt/i18n';
+import { Column, Input, styled, Typography } from '@revolt/ui';
+import { createSignal } from 'solid-js';
+import { QRCodeSVG } from 'solid-qr-code';
 
-import { useTranslation } from "@revolt/i18n";
-import { Column, Input, Typography, styled } from "@revolt/ui";
-
-import { PropGenerator } from "../types";
+import type { PropGenerator } from '../types';
 
 /**
  * Wrapper element for the raw TOTP code
@@ -16,7 +15,7 @@ const Code = styled.code`
 /**
  * Wrapper element for the QR code
  */
-const Qr = styled("div", "Qr")`
+const Qr = styled('div', 'Qr')`
   border-radius: 4px;
   background: white;
 
@@ -30,9 +29,9 @@ const Qr = styled("div", "Qr")`
 /**
  * Modal to display QR code and secret key for MFA and accept the correct code
  */
-const MFAEnableTOTP: PropGenerator<"mfa_enable_totp"> = (props) => {
+const MFAEnableTOTP: PropGenerator<'mfa_enable_totp'> = (props) => {
   const t = useTranslation();
-  const [value, setValue] = createSignal("");
+  const [value, setValue] = createSignal('');
 
   /**
    * Generate OTP URI
@@ -41,21 +40,21 @@ const MFAEnableTOTP: PropGenerator<"mfa_enable_totp"> = (props) => {
     `otpauth://totp/Revolt:${props.identifier}?secret=${props.secret}&issuer=Revolt`;
 
   return {
-    title: t("app.special.modals.mfa.enable_totp"),
-    description: t("app.special.modals.mfa.prompt_totp"),
+    title: t('app.special.modals.mfa.enable_totp'),
+    description: t('app.special.modals.mfa.prompt_totp'),
     actions: [
       {
-        palette: "primary",
-        children: t("app.special.modals.actions.continue"),
+        palette: 'primary',
+        children: t('app.special.modals.actions.continue'),
         onClick: () => {
-          props.callback(value().trim().replace(/\s/g, ""));
+          props.callback(value().trim().replace(/\s/g, ''));
           return true;
         },
         confirmation: true,
       },
       {
-        palette: "plain",
-        children: t("app.special.modals.actions.cancel"),
+        palette: 'plain',
+        children: t('app.special.modals.actions.cancel'),
         onClick: () => {
           props.callback();
           return true;
@@ -65,13 +64,13 @@ const MFAEnableTOTP: PropGenerator<"mfa_enable_totp"> = (props) => {
     nonDismissable: true,
     children: (
       <>
-        <Column align="center">
+        <Column align='center'>
           <Qr>
             <QRCodeSVG
               value={uri()}
-              backgroundColor="white"
-              foregroundColor="black"
-              level="medium"
+              backgroundColor='white'
+              foregroundColor='black'
+              level='medium'
               height={140}
               width={140}
               backgroundAlpha={1}
@@ -81,8 +80,8 @@ const MFAEnableTOTP: PropGenerator<"mfa_enable_totp"> = (props) => {
           <Code>{props.secret}</Code>
         </Column>
 
-        <Typography variant="label">
-          {t("app.special.modals.mfa.enter_code")}
+        <Typography variant='label'>
+          {t('app.special.modals.mfa.enter_code')}
         </Typography>
 
         <Input
diff --git a/packages/client/components/modal/modals/MFAFlow.tsx b/packages/client/components/modal/modals/MFAFlow.tsx
index ad1499417..156f04c83 100644
--- a/packages/client/components/modal/modals/MFAFlow.tsx
+++ b/packages/client/components/modal/modals/MFAFlow.tsx
@@ -1,30 +1,28 @@
-import { BiRegularArchive, BiSolidKey, BiSolidKeyboard } from "solid-icons/bi";
+import { useTranslation } from '@revolt/i18n';
+import { CategoryButton, Input, Preloader, Typography } from '@revolt/ui';
+import type { API } from 'revolt.js';
+import { BiRegularArchive, BiSolidKey, BiSolidKeyboard } from 'solid-icons/bi';
 import {
-  For,
-  Match,
-  Switch,
   createEffect,
   createSignal,
+  For,
+  Match,
   onMount,
-} from "solid-js";
-
-import type { API } from "revolt.js";
-
-import { useTranslation } from "@revolt/i18n";
-import { CategoryButton, Input, Preloader, Typography } from "@revolt/ui";
+  Switch,
+} from 'solid-js';
 
-import { PropGenerator } from "../types";
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to create an MFA ticket
  */
-const MFAFlow: PropGenerator<"mfa_flow"> = (props) => {
+const MFAFlow: PropGenerator<'mfa_flow'> = (props) => {
   const t = useTranslation();
 
   // Keep track of available methods
   const [methods, setMethods] = createSignal<API.MFAMethod[] | undefined>(
     // eslint-disable-next-line solid/reactivity
-    props.state === "unknown" ? props.available_methods : undefined
+    props.state === 'unknown' ? props.available_methods : undefined
   );
 
   // Current state of the modal
@@ -33,7 +31,7 @@ const MFAFlow: PropGenerator<"mfa_flow"> = (props) => {
 
   // Fetch available methods if they have not been provided.
   onMount(() => {
-    if (!methods() && props.state === "known") {
+    if (!methods() && props.state === 'known') {
       setMethods(props.mfa.availableMethods);
     }
   });
@@ -42,7 +40,7 @@ const MFAFlow: PropGenerator<"mfa_flow"> = (props) => {
   createEffect(() => {
     const list = methods();
     if (list) {
-      setSelected(list.find((entry) => entry !== "Recovery"));
+      setSelected(list.find((entry) => entry !== 'Recovery'));
     }
   });
 
@@ -53,7 +51,7 @@ const MFAFlow: PropGenerator<"mfa_flow"> = (props) => {
     const mfa_response = response();
     if (!mfa_response) return false;
 
-    if (props.state === "known") {
+    if (props.state === 'known') {
       const ticket = await props.mfa.createTicket(mfa_response);
       props.callback(ticket);
     } else {
@@ -64,11 +62,11 @@ const MFAFlow: PropGenerator<"mfa_flow"> = (props) => {
   };
 
   return {
-    title: t("app.special.modals.confirm"),
+    title: t('app.special.modals.confirm'),
     description: (
-      <Switch fallback={t("app.special.modals.mfa.select_method")}>
+      <Switch fallback={t('app.special.modals.mfa.select_method')}>
         <Match when={selectedMethod()}>
-          {t("app.special.modals.mfa.confirm")}
+          {t('app.special.modals.mfa.confirm')}
         </Match>
       </Switch>
     ),
@@ -76,16 +74,16 @@ const MFAFlow: PropGenerator<"mfa_flow"> = (props) => {
       selectedMethod()
         ? [
             {
-              palette: "primary",
-              children: t("app.special.modals.actions.confirm"),
+              palette: 'primary',
+              children: t('app.special.modals.actions.confirm'),
               onClick: generateTicket,
               confirmation: true,
             },
             {
-              palette: "plain",
+              palette: 'plain',
               children: t(
                 `app.special.modals.actions.${
-                  methods()!.length === 1 ? "cancel" : "back"
+                  methods()!.length === 1 ? 'cancel' : 'back'
                 }`
               ),
               onClick: () => {
@@ -100,8 +98,8 @@ const MFAFlow: PropGenerator<"mfa_flow"> = (props) => {
           ]
         : [
             {
-              palette: "plain",
-              children: t("app.special.modals.actions.cancel"),
+              palette: 'plain',
+              children: t('app.special.modals.actions.cancel'),
               onClick: () => {
                 props.callback();
                 return true;
@@ -115,35 +113,35 @@ const MFAFlow: PropGenerator<"mfa_flow"> = (props) => {
     // or when switching to your password manager.
     nonDismissable:
       // eslint-disable-next-line solid/reactivity
-      props.state === "unknown" || typeof selectedMethod !== "undefined",
+      props.state === 'unknown' || typeof selectedMethod !== 'undefined',
     children: (
-      <Switch fallback={<Preloader type="ring" />}>
+      <Switch fallback={<Preloader type='ring' />}>
         <Match when={selectedMethod()}>
-          <Typography variant="label">
+          <Typography variant='label'>
             {t(`login.${selectedMethod()!.toLowerCase()}`)}
           </Typography>
           <Switch>
-            <Match when={selectedMethod() === "Password"}>
+            <Match when={selectedMethod() === 'Password'}>
               <Input
-                type="password"
+                type='password'
                 value={(response() as { password: string })?.password}
                 onChange={(e) =>
                   setResponse({ password: e.currentTarget.value })
                 }
               />
             </Match>
-            <Match when={selectedMethod() === "Totp"}>
+            <Match when={selectedMethod() === 'Totp'}>
               <Input
-                type="text"
+                type='text'
                 value={(response() as { totp_code: string })?.totp_code}
                 onChange={(e) =>
                   setResponse({ totp_code: e.currentTarget.value })
                 }
               />
             </Match>
-            <Match when={selectedMethod() === "Recovery"}>
+            <Match when={selectedMethod() === 'Recovery'}>
               <Input
-                type="text"
+                type='text'
                 value={(response() as { recovery_code: string })?.recovery_code}
                 onChange={(e) =>
                   setResponse({ recovery_code: e.currentTarget.value })
@@ -156,16 +154,16 @@ const MFAFlow: PropGenerator<"mfa_flow"> = (props) => {
           <For each={methods()}>
             {(method) => (
               <CategoryButton
-                action="chevron"
+                action='chevron'
                 icon={
                   <Switch>
-                    <Match when={method === "Password"}>
+                    <Match when={method === 'Password'}>
                       <BiSolidKeyboard size={24} />
                     </Match>
-                    <Match when={method === "Totp"}>
+                    <Match when={method === 'Totp'}>
                       <BiSolidKey size={24} />
                     </Match>
-                    <Match when={method === "Recovery"}>
+                    <Match when={method === 'Recovery'}>
                       <BiRegularArchive size={24} />
                     </Match>
                   </Switch>
diff --git a/packages/client/components/modal/modals/MFARecovery.tsx b/packages/client/components/modal/modals/MFARecovery.tsx
index e56a6c4d8..8677d506a 100644
--- a/packages/client/components/modal/modals/MFARecovery.tsx
+++ b/packages/client/components/modal/modals/MFARecovery.tsx
@@ -1,10 +1,9 @@
-import { For, createSignal } from "solid-js";
+import { useTranslation } from '@revolt/i18n';
+import { styled } from '@revolt/ui';
+import { createSignal, For } from 'solid-js';
 
-import { useTranslation } from "@revolt/i18n";
-import { styled } from "@revolt/ui";
-
-import { modalController } from "..";
-import { PropGenerator } from "../types";
+import { modalController } from '..';
+import type { PropGenerator } from '../types';
 
 /**
  * List of recovery codes
@@ -28,7 +27,7 @@ const List = styled.div`
 /**
  * Modal to display a list of recovery codes
  */
-const MFARecovery: PropGenerator<"mfa_recovery"> = (props) => {
+const MFARecovery: PropGenerator<'mfa_recovery'> = (props) => {
   const t = useTranslation();
 
   // Keep track of changes to recovery codes
@@ -49,18 +48,18 @@ const MFARecovery: PropGenerator<"mfa_recovery"> = (props) => {
   };
 
   return {
-    title: t("app.special.modals.mfa.recovery_codes"),
-    description: t("app.special.modals.mfa.save_codes"),
+    title: t('app.special.modals.mfa.recovery_codes'),
+    description: t('app.special.modals.mfa.save_codes'),
     actions: [
       {
-        palette: "primary",
-        children: t("app.special.modals.actions.done"),
+        palette: 'primary',
+        children: t('app.special.modals.actions.done'),
         onClick: () => true,
         confirmation: true,
       },
       {
-        palette: "plain",
-        children: t("app.special.modals.actions.reset"),
+        palette: 'plain',
+        children: t('app.special.modals.actions.reset'),
         onClick: reset,
       },
     ],
@@ -69,7 +68,7 @@ const MFARecovery: PropGenerator<"mfa_recovery"> = (props) => {
         <For each={known()}>
           {(code, index) => (
             <span>
-              {code} {index() !== known.length && <i>{","}</i>}
+              {code} {index() !== known.length && <i>{','}</i>}
             </span>
           )}
         </For>
diff --git a/packages/client/components/modal/modals/Onboarding.tsx b/packages/client/components/modal/modals/Onboarding.tsx
index 0459eeaab..8079d989f 100644
--- a/packages/client/components/modal/modals/Onboarding.tsx
+++ b/packages/client/components/modal/modals/Onboarding.tsx
@@ -1,31 +1,31 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 // TODO: port the onboarding modal design
 
 /**
  * Modal to pick a new username
  */
-const Onboarding: PropGenerator<"onboarding"> = (props) => {
+const Onboarding: PropGenerator<'onboarding'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: "Choose username",
+      title: 'Choose username',
     },
     schema: {
-      username: "text",
+      username: 'text',
     },
     data: {
       username: {
-        field: "Username",
+        field: 'Username',
       },
     },
     callback: async ({ username }) => await props.callback(username),
     submit: {
-      children: "Good",
+      children: 'Good',
     },
   });
 };
diff --git a/packages/client/components/modal/modals/RenameSession.tsx b/packages/client/components/modal/modals/RenameSession.tsx
index 59239ea51..901a9c58e 100644
--- a/packages/client/components/modal/modals/RenameSession.tsx
+++ b/packages/client/components/modal/modals/RenameSession.tsx
@@ -1,33 +1,33 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal for renaming session
  */
-const RenameSession: PropGenerator<"rename_session"> = (props) => {
+const RenameSession: PropGenerator<'rename_session'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
-      title: "Rename Session",
+      title: 'Rename Session',
     },
     schema: {
-      name: "text",
+      name: 'text',
     },
     defaults: {
       name: props.session.name,
     },
     data: {
       name: {
-        field: "Name",
-        placeholder: "Enter a new name for this session",
+        field: 'Name',
+        placeholder: 'Enter a new name for this session',
       },
     },
     callback: async ({ name }) => void (await props.session.rename(name)),
     submit: {
-      children: t("app.special.modals.actions.update"),
+      children: t('app.special.modals.actions.update'),
     },
   });
 };
diff --git a/packages/client/components/modal/modals/ReportContent.tsx b/packages/client/components/modal/modals/ReportContent.tsx
index 8124299c8..08ad0300e 100644
--- a/packages/client/components/modal/modals/ReportContent.tsx
+++ b/packages/client/components/modal/modals/ReportContent.tsx
@@ -1,71 +1,71 @@
-import { API, Server, User } from "revolt.js";
+import { Message } from '@revolt/app';
+import { useTranslation } from '@revolt/i18n';
+import { Avatar, Column, Initials, styled } from '@revolt/ui';
+import type { API } from 'revolt.js';
+import { Server, User } from 'revolt.js';
 
-import { Message } from "@revolt/app";
-import { useTranslation } from "@revolt/i18n";
-import { Avatar, Column, Initials, styled } from "@revolt/ui";
-
-import { createFormModal } from "../form";
-import { PropGenerator } from "../types";
+import { createFormModal } from '../form';
+import type { PropGenerator } from '../types';
 
 const CONTENT_REPORT_REASONS: API.ContentReportReason[] = [
-  "Illegal",
-  "IllegalGoods",
-  "IllegalExtortion",
-  "IllegalPornography",
-  "IllegalHacking",
-  "ExtremeViolence",
-  "PromotesHarm",
-  "UnsolicitedSpam",
-  "Raid",
-  "SpamAbuse",
-  "ScamsFraud",
-  "Malware",
-  "Harassment",
-  "NoneSpecified",
+  'Illegal',
+  'IllegalGoods',
+  'IllegalExtortion',
+  'IllegalPornography',
+  'IllegalHacking',
+  'ExtremeViolence',
+  'PromotesHarm',
+  'UnsolicitedSpam',
+  'Raid',
+  'SpamAbuse',
+  'ScamsFraud',
+  'Malware',
+  'Harassment',
+  'NoneSpecified',
 ];
 
 const USER_REPORT_REASONS: API.UserReportReason[] = [
-  "UnsolicitedSpam",
-  "SpamAbuse",
-  "InappropriateProfile",
-  "Impersonation",
-  "BanEvasion",
-  "Underage",
-  "NoneSpecified",
+  'UnsolicitedSpam',
+  'SpamAbuse',
+  'InappropriateProfile',
+  'Impersonation',
+  'BanEvasion',
+  'Underage',
+  'NoneSpecified',
 ];
 
 /**
  * Modal to report content
  */
-const ReportContent: PropGenerator<"report_content"> = (props) => {
+const ReportContent: PropGenerator<'report_content'> = (props) => {
   const t = useTranslation();
 
   return createFormModal({
     modalProps: {
       title: `Tell us what's wrong with this ${
         /* TEMP TODO */ props.target instanceof User
-          ? "user"
+          ? 'user'
           : props.target instanceof Server
-          ? "server"
-          : "message"
+            ? 'server'
+            : 'message'
       }`,
     },
     schema: {
-      preview: "custom",
-      category: "combo",
-      detail: "text",
+      preview: 'custom',
+      category: 'combo',
+      detail: 'text',
     },
     data: {
       preview: {
         element: (
           <ContentContainer use:scrollable>
             {props.target instanceof User ? (
-              <Column align="center">
+              <Column align='center'>
                 <Avatar src={props.target.animatedAvatarURL} size={64} />
                 {props.target.displayName}
               </Column>
             ) : props.target instanceof Server ? (
-              <Column align="center">
+              <Column align='center'>
                 <Avatar
                   src={props.target.animatedIconURL}
                   fallback={<Initials input={props.target.name} />}
@@ -82,8 +82,8 @@ const ReportContent: PropGenerator<"report_content"> = (props) => {
       category: {
         options: [
           {
-            name: "Please select a reason",
-            value: "",
+            name: 'Please select a reason',
+            value: '',
             disabled: true,
             selected: true,
           },
@@ -99,41 +99,41 @@ const ReportContent: PropGenerator<"report_content"> = (props) => {
             value,
           })),
         ],
-        field: "Pick a category",
+        field: 'Pick a category',
       },
       detail: {
-        field: "Give us some detail",
+        field: 'Give us some detail',
       },
     },
     callback: async ({ category, detail }) => {
-      if (!category || (category === "NoneSpecified" && !detail))
-        throw "NoReasonProvided";
+      if (!category || (category === 'NoneSpecified' && !detail))
+        throw 'NoReasonProvided';
 
-      await props.client.api.post("/safety/report", {
+      await props.client.api.post('/safety/report', {
         content:
           props.target instanceof User
             ? {
-                type: "User",
+                type: 'User',
                 id: props.target.id,
                 report_reason: category as API.UserReportReason,
                 message_id: props.contextMessage?.id,
               }
             : props.target instanceof Server
-            ? {
-                type: "Server",
-                id: props.target.id,
-                report_reason: category as API.ContentReportReason,
-              }
-            : {
-                type: "Message",
-                id: props.target.id,
-                report_reason: category as API.ContentReportReason,
-              },
+              ? {
+                  type: 'Server',
+                  id: props.target.id,
+                  report_reason: category as API.ContentReportReason,
+                }
+              : {
+                  type: 'Message',
+                  id: props.target.id,
+                  report_reason: category as API.ContentReportReason,
+                },
         additional_context: detail,
       });
     },
     submit: {
-      children: "Report",
+      children: 'Report',
     },
   });
 };
diff --git a/packages/client/components/modal/modals/ServerIdentity.tsx b/packages/client/components/modal/modals/ServerIdentity.tsx
index f38758e0b..fc0e5cd31 100644
--- a/packages/client/components/modal/modals/ServerIdentity.tsx
+++ b/packages/client/components/modal/modals/ServerIdentity.tsx
@@ -1,15 +1,14 @@
-import { Accessor, createEffect, createSignal } from "solid-js";
+import { useTranslation } from '@revolt/i18n';
+import { Avatar, Column, Input, MessageContainer, Username } from '@revolt/ui';
+import type { ServerMember } from 'revolt.js';
+import type { Accessor } from 'solid-js';
+import { createEffect, createSignal } from 'solid-js';
 
-import { ServerMember } from "revolt.js";
-
-import { useTranslation } from "@revolt/i18n";
-import { Avatar, Column, Input, MessageContainer, Username } from "@revolt/ui";
-
-import { PropGenerator } from "../types";
+import type { PropGenerator } from '../types';
 
 function Preview(props: { nickname: Accessor<string>; member: ServerMember }) {
   createEffect(() => {
-    console.info("n:", props.nickname());
+    console.info('n:', props.nickname());
   });
 
   return (
@@ -34,20 +33,20 @@ function Preview(props: { nickname: Accessor<string>; member: ServerMember }) {
 /**
  * Modal to update the user's server identity
  */
-const ServerIdentity: PropGenerator<"server_identity"> = (props) => {
+const ServerIdentity: PropGenerator<'server_identity'> = (props) => {
   const t = useTranslation();
-  const [nickname, setNickname] = createSignal(props.member.nickname ?? "");
+  const [nickname, setNickname] = createSignal(props.member.nickname ?? '');
 
   const [avatarFile, setAvatarFile] = createSignal<File>();
 
   return {
-    title: t("app.special.popovers.server_identity.title", {
+    title: t('app.special.popovers.server_identity.title', {
       server: props.member.server!.name,
     }),
     children: (
       <Column>
         {/* <span>developer ui</span> */}
-        <span>{t("app.special.popovers.server_identity.nickname")}</span>
+        <span>{t('app.special.popovers.server_identity.nickname')}</span>
         <Input
           value={nickname()}
           onChange={(e) => setNickname(e.currentTarget.value)}
@@ -59,7 +58,7 @@ const ServerIdentity: PropGenerator<"server_identity"> = (props) => {
     ),
     actions: [
       {
-        children: t("app.special.modals.actions.save"),
+        children: t('app.special.modals.actions.save'),
         async onClick() {
           await props.member.edit(
             nickname()
@@ -67,7 +66,7 @@ const ServerIdentity: PropGenerator<"server_identity"> = (props) => {
                   nickname: nickname(),
                 }
               : {
-                  remove: ["Nickname"],
+                  remove: ['Nickname'],
                 }
           );
 
diff --git a/packages/client/components/modal/modals/ServerInfo.tsx b/packages/client/components/modal/modals/ServerInfo.tsx
index 23e92000c..11891af63 100644
--- a/packages/client/components/modal/modals/ServerInfo.tsx
+++ b/packages/client/components/modal/modals/ServerInfo.tsx
@@ -1,28 +1,27 @@
-import { BiRegularX } from "solid-icons/bi";
-import { Show } from "solid-js";
+import { useTranslation } from '@revolt/i18n';
+import { Markdown } from '@revolt/markdown';
+import { Button, Column, Row, Typography } from '@revolt/ui';
+import { BiRegularX } from 'solid-icons/bi';
+import { Show } from 'solid-js';
 
-import { useTranslation } from "@revolt/i18n";
-import { Markdown } from "@revolt/markdown";
-import { Button, Column, Row, Typography } from "@revolt/ui";
-
-import { modalController } from "..";
-import { PropGenerator } from "../types";
+import { modalController } from '..';
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to display server information
  */
-const ServerInfo: PropGenerator<"server_info"> = (props, onClose) => {
+const ServerInfo: PropGenerator<'server_info'> = (props, onClose) => {
   const t = useTranslation();
 
   return {
     title: (
-      <Row align="center">
+      <Row align='center'>
         <Column grow>
-          <Typography variant="legacy-settings-title">
+          <Typography variant='legacy-settings-title'>
             {props.server.name}
           </Typography>
         </Column>
-        <Button size="icon" variant="plain" onClick={onClose}>
+        <Button size='icon' variant='plain' onClick={onClose}>
           <BiRegularX size={36} />
         </Button>
       </Row>
@@ -36,31 +35,31 @@ const ServerInfo: PropGenerator<"server_info"> = (props, onClose) => {
       {
         // TODO: report server
         onClick: () => true, //report(server),
-        children: t("app.special.modals.actions.report"),
-        palette: "error",
+        children: t('app.special.modals.actions.report'),
+        palette: 'error',
       },
       {
         onClick: () => {
           modalController.push({
-            type: "server_identity",
+            type: 'server_identity',
             member: props.server.member!,
           });
           return true;
         },
-        children: "Edit Identity",
-        palette: "secondary",
+        children: 'Edit Identity',
+        palette: 'secondary',
       },
       {
         onClick: () => {
           modalController.push({
-            type: "settings",
-            config: "server",
+            type: 'settings',
+            config: 'server',
             context: props.server,
           });
           return true;
         },
-        children: "Settings",
-        palette: "secondary",
+        children: 'Settings',
+        palette: 'secondary',
       },
     ],
   };
diff --git a/packages/client/components/modal/modals/Settings.tsx b/packages/client/components/modal/modals/Settings.tsx
index cde815b9b..aea6405b3 100644
--- a/packages/client/components/modal/modals/Settings.tsx
+++ b/packages/client/components/modal/modals/Settings.tsx
@@ -1,16 +1,14 @@
-import { Show } from "solid-js";
-import { Portal } from "solid-js/web";
+import { Settings, SettingsConfigurations } from '@revolt/app';
+import { Show } from 'solid-js';
+import { Portal } from 'solid-js/web';
+import { Motion, Presence } from 'solid-motionone';
 
-import { Motion, Presence } from "@motionone/solid";
-
-import { Settings, SettingsConfigurations } from "@revolt/app";
-
-import { PropGenerator } from "../types";
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to display server information
  */
-const SettingsModal: PropGenerator<"settings"> = ({
+const SettingsModal: PropGenerator<'settings'> = ({
   config: configKey,
   context,
 }) => {
@@ -19,25 +17,25 @@ const SettingsModal: PropGenerator<"settings"> = ({
   return {
     _children: (props) => {
       return (
-        <Portal mount={document.getElementById("floating")!}>
+        <Portal mount={document.getElementById('floating')!}>
           <div
             style={{
-              position: "fixed",
-              width: "100%",
-              height: "100vh",
+              position: 'fixed',
+              width: '100%',
+              height: '100vh',
               left: 0,
               top: 0,
-              "pointer-events": "none",
+              'pointer-events': 'none',
             }}
           >
             <Presence>
               <Show when={props?.show}>
                 <Motion.div
                   style={{
-                    height: "100%",
-                    "pointer-events": "all",
-                    display: "flex",
-                    background: "var(--colours-settings-background)",
+                    height: '100%',
+                    'pointer-events': 'all',
+                    display: 'flex',
+                    background: 'var(--colours-settings-background)',
                   }}
                   initial={{ opacity: 0, scale: 1.1 }}
                   animate={{ opacity: 1, scale: 1 }}
diff --git a/packages/client/components/modal/modals/SignOutSessions.tsx b/packages/client/components/modal/modals/SignOutSessions.tsx
index 0db87ac48..5ef8f6022 100644
--- a/packages/client/components/modal/modals/SignOutSessions.tsx
+++ b/packages/client/components/modal/modals/SignOutSessions.tsx
@@ -1,11 +1,11 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { PropGenerator } from "../types";
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to display server information
  */
-const SignOutSessions: PropGenerator<"sign_out_sessions"> = (props) => {
+const SignOutSessions: PropGenerator<'sign_out_sessions'> = (props) => {
   const t = useTranslation();
 
   /**
@@ -14,17 +14,17 @@ const SignOutSessions: PropGenerator<"sign_out_sessions"> = (props) => {
   const confirm = () => props.client.sessions.deleteAll().then(() => true);
 
   return {
-    title: t("app.special.modals.sessions.title"),
-    children: t("app.special.modals.sessions.short"),
+    title: t('app.special.modals.sessions.title'),
+    children: t('app.special.modals.sessions.short'),
     actions: [
       {
-        palette: "accent",
+        palette: 'accent',
         onClick: () => true,
-        children: t("app.special.modals.actions.cancel"),
+        children: t('app.special.modals.actions.cancel'),
       },
       {
         onClick: confirm,
-        children: t("app.special.modals.sessions.accept"),
+        children: t('app.special.modals.sessions.accept'),
       },
     ],
   };
diff --git a/packages/client/components/modal/modals/SignedOut.tsx b/packages/client/components/modal/modals/SignedOut.tsx
index 6258dc066..c99e79d1e 100644
--- a/packages/client/components/modal/modals/SignedOut.tsx
+++ b/packages/client/components/modal/modals/SignedOut.tsx
@@ -1,20 +1,20 @@
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
 
-import { PropGenerator } from "../types";
+import type { PropGenerator } from '../types';
 
 /**
  * Modal to notify the user they've been signed out
  * TODO: show if user is banned, etc
  */
-const SignedOut: PropGenerator<"signed_out"> = () => {
+const SignedOut: PropGenerator<'signed_out'> = () => {
   const t = useTranslation();
 
   return {
-    title: t("app.special.modals.signed_out"),
+    title: t('app.special.modals.signed_out'),
     actions: [
       {
-        children: t("app.special.modals.actions.ok"),
-        palette: "secondary",
+        children: t('app.special.modals.actions.ok'),
+        palette: 'secondary',
         onClick() {
           return true;
         },
diff --git a/packages/client/components/modal/modals/index.tsx b/packages/client/components/modal/modals/index.tsx
index d25d19e06..6bed7cce8 100644
--- a/packages/client/components/modal/modals/index.tsx
+++ b/packages/client/components/modal/modals/index.tsx
@@ -1,51 +1,50 @@
-import { JSX } from "solid-js";
+import { Modal } from '@revolt/ui';
+import type { JSX } from 'solid-js';
 
-import { Modal } from "@revolt/ui";
+import type { ActiveModal } from '..';
+import { modalController } from '..';
+import type { Modals as AllModals, PropGenerator } from '../types';
+import add_friend from './AddFriend';
+import ban_member from './BanMember';
+import changelog from './Changelog';
+import channel_info from './ChannelInfo';
+import clipboard from './Clipboard';
+import create_bot from './CreateBot';
+import create_category from './CreateCategory';
+import create_channel from './CreateChannel';
+import create_group from './CreateGroup';
+import create_invite from './CreateInvite';
+import create_or_join_server from './CreateOrJoinServer';
+import create_role from './CreateRole';
+import create_server from './CreateServer';
+import custom_status from './CustomStatus';
+import delete_bot from './DeleteBot';
+import delete_channel from './DeleteChannel';
+import delete_message from './DeleteMessage';
+import delete_server from './DeleteServer';
+import edit_display_name from './EditDisplayName';
+import edit_email from './EditEmail';
+import edit_keybind from './EditKeybind';
+import edit_password from './EditPassword';
+import edit_username from './EditUsername';
+import error from './Error';
+import image_viewer from './ImageViewer';
+import join_server from './JoinServer';
+import kick_member from './KickMember';
+import leave_server from './LeaveServer';
+import mfa_enable_totp from './MFAEnableTOTP';
+import mfa_flow from './MFAFlow';
+import mfa_recovery from './MFARecovery';
+import onboarding from './Onboarding';
+import rename_session from './RenameSession';
+import report_content from './ReportContent';
+import server_identity from './ServerIdentity';
+import server_info from './ServerInfo';
+import settings from './Settings';
+import signed_out from './SignedOut';
+import sign_out_sessions from './SignOutSessions';
 
-import { ActiveModal, modalController } from "..";
-import type { Modals as AllModals, PropGenerator } from "../types";
-
-import add_friend from "./AddFriend";
-import ban_member from "./BanMember";
-import changelog from "./Changelog";
-import channel_info from "./ChannelInfo";
-import clipboard from "./Clipboard";
-import create_bot from "./CreateBot";
-import create_category from "./CreateCategory";
-import create_channel from "./CreateChannel";
-import create_group from "./CreateGroup";
-import create_invite from "./CreateInvite";
-import create_or_join_server from "./CreateOrJoinServer";
-import create_role from "./CreateRole";
-import create_server from "./CreateServer";
-import custom_status from "./CustomStatus";
-import delete_bot from "./DeleteBot";
-import delete_channel from "./DeleteChannel";
-import delete_message from "./DeleteMessage";
-import delete_server from "./DeleteServer";
-import edit_display_name from "./EditDisplayName";
-import edit_email from "./EditEmail";
-import edit_keybind from "./EditKeybind";
-import edit_password from "./EditPassword";
-import edit_username from "./EditUsername";
-import error from "./Error";
-import image_viewer from "./ImageViewer";
-import join_server from "./JoinServer";
-import kick_member from "./KickMember";
-import leave_server from "./LeaveServer";
-import mfa_enable_totp from "./MFAEnableTOTP";
-import mfa_flow from "./MFAFlow";
-import mfa_recovery from "./MFARecovery";
-import onboarding from "./Onboarding";
-import rename_session from "./RenameSession";
-import report_content from "./ReportContent";
-import server_identity from "./ServerIdentity";
-import server_info from "./ServerInfo";
-import settings from "./Settings";
-import sign_out_sessions from "./SignOutSessions";
-import signed_out from "./SignedOut";
-
-const Modals: Record<AllModals["type"], PropGenerator<any>> = {
+const Modals: Record<AllModals['type'], PropGenerator<any>> = {
   add_friend,
   ban_member,
   changelog,
@@ -99,7 +98,7 @@ export function RenderModal(props: ActiveModal) {
 
   if (import.meta.env.DEV) {
     // eslint-disable-next-line solid/reactivity
-    console.info("modal:", props.props.type);
+    console.info('modal:', props.props.type);
   }
 
   // eslint-disable-next-line solid/reactivity
diff --git a/packages/client/components/modal/types.ts b/packages/client/components/modal/types.ts
index 3827175ca..92846ab27 100644
--- a/packages/client/components/modal/types.ts
+++ b/packages/client/components/modal/types.ts
@@ -1,243 +1,241 @@
-import type { ComponentProps, JSX } from "solid-js";
-
-import {
+import type { SettingsConfigurations } from '@revolt/app';
+import type { KeybindAction, KeyComboSequence } from '@revolt/keybinds';
+import type { Modal } from '@revolt/ui';
+import type {
   API,
   Bot,
   Channel,
   Client,
   File,
+  Message,
   MFA,
   MFATicket,
-  Message,
   Server,
   ServerMember,
   Session,
   User,
-} from "revolt.js";
-
-import { SettingsConfigurations } from "@revolt/app";
-import type { KeyComboSequence, KeybindAction } from "@revolt/keybinds";
-import type { Modal } from "@revolt/ui";
+} from 'revolt.js';
+import type { ComponentProps, JSX } from 'solid-js';
 
-import { ChangelogPost } from "./modals/Changelog";
+import type { ChangelogPost } from './modals/Changelog';
 
 export type Modals =
   | {
       type:
-        | "add_friend"
-        | "create_group"
-        | "create_or_join_server"
-        | "create_server"
-        | "join_server"
-        | "custom_status"
-        | "edit_username"
-        | "edit_email"
-        | "edit_password";
+        | 'add_friend'
+        | 'create_group'
+        | 'create_or_join_server'
+        | 'create_server'
+        | 'join_server'
+        | 'custom_status'
+        | 'edit_username'
+        | 'edit_email'
+        | 'edit_password';
       client: Client;
     }
   | {
-      type: "edit_display_name";
+      type: 'edit_display_name';
       user: User;
     }
   | {
-      type: "rename_session";
+      type: 'rename_session';
       session: Session;
     }
   | {
-      type: "report_content";
+      type: 'report_content';
       client: Client;
       target: Server | User | Message;
       contextMessage?: Message;
     }
   | {
-      type: "report_success";
+      type: 'report_success';
       user?: User;
     }
   | {
-      type: "signed_out";
+      type: 'signed_out';
     }
   | ({
-      type: "mfa_flow";
+      type: 'mfa_flow';
     } & (
       | {
           mfa: MFA;
-          state: "known";
+          state: 'known';
           callback: (ticket?: MFATicket) => void;
         }
       | {
-          state: "unknown";
+          state: 'unknown';
           available_methods: API.MFAMethod[];
           callback: (response?: API.MFAResponse) => void;
         }
     ))
-  | { type: "mfa_recovery"; codes: string[]; mfa: MFA }
+  | { type: 'mfa_recovery'; codes: string[]; mfa: MFA }
   | {
-      type: "mfa_enable_totp";
+      type: 'mfa_enable_totp';
       identifier: string;
       secret: string;
       callback: (code?: string) => void;
     }
   | {
-      type: "out_of_date";
+      type: 'out_of_date';
       version: string;
     }
   | {
-      type: "changelog";
+      type: 'changelog';
       initial?: number;
       posts: ChangelogPost[];
     }
   | {
-      type: "sign_out_sessions";
+      type: 'sign_out_sessions';
       client: Client;
     }
   | {
-      type: "show_token";
+      type: 'show_token';
       name: string;
       token: string;
     }
   | {
-      type: "error";
+      type: 'error';
       error: string;
     }
   | {
-      type: "clipboard";
+      type: 'clipboard';
       text: string;
     }
   | {
-      type: "link_warning";
+      type: 'link_warning';
       link: string;
       callback: () => true;
     }
   | {
-      type: "pending_friend_requests";
+      type: 'pending_friend_requests';
       users: User[];
     }
   | {
-      type: "modify_account";
+      type: 'modify_account';
       client: Client;
-      field: "username" | "email" | "password";
+      field: 'username' | 'email' | 'password';
     }
   | {
-      type: "server_identity";
+      type: 'server_identity';
       member: ServerMember;
     }
   | {
-      type: "channel_info";
+      type: 'channel_info';
       channel: Channel;
     }
   | {
-      type: "server_info";
+      type: 'server_info';
       server: Server;
     }
   | {
-      type: "image_viewer";
+      type: 'image_viewer';
       embed?: API.Image;
       file?: File;
     }
   | {
-      type: "user_picker";
+      type: 'user_picker';
       omit?: string[];
       callback: (users: string[]) => Promise<void>;
     }
   | {
-      type: "user_profile";
+      type: 'user_profile';
       user_id: string;
       isPlaceholder?: boolean;
       placeholderProfile?: API.UserProfile;
     }
   | {
-      type: "create_bot";
+      type: 'create_bot';
       client: Client;
       onCreate: (bot: Bot) => void;
     }
   | {
-      type: "onboarding";
+      type: 'onboarding';
       callback: (username: string, loginAfterSuccess?: true) => Promise<void>;
     }
   | {
-      type: "create_role";
+      type: 'create_role';
       server: Server;
       callback: (id: string) => void;
     }
   | {
-      type: "leave_group";
+      type: 'leave_group';
       channel: Channel;
     }
   | {
-      type: "close_dm";
+      type: 'close_dm';
       channel: Channel;
     }
   | {
-      type: "delete_channel";
+      type: 'delete_channel';
       channel: Channel;
     }
   | {
-      type: "create_invite";
+      type: 'create_invite';
       channel: Channel;
     }
   | {
-      type: "leave_server";
+      type: 'leave_server';
       server: Server;
     }
   | {
-      type: "delete_server";
+      type: 'delete_server';
       server: Server;
     }
   | {
-      type: "delete_bot";
+      type: 'delete_bot';
       bot: Bot;
     }
   | {
-      type: "delete_message";
+      type: 'delete_message';
       message: Message;
     }
   | {
-      type: "kick_member";
+      type: 'kick_member';
       member: ServerMember;
     }
   | {
-      type: "ban_member";
+      type: 'ban_member';
       member: ServerMember;
     }
   | {
-      type: "unfriend_user";
+      type: 'unfriend_user';
       user: User;
     }
   | {
-      type: "block_user";
+      type: 'block_user';
       user: User;
     }
   | {
-      type: "create_channel";
+      type: 'create_channel';
       server: Server;
       cb?: (channel: Channel) => void;
     }
   | {
-      type: "create_category";
+      type: 'create_category';
       server: Server;
     }
   | {
-      type: "import_theme";
+      type: 'import_theme';
     }
   | {
-      type: "settings";
+      type: 'settings';
       config: keyof typeof SettingsConfigurations;
       // eslint-disable-next-line
       context?: any;
     }
   | {
-      type: "edit_keybind";
+      type: 'edit_keybind';
       action: KeybindAction;
       onSubmit: (sequence: KeyComboSequence) => void;
     };
 
-export type ModalProps<T extends Modals["type"]> = Modals & { type: T };
+export type ModalProps<T extends Modals['type']> = Modals & { type: T };
 export type ReturnType =
   | ComponentProps<typeof Modal>
   | {
       _children: (props: { show: boolean; onClose: () => void }) => JSX.Element;
     };
-export type PropGenerator<T extends Modals["type"]> = (
+export type PropGenerator<T extends Modals['type']> = (
   props: ModalProps<T>,
   onClose: () => void
 ) => ReturnType;
diff --git a/packages/client/components/routing/index.tsx b/packages/client/components/routing/index.tsx
index 50b5aab2e..8cf60434e 100644
--- a/packages/client/components/routing/index.tsx
+++ b/packages/client/components/routing/index.tsx
@@ -1,6 +1,5 @@
-import { Accessor } from "solid-js";
-
-import { useLocation } from "@solidjs/router";
+import { useLocation } from '@solidjs/router';
+import { type Accessor } from 'solid-js';
 
 /**
  * We re-export everything to prevent us importing @solidjs/router
@@ -11,13 +10,13 @@ import { useLocation } from "@solidjs/router";
  */
 export {
   Navigate,
-  Router,
   Route,
+  Router,
+  useBeforeLeave,
+  useLocation,
   useNavigate,
   useParams,
-  useLocation,
-  useBeforeLeave,
-} from "@solidjs/router";
+} from '@solidjs/router';
 
 const RE_SERVER = /\/server\/([A-Z0-9]{26})/;
 const RE_CHANNEL = /\/channel\/([A-Z0-9]{26})/;
@@ -32,7 +31,7 @@ const RE_MESSAGE_ID_EXACT =
 /**
  * Route parameters available globally
  */
-type GlobalParams = {
+interface GlobalParams {
   /**
    * Server ID
    */
@@ -62,7 +61,7 @@ type GlobalParams = {
    * Exact match for message?
    */
   exactMessage: boolean;
-};
+}
 
 /**
  * Generate global params from path
diff --git a/packages/client/components/state/index.tsx b/packages/client/components/state/index.tsx
index 15944eab0..7f7e02e69 100644
--- a/packages/client/components/state/index.tsx
+++ b/packages/client/components/state/index.tsx
@@ -1,21 +1,21 @@
-import { JSX, Show, createSignal, onMount } from "solid-js";
-import { SetStoreFunction, createStore } from "solid-js/store";
-
-import equal from "fast-deep-equal";
-import localforage from "localforage";
-
-import { registerController } from "@revolt/common";
-
-import { AbstractStore, Store } from "./stores";
-import { Auth } from "./stores/Auth";
-import { Draft } from "./stores/Draft";
-import { Experiments } from "./stores/Experiments";
-import { Keybinds } from "./stores/Keybinds";
-import { Layout } from "./stores/Layout";
-import { Locale } from "./stores/Locale";
-import { NotificationOptions } from "./stores/NotificationOptions";
-import { Ordering } from "./stores/Ordering";
-import { Settings } from "./stores/Settings";
+import { registerController } from '@revolt/common';
+import equal from 'fast-deep-equal';
+import localforage from 'localforage';
+import type { JSX } from 'solid-js';
+import { createSignal, onMount, Show } from 'solid-js';
+import type { SetStoreFunction } from 'solid-js/store';
+import { createStore } from 'solid-js/store';
+
+import type { AbstractStore, Store } from './stores';
+import { Auth } from './stores/Auth';
+import { Draft } from './stores/Draft';
+import { Experiments } from './stores/Experiments';
+import { Keybinds } from './stores/Keybinds';
+import { Layout } from './stores/Layout';
+import { Locale } from './stores/Locale';
+import { NotificationOptions } from './stores/NotificationOptions';
+import { Ordering } from './stores/Ordering';
+import { Settings } from './stores/Settings';
 
 /**
  * Introduce some delay before writing state to disk
@@ -25,7 +25,7 @@ const DISK_WRITE_WAIT_MS = 1200;
 /**
  * Stores for which we don't want to wait to write to
  */
-const IGNORE_WRITE_DELAY = ["auth"];
+const IGNORE_WRITE_DELAY = ['auth'];
 
 /**
  * Global application state
@@ -85,7 +85,7 @@ export class State {
     this.setStore = setStore;
     this.writeQueue = {};
 
-    registerController("state", this);
+    registerController('state', this);
   }
 
   /**
@@ -118,7 +118,7 @@ export class State {
         );
 
         if (import.meta.env.DEV) {
-          console.info("Wrote state to disk.");
+          console.info('Wrote state to disk.');
         }
       },
       IGNORE_WRITE_DELAY.includes(key) ? 0 : DISK_WRITE_WAIT_MS
@@ -134,7 +134,7 @@ export class State {
 
     // run side-effects
     if (import.meta.env.DEV) {
-      console.info("[store] updated data", args[0]);
+      console.info('[store] updated data', args[0]);
     }
   };
 
diff --git a/packages/client/components/state/stores/Auth.ts b/packages/client/components/state/stores/Auth.ts
index 2933d5a08..cd1270eb6 100644
--- a/packages/client/components/state/stores/Auth.ts
+++ b/packages/client/components/state/stores/Auth.ts
@@ -1,34 +1,33 @@
-import { TransitionType } from "@revolt/client/Controller";
-import { CONFIGURATION, getController } from "@revolt/common";
+import { TransitionType } from '@revolt/client/Controller';
+import { CONFIGURATION, getController } from '@revolt/common';
 
-import { State } from "..";
+import type { State } from '..';
+import { AbstractStore } from '.';
 
-import { AbstractStore } from ".";
-
-export type Session = {
+export interface Session {
   _id: string;
   token: string;
   userId: string;
   valid: boolean;
-};
+}
 
-export type TypeAuth = {
+export interface TypeAuth {
   /**
    * Session information
    */
   session?: Session;
-};
+}
 
 /**
  * Authentication details store
  */
-export class Auth extends AbstractStore<"auth", TypeAuth> {
+export class Auth extends AbstractStore<'auth', TypeAuth> {
   /**
    * Construct store
    * @param state State
    */
   constructor(state: State) {
-    super(state, "auth");
+    super(state, 'auth');
   }
 
   /**
@@ -37,7 +36,7 @@ export class Auth extends AbstractStore<"auth", TypeAuth> {
   hydrate(): void {
     if (CONFIGURATION.DEVELOPMENT_TOKEN && CONFIGURATION.DEVELOPMENT_USER_ID) {
       this.setSession({
-        _id: CONFIGURATION.DEVELOPMENT_SESSION_ID ?? "0",
+        _id: CONFIGURATION.DEVELOPMENT_SESSION_ID ?? '0',
         token: CONFIGURATION.DEVELOPMENT_TOKEN,
         userId: CONFIGURATION.DEVELOPMENT_USER_ID,
         valid: true,
@@ -46,7 +45,7 @@ export class Auth extends AbstractStore<"auth", TypeAuth> {
 
     const session = this.getSession();
     if (session) {
-      const clientController = getController("client");
+      const clientController = getController('client');
       clientController.lifecycle.transition({
         type: TransitionType.LoginCached,
         session,
@@ -68,11 +67,11 @@ export class Auth extends AbstractStore<"auth", TypeAuth> {
    */
   clean(input: Partial<TypeAuth>): TypeAuth {
     let session;
-    if (typeof input.session === "object") {
+    if (typeof input.session === 'object') {
       if (
-        typeof input.session._id === "string" &&
-        typeof input.session.token === "string" &&
-        typeof input.session.userId === "string" &&
+        typeof input.session._id === 'string' &&
+        typeof input.session.token === 'string' &&
+        typeof input.session.userId === 'string' &&
         input.session.valid
       ) {
         session = {
@@ -102,14 +101,14 @@ export class Auth extends AbstractStore<"auth", TypeAuth> {
    * @param session Session
    */
   setSession(session: Session) {
-    this.set("session", session);
+    this.set('session', session);
   }
 
   /**
    * Remove existing session.
    */
   removeSession() {
-    this.set("session", undefined!);
+    this.set('session', undefined!);
   }
 
   /**
@@ -118,7 +117,7 @@ export class Auth extends AbstractStore<"auth", TypeAuth> {
   markValid() {
     const session = this.get().session;
     if (session && !session.valid) {
-      this.set("session", "valid", true);
+      this.set('session', 'valid', true);
     }
   }
 }
diff --git a/packages/client/components/state/stores/Draft.ts b/packages/client/components/state/stores/Draft.ts
index 630ffd99b..df4a2f4d1 100644
--- a/packages/client/components/state/stores/Draft.ts
+++ b/packages/client/components/state/stores/Draft.ts
@@ -1,13 +1,10 @@
-import { batch } from "solid-js";
+import { CONFIGURATION, insecureUniqueId } from '@revolt/common';
+import type { API, Channel, Client, Message } from 'revolt.js';
+import { batch } from 'solid-js';
 
-import { API, Channel, Client, Message } from "revolt.js";
-
-import { CONFIGURATION, insecureUniqueId } from "@revolt/common";
-
-import { State } from "..";
-
-import { AbstractStore } from ".";
-import { LAYOUT_SECTIONS } from "./Layout";
+import type { State } from '..';
+import { AbstractStore } from '.';
+import { LAYOUT_SECTIONS } from './Layout';
 
 export interface DraftData {
   /**
@@ -35,7 +32,7 @@ export type UnsentMessage = {
   /**
    * Status
    */
-  status: "sending" | "unsent" | "failed";
+  status: 'sending' | 'unsent' | 'failed';
 } & DraftData;
 
 export interface TextSelection {
@@ -55,7 +52,7 @@ export interface TextSelection {
   end: number;
 }
 
-export type TypeDraft = {
+export interface TypeDraft {
   /**
    * All active message drafts
    */
@@ -65,22 +62,22 @@ export type TypeDraft = {
    * Unsent messages
    */
   outbox: Record<string, UnsentMessage[]>;
-};
+}
 
 /**
  * List of image content types
  */
 export const ALLOWED_IMAGE_TYPES = [
-  "image/jpeg",
-  "image/png",
-  "image/gif",
-  "image/webp",
+  'image/jpeg',
+  'image/png',
+  'image/gif',
+  'image/webp',
 ];
 
 /**
  * Message drafts store
  */
-export class Draft extends AbstractStore<"draft", TypeDraft> {
+export class Draft extends AbstractStore<'draft', TypeDraft> {
   /**
    * Keep track of cached files
    */
@@ -99,7 +96,7 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
    * @param state State
    */
   constructor(state: State) {
-    super(state, "draft");
+    super(state, 'draft');
     this.fileCache = {};
 
     this.getFile = this.getFile.bind(this);
@@ -126,8 +123,8 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
    * Validate the given data to see if it is compliant and return a compliant object
    */
   clean(input: Partial<TypeDraft>): TypeDraft {
-    const drafts: TypeDraft["drafts"] = {};
-    const outbox: TypeDraft["outbox"] = {};
+    const drafts: TypeDraft['drafts'] = {};
+    const outbox: TypeDraft['outbox'] = {};
 
     /**
      * Validate replies array is correct
@@ -139,18 +136,18 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
       replies.length &&
       !replies.find(
         (x) =>
-          typeof x !== "object" ||
-          typeof x.id !== "string" ||
-          typeof x.mention !== "boolean"
+          typeof x !== 'object' ||
+          typeof x.id !== 'string' ||
+          typeof x.mention !== 'boolean'
       );
 
     const messageDrafts = input.drafts;
-    if (typeof messageDrafts === "object") {
+    if (typeof messageDrafts === 'object') {
       for (const channelId of Object.keys(messageDrafts)) {
         const entry = messageDrafts?.[channelId];
         const draft: DraftData = {};
 
-        if (typeof entry?.content === "string" && entry.content) {
+        if (typeof entry?.content === 'string' && entry.content) {
           draft.content = entry.content;
         }
 
@@ -165,7 +162,7 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
     }
 
     const pendingMessages = input.outbox;
-    if (typeof pendingMessages === "object") {
+    if (typeof pendingMessages === 'object') {
       for (const channelId of Object.keys(pendingMessages)) {
         const entry = pendingMessages[channelId];
         const messages: UnsentMessage[] = [];
@@ -173,15 +170,15 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
         if (Array.isArray(entry)) {
           for (const message of entry) {
             if (
-              typeof message === "object" &&
-              ["sending", "unsent", "failed"].includes(message.status) &&
-              typeof message.idempotencyKey === "string" &&
-              typeof message.content === "string" // shouldn't be enforced once we support caching files
+              typeof message === 'object' &&
+              ['sending', 'unsent', 'failed'].includes(message.status) &&
+              typeof message.idempotencyKey === 'string' &&
+              typeof message.content === 'string' // shouldn't be enforced once we support caching files
             ) {
               const msg: UnsentMessage = {
                 idempotencyKey: message.idempotencyKey,
                 content: message.content,
-                status: "unsent",
+                status: 'unsent',
                 // TODO: support storing unsent files in local storage
                 // files: [..]
               };
@@ -231,15 +228,15 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
     channelId: string,
     data?: DraftData | ((data: DraftData) => DraftData)
   ) {
-    if (typeof data === "function") {
+    if (typeof data === 'function') {
       data = data(this.getDraft(channelId));
     }
 
-    if (typeof data === "undefined") {
+    if (typeof data === 'undefined') {
       return this.clearDraft(channelId);
     }
 
-    this.set("drafts", channelId, data);
+    this.set('drafts', channelId, data);
   }
 
   /**
@@ -253,7 +250,7 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
     }
 
     this.setDraft(channelId, {
-      content: "",
+      content: '',
       replies: [],
       files: [],
     });
@@ -270,12 +267,12 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
 
     // TODO: const idempotencyKey = ulid();
     const idempotencyKey = Math.random().toString();
-    this.set("outbox", channel.id, [
+    this.set('outbox', channel.id, [
       ...this.getPendingMessages(channel.id),
       {
         ...draft,
         idempotencyKey,
-        status: "sending",
+        status: 'sending',
       } as UnsentMessage,
     ]);
 
@@ -300,28 +297,28 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
         // Prepare for upload
         const body = new FormData();
         const { file } = this.getFile(fileId);
-        body.set("file", file);
+        body.set('file', file);
 
         // We have to use XMLHttpRequest because modern fetch duplex streams require QUIC or HTTP/2
         const xhr = new XMLHttpRequest();
-        xhr.responseType = "json";
+        xhr.responseType = 'json';
 
         const [success, response] = await new Promise<
           [boolean, { id: string }]
         >((resolve) => {
-          xhr.upload.addEventListener("progress", (event) => {
+          xhr.upload.addEventListener('progress', (event) => {
             if (event.lengthComputable) {
               // TODO: show this to users
-              console.log("upload progress:", event.loaded / event.total);
+              console.log('upload progress:', event.loaded / event.total);
             }
           });
 
-          xhr.addEventListener("loadend", () => {
+          xhr.addEventListener('loadend', () => {
             resolve([xhr.readyState === 4 && xhr.status === 200, xhr.response]);
           });
 
           xhr.open(
-            "POST",
+            'POST',
             `${client.configuration!.features.autumn.url}/attachments`,
             true
           );
@@ -329,7 +326,7 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
         });
 
         // TODO: keep track of uploaded files (and don't reupload those that succeded if message or something else fails)
-        if (!success) throw "Upload Error";
+        if (!success) throw 'Upload Error';
         attachments.push(response.id);
       }
     }
@@ -350,7 +347,7 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
       }
 
       this.set(
-        "outbox",
+        'outbox',
         channel.id,
         this.getPendingMessages(channel.id).filter(
           (entry) => entry.idempotencyKey !== idempotencyKey
@@ -358,13 +355,13 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
       );
     } catch (err) {
       this.set(
-        "outbox",
+        'outbox',
         channel.id,
         this.getPendingMessages(channel.id).map((entry) =>
           entry.idempotencyKey === idempotencyKey
             ? {
                 ...entry,
-                status: "failed",
+                status: 'failed',
               }
             : entry
         )
@@ -381,7 +378,7 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
     const { content, replies, files } = this.getDraft(channelId);
 
     this.setDraft(channelId, {
-      content: "",
+      content: '',
       replies: [],
       files: files?.splice(CONFIGURATION.MAX_ATTACHMENTS),
     });
@@ -418,7 +415,7 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
    */
   cancelSend(channel: Channel, idempotencyKey: string) {
     this.set(
-      "outbox",
+      'outbox',
       channel.id,
       this.getPendingMessages(channel.id).filter(
         (entry) => entry.idempotencyKey !== idempotencyKey
@@ -455,7 +452,7 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
    */
   insertText(string: string) {
     if (this.textSelection) {
-      const content = this.getDraft(this.textSelection.channelId).content ?? "";
+      const content = this.getDraft(this.textSelection.channelId).content ?? '';
       const startStr = content.slice(0, this.textSelection.start);
       const endStr = content.slice(this.textSelection.end, content.length);
 
@@ -477,7 +474,7 @@ export class Draft extends AbstractStore<"draft", TypeDraft> {
    * Reset and clear all drafts.
    */
   reset() {
-    this.set("drafts", {});
+    this.set('drafts', {});
   }
 
   /**
diff --git a/packages/client/components/state/stores/Experiments.ts b/packages/client/components/state/stores/Experiments.ts
index 5a3d048be..835a2c6db 100644
--- a/packages/client/components/state/stores/Experiments.ts
+++ b/packages/client/components/state/stores/Experiments.ts
@@ -1,47 +1,46 @@
-import { State } from "..";
-
-import { AbstractStore } from ".";
+import type { State } from '..';
+import { AbstractStore } from '.';
 
 /**
  * Union type of available experiments.
  */
 export type Experiment =
-  | "file_uploads"
-  | "friends"
-  | "account_switcher"
-  | "gif_picker"
-  | "user_card"
-  | "emoji_picker"
-  | "plugins"
-  | "voice_chat";
+  | 'file_uploads'
+  | 'friends'
+  | 'account_switcher'
+  | 'gif_picker'
+  | 'user_card'
+  | 'emoji_picker'
+  | 'plugins'
+  | 'voice_chat';
 
 /**
  * Currently active experiments.
  */
 export const AVAILABLE_EXPERIMENTS: Experiment[] = [
-  "file_uploads",
-  "friends",
-  "account_switcher",
-  "gif_picker",
-  "user_card",
-  "emoji_picker",
-  "plugins",
-  "voice_chat",
+  'file_uploads',
+  'friends',
+  'account_switcher',
+  'gif_picker',
+  'user_card',
+  'emoji_picker',
+  'plugins',
+  'voice_chat',
 ];
 
 /**
  * Experiments enabled by default.
  */
-export const DEFAULT_EXPERIMENTS: Experiment[] = ["file_uploads"];
+export const DEFAULT_EXPERIMENTS: Experiment[] = ['file_uploads'];
 
 /**
  * Always-on development-mode experiments.
  */
 export const ALWAYS_ON_DEVELOPMENT_EXPERIMENTS: Experiment[] = [
-  "file_uploads",
-  "friends",
-  "gif_picker",
-  "user_card",
+  'file_uploads',
+  'friends',
+  'gif_picker',
+  'user_card',
 ];
 
 /**
@@ -51,36 +50,36 @@ export const EXPERIMENTS: {
   [key in Experiment]: { title: string; description: string };
 } = {
   file_uploads: {
-    title: "File Uploads",
-    description: "Enable file uploads when messaging.",
+    title: 'File Uploads',
+    description: 'Enable file uploads when messaging.',
   },
   friends: {
-    title: "Friends Menu",
-    description: "Enable the friends menu in home.",
+    title: 'Friends Menu',
+    description: 'Enable the friends menu in home.',
   },
   account_switcher: {
-    title: "Account Switcher",
-    description: "Enable the account switcher on the login page.",
+    title: 'Account Switcher',
+    description: 'Enable the account switcher on the login page.',
   },
   gif_picker: {
-    title: "GIF Picker",
-    description: "Search and send GIFs from GIFBox!",
+    title: 'GIF Picker',
+    description: 'Search and send GIFs from GIFBox!',
   },
   user_card: {
-    title: "Member Pop-out Card",
-    description: "Click on members to see more information about them.",
+    title: 'Member Pop-out Card',
+    description: 'Click on members to see more information about them.',
   },
   emoji_picker: {
-    title: "Emoji Picker Placeholder",
-    description: "Search and add emoji to your messages.",
+    title: 'Emoji Picker Placeholder',
+    description: 'Search and add emoji to your messages.',
   },
   plugins: {
-    title: "Plugins v2 Placeholder",
-    description: "Not available yet.",
+    title: 'Plugins v2 Placeholder',
+    description: 'Not available yet.',
   },
   voice_chat: {
-    title: "Voice Chat Placeholder",
-    description: "Not available yet.",
+    title: 'Voice Chat Placeholder',
+    description: 'Not available yet.',
   },
 };
 
@@ -99,13 +98,13 @@ export interface TypeExperiments {
 /**
  * Handles enabling and disabling client experiments.
  */
-export class Experiments extends AbstractStore<"experiments", TypeExperiments> {
+export class Experiments extends AbstractStore<'experiments', TypeExperiments> {
   /**
    * Construct store
    * @param state State
    */
   constructor(state: State) {
-    super(state, "experiments");
+    super(state, 'experiments');
 
     this.toggleSafeMode = this.toggleSafeMode.bind(this);
   }
@@ -131,7 +130,7 @@ export class Experiments extends AbstractStore<"experiments", TypeExperiments> {
    * Validate the given data to see if it is compliant and return a compliant object
    */
   clean(input: Partial<TypeExperiments>): TypeExperiments {
-    const enabled: Set<Experiment> = new Set();
+    const enabled = new Set<Experiment>();
 
     if (input.enabled) {
       for (const entry of input.enabled) {
@@ -166,7 +165,7 @@ export class Experiments extends AbstractStore<"experiments", TypeExperiments> {
    */
   enable(experiment: Experiment) {
     if (!this.isEnabled(experiment)) {
-      this.set("enabled", (enabled) => [...enabled, experiment]);
+      this.set('enabled', (enabled) => [...enabled, experiment]);
     }
   }
 
@@ -176,7 +175,7 @@ export class Experiments extends AbstractStore<"experiments", TypeExperiments> {
    */
   disable(experiment: Experiment) {
     if (this.isEnabled(experiment)) {
-      this.set("enabled", (enabled) =>
+      this.set('enabled', (enabled) =>
         enabled.filter((entry) => entry !== experiment)
       );
     }
@@ -199,13 +198,13 @@ export class Experiments extends AbstractStore<"experiments", TypeExperiments> {
    * Toggle safe mode.
    */
   toggleSafeMode() {
-    this.set("safeMode", (safeMode) => !safeMode);
+    this.set('safeMode', (safeMode) => !safeMode);
   }
 
   /**
    * Reset and disable all experiments.
    */
   reset() {
-    this.set("enabled", []);
+    this.set('enabled', []);
   }
 }
diff --git a/packages/client/components/state/stores/Keybinds.ts b/packages/client/components/state/stores/Keybinds.ts
index e0190b3d9..b8091c367 100644
--- a/packages/client/components/state/stores/Keybinds.ts
+++ b/packages/client/components/state/stores/Keybinds.ts
@@ -1,14 +1,8 @@
-import {
-  KeyCombo,
-  KeyComboSequence,
-  KeybindAction,
-  KeybindActions,
-  KeybindSequence,
-} from "@revolt/keybinds";
+import type { KeybindActions, KeyComboSequence } from '@revolt/keybinds';
+import { KeybindAction, KeybindSequence, KeyCombo } from '@revolt/keybinds';
 
-import { State } from "..";
-
-import { AbstractStore } from ".";
+import type { State } from '..';
+import { AbstractStore } from '.';
 
 /** utility to make writing the default keybinds easier, requires all `KeybindAction` values to be filled out */
 function keybindMap(
@@ -23,36 +17,36 @@ function keybindMap(
 }
 
 export const DEFAULT_VALUES: KeybindActions = keybindMap({
-  [KeybindAction.NavigateChannelUp]: ["Alt+ArrowUp"],
-  [KeybindAction.NavigateChannelDown]: ["Alt+ArrowDown"],
+  [KeybindAction.NavigateChannelUp]: ['Alt+ArrowUp'],
+  [KeybindAction.NavigateChannelDown]: ['Alt+ArrowDown'],
   // temporary, Control+Alt+ArrowUp does not seem to work on chrome or firefox at the moment
-  [KeybindAction.NavigateServerUp]: ["Control+ArrowUp"],
-  [KeybindAction.NavigateServerDown]: ["Control+ArrowDown"],
+  [KeybindAction.NavigateServerUp]: ['Control+ArrowUp'],
+  [KeybindAction.NavigateServerDown]: ['Control+ArrowDown'],
 
-  [KeybindAction.AutoCompleteUp]: ["ArrowUp"],
-  [KeybindAction.AutoCompleteDown]: ["ArrowDown"],
-  [KeybindAction.AutoCompleteSelect]: ["Enter", "Tab"],
+  [KeybindAction.AutoCompleteUp]: ['ArrowUp'],
+  [KeybindAction.AutoCompleteDown]: ['ArrowDown'],
+  [KeybindAction.AutoCompleteSelect]: ['Enter', 'Tab'],
 
   [KeybindAction.NavigatePreviousContext]: [], //["Escape"],
   [KeybindAction.NavigatePreviousContextModal]: [],
   [KeybindAction.NavigatePreviousContextSettings]: [],
 
-  [KeybindAction.InputForceSubmit]: ["Control+Enter"],
-  [KeybindAction.InputSubmit]: ["Enter"],
+  [KeybindAction.InputForceSubmit]: ['Control+Enter'],
+  [KeybindAction.InputSubmit]: ['Enter'],
   [KeybindAction.InputCancel]: [], // ["Escape"],
 
   [KeybindAction.MessagingMarkChannelRead]: [], // ["Escape"],
-  [KeybindAction.MessagingScrollToBottom]: ["Escape"],
-  [KeybindAction.MessagingEditPreviousMessage]: ["ArrowUp"],
+  [KeybindAction.MessagingScrollToBottom]: ['Escape'],
+  [KeybindAction.MessagingEditPreviousMessage]: ['ArrowUp'],
 
   [KeybindAction.DeveloperToggleAllExperiments]: [],
 });
 
-export type TypeKeybinds = {
+export interface TypeKeybinds {
   keybinds: KeybindActions;
-};
+}
 
-export class Keybinds extends AbstractStore<"keybinds", TypeKeybinds> {
+export class Keybinds extends AbstractStore<'keybinds', TypeKeybinds> {
   keybinds = Map;
 
   /**
@@ -60,7 +54,7 @@ export class Keybinds extends AbstractStore<"keybinds", TypeKeybinds> {
    * @param state State
    */
   constructor(state: State) {
-    super(state, "keybinds");
+    super(state, 'keybinds');
   }
 
   /**
@@ -105,7 +99,7 @@ export class Keybinds extends AbstractStore<"keybinds", TypeKeybinds> {
    * @param sequence the keybind sequence
    */
   setKeybind(action: KeybindAction, index: number, sequence: KeyComboSequence) {
-    this.set("keybinds", action, index, sequence);
+    this.set('keybinds', action, index, sequence);
   }
 
   /**
@@ -114,7 +108,7 @@ export class Keybinds extends AbstractStore<"keybinds", TypeKeybinds> {
    * @param sequence the keybind sequence to add
    */
   addKeybind(action: KeybindAction, sequence: KeyComboSequence) {
-    this.set("keybinds", action, (keybinds) => [...keybinds, sequence]);
+    this.set('keybinds', action, (keybinds) => [...keybinds, sequence]);
   }
 
   /**
@@ -126,10 +120,10 @@ export class Keybinds extends AbstractStore<"keybinds", TypeKeybinds> {
   resetKeybindToDefault(action: KeybindAction, index: number) {
     const defaultValue = this.getDefaultKeybind(action, index);
     if (defaultValue) {
-      this.set("keybinds", action, index, defaultValue);
+      this.set('keybinds', action, index, defaultValue);
     } else {
       // todo: maybe convert into a more efficient utility
-      this.set("keybinds", action, (keybinds) => {
+      this.set('keybinds', action, (keybinds) => {
         // shallow copy so splice doesn't mutate the original
         keybinds = [...keybinds];
         keybinds.splice(index, 1);
diff --git a/packages/client/components/state/stores/Layout.ts b/packages/client/components/state/stores/Layout.ts
index 95ec094d8..53a722503 100644
--- a/packages/client/components/state/stores/Layout.ts
+++ b/packages/client/components/state/stores/Layout.ts
@@ -1,15 +1,14 @@
-import { paramsFromPathname } from "@revolt/routing";
+import { paramsFromPathname } from '@revolt/routing';
 
-import { State } from "..";
-
-import { AbstractStore } from ".";
+import type { State } from '..';
+import { AbstractStore } from '.';
 
 /**
  * Static section IDs
  */
 export enum LAYOUT_SECTIONS {
-  MEMBER_SIDEBAR = "MEMBER_SIDEBAR",
-  MENTION_REPLY = "MENTION_REPLY",
+  MEMBER_SIDEBAR = 'MEMBER_SIDEBAR',
+  MENTION_REPLY = 'MENTION_REPLY',
 }
 
 export interface TypeLayout {
@@ -21,12 +20,12 @@ export interface TypeLayout {
    * - discover
    * - a server ID
    */
-  activeInterface: "home" | "discover" | string;
+  activeInterface: 'home' | 'discover' | string;
 
   /**
    * Current path within an interface
    */
-  activePath: Record<TypeLayout["activeInterface"], string>;
+  activePath: Record<TypeLayout['activeInterface'], string>;
 
   /**
    * Open (or closed) sections of the UI
@@ -39,13 +38,13 @@ export interface TypeLayout {
 /**
  * Handles layout and navigation of the app.
  */
-export class Layout extends AbstractStore<"layout", TypeLayout> {
+export class Layout extends AbstractStore<'layout', TypeLayout> {
   /**
    * Construct store
    * @param state State
    */
   constructor(state: State) {
-    super(state, "layout");
+    super(state, 'layout');
   }
 
   /**
@@ -60,10 +59,10 @@ export class Layout extends AbstractStore<"layout", TypeLayout> {
    */
   default(): TypeLayout {
     return {
-      activeInterface: "home",
+      activeInterface: 'home',
       activePath: {
-        home: "/",
-        discover: "/discover/servers",
+        home: '/',
+        discover: '/discover/servers',
       },
       openSections: {},
     };
@@ -75,21 +74,21 @@ export class Layout extends AbstractStore<"layout", TypeLayout> {
   clean(input: Partial<TypeLayout>): TypeLayout {
     const layout: TypeLayout = this.default();
 
-    if (typeof input.activeInterface === "string") {
+    if (typeof input.activeInterface === 'string') {
       layout.activeInterface = input.activeInterface;
     }
 
-    if (typeof input.activePath === "object") {
+    if (typeof input.activePath === 'object') {
       for (const interfaceId of Object.keys(input.activePath)) {
-        if (typeof input.activePath[interfaceId] === "string") {
+        if (typeof input.activePath[interfaceId] === 'string') {
           layout.activePath[interfaceId] = input.activePath[interfaceId];
         }
       }
     }
 
-    if (typeof input.openSections === "object") {
+    if (typeof input.openSections === 'object') {
       for (const section of Object.keys(input.openSections)) {
-        if (typeof input.openSections[section] === "boolean") {
+        if (typeof input.openSections[section] === 'boolean') {
           layout.openSections[section] = input.openSections[section];
         }
       }
@@ -103,7 +102,7 @@ export class Layout extends AbstractStore<"layout", TypeLayout> {
    */
   getLastActivePath() {
     const section = this.get().activeInterface;
-    return this.get().activePath[section] ?? "/";
+    return this.get().activePath[section] ?? '/';
   }
 
   /**
@@ -111,9 +110,9 @@ export class Layout extends AbstractStore<"layout", TypeLayout> {
    */
   setLastActivePath(pathname: string) {
     const params = paramsFromPathname(pathname);
-    const section = params.serverId ?? "home";
-    this.set("activeInterface", section);
-    this.set("activePath", section, pathname);
+    const section = params.serverId ?? 'home';
+    this.set('activeInterface', section);
+    this.set('activePath', section, pathname);
   }
 
   /**
@@ -133,7 +132,7 @@ export class Layout extends AbstractStore<"layout", TypeLayout> {
    * @param defaultValue Default state value
    */
   setSectionState(id: string, value: boolean, defaultValue = false) {
-    this.set("openSections", id, value === defaultValue ? undefined! : value);
+    this.set('openSections', id, value === defaultValue ? undefined! : value);
   }
 
   /**
diff --git a/packages/client/components/state/stores/Locale.ts b/packages/client/components/state/stores/Locale.ts
index e8bda0156..229ba8b2f 100644
--- a/packages/client/components/state/stores/Locale.ts
+++ b/packages/client/components/state/stores/Locale.ts
@@ -1,38 +1,33 @@
-import {
-  Language,
-  Languages,
-  browserPreferredLanguage,
-  loadAndSetLanguage,
-} from "@revolt/i18n";
+import type { Language } from '@revolt/i18n';
+import { browserPreferredLanguage, Languages, setLanguage } from '@revolt/i18n';
 
-import { State } from "..";
+import type { State } from '..';
+import { AbstractStore } from '.';
 
-import { AbstractStore } from ".";
-
-export type TypeLocale = {
+export interface TypeLocale {
   /**
    * Current language in use
    */
   lang: Language;
-};
+}
 
 /**
  * Manage localisation of the application
  */
-export class Locale extends AbstractStore<"locale", TypeLocale> {
+export class Locale extends AbstractStore<'locale', TypeLocale> {
   /**
    * Construct store
    * @param state State
    */
   constructor(state: State) {
-    super(state, "locale");
+    super(state, 'locale');
   }
 
   /**
    * Hydrate external context
    */
   hydrate(): void {
-    loadAndSetLanguage(this.get().lang);
+    setLanguage(this.get().lang);
   }
 
   /**
@@ -63,7 +58,7 @@ export class Locale extends AbstractStore<"locale", TypeLocale> {
    * @param language Language
    */
   switch(language: Language): void {
-    this.set("lang", language);
+    this.set('lang', language);
     this.hydrate();
   }
 }
diff --git a/packages/client/components/state/stores/NotificationOptions.ts b/packages/client/components/state/stores/NotificationOptions.ts
index 5376b5b92..88c45dd80 100644
--- a/packages/client/components/state/stores/NotificationOptions.ts
+++ b/packages/client/components/state/stores/NotificationOptions.ts
@@ -1,33 +1,32 @@
-import { Channel, Server } from "revolt.js";
+import { Channel, Server } from 'revolt.js';
 
-import { State } from "..";
-
-import { AbstractStore } from ".";
+import type { State } from '..';
+import { AbstractStore } from '.';
 
 /**
  * Possible notification states
  */
-export type NotificationState = "all" | "mention" | "none" | "muted";
+export type NotificationState = 'all' | 'mention' | 'none' | 'muted';
 
 /**
  * Possible notification states
  */
 const NotificationStates: NotificationState[] = [
-  "all",
-  "mention",
-  "none",
-  "muted",
+  'all',
+  'mention',
+  'none',
+  'muted',
 ];
 
 /**
  * Default notification states for various types of channels
  */
 export const DEFAULT_STATES: {
-  [key in Channel["type"]]: NotificationState;
+  [key in Channel['type']]: NotificationState;
 } = {
-  SavedMessages: "all",
-  DirectMessage: "all",
-  Group: "all",
+  SavedMessages: 'all',
+  DirectMessage: 'all',
+  Group: 'all',
   TextChannel: undefined!,
   VoiceChannel: undefined!,
 };
@@ -35,7 +34,7 @@ export const DEFAULT_STATES: {
 /**
  * Default state for servers
  */
-export const DEFAULT_SERVER_STATE: NotificationState = "mention";
+export const DEFAULT_SERVER_STATE: NotificationState = 'mention';
 
 export interface TypeNotificationOptions {
   /**
@@ -71,7 +70,7 @@ async function createNotification(
  * Manages the user's notification preferences.
  */
 export class NotificationOptions extends AbstractStore<
-  "notifications",
+  'notifications',
   TypeNotificationOptions
 > {
   private activeNotifications: Record<string, Notification> = {};
@@ -80,7 +79,7 @@ export class NotificationOptions extends AbstractStore<
    * Construct new Experiments store.
    */
   constructor(state: State) {
-    super(state, "notifications");
+    super(state, 'notifications');
   }
 
   /**
@@ -104,10 +103,10 @@ export class NotificationOptions extends AbstractStore<
    * Validate the given data to see if it is compliant and return a compliant object
    */
   clean(input: Partial<TypeNotificationOptions>): TypeNotificationOptions {
-    const server: TypeNotificationOptions["server"] = {};
-    const channel: TypeNotificationOptions["channel"] = {};
+    const server: TypeNotificationOptions['server'] = {};
+    const channel: TypeNotificationOptions['channel'] = {};
 
-    if (typeof input.server === "object") {
+    if (typeof input.server === 'object') {
       for (const serverId of Object.keys(input.server)) {
         const entry = input.server[serverId];
         if (NotificationStates.includes(entry)) {
@@ -116,7 +115,7 @@ export class NotificationOptions extends AbstractStore<
       }
     }
 
-    if (typeof input.channel === "object") {
+    if (typeof input.channel === 'object') {
       for (const channelId of Object.keys(input.channel)) {
         const entry = input.channel[channelId];
         if (NotificationStates.includes(entry)) {
@@ -138,7 +137,7 @@ export class NotificationOptions extends AbstractStore<
    */
   computeForServer(server?: Server) {
     return server
-      ? this.get().server[server.id] ?? DEFAULT_SERVER_STATE
+      ? (this.get().server[server.id] ?? DEFAULT_SERVER_STATE)
       : undefined;
   }
 
@@ -168,7 +167,7 @@ export class NotificationOptions extends AbstractStore<
       value = this.computeForServer(target);
     }
 
-    if (value === "muted") {
+    if (value === 'muted') {
       return true;
     }
 
diff --git a/packages/client/components/state/stores/Ordering.ts b/packages/client/components/state/stores/Ordering.ts
index 90cda1478..8240a6dc7 100644
--- a/packages/client/components/state/stores/Ordering.ts
+++ b/packages/client/components/state/stores/Ordering.ts
@@ -1,8 +1,7 @@
-import { getController } from "@revolt/common";
+import { getController } from '@revolt/common';
 
-import { State } from "..";
-
-import { AbstractStore } from ".";
+import type { State } from '..';
+import { AbstractStore } from '.';
 
 export interface TypeOrdering {
   /**
@@ -14,13 +13,13 @@ export interface TypeOrdering {
 /**
  * Handles ordering of items in the app interface.
  */
-export class Ordering extends AbstractStore<"ordering", TypeOrdering> {
+export class Ordering extends AbstractStore<'ordering', TypeOrdering> {
   /**
    * Construct store
    * @param state State
    */
   constructor(state: State) {
-    super(state, "ordering");
+    super(state, 'ordering');
     this.setServerOrder = this.setServerOrder.bind(this);
   }
 
@@ -48,7 +47,7 @@ export class Ordering extends AbstractStore<"ordering", TypeOrdering> {
 
     if (Array.isArray(input.servers)) {
       for (const serverId of input.servers) {
-        if (typeof serverId === "string") {
+        if (typeof serverId === 'string') {
           ordering.servers.push(serverId);
         }
       }
@@ -62,7 +61,7 @@ export class Ordering extends AbstractStore<"ordering", TypeOrdering> {
    * @returns List of Server objects
    */
   get orderedServers() {
-    const client = getController("client").getCurrentClient();
+    const client = getController('client').getCurrentClient();
     const known = new Set(client?.servers.keys() ?? []);
     const ordered = [...this.get().servers];
 
@@ -85,7 +84,7 @@ export class Ordering extends AbstractStore<"ordering", TypeOrdering> {
    * @param ids List of IDs
    */
   setServerOrder(ids: string[]) {
-    this.set("servers", ids);
+    this.set('servers', ids);
   }
 
   /**
@@ -93,15 +92,15 @@ export class Ordering extends AbstractStore<"ordering", TypeOrdering> {
    * @returns List of Channel objects
    */
   get orderedConversations() {
-    const client = getController("client").getCurrentClient();
+    const client = getController('client').getCurrentClient();
 
     return (
       client?.channels
         .toList()
         .filter(
           (channel) =>
-            (channel.type === "DirectMessage" && channel.active) ||
-            channel.type === "Group"
+            (channel.type === 'DirectMessage' && channel.active) ||
+            channel.type === 'Group'
         )
         .sort((a, b) => +b.updatedAt - +a.updatedAt) ?? []
     );
diff --git a/packages/client/components/state/stores/Settings.ts b/packages/client/components/state/stores/Settings.ts
index 0eedac265..963ab907c 100644
--- a/packages/client/components/state/stores/Settings.ts
+++ b/packages/client/components/state/stores/Settings.ts
@@ -1,6 +1,5 @@
-import { State } from "..";
-
-import { AbstractStore } from ".";
+import type { State } from '..';
+import { AbstractStore } from '.';
 
 interface SettingsDefinition {
   /**
@@ -37,12 +36,12 @@ interface SettingsDefinition {
   /**
    * Show message send button
    */
-  "appearance:show_send_button": boolean;
+  'appearance:show_send_button': boolean;
 
   /**
    * Whether to render messages in compact mode
    */
-  "appearance:compact_mode": boolean;
+  'appearance:compact_mode': boolean;
 
   /**
    * Indicate new users to Revolt
@@ -56,18 +55,20 @@ interface SettingsDefinition {
  */
 type ValueType<T extends keyof SettingsDefinition> =
   SettingsDefinition[T] extends boolean
-    ? "boolean"
+    ? 'boolean'
     : SettingsDefinition[T] extends string
-    ? "string"
-    : (v: Partial<SettingsDefinition[T]>) => SettingsDefinition[T] | undefined;
+      ? 'string'
+      : (
+          v: Partial<SettingsDefinition[T]>
+        ) => SettingsDefinition[T] | undefined;
 
 /**
  * Expected types of settings keys, enforce some sort of validation is present for all keys.
  * If we cannot validate the value as a primitive, clean it up using a function.
  */
 const EXPECTED_TYPES: { [K in keyof SettingsDefinition]: ValueType<K> } = {
-  "appearance:show_send_button": "boolean",
-  "appearance:compact_mode": "boolean",
+  'appearance:show_send_button': 'boolean',
+  'appearance:compact_mode': 'boolean',
 };
 
 /**
@@ -83,13 +84,13 @@ const DEFAULT_VALUES: TypeSettings = {};
 /**
  * Settings store
  */
-export class Settings extends AbstractStore<"settings", TypeSettings> {
+export class Settings extends AbstractStore<'settings', TypeSettings> {
   /**
    * Construct store
    * @param state State
    */
   constructor(state: State) {
-    super(state, "settings");
+    super(state, 'settings');
   }
 
   /**
@@ -115,7 +116,7 @@ export class Settings extends AbstractStore<"settings", TypeSettings> {
     for (const key of Object.keys(input) as (keyof TypeSettings)[]) {
       const expectedType = EXPECTED_TYPES[key];
 
-      if (typeof expectedType === "function") {
+      if (typeof expectedType === 'function') {
         const cleanedValue = (expectedType as (value: unknown) => unknown)(
           input[key]
         );
diff --git a/packages/client/components/state/stores/index.ts b/packages/client/components/state/stores/index.ts
index 511e2a2ef..7eb010bfb 100644
--- a/packages/client/components/state/stores/index.ts
+++ b/packages/client/components/state/stores/index.ts
@@ -1,18 +1,17 @@
-import { SetStoreFunction } from "solid-js/store";
+import type { SetStoreFunction } from 'solid-js/store';
 
-import { State } from "..";
+import type { State } from '..';
+import type { TypeAuth } from './Auth';
+import type { TypeDraft } from './Draft';
+import type { TypeExperiments } from './Experiments';
+import type { TypeKeybinds } from './Keybinds';
+import type { TypeLayout } from './Layout';
+import type { TypeLocale } from './Locale';
+import type { TypeNotificationOptions } from './NotificationOptions';
+import type { TypeOrdering } from './Ordering';
+import type { TypeSettings } from './Settings';
 
-import { TypeAuth } from "./Auth";
-import { TypeDraft } from "./Draft";
-import { TypeExperiments } from "./Experiments";
-import { TypeKeybinds } from "./Keybinds";
-import { TypeLayout } from "./Layout";
-import { TypeLocale } from "./Locale";
-import { TypeNotificationOptions } from "./NotificationOptions";
-import { TypeOrdering } from "./Ordering";
-import { TypeSettings } from "./Settings";
-
-export type Store = {
+export interface Store {
   auth: TypeAuth;
   draft: TypeDraft;
   experiments: TypeExperiments;
@@ -22,7 +21,7 @@ export type Store = {
   notifications: TypeNotificationOptions;
   ordering: TypeOrdering;
   settings: TypeSettings;
-};
+}
 
 /**
  * Abstract store implementation
diff --git a/packages/client/components/ui/components/common/Draggable.tsx b/packages/client/components/ui/components/common/Draggable.tsx
index 4e1e3dce9..746e909de 100644
--- a/packages/client/components/ui/components/common/Draggable.tsx
+++ b/packages/client/components/ui/components/common/Draggable.tsx
@@ -1,5 +1,6 @@
-import { dndzone } from "solid-dnd-directive";
-import { For, JSX, createEffect, createSignal } from "solid-js";
+import { dndzone } from 'solid-dnd-directive';
+import type { JSX } from 'solid-js';
+import { createEffect, createSignal, For } from 'solid-js';
 
 interface Props<T> {
   items: Item<T>[];
@@ -21,7 +22,7 @@ interface DragHandleEvent<T> {
   detail: {
     items: ContainerItem<T>[];
   };
-  type: "consider" | "finalize";
+  type: 'consider' | 'finalize';
 }
 
 /**
@@ -54,7 +55,7 @@ export function Draggable<T>(props: Props<T>) {
   function handleDndEvent(e: DragHandleEvent<T>) {
     const { items: newContainerItems } = e.detail;
     setContainerItems(newContainerItems);
-    if (e.type === "finalize")
+    if (e.type === 'finalize')
       props.onChange(
         newContainerItems.map((containerItems) => containerItems.id)
       );
@@ -66,7 +67,6 @@ export function Draggable<T>(props: Props<T>) {
    */
   return (
     <div
-      // @ts-expect-error Typescript doesn't support directives
       use:dndzone={{ items: containerItems }}
       on:consider={handleDndEvent}
       on:finalize={handleDndEvent}
diff --git a/packages/client/components/ui/components/common/Masks.tsx b/packages/client/components/ui/components/common/Masks.tsx
index c464a283f..b92e78bdd 100644
--- a/packages/client/components/ui/components/common/Masks.tsx
+++ b/packages/client/components/ui/components/common/Masks.tsx
@@ -3,56 +3,56 @@
  */
 export function Masks() {
   return (
-    <svg width={0} height={0} style={{ position: "fixed" }}>
+    <svg width={0} height={0} style={{ position: 'fixed' }}>
       <defs>
-        <mask id="holepunch-top-left">
-          <rect x="0" y="0" width="32" height="32" fill="white" />
-          <circle cx="5" cy="5" r="7" fill={"black"} />
+        <mask id='holepunch-top-left'>
+          <rect x='0' y='0' width='32' height='32' fill='white' />
+          <circle cx='5' cy='5' r='7' fill={'black'} />
         </mask>
-        <mask id="holepunch-top-right">
-          <rect x="0" y="0" width="32" height="32" fill="white" />
-          <circle cx="27" cy="5" r="7" fill={"black"} />
+        <mask id='holepunch-top-right'>
+          <rect x='0' y='0' width='32' height='32' fill='white' />
+          <circle cx='27' cy='5' r='7' fill={'black'} />
         </mask>
-        <mask id="holepunch-bottom-right">
-          <rect x="0" y="0" width="32" height="32" fill="white" />
-          <circle cx="27" cy="27" r="7" fill={"black"} />
+        <mask id='holepunch-bottom-right'>
+          <rect x='0' y='0' width='32' height='32' fill='white' />
+          <circle cx='27' cy='27' r='7' fill={'black'} />
         </mask>
-        <mask id="holepunch-right">
-          <rect x="0" y="0" width="32" height="32" fill="white" />
-          <circle cx="27" cy="5" r="7" fill={"black"} />
-          <circle cx="27" cy="27" r="7" fill={"black"} />
+        <mask id='holepunch-right'>
+          <rect x='0' y='0' width='32' height='32' fill='white' />
+          <circle cx='27' cy='5' r='7' fill={'black'} />
+          <circle cx='27' cy='27' r='7' fill={'black'} />
         </mask>
-        <mask id="holepunch-overlap">
-          <rect x="0" y="0" width="32" height="32" fill="white" />
-          <circle cx="32" cy="16" r="18" fill="black" />
+        <mask id='holepunch-overlap'>
+          <rect x='0' y='0' width='32' height='32' fill='white' />
+          <circle cx='32' cy='16' r='18' fill='black' />
         </mask>
-        <mask id="holepunch-overlap-subtle">
-          <rect x="0" y="0" width="32" height="32" fill="white" />
-          <circle cx="33" cy="16" r="18" fill="black" />
+        <mask id='holepunch-overlap-subtle'>
+          <rect x='0' y='0' width='32' height='32' fill='white' />
+          <circle cx='33' cy='16' r='18' fill='black' />
         </mask>
-        <mask id="accessible-status-offline">
-          <circle cx="27" cy="27" r="5" fill="white" />
-          <circle cx="27" cy="27" r="3" fill="black" />
+        <mask id='accessible-status-offline'>
+          <circle cx='27' cy='27' r='5' fill='white' />
+          <circle cx='27' cy='27' r='3' fill='black' />
         </mask>
-        <mask id="accessible-status-idle">
-          <circle cx="27" cy="27" r="5" fill="white" />
-          <circle cx="25" cy="25" r="4" fill="black" />
+        <mask id='accessible-status-idle'>
+          <circle cx='27' cy='27' r='5' fill='white' />
+          <circle cx='25' cy='25' r='4' fill='black' />
         </mask>
-        <mask id="accessible-status-busy">
-          <circle cx="27" cy="27" r="5" fill="white" />
+        <mask id='accessible-status-busy'>
+          <circle cx='27' cy='27' r='5' fill='white' />
           <line
-            x1="24"
-            y1="27"
-            x2="30"
-            y2="27"
-            stroke="black"
+            x1='24'
+            y1='27'
+            x2='30'
+            y2='27'
+            stroke='black'
             stroke-width={2}
           />
         </mask>
-        <mask id="accessible-status-focus">
-          <circle cx="27" cy="27" r="5" fill="white" />
-          <circle cx="27" cy="27" r="4" fill="black" />
-          <circle cx="27" cy="27" r="2" fill="white" />
+        <mask id='accessible-status-focus'>
+          <circle cx='27' cy='27' r='5' fill='white' />
+          <circle cx='27' cy='27' r='4' fill='black' />
+          <circle cx='27' cy='27' r='2' fill='white' />
         </mask>
       </defs>
     </svg>
diff --git a/packages/client/components/ui/components/common/index.ts b/packages/client/components/ui/components/common/index.ts
index e92b6c41d..b9b3dba24 100644
--- a/packages/client/components/ui/components/common/index.ts
+++ b/packages/client/components/ui/components/common/index.ts
@@ -1,2 +1,2 @@
-export { Draggable } from "./Draggable";
-export { Masks } from "./Masks";
+export { Draggable } from './Draggable';
+export { Masks } from './Masks';
diff --git a/packages/client/components/ui/components/context/Keybinds.tsx b/packages/client/components/ui/components/context/Keybinds.tsx
index 38bb56674..f2f58a854 100644
--- a/packages/client/components/ui/components/context/Keybinds.tsx
+++ b/packages/client/components/ui/components/context/Keybinds.tsx
@@ -1,17 +1,7 @@
-import {
-  Accessor,
-  ParentComponent,
-  createContext,
-  onCleanup,
-  onMount,
-  useContext,
-} from "solid-js";
-
-import {
-  KeybindAction,
-  KeybindActions,
-  KeybindEventHandler,
-} from "@revolt/keybinds";
+import type { KeybindAction, KeybindActions } from '@revolt/keybinds';
+import { KeybindEventHandler } from '@revolt/keybinds';
+import type { Accessor, ParentComponent } from 'solid-js';
+import { createContext, onCleanup, onMount, useContext } from 'solid-js';
 
 const KeybindsContext = createContext<KeybindEventHandler<KeybindAction>>();
 
@@ -25,11 +15,11 @@ export const KeybindsProvider: ParentComponent<Props> = (props) => {
   const handler = new KeybindEventHandler<KeybindAction>(props.keybinds);
 
   onMount(() => {
-    document.addEventListener("keydown", handler);
+    document.addEventListener('keydown', handler);
   });
 
   onCleanup(() => {
-    document.removeEventListener("keydown", handler);
+    document.removeEventListener('keydown', handler);
   });
 
   return (
diff --git a/packages/client/components/ui/components/context/index.ts b/packages/client/components/ui/components/context/index.ts
index 7038dcfa6..0b05bc89f 100644
--- a/packages/client/components/ui/components/context/index.ts
+++ b/packages/client/components/ui/components/context/index.ts
@@ -1 +1 @@
-export { KeybindsProvider } from "./Keybinds";
+export { KeybindsProvider } from './Keybinds';
diff --git a/packages/client/components/ui/components/design/atoms/display/Avatar.stories.tsx b/packages/client/components/ui/components/design/atoms/display/Avatar.stories.tsx
index 66ece5bf7..05d12189d 100644
--- a/packages/client/components/ui/components/design/atoms/display/Avatar.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Avatar.stories.tsx
@@ -1,32 +1,31 @@
-import type { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import TestImage from "../../../../test-images/the-halal-design-studio-ZrJpH6W-HDs-unsplash.jpg";
-import type { ComponentStory } from "../../../stories";
-import { UserStatusGraphic } from "../indicators";
-
-import { Avatar } from "./Avatar";
+import TestImage from '../../../../test-images/the-halal-design-studio-ZrJpH6W-HDs-unsplash.jpg';
+import type { ComponentStory } from '../../../stories';
+import { UserStatusGraphic } from '../indicators';
+import { Avatar } from './Avatar';
 
 export default {
-  category: "Design System/Atoms/Avatar",
+  category: 'Design System/Atoms/Avatar',
   component: Avatar,
   stories: [
-    { title: "Default" },
+    { title: 'Default' },
     {
-      title: "Cut Out",
+      title: 'Cut Out',
       props: {
         interactive: true,
-        holepunch: "bottom-right",
-        overlay: () => <UserStatusGraphic status="Online" />,
+        holepunch: 'bottom-right',
+        overlay: () => <UserStatusGraphic status='Online' />,
       },
     },
     {
-      title: "Fallback",
+      title: 'Fallback',
       props: {
-        fallback: "test fallback string",
+        fallback: 'test fallback string',
         src: undefined,
         interactive: true,
-        holepunch: "bottom-right",
-        overlay: () => <UserStatusGraphic status="Focus" />,
+        holepunch: 'bottom-right',
+        overlay: () => <UserStatusGraphic status='Focus' />,
       },
     },
   ],
@@ -35,11 +34,11 @@ export default {
     src: TestImage,
   },
   propTypes: {
-    size: "number",
-    src: "string",
-    fallback: "string",
-    interactive: "boolean",
-    holepunch: ["none", "bottom-right", "top-right", "right"],
-    overlay: "component",
+    size: 'number',
+    src: 'string',
+    fallback: 'string',
+    interactive: 'boolean',
+    holepunch: ['none', 'bottom-right', 'top-right', 'right'],
+    overlay: 'component',
   },
 } as ComponentStory<typeof Avatar, ComponentProps<typeof Avatar>>;
diff --git a/packages/client/components/ui/components/design/atoms/display/Avatar.tsx b/packages/client/components/ui/components/design/atoms/display/Avatar.tsx
index a1699974d..a90895796 100644
--- a/packages/client/components/ui/components/design/atoms/display/Avatar.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Avatar.tsx
@@ -1,9 +1,10 @@
-import { JSXElement, createEffect, createSignal, on } from "solid-js";
-import { styled } from "solid-styled-components";
+import type { JSXElement } from 'solid-js';
+import { createEffect, createSignal, on } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { Initials } from "./Initials";
+import { Initials } from './Initials';
 
-export type Props = {
+export interface Props {
   /**
    * Avatar size
    */
@@ -12,7 +13,7 @@ export type Props = {
   /**
    * Avatar shape
    */
-  shape?: "circle" | "rounded-square";
+  shape?: 'circle' | 'rounded-square';
 
   /**
    * Image source
@@ -33,12 +34,12 @@ export type Props = {
    * Punch a hole through the avatar
    */
   holepunch?:
-    | "bottom-right"
-    | "top-right"
-    | "right"
-    | "overlap"
-    | "overlap-subtle"
-    | "none"
+    | 'bottom-right'
+    | 'top-right'
+    | 'right'
+    | 'overlap'
+    | 'overlap-subtle'
+    | 'none'
     | false;
 
   /**
@@ -50,18 +51,18 @@ export type Props = {
    * Whether this icon is interactive
    */
   interactive?: boolean;
-};
+}
 
 /**
  * Avatar image
  */
-const Image = styled("img")<Pick<Props, "shape">>`
+const Image = styled('img')<Pick<Props, 'shape'>>`
   width: 100%;
   height: 100%;
   object-fit: cover;
 
   border-radius: ${(props) =>
-    props.shape === "rounded-square"
+    props.shape === 'rounded-square'
       ? props.theme!.borderRadius.md
       : props.theme!.borderRadius.full};
 `;
@@ -69,12 +70,12 @@ const Image = styled("img")<Pick<Props, "shape">>`
 /**
  * Text fallback container
  */
-const FallbackBase = styled("div")<Pick<Props, "shape" | "primaryContrast">>`
+const FallbackBase = styled('div')<Pick<Props, 'shape' | 'primaryContrast'>>`
   width: 100%;
   height: 100%;
 
   border-radius: ${(props) =>
-    props.shape === "rounded-square"
+    props.shape === 'rounded-square'
       ? props.theme!.borderRadius.md
       : props.theme!.borderRadius.full};
 
@@ -87,13 +88,13 @@ const FallbackBase = styled("div")<Pick<Props, "shape" | "primaryContrast">>`
   color: ${(props) =>
     props.theme!.colours[
       `component-avatar-fallback${
-        props.primaryContrast ? "-contrast" : ""
+        props.primaryContrast ? '-contrast' : ''
       }-foreground`
     ]};
   background: ${(props) =>
     props.theme!.colours[
       `component-avatar-fallback${
-        props.primaryContrast ? "-contrast" : ""
+        props.primaryContrast ? '-contrast' : ''
       }-background`
     ]};
 `;
@@ -101,10 +102,10 @@ const FallbackBase = styled("div")<Pick<Props, "shape" | "primaryContrast">>`
 /**
  * Avatar parent container
  */
-const ParentBase = styled("svg", "Avatar")<Pick<Props, "interactive">>`
+const ParentBase = styled('svg', 'Avatar')<Pick<Props, 'interactive'>>`
   flex-shrink: 0;
   user-select: none;
-  cursor: ${(props) => (props.interactive ? "cursor" : "inherit")};
+  cursor: ${(props) => (props.interactive ? 'cursor' : 'inherit')};
 
   foreignObject {
     transition: ${(props) => props.theme!.transitions.fast} filter;
@@ -127,7 +128,7 @@ export function Avatar(props: Props) {
       () => props.src,
       (src) => {
         if (url() !== src) {
-          setUrl("");
+          setUrl('');
           setTimeout(() => setUrl(src));
         }
       },
@@ -139,14 +140,14 @@ export function Avatar(props: Props) {
     <ParentBase
       width={props.size}
       height={props.size}
-      viewBox="0 0 32 32"
+      viewBox='0 0 32 32'
       interactive={props.interactive}
     >
       <foreignObject
-        x="0"
-        y="0"
-        width="32"
-        height="32"
+        x='0'
+        y='0'
+        width='32'
+        height='32'
         // @ts-expect-error Solid.js typing issue
         mask={
           props.holepunch ? `url(#holepunch-${props.holepunch})` : undefined
@@ -159,7 +160,7 @@ export function Avatar(props: Props) {
             shape={props.shape}
             primaryContrast={props.primaryContrast}
           >
-            {typeof props.fallback === "string" ? (
+            {typeof props.fallback === 'string' ? (
               <Initials input={props.fallback} maxLength={2} />
             ) : (
               props.fallback
diff --git a/packages/client/components/ui/components/design/atoms/display/Breadcrumbs.tsx b/packages/client/components/ui/components/design/atoms/display/Breadcrumbs.tsx
index 15bd4e34c..c89c0ed3b 100644
--- a/packages/client/components/ui/components/design/atoms/display/Breadcrumbs.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Breadcrumbs.tsx
@@ -1,8 +1,9 @@
-import { BiSolidChevronRight } from "solid-icons/bi";
-import { For, JSX, Match, Show, Switch } from "solid-js";
-import { styled } from "solid-styled-components";
+import { BiSolidChevronRight } from 'solid-icons/bi';
+import type { JSX } from 'solid-js';
+import { For, Match, Show, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { Row } from "../../layout";
+import { Row } from '../../layout';
 
 interface Props {
   elements: string[];
@@ -31,18 +32,18 @@ export function Breadcrumbs(props: Props) {
           return (
             <>
               <Show when={index() !== 0}>
-                <BiSolidChevronRight size="0.6em" />
+                <BiSolidChevronRight size='0.6em' />
               </Show>
               <Switch
                 fallback={
                   <Unselected onClick={navigate}>
-                    {props.renderElement(segments().join("/"))}
+                    {props.renderElement(segments().join('/'))}
                   </Unselected>
                 }
               >
                 <Match when={index() === props.elements.length - 1}>
                   <Selected>
-                    {props.renderElement(segments().join("/"))}
+                    {props.renderElement(segments().join('/'))}
                   </Selected>
                 </Match>
               </Switch>
@@ -59,7 +60,7 @@ export function Breadcrumbs(props: Props) {
  */
 const Base = styled(Row)`
   user-select: none;
-  color: ${(props) => props.theme!.colours["foreground-300"]};
+  color: ${(props) => props.theme!.colours['foreground-300']};
 `;
 
 /**
@@ -82,5 +83,5 @@ const Unselected = styled.div`
  * Selected styles
  */
 const Selected = styled.div`
-  color: ${(props) => props.theme!.colours["foreground"]};
+  color: ${(props) => props.theme!.colours['foreground']};
 `;
diff --git a/packages/client/components/ui/components/design/atoms/display/ColouredText.tsx b/packages/client/components/ui/components/design/atoms/display/ColouredText.tsx
index 9dbbdc33d..adc5e847f 100644
--- a/packages/client/components/ui/components/design/atoms/display/ColouredText.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/ColouredText.tsx
@@ -1,13 +1,13 @@
-import { styled } from "solid-styled-components";
+import { styled } from 'solid-styled-components';
 
 /**
  * Coloured text
  */
 export const ColouredText = styled.span<{ colour?: string; clip?: boolean }>`
-  color: ${(props) => props.colour ?? "inherit"};
-  background: ${(props) => (props.clip ? props.colour! : "none")};
-  -webkit-text-fill-color: ${(props) => (props.clip ? "transparent" : "unset")};
-  background-clip: ${(props) => (props.clip ? "text" : "unset")};
-  -webkit-background-clip: ${(props) => (props.clip ? "text" : "unset")};
-  text-decoration: ${(props) => (props.clip ? "none" : "unset")} !important;
+  color: ${(props) => props.colour ?? 'inherit'};
+  background: ${(props) => (props.clip ? props.colour! : 'none')};
+  -webkit-text-fill-color: ${(props) => (props.clip ? 'transparent' : 'unset')};
+  background-clip: ${(props) => (props.clip ? 'text' : 'unset')};
+  -webkit-background-clip: ${(props) => (props.clip ? 'text' : 'unset')};
+  text-decoration: ${(props) => (props.clip ? 'none' : 'unset')} !important;
 `;
diff --git a/packages/client/components/ui/components/design/atoms/display/FormGroup.stories.tsx b/packages/client/components/ui/components/design/atoms/display/FormGroup.stories.tsx
index e0278ab50..7a2e95e30 100644
--- a/packages/client/components/ui/components/design/atoms/display/FormGroup.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/FormGroup.stories.tsx
@@ -1,24 +1,23 @@
-import type { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import type { ComponentStory } from "../../../stories";
-import { Input } from "../inputs";
-
-import { FormGroup } from "./FormGroup";
-import { Typography } from "./Typography";
+import type { ComponentStory } from '../../../stories';
+import { Input } from '../inputs';
+import { FormGroup } from './FormGroup';
+import { Typography } from './Typography';
 
 export default {
-  category: "Design System/Atoms/Form Group",
+  category: 'Design System/Atoms/Form Group',
   component: FormGroup,
-  stories: [{ title: "Default" }],
+  stories: [{ title: 'Default' }],
   props: {
     children: () => (
       <>
-        <Typography variant="label">Title</Typography>
-        <Input placeholder="Type something..." />
+        <Typography variant='label'>Title</Typography>
+        <Input placeholder='Type something...' />
       </>
     ),
   },
   propTypes: {
-    children: "component",
+    children: 'component',
   },
 } as ComponentStory<typeof FormGroup, ComponentProps<typeof FormGroup>>;
diff --git a/packages/client/components/ui/components/design/atoms/display/FormGroup.tsx b/packages/client/components/ui/components/design/atoms/display/FormGroup.tsx
index 411115519..896375140 100644
--- a/packages/client/components/ui/components/design/atoms/display/FormGroup.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/FormGroup.tsx
@@ -1,9 +1,9 @@
-import { styled } from "solid-styled-components";
+import { styled } from 'solid-styled-components';
 
 /**
  * Input element and label grouping
  */
-export const FormGroup = styled("label")`
+export const FormGroup = styled('label')`
   display: flex;
   flex-direction: column;
   gap: ${(props) => props.theme!.gap.md};
diff --git a/packages/client/components/ui/components/design/atoms/display/Header.stories.tsx b/packages/client/components/ui/components/design/atoms/display/Header.stories.tsx
index 10948883f..6b04abdef 100644
--- a/packages/client/components/ui/components/design/atoms/display/Header.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Header.stories.tsx
@@ -1,20 +1,19 @@
-import type { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import TextColourDecorator from "../../../../decorators/TextColourDecorator";
-import type { ComponentStory } from "../../../stories";
-import { Column } from "../../layout";
-
-import { Header, HeaderWithTransparency } from "./Header";
+import TextColourDecorator from '../../../../decorators/TextColourDecorator';
+import type { ComponentStory } from '../../../stories';
+import { Column } from '../../layout';
+import { Header, HeaderWithTransparency } from './Header';
 
 export default {
-  category: "Design System/Atoms/Display",
+  category: 'Design System/Atoms/Display',
   component: Header,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
     },
     {
-      title: "With Transparency",
+      title: 'With Transparency',
       component: HeaderWithTransparency,
       decorators: [
         (props) => (
@@ -31,10 +30,10 @@ export default {
     },
   ],
   props: {
-    children: "My Cool Server",
+    children: 'My Cool Server',
   },
   decorators: [TextColourDecorator],
   propTypes: {
-    children: "string",
+    children: 'string',
   },
 } as ComponentStory<typeof Header, ComponentProps<typeof Header>>;
diff --git a/packages/client/components/ui/components/design/atoms/display/Header.tsx b/packages/client/components/ui/components/design/atoms/display/Header.tsx
index d138d9c10..78028a7a7 100644
--- a/packages/client/components/ui/components/design/atoms/display/Header.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Header.tsx
@@ -1,7 +1,7 @@
-import { styled } from "solid-styled-components";
+import { styled } from 'solid-styled-components';
 
 export interface Props {
-  readonly placement: "primary" | "secondary";
+  readonly placement: 'primary' | 'secondary';
 
   readonly topBorder?: boolean;
   readonly bottomBorder?: boolean;
@@ -10,7 +10,7 @@ export interface Props {
 /**
  * Generic header component
  */
-export const Header = styled("div", "Header")<Props>`
+export const Header = styled('div', 'Header')<Props>`
   gap: 10px;
   flex: 0 auto;
   display: flex;
@@ -22,16 +22,16 @@ export const Header = styled("div", "Header")<Props>`
   user-select: none;
 
   margin: ${(props) =>
-    props.placement === "primary"
-      ? (props.theme!.gap.md + " ").repeat(3) + "0"
-      : ""};
+    props.placement === 'primary'
+      ? (props.theme!.gap.md + ' ').repeat(3) + '0'
+      : ''};
   overflow: hidden;
   height: ${(props) => props.theme!.layout.height.header};
   border-radius: ${(props) => props.theme!.borderRadius.lg};
 
-  color: ${(props) => props.theme!.colours["sidebar-header-foreground"]};
+  color: ${(props) => props.theme!.colours['sidebar-header-foreground']};
   background-color: ${(props) =>
-    props.theme!.colours["sidebar-header-background"]};
+    props.theme!.colours['sidebar-header-background']};
 
   svg {
     flex-shrink: 0;
@@ -48,7 +48,7 @@ export const Header = styled("div", "Header")<Props>`
  */
 export const BelowFloatingHeader = styled.div`
   position: relative;
-  z-index: ${(props) => props.theme!.layout.zIndex["floating-bar"]};
+  z-index: ${(props) => props.theme!.layout.zIndex['floating-bar']};
 
   > * {
     width: 100%;
@@ -65,12 +65,12 @@ export const BelowFloatingHeader = styled.div`
  */
 export const HeaderWithTransparency = styled(Header)`
   background-color: ${(props) =>
-    props.theme!.colours["sidebar-header-transparent-background"]};
+    props.theme!.colours['sidebar-header-transparent-background']};
   backdrop-filter: ${(props) => props.theme!.effects.blur.md};
 
   position: absolute;
   width: calc(100% - ${(props) => props.theme!.gap.md});
-  z-index: ${(props) => props.theme!.layout.zIndex["floating-bar"]};
+  z-index: ${(props) => props.theme!.layout.zIndex['floating-bar']};
 `;
 
 /**
@@ -81,18 +81,18 @@ export const HeaderWithImage = styled(Header)`
   align-items: flex-end;
   justify-content: stretch;
   text-shadow: 0px 0px 1px ${(props) => props.theme!.colours.foreground};
-  height: ${(props) => props.theme!.layout.height["tall-header"]};
+  height: ${(props) => props.theme!.layout.height['tall-header']};
   margin: ${(props) => props.theme!.gap.md};
 
   > * {
     flex-grow: 1;
     padding: 6px 14px;
     color: ${(props) =>
-      props.theme!.colours["sidebar-header-with-image-text-foreground"]};
+      props.theme!.colours['sidebar-header-with-image-text-foreground']};
     background: linear-gradient(
       0deg,
       ${(props) =>
-        props.theme!.colours["sidebar-header-with-image-text-background"]},
+        props.theme!.colours['sidebar-header-with-image-text-background']},
       transparent
     );
   }
diff --git a/packages/client/components/ui/components/design/atoms/display/Initials.stories.tsx b/packages/client/components/ui/components/design/atoms/display/Initials.stories.tsx
index f9c6eee81..6f6ea443d 100644
--- a/packages/client/components/ui/components/design/atoms/display/Initials.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Initials.stories.tsx
@@ -1,25 +1,24 @@
-import type { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import TextColourDecorator from "../../../../decorators/TextColourDecorator";
-import type { ComponentStory } from "../../../stories";
-
-import { Initials } from "./Initials";
+import TextColourDecorator from '../../../../decorators/TextColourDecorator';
+import type { ComponentStory } from '../../../stories';
+import { Initials } from './Initials';
 
 export default {
-  category: "Design System/Atoms/Display",
+  category: 'Design System/Atoms/Display',
   component: Initials,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
       props: {
-        input: "this is a long string",
+        input: 'this is a long string',
         maxLength: 3,
       },
     },
   ],
   propTypes: {
-    input: "string",
-    maxLength: "number",
+    input: 'string',
+    maxLength: 'number',
   },
   decorators: [TextColourDecorator],
 } as ComponentStory<typeof Initials, ComponentProps<typeof Initials>>;
diff --git a/packages/client/components/ui/components/design/atoms/display/Initials.tsx b/packages/client/components/ui/components/design/atoms/display/Initials.tsx
index b251d6c35..7055c2abc 100644
--- a/packages/client/components/ui/components/design/atoms/display/Initials.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Initials.tsx
@@ -1,4 +1,4 @@
-export type Props = {
+export interface Props {
   /**
    * Input string
    */
@@ -8,7 +8,7 @@ export type Props = {
    * Maximum length
    */
   maxLength?: number;
-};
+}
 
 /**
  * Generate initials from some string
@@ -30,5 +30,5 @@ export function toInitials(input: string, maxLength = 2) {
  * Takes some string and displays the first letter of each word
  */
 export function Initials(props: Props) {
-  return <>{toInitials(props.input, props.maxLength).join("")}</>;
+  return <>{toInitials(props.input, props.maxLength).join('')}</>;
 }
diff --git a/packages/client/components/ui/components/design/atoms/display/Key.stories.tsx b/packages/client/components/ui/components/design/atoms/display/Key.stories.tsx
index e87b37dac..43fe686ce 100644
--- a/packages/client/components/ui/components/design/atoms/display/Key.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Key.stories.tsx
@@ -1,37 +1,36 @@
-import type { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import TextColourDecorator from "../../../../decorators/TextColourDecorator";
-import type { ComponentStory } from "../../../stories";
-
-import { Key } from "./Key";
+import TextColourDecorator from '../../../../decorators/TextColourDecorator';
+import type { ComponentStory } from '../../../stories';
+import { Key } from './Key';
 
 export default {
-  category: "Design System/Atoms/Display",
+  category: 'Design System/Atoms/Display',
   component: Key,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
       props: {
-        children: "K",
+        children: 'K',
       },
     },
     {
-      title: "Simple",
+      title: 'Simple',
       props: {
-        children: "ArrowUp",
+        children: 'ArrowUp',
         simple: true,
       },
     },
     {
-      title: "Special Key Replacement",
+      title: 'Special Key Replacement',
       props: {
-        children: "ArrowUp",
+        children: 'ArrowUp',
       },
     },
   ],
   propTypes: {
-    children: "string",
-    short: "boolean",
-    simple: "boolean",
+    children: 'string',
+    short: 'boolean',
+    simple: 'boolean',
   },
 } as ComponentStory<typeof Key, ComponentProps<typeof Key>>;
diff --git a/packages/client/components/ui/components/design/atoms/display/Key.tsx b/packages/client/components/ui/components/design/atoms/display/Key.tsx
index 8fc1db450..7c1779621 100644
--- a/packages/client/components/ui/components/design/atoms/display/Key.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Key.tsx
@@ -1,13 +1,13 @@
+import { useTranslation } from '@revolt/i18n';
 import {
   FaSolidArrowDown,
   FaSolidArrowLeft,
   FaSolidArrowRight,
   FaSolidArrowUp,
-} from "solid-icons/fa";
-import { Component, JSXElement, createMemo } from "solid-js";
-import { styled } from "solid-styled-components";
-
-import { useTranslation } from "@revolt/i18n";
+} from 'solid-icons/fa';
+import type { Component, JSXElement } from 'solid-js';
+import { createMemo } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
 export interface Props {
   children: string;
@@ -16,7 +16,7 @@ export interface Props {
   simple?: boolean;
 }
 
-const Base = styled("kbd", "Key")<Pick<Props, "simple">>`
+const Base = styled('kbd', 'Key')<Pick<Props, 'simple'>>`
   display: inline-flex;
   color: var(--colours-component-key-foreground);
   background: var(--colours-component-key-background);
@@ -52,10 +52,10 @@ const Base = styled("kbd", "Key")<Pick<Props, "simple">>`
 `;
 
 const REPLACEMENTS: Record<string, () => JSXElement> = {
-  ArrowUp: () => <FaSolidArrowUp size="1em" />,
-  ArrowDown: () => <FaSolidArrowDown size="1em" />,
-  ArrowLeft: () => <FaSolidArrowLeft size="1em" />,
-  ArrowRight: () => <FaSolidArrowRight size="1em" />,
+  ArrowUp: () => <FaSolidArrowUp size='1em' />,
+  ArrowDown: () => <FaSolidArrowDown size='1em' />,
+  ArrowLeft: () => <FaSolidArrowLeft size='1em' />,
+  ArrowRight: () => <FaSolidArrowRight size='1em' />,
 };
 
 export const Key: Component<Props> = (props) => {
diff --git a/packages/client/components/ui/components/design/atoms/display/KeySequence.stories.tsx b/packages/client/components/ui/components/design/atoms/display/KeySequence.stories.tsx
index 05bb46ba6..07dbcf75a 100644
--- a/packages/client/components/ui/components/design/atoms/display/KeySequence.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/KeySequence.stories.tsx
@@ -1,40 +1,39 @@
-import type { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import TextColourDecorator from "../../../../decorators/TextColourDecorator";
-import type { ComponentStory } from "../../../stories";
-
-import { KeySequence } from "./KeySequence";
+import TextColourDecorator from '../../../../decorators/TextColourDecorator';
+import type { ComponentStory } from '../../../stories';
+import { KeySequence } from './KeySequence';
 
 export default {
-  category: "Design System/Atoms/Display",
+  category: 'Design System/Atoms/Display',
   component: KeySequence,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
       props: {
-        sequence: "Control+Alt+ArrowUp",
+        sequence: 'Control+Alt+ArrowUp',
         short: true,
       },
     },
     {
-      title: "Simple",
+      title: 'Simple',
       props: {
-        sequence: "Control+Alt+ArrowUp",
+        sequence: 'Control+Alt+ArrowUp',
         simple: true,
         short: true,
       },
     },
     {
-      title: "Long",
+      title: 'Long',
       props: {
-        sequence: "Control+Alt+ArrowUp",
+        sequence: 'Control+Alt+ArrowUp',
         short: false,
       },
     },
   ],
   propTypes: {
-    sequence: "string",
-    short: "boolean",
-    simple: "boolean",
+    sequence: 'string',
+    short: 'boolean',
+    simple: 'boolean',
   },
 } as ComponentStory<typeof KeySequence, ComponentProps<typeof KeySequence>>;
diff --git a/packages/client/components/ui/components/design/atoms/display/KeySequence.tsx b/packages/client/components/ui/components/design/atoms/display/KeySequence.tsx
index b77aeab4a..dbdfa11d2 100644
--- a/packages/client/components/ui/components/design/atoms/display/KeySequence.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/KeySequence.tsx
@@ -1,12 +1,12 @@
-import { Component, For, createMemo } from "solid-js";
-import { styled } from "solid-styled-components";
-
 import {
   KeybindSequence,
   type KeyComboSequence as TKeySequence,
-} from "@revolt/keybinds";
+} from '@revolt/keybinds';
+import type { Component } from 'solid-js';
+import { createMemo, For } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { Key } from "./Key";
+import { Key } from './Key';
 
 export interface Props {
   sequence: string | TKeySequence;
@@ -15,7 +15,7 @@ export interface Props {
   simple?: boolean;
 }
 
-const Base = styled("kbd", "KeySequence")`
+const Base = styled('kbd', 'KeySequence')`
   display: inline-flex;
   place-items: center;
   flex-wrap: wrap;
@@ -35,7 +35,7 @@ const Base = styled("kbd", "KeySequence")`
 export const KeySequence: Component<Props> = (props) => {
   // accepting strings and parsing them isn't really needed other than a nice api?
   const sequence = createMemo(() =>
-    typeof props.sequence === "string"
+    typeof props.sequence === 'string'
       ? KeybindSequence.parse(props.sequence)
       : props.sequence
   );
@@ -47,7 +47,7 @@ export const KeySequence: Component<Props> = (props) => {
           <For each={combo}>
             {(key, index) => (
               <>
-                {index() !== 0 && "+"}
+                {index() !== 0 && '+'}
                 <Key {...props}>{key}</Key>
               </>
             )}
diff --git a/packages/client/components/ui/components/design/atoms/display/Modal.stories.tsx b/packages/client/components/ui/components/design/atoms/display/Modal.stories.tsx
index 21f7f9147..fd4bc7a85 100644
--- a/packages/client/components/ui/components/design/atoms/display/Modal.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Modal.stories.tsx
@@ -1,66 +1,65 @@
-import { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import type { ComponentStory } from "../../../stories";
-import { Button } from "../inputs";
-
-import { Modal } from "./Modal";
+import type { ComponentStory } from '../../../stories';
+import { Button } from '../inputs';
+import { Modal } from './Modal';
 
 const urlSearchParams = new URLSearchParams(window.location.search);
 const params = Object.fromEntries(urlSearchParams.entries());
 
-function shouldShow(key: "default" | "no-actions") {
-  const show = params["show"];
+function shouldShow(key: 'default' | 'no-actions') {
+  const show = params['show'];
   return show ? show === key : false;
 }
 
 export default {
   component: Modal,
-  category: "Design System/Atoms/Display",
+  category: 'Design System/Atoms/Display',
   stories: [
     {
-      title: "Default",
+      title: 'Default',
       props: {
-        show: shouldShow("default"),
+        show: shouldShow('default'),
       },
     },
     {
-      title: "No Actions",
+      title: 'No Actions',
       props: {
         actions: [],
-        show: shouldShow("no-actions"),
+        show: shouldShow('no-actions'),
       },
     },
   ],
   props: {
-    title: "Modal Title",
-    description: "Optional modal description.",
+    title: 'Modal Title',
+    description: 'Optional modal description.',
     children:
       "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
     actions: [
       {
-        children: "OK",
-        palette: "accent",
+        children: 'OK',
+        palette: 'accent',
         confirmation: true,
         onClick: () => true,
       },
       {
-        children: "Cancel",
-        palette: "plain",
+        children: 'Cancel',
+        palette: 'plain',
         onClick: () => true,
       },
     ],
   },
   propTypes: {
-    show: "boolean",
-    title: "string",
-    description: "string",
-    children: "string",
+    show: 'boolean',
+    title: 'string',
+    description: 'string',
+    children: 'string',
   },
   decorators: [
     (props) => (
       <div>
         <Button
-          palette="primary"
+          palette='primary'
           onClick={() => (props.childProps as any).onShow()}
         >
           Open Modal
diff --git a/packages/client/components/ui/components/design/atoms/display/Modal.tsx b/packages/client/components/ui/components/design/atoms/display/Modal.tsx
index 6f3a8a14c..d91915cd3 100644
--- a/packages/client/components/ui/components/design/atoms/display/Modal.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Modal.tsx
@@ -1,14 +1,13 @@
-import { ComponentProps, For, JSX, Show } from "solid-js";
-import { Portal } from "solid-js/web";
-import { styled } from "solid-styled-components";
+import type { ComponentProps, JSX } from 'solid-js';
+import { For, Show } from 'solid-js';
+import { Portal } from 'solid-js/web';
+import { Motion, Presence } from 'solid-motionone';
+import { styled } from 'solid-styled-components';
 
-import { Motion, Presence } from "@motionone/solid";
+import { Button } from '../inputs/Button';
+import { Typography } from './Typography';
 
-import { Button } from "../inputs/Button";
-
-import { Typography } from "./Typography";
-
-export type Action = Omit<ComponentProps<typeof Button>, "onClick"> & {
+export type Action = Omit<ComponentProps<typeof Button>, 'onClick'> & {
   confirmation?: boolean;
   onClick: () => void | boolean | Promise<boolean>;
 };
@@ -78,14 +77,14 @@ export interface Props {
 /**
  * Fixed position container to centre the modal
  */
-const Base = styled("div", "Modal")<{ show?: boolean }>`
+const Base = styled('div', 'Modal')<{ show?: boolean }>`
   top: 0;
   left: 0;
   width: 100%;
   height: 100%;
 
   position: fixed;
-  z-index: ${(props) => props.theme!.layout.zIndex["modal"]};
+  z-index: ${(props) => props.theme!.layout.zIndex['modal']};
 
   max-height: 100%;
   user-select: none;
@@ -98,13 +97,13 @@ const Base = styled("div", "Modal")<{ show?: boolean }>`
   place-items: center;
 
   transition: ${(props) => props.theme!.transitions.medium} all;
-  pointer-events: ${(props) => (props.show ? "all" : "none")};
+  pointer-events: ${(props) => (props.show ? 'all' : 'none')};
 
   /** TODO: rgb value here */
-  background: ${(props) => (props.show ? "rgba(0, 0, 0, 0.6)" : "transparent")};
+  background: ${(props) => (props.show ? 'rgba(0, 0, 0, 0.6)' : 'transparent')};
 `;
 
-type ContainerProps = Pick<Props, "transparent" | "maxWidth" | "maxHeight"> & {
+type ContainerProps = Pick<Props, 'transparent' | 'maxWidth' | 'maxHeight'> & {
   actions: boolean;
 };
 
@@ -112,22 +111,22 @@ type ContainerProps = Pick<Props, "transparent" | "maxWidth" | "maxHeight"> & {
  * Component that wraps all of the actual modal content
  */
 const Container = styled.div<ContainerProps>`
-  width: ${(props) => (props.maxWidth ? "100%" : "unset")};
-  max-width: min(calc(100vw - 20px), ${(props) => props.maxWidth ?? "450px"});
-  max-height: min(calc(100vh - 20px), ${(props) => props.maxHeight ?? "650px"});
+  width: ${(props) => (props.maxWidth ? '100%' : 'unset')};
+  max-width: min(calc(100vw - 20px), ${(props) => props.maxWidth ?? '450px'});
+  max-height: min(calc(100vh - 20px), ${(props) => props.maxHeight ?? '650px'});
 
   margin: 20px;
   display: flex;
   flex-direction: column;
 
-  color: ${(props) => props.theme!.colours["component-modal-foreground"]};
+  color: ${(props) => props.theme!.colours['component-modal-foreground']};
   background: ${(props) =>
     props.transparent
-      ? "transparent"
-      : props.theme!.colours["component-modal-background"]};
+      ? 'transparent'
+      : props.theme!.colours['component-modal-background']};
   border-radius: ${(props) =>
-    props.transparent ? "none" : props.theme!.borderRadius.lg};
-  overflow: ${(props) => (props.transparent ? "unset" : "hidden")};
+    props.transparent ? 'none' : props.theme!.borderRadius.lg};
+  overflow: ${(props) => (props.transparent ? 'unset' : 'hidden')};
 `;
 
 /**
@@ -160,7 +159,7 @@ const Content = styled.div<Props>`
 /**
  * Container for bottom modal actions
  */
-const Actions = styled("div", "Actions")`
+const Actions = styled('div', 'Actions')`
   flex-shrink: 0;
 
   gap: 8px;
@@ -176,11 +175,11 @@ const Actions = styled("div", "Actions")`
  */
 export function Modal(props: Props) {
   const showActions = () =>
-    typeof props.actions === "function" ||
+    typeof props.actions === 'function' ||
     (props.actions ? props.actions.length > 0 : false);
 
   return (
-    <Portal mount={document.getElementById("floating")!}>
+    <Portal mount={document.getElementById('floating')!}>
       <Base
         show={props.show}
         onClick={() => !props.nonDismissable && props.onClose?.()}
@@ -200,12 +199,12 @@ export function Modal(props: Props) {
                 <Show when={props.title || props.description}>
                   <Title>
                     <Show when={props.title}>
-                      <Typography variant="modal-title">
+                      <Typography variant='modal-title'>
                         {props.title}
                       </Typography>
                     </Show>
                     <Show when={props.description}>
-                      <Typography variant="modal-description">
+                      <Typography variant='modal-description'>
                         {props.description}
                       </Typography>
                     </Show>
@@ -218,7 +217,7 @@ export function Modal(props: Props) {
                   <Actions>
                     <For
                       each={
-                        typeof props.actions === "function"
+                        typeof props.actions === 'function'
                           ? props.actions()
                           : props.actions
                       }
diff --git a/packages/client/components/ui/components/design/atoms/display/Time.stories.tsx b/packages/client/components/ui/components/design/atoms/display/Time.stories.tsx
index 4f0a01e85..1a043d858 100644
--- a/packages/client/components/ui/components/design/atoms/display/Time.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Time.stories.tsx
@@ -1,50 +1,49 @@
-import type { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import TextColourDecorator from "../../../../decorators/TextColourDecorator";
-import type { ComponentStory } from "../../../stories";
+import TextColourDecorator from '../../../../decorators/TextColourDecorator';
+import type { ComponentStory } from '../../../stories';
+import { Time } from './Time';
 
-import { Time } from "./Time";
-
-const REFERENCE_TIME = "2022-12-07T20:27:50.000Z";
+const REFERENCE_TIME = '2022-12-07T20:27:50.000';
 
 export const TIME_TEST_DATA = [
   {
-    value: "2022-12-07T20:20:50.000Z",
-    format: "calendar" as const,
-    expected: "Today at 8:20 PM",
+    value: '2022-12-07T20:20:50.000',
+    format: 'calendar' as const,
+    expected: 'Today at 8:20 PM',
     referenceTime: REFERENCE_TIME,
   },
   {
-    value: "2022-12-05T20:20:50.000Z",
-    format: "calendar" as const,
-    expected: "Last Monday at 8:20 PM",
+    value: '2022-12-05T20:20:50.000',
+    format: 'calendar' as const,
+    expected: 'Last Monday at 8:20 PM',
     referenceTime: REFERENCE_TIME,
   },
   {
-    value: "2022-12-01T20:20:50.000Z",
-    format: "time" as const,
-    expected: "20:20",
+    value: '2022-12-01T20:20:50.000',
+    format: 'time' as const,
+    expected: '20:20',
     referenceTime: REFERENCE_TIME,
   },
 ];
 
 export default {
-  category: "Design System/Atoms/Display",
+  category: 'Design System/Atoms/Display',
   component: Time,
   stories: [
     {
-      title: "Calendar",
+      title: 'Calendar',
       props: { ...TIME_TEST_DATA[0] },
     },
     {
-      title: "Time",
+      title: 'Time',
       props: { ...TIME_TEST_DATA[2] },
     },
   ],
   propTypes: {
-    value: "string",
-    format: ["time", "calendar"],
-    referenceTime: "string",
+    value: 'string',
+    format: ['time', 'calendar'],
+    referenceTime: 'string',
   },
   decorators: [TextColourDecorator],
 } as ComponentStory<typeof Time, ComponentProps<typeof Time>>;
diff --git a/packages/client/components/ui/components/design/atoms/display/Time.tsx b/packages/client/components/ui/components/design/atoms/display/Time.tsx
index 4d5cc92e5..bc8533ae7 100644
--- a/packages/client/components/ui/components/design/atoms/display/Time.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Time.tsx
@@ -1,20 +1,19 @@
-import { createSignal, onCleanup } from "solid-js";
-
-import { dayjs } from "@revolt/i18n";
+import { dayjs } from '@revolt/i18n';
+import { createSignal, onCleanup } from 'solid-js';
 
 interface Props {
   value: number | Date | string;
   format:
-    | "calendar"
-    | "datetime"
-    | "date"
-    | "dateNormal"
-    | "dateAmerican"
-    | "iso8601"
-    | "relative"
-    | "time"
-    | "time24"
-    | "time12";
+    | 'calendar'
+    | 'datetime'
+    | 'date'
+    | 'dateNormal'
+    | 'dateAmerican'
+    | 'iso8601'
+    | 'relative'
+    | 'time'
+    | 'time24'
+    | 'time12';
   referenceTime?: number | Date | string;
 }
 
@@ -23,27 +22,27 @@ interface Props {
  */
 export function formatTime(options: Props): string {
   switch (options.format) {
-    case "calendar":
+    case 'calendar':
       return dayjs(options.value).calendar(options.referenceTime);
-    case "datetime":
+    case 'datetime':
       return `${formatTime({
-        format: "date",
+        format: 'date',
         value: options.value,
-      })} ${formatTime({ format: "time", value: options.value })}`;
-    case "date":
-    case "dateNormal":
-      return dayjs(options.value).format("DD/MM/YYYY");
-    case "dateAmerican":
-      return dayjs(options.value).format("MM/DD/YYYY");
-    case "iso8601":
-      return dayjs(options.value).format("YYYY-MM-DD");
-    case "relative":
+      })} ${formatTime({ format: 'time', value: options.value })}`;
+    case 'date':
+    case 'dateNormal':
+      return dayjs(options.value).format('DD/MM/YYYY');
+    case 'dateAmerican':
+      return dayjs(options.value).format('MM/DD/YYYY');
+    case 'iso8601':
+      return dayjs(options.value).format('YYYY-MM-DD');
+    case 'relative':
       return dayjs(options.value).fromNow();
-    case "time12":
-      return dayjs(options.value).format("h:mm A");
-    case "time24":
+    case 'time12':
+      return dayjs(options.value).format('h:mm A');
+    case 'time24':
     default:
-      return dayjs(options.value).format("HH:mm");
+      return dayjs(options.value).format('HH:mm');
   }
 }
 
diff --git a/packages/client/components/ui/components/design/atoms/display/Typography.stories.tsx b/packages/client/components/ui/components/design/atoms/display/Typography.stories.tsx
index fe91e5aad..715fd5f4d 100644
--- a/packages/client/components/ui/components/design/atoms/display/Typography.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Typography.stories.tsx
@@ -1,70 +1,69 @@
-import type { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import TextColourDecorator from "../../../../decorators/TextColourDecorator";
-import type { ComponentStory } from "../../../stories";
-
-import { Typography } from "./Typography";
+import TextColourDecorator from '../../../../decorators/TextColourDecorator';
+import type { ComponentStory } from '../../../stories';
+import { Typography } from './Typography';
 
 export default {
-  category: "Design System/Atoms/Display",
+  category: 'Design System/Atoms/Display',
   component: Typography,
   stories: [
     {
-      title: "Heading 1",
+      title: 'Heading 1',
       props: {
-        variant: "h1",
+        variant: 'h1',
       },
     },
     {
-      title: "Heading 2",
+      title: 'Heading 2',
       props: {
-        variant: "h2",
+        variant: 'h2',
       },
     },
     {
-      title: "Heading 3",
+      title: 'Heading 3',
       props: {
-        variant: "h3",
+        variant: 'h3',
       },
     },
     {
-      title: "Heading 4",
+      title: 'Heading 4',
       props: {
-        variant: "h4",
+        variant: 'h4',
       },
     },
     {
-      title: "Subtitle",
+      title: 'Subtitle',
       props: {
-        variant: "subtitle",
+        variant: 'subtitle',
       },
     },
     {
-      title: "Label",
+      title: 'Label',
       props: {
-        variant: "label",
+        variant: 'label',
       },
     },
     {
-      title: "Small",
+      title: 'Small',
       props: {
-        variant: "small",
+        variant: 'small',
       },
       decorators: [TextColourDecorator],
     },
     {
-      title: "Username",
+      title: 'Username',
       props: {
-        variant: "username",
+        variant: 'username',
       },
       decorators: [TextColourDecorator],
     },
   ],
   props: {
-    children: "The quick brown fox jumps over the lazy dog.",
+    children: 'The quick brown fox jumps over the lazy dog.',
   },
   propTypes: {
-    children: "string",
-    variant: ["h1", "h2", "h3", "h4", "subtitle", "label", "small", "username"],
+    children: 'string',
+    variant: ['h1', 'h2', 'h3', 'h4', 'subtitle', 'label', 'small', 'username'],
   },
 } as ComponentStory<typeof Typography, ComponentProps<typeof Typography>>;
diff --git a/packages/client/components/ui/components/design/atoms/display/Typography.tsx b/packages/client/components/ui/components/design/atoms/display/Typography.tsx
index b15d6c905..50cd3811c 100644
--- a/packages/client/components/ui/components/design/atoms/display/Typography.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Typography.tsx
@@ -1,17 +1,13 @@
-import { splitProps } from "solid-js";
-import type { JSX } from "solid-js/jsx-runtime";
-import {
-  DefaultTheme,
-  StylesArg,
-  css,
-  useTheme,
-} from "solid-styled-components";
+import { splitProps } from 'solid-js';
+import type { JSX } from 'solid-js/jsx-runtime';
+import type { DefaultTheme, StylesArg } from 'solid-styled-components';
+import { css, useTheme } from 'solid-styled-components';
 
 type TypographyProps = {
   /**
    * Which variant to use
    */
-  readonly variant: keyof DefaultTheme["typography"];
+  readonly variant: keyof DefaultTheme['typography'];
   // eslint-disable-next-line @typescript-eslint/no-explicit-any
 } & JSX.HTMLAttributes<any>;
 
@@ -23,7 +19,7 @@ type TypographyProps = {
  */
 export function generateTypography(
   theme: DefaultTheme,
-  variant: keyof DefaultTheme["typography"]
+  variant: keyof DefaultTheme['typography']
 ) {
   const { fontSize, fontWeight, lineHeight, margin, textTransform, colour } =
     theme.typography[variant] ?? {};
@@ -51,17 +47,17 @@ export function generateTypography(
  */
 export function generateTypographyCSS(
   theme: DefaultTheme,
-  variant: keyof DefaultTheme["typography"]
+  variant: keyof DefaultTheme['typography']
 ) {
   const { fontSize, fontWeight, lineHeight, margin, textTransform, colour } =
     theme.typography[variant] ?? {};
 
   const styles = {
-    "font-size": fontSize,
-    "font-weight": fontWeight,
-    "line-height": lineHeight,
+    'font-size': fontSize,
+    'font-weight': fontWeight,
+    'line-height': lineHeight,
     margin,
-    "text-transform": textTransform,
+    'text-transform': textTransform,
   } as Record<string, string>;
 
   if (colour) {
@@ -71,7 +67,7 @@ export function generateTypographyCSS(
   return Object.keys(styles)
     .filter((key) => styles[key])
     .map((key) => `${key}:${styles[key]};`)
-    .join("");
+    .join('');
 }
 
 /**
@@ -80,23 +76,23 @@ export function generateTypographyCSS(
  */
 export const Typography = (props: TypographyProps) => {
   /* eslint-disable solid/reactivity, solid/components-return-once */
-  const [local, others] = splitProps(props, ["variant"]);
+  const [local, others] = splitProps(props, ['variant']);
 
   const theme = useTheme();
   const className = css(generateTypography(theme, local.variant));
 
   switch (theme.typography[local.variant]?.element) {
-    case "h1":
+    case 'h1':
       return <h1 class={className} {...others} />;
-    case "h2":
+    case 'h2':
       return <h2 class={className} {...others} />;
-    case "h3":
+    case 'h3':
       return <h3 class={className} {...others} />;
-    case "h4":
+    case 'h4':
       return <h4 class={className} {...others} />;
-    case "label":
+    case 'label':
       return <label class={className} {...others} />;
-    case "div":
+    case 'div':
       return <div class={className} {...others} />;
     default:
       return <span class={className} {...others} />;
diff --git a/packages/client/components/ui/components/design/atoms/display/Username.tsx b/packages/client/components/ui/components/design/atoms/display/Username.tsx
index 1b9540b17..6dd5bcf39 100644
--- a/packages/client/components/ui/components/design/atoms/display/Username.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/Username.tsx
@@ -1,7 +1,8 @@
-import { ComponentProps, splitProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
+import { splitProps } from 'solid-js';
 
-import { ColouredText } from "./ColouredText";
-import { Typography } from "./Typography";
+import { ColouredText } from './ColouredText';
+import { Typography } from './Typography';
 
 type Props = {
   /**
@@ -13,19 +14,19 @@ type Props = {
    * Text colour
    */
   colour?: string;
-} & Omit<ComponentProps<typeof Typography>, "variant">;
+} & Omit<ComponentProps<typeof Typography>, 'variant'>;
 
 /**
  * Username
  */
 export function Username(props: Props) {
-  const [local, remote] = splitProps(props, ["username", "colour"]);
+  const [local, remote] = splitProps(props, ['username', 'colour']);
 
   return (
-    <Typography {...remote} variant="username">
+    <Typography {...remote} variant='username'>
       <ColouredText
         colour={local.colour!}
-        clip={local.colour?.includes("gradient")}
+        clip={local.colour?.includes('gradient')}
       >
         {local.username}
       </ColouredText>
diff --git a/packages/client/components/ui/components/design/atoms/display/__tests__/initialsComponent.test.tsx b/packages/client/components/ui/components/design/atoms/display/__tests__/initialsComponent.test.tsx
index da0dc4545..70d155b23 100644
--- a/packages/client/components/ui/components/design/atoms/display/__tests__/initialsComponent.test.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/__tests__/initialsComponent.test.tsx
@@ -1,35 +1,35 @@
-import { render, screen } from "@solidjs/testing-library";
-import { describe, expect, it } from "vitest";
+import { render, screen } from '@solidjs/testing-library';
+import { describe, expect, it } from 'vitest';
 
-import { Initials, toInitials } from "../Initials";
+import { Initials, toInitials } from '../Initials';
 
 const TEST_DATA = [
   {
-    input: "test string",
-    output: "ts",
+    input: 'test string',
+    output: 'ts',
   },
   {
-    input: "test string",
+    input: 'test string',
     maxLength: 1,
-    output: "t",
+    output: 't',
   },
   {
-    input: "some other test string which is quite long",
+    input: 'some other test string which is quite long',
     maxLength: 3,
-    output: "sot",
+    output: 'sot',
   },
 ];
 
-describe("Initials component", () => {
-  it("should have correct output", () => {
+describe('Initials component', () => {
+  it('should have correct output', () => {
     for (const entry of TEST_DATA) {
       expect(toInitials(entry.input, entry.maxLength)).toStrictEqual(
-        entry.output.split("")
+        entry.output.split('')
       );
     }
   });
 
-  it("should render the correct output", () => {
+  it('should render the correct output', () => {
     for (const entry of TEST_DATA) {
       render(() => <Initials {...entry} />);
       const textElm = screen.getByText(entry.output);
diff --git a/packages/client/components/ui/components/design/atoms/display/__tests__/timeComponent.test.tsx b/packages/client/components/ui/components/design/atoms/display/__tests__/timeComponent.test.tsx
index cb0cde63a..dc3bf13b8 100644
--- a/packages/client/components/ui/components/design/atoms/display/__tests__/timeComponent.test.tsx
+++ b/packages/client/components/ui/components/design/atoms/display/__tests__/timeComponent.test.tsx
@@ -1,17 +1,19 @@
-import { render, screen } from "@solidjs/testing-library";
-import { describe, expect, it } from "vitest";
+import { render, screen } from '@solidjs/testing-library';
+import { describe, expect, it } from 'vitest';
 
-import { Time, formatTime } from "../Time";
-import { TIME_TEST_DATA } from "../Time.stories";
+import { formatTime, Time } from '../Time';
+import { TIME_TEST_DATA } from '../Time.stories';
+import dayjs from "dayjs";
 
-describe("Time component", () => {
-  it("should have correct output", () => {
+describe('Time component', () => {
+  it('should have correct output', () => {
     for (const entry of TIME_TEST_DATA) {
+      console.log(dayjs(entry.value).format())
       expect(formatTime(entry)).toBe(entry.expected);
     }
   });
 
-  it("should render the correct output", () => {
+  it('should render the correct output', () => {
     for (const entry of TIME_TEST_DATA) {
       render(() => <Time {...entry} />);
       const textElm = screen.getByText(entry.expected);
diff --git a/packages/client/components/ui/components/design/atoms/display/index.ts b/packages/client/components/ui/components/design/atoms/display/index.ts
index b11981b13..0404955cc 100644
--- a/packages/client/components/ui/components/design/atoms/display/index.ts
+++ b/packages/client/components/ui/components/design/atoms/display/index.ts
@@ -1,17 +1,17 @@
-export { Avatar } from "./Avatar";
-export { Breadcrumbs } from "./Breadcrumbs";
-export { ColouredText } from "./ColouredText";
-export { FormGroup } from "./FormGroup";
+export { Avatar } from './Avatar';
+export { Breadcrumbs } from './Breadcrumbs';
+export { ColouredText } from './ColouredText';
+export { FormGroup } from './FormGroup';
 export {
+  BelowFloatingHeader,
   Header,
   HeaderWithImage,
   HeaderWithTransparency,
-  BelowFloatingHeader,
-} from "./Header";
-export { Initials } from "./Initials";
-export { Time } from "./Time";
-export { Typography } from "./Typography";
-export { Modal } from "./Modal";
-export { Username } from "./Username";
-export { Key } from "./Key";
-export { KeySequence } from "./KeySequence";
+} from './Header';
+export { Initials } from './Initials';
+export { Key } from './Key';
+export { KeySequence } from './KeySequence';
+export { Modal } from './Modal';
+export { Time } from './Time';
+export { Typography } from './Typography';
+export { Username } from './Username';
diff --git a/packages/client/components/ui/components/design/atoms/index.ts b/packages/client/components/ui/components/design/atoms/index.ts
index d5b50baa4..e1740809d 100644
--- a/packages/client/components/ui/components/design/atoms/index.ts
+++ b/packages/client/components/ui/components/design/atoms/index.ts
@@ -1,3 +1,3 @@
-export * from "./display";
-export * from "./indicators";
-export * from "./inputs";
+export * from './display';
+export * from './indicators';
+export * from './inputs';
diff --git a/packages/client/components/ui/components/design/atoms/indicators/BlockedMessage.tsx b/packages/client/components/ui/components/design/atoms/indicators/BlockedMessage.tsx
index 14971d61b..583d11194 100644
--- a/packages/client/components/ui/components/design/atoms/indicators/BlockedMessage.tsx
+++ b/packages/client/components/ui/components/design/atoms/indicators/BlockedMessage.tsx
@@ -1,15 +1,13 @@
-import { styled } from "solid-styled-components";
+import MdClose from '@material-design-icons/svg/filled/close.svg?component-solid';
+import { useTranslation } from '@revolt/i18n';
+import { styled } from 'solid-styled-components';
 
-import { useTranslation } from "@revolt/i18n";
-
-import MdClose from "@material-design-icons/svg/filled/close.svg?component-solid";
-
-import { iconSize } from "../../../..";
+import { iconSize } from '../../../..';
 
 /**
  * Base styles
  */
-const Base = styled("div")<{ unread?: boolean }>`
+const Base = styled('div')<{ unread?: boolean }>`
   display: flex;
   align-items: center;
 
@@ -20,11 +18,11 @@ const Base = styled("div")<{ unread?: boolean }>`
 
   font-size: 0.8em; /* TODO should be in typography */
   color: ${(props) =>
-    props.theme!.colours["messaging-component-blocked-message-foreground"]};
+    props.theme!.colours['messaging-component-blocked-message-foreground']};
   fill: ${(props) =>
-    props.theme!.colours["messaging-component-blocked-message-foreground"]};
+    props.theme!.colours['messaging-component-blocked-message-foreground']};
   background: ${(props) =>
-    props.theme!.colours["messaging-component-blocked-message-background"]};
+    props.theme!.colours['messaging-component-blocked-message-background']};
 `;
 
 interface Props {
@@ -42,8 +40,8 @@ export function BlockedMessage(props: Props) {
 
   return (
     <Base use:ripple={{ enable: false }}>
-      <MdClose {...iconSize(16)} />{" "}
-      {t("app.main.channel.misc.blocked_messages", {
+      <MdClose {...iconSize(16)} />{' '}
+      {t('app.main.channel.misc.blocked_messages', {
         count: props.count.toString(),
       })}
     </Base>
diff --git a/packages/client/components/ui/components/design/atoms/indicators/ConversationStart.tsx b/packages/client/components/ui/components/design/atoms/indicators/ConversationStart.tsx
index f1c366589..e36f97e45 100644
--- a/packages/client/components/ui/components/design/atoms/indicators/ConversationStart.tsx
+++ b/packages/client/components/ui/components/design/atoms/indicators/ConversationStart.tsx
@@ -1,11 +1,9 @@
-import { Show } from "solid-js";
-import { styled } from "solid-styled-components";
+import { useTranslation } from '@revolt/i18n';
+import type { Channel } from 'revolt.js';
+import { Show } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { Channel } from "revolt.js";
-
-import { useTranslation } from "@revolt/i18n";
-
-import { Typography } from "../display";
+import { Typography } from '../display';
 
 interface Props {
   /**
@@ -22,15 +20,15 @@ export function ConversationStart(props: Props) {
 
   return (
     <Base>
-      <Show when={props.channel.type !== "SavedMessages"}>
-        <Typography variant="conversation-channel-name">
+      <Show when={props.channel.type !== 'SavedMessages'}>
+        <Typography variant='conversation-channel-name'>
           {props.channel.name ?? props.channel.recipient?.username}
         </Typography>
       </Show>
-      <Typography variant="conversation-start">
+      <Typography variant='conversation-start'>
         {t(
           `app.main.channel.start.${
-            props.channel.type === "SavedMessages" ? "saved" : "group"
+            props.channel.type === 'SavedMessages' ? 'saved' : 'group'
           }`
         )}
       </Typography>
diff --git a/packages/client/components/ui/components/design/atoms/indicators/MessageDivider.stories.tsx b/packages/client/components/ui/components/design/atoms/indicators/MessageDivider.stories.tsx
index f9c67c68e..b20157f12 100644
--- a/packages/client/components/ui/components/design/atoms/indicators/MessageDivider.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/indicators/MessageDivider.stories.tsx
@@ -1,36 +1,35 @@
-import makeContainerDecorator from "../../../../decorators/ContainerDecorator";
-import type { ComponentStory } from "../../../stories";
-
-import { MessageDivider } from "./MessageDivider";
+import makeContainerDecorator from '../../../../decorators/ContainerDecorator';
+import type { ComponentStory } from '../../../stories';
+import { MessageDivider } from './MessageDivider';
 
 export default {
-  category: "Design System/Atoms/Indicators",
+  category: 'Design System/Atoms/Indicators',
   component: MessageDivider,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
     },
     {
-      title: "Unread",
+      title: 'Unread',
       props: {
         unread: true,
       },
     },
   ],
   props: {
-    date: "1st December 2022",
+    date: '1st December 2022',
   },
   decorators: [
     makeContainerDecorator({
       width: 360,
-      flex: "col",
+      flex: 'col',
     }),
     makeContainerDecorator({
       height: 32,
     }),
   ],
   propTypes: {
-    date: "string",
-    unread: "boolean",
+    date: 'string',
+    unread: 'boolean',
   },
 } as ComponentStory<typeof MessageDivider>;
diff --git a/packages/client/components/ui/components/design/atoms/indicators/MessageDivider.tsx b/packages/client/components/ui/components/design/atoms/indicators/MessageDivider.tsx
index 5a5444c3a..d7b5a8931 100644
--- a/packages/client/components/ui/components/design/atoms/indicators/MessageDivider.tsx
+++ b/packages/client/components/ui/components/design/atoms/indicators/MessageDivider.tsx
@@ -1,10 +1,10 @@
-import { Show } from "solid-js";
-import { styled } from "solid-styled-components";
+import { Show } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
 /**
  * Divider line
  */
-const Base = styled("div")<{ unread?: boolean }>`
+const Base = styled('div')<{ unread?: boolean }>`
   height: 0;
   display: flex;
   user-select: none;
@@ -21,7 +21,7 @@ const Base = styled("div")<{ unread?: boolean }>`
     border-radius: ${(props) => props.theme!.borderRadius.md};
 
     color: ${({ theme }) =>
-      theme!.colours["messaging-component-message-divider-foreground"]};
+      theme!.colours['messaging-component-message-divider-foreground']};
     background: ${({ theme }) => theme!.colours.background};
   }
 
@@ -29,7 +29,7 @@ const Base = styled("div")<{ unread?: boolean }>`
     ${({ unread, theme }) =>
       theme!.colours[
         `messaging-component-message-divider${
-          unread ? "-unread" : ""
+          unread ? '-unread' : ''
         }-background`
       ]};
 `;
@@ -37,13 +37,13 @@ const Base = styled("div")<{ unread?: boolean }>`
 /**
  * Unread indicator
  */
-const Unread = styled("div")`
+const Unread = styled('div')`
   font-size: 0.625rem;
   font-weight: 600;
   color: ${({ theme }) =>
-    theme!.colours["messaging-component-message-divider-unread-foreground"]};
+    theme!.colours['messaging-component-message-divider-unread-foreground']};
   background: ${({ theme }) =>
-    theme!.colours["messaging-component-message-divider-unread-background"]};
+    theme!.colours['messaging-component-message-divider-unread-background']};
 
   padding: 2px 6px;
   margin-top: -1px;
diff --git a/packages/client/components/ui/components/design/atoms/indicators/Preloader.stories.tsx b/packages/client/components/ui/components/design/atoms/indicators/Preloader.stories.tsx
index 547c0f010..f271dd9e7 100644
--- a/packages/client/components/ui/components/design/atoms/indicators/Preloader.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/indicators/Preloader.stories.tsx
@@ -1,28 +1,27 @@
-import type { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import type { ComponentStory } from "../../../stories";
-
-import { Preloader } from "./Preloader";
+import type { ComponentStory } from '../../../stories';
+import { Preloader } from './Preloader';
 
 export default {
-  category: "Design System/Atoms/Indicators",
+  category: 'Design System/Atoms/Indicators',
   component: Preloader,
   stories: [
     {
-      title: "Ring",
+      title: 'Ring',
       props: {
-        type: "ring",
+        type: 'ring',
       },
     },
     {
-      title: "Spinner",
+      title: 'Spinner',
       props: {
-        type: "spinner",
+        type: 'spinner',
       },
     },
   ],
   propTypes: {
-    type: ["ring", "spinner"],
-    grow: "boolean",
+    type: ['ring', 'spinner'],
+    grow: 'boolean',
   },
 } as ComponentStory<typeof Preloader, ComponentProps<typeof Preloader>>;
diff --git a/packages/client/components/ui/components/design/atoms/indicators/Preloader.tsx b/packages/client/components/ui/components/design/atoms/indicators/Preloader.tsx
index ffe393044..c49df07c1 100644
--- a/packages/client/components/ui/components/design/atoms/indicators/Preloader.tsx
+++ b/packages/client/components/ui/components/design/atoms/indicators/Preloader.tsx
@@ -1,4 +1,4 @@
-import { keyframes, styled } from "solid-styled-components";
+import { keyframes, styled } from 'solid-styled-components';
 
 /**
  * Animation for spinner
@@ -29,8 +29,8 @@ const prRing = keyframes`
 /**
  * Preloader component styling
  */
-const PreloaderBase = styled("div")<{ grow?: boolean }>`
-  height: ${(props) => (props.grow ? "100%" : "fit-content")};
+const PreloaderBase = styled('div')<{ grow?: boolean }>`
+  height: ${(props) => (props.grow ? '100%' : 'fit-content')};
 
   display: flex;
   align-items: center;
@@ -96,7 +96,7 @@ const PreloaderBase = styled("div")<{ grow?: boolean }>`
 `;
 
 export interface Props {
-  type: "spinner" | "ring";
+  type: 'spinner' | 'ring';
   grow?: boolean;
 }
 
diff --git a/packages/client/components/ui/components/design/atoms/indicators/SaveStatus.stories.tsx b/packages/client/components/ui/components/design/atoms/indicators/SaveStatus.stories.tsx
index b8e1f7a56..0663d7aae 100644
--- a/packages/client/components/ui/components/design/atoms/indicators/SaveStatus.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/indicators/SaveStatus.stories.tsx
@@ -1,33 +1,32 @@
-import type { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import type { ComponentStory } from "../../../stories";
-
-import { SaveStatus } from "./SaveStatus";
+import type { ComponentStory } from '../../../stories';
+import { SaveStatus } from './SaveStatus';
 
 export default {
-  category: "Design System/Atoms/Indicators",
+  category: 'Design System/Atoms/Indicators',
   component: SaveStatus,
   stories: [
     {
-      title: "Saved",
+      title: 'Saved',
       props: {
-        status: "saved",
+        status: 'saved',
       },
     },
     {
-      title: "Editing",
+      title: 'Editing',
       props: {
-        status: "editing",
+        status: 'editing',
       },
     },
     {
-      title: "Saving",
+      title: 'Saving',
       props: {
-        status: "saving",
+        status: 'saving',
       },
     },
   ],
   propTypes: {
-    status: ["saved", "saving", "editing"],
+    status: ['saved', 'saving', 'editing'],
   },
 } as ComponentStory<typeof SaveStatus, ComponentProps<typeof SaveStatus>>;
diff --git a/packages/client/components/ui/components/design/atoms/indicators/SaveStatus.tsx b/packages/client/components/ui/components/design/atoms/indicators/SaveStatus.tsx
index ce741e4ee..6bb84d47a 100644
--- a/packages/client/components/ui/components/design/atoms/indicators/SaveStatus.tsx
+++ b/packages/client/components/ui/components/design/atoms/indicators/SaveStatus.tsx
@@ -2,14 +2,14 @@ import {
   BiRegularCheck,
   BiRegularCloudUpload,
   BiSolidPencil,
-} from "solid-icons/bi";
-import { Match, Switch } from "solid-js";
-import { styled } from "solid-styled-components";
+} from 'solid-icons/bi';
+import { Match, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
 /**
  * Text and icon styling
  */
-const Base = styled("div")`
+const Base = styled('div')`
   gap: 8px;
   padding: 4px;
   display: flex;
@@ -24,7 +24,7 @@ const Base = styled("div")`
 /**
  * Possible edit states
  */
-export type EditStatus = "saved" | "editing" | "saving";
+export type EditStatus = 'saved' | 'editing' | 'saving';
 
 interface Props {
   status: EditStatus;
@@ -37,10 +37,10 @@ export function SaveStatus(props: Props) {
   return (
     <Base>
       <Switch fallback={<BiRegularCheck size={20} />}>
-        <Match when={props.status === "editing"}>
+        <Match when={props.status === 'editing'}>
           <BiSolidPencil size={20} />
         </Match>
-        <Match when={props.status === "saving"}>
+        <Match when={props.status === 'saving'}>
           <BiRegularCloudUpload size={20} />
         </Match>
       </Switch>
diff --git a/packages/client/components/ui/components/design/atoms/indicators/Unreads.stories.tsx b/packages/client/components/ui/components/design/atoms/indicators/Unreads.stories.tsx
index 18040a736..97dd6b816 100644
--- a/packages/client/components/ui/components/design/atoms/indicators/Unreads.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/indicators/Unreads.stories.tsx
@@ -1,25 +1,24 @@
-import type { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import makeSvgDecorator from "../../../../decorators/SvgDecorator";
-import type { ComponentStory } from "../../../stories";
-
-import { UnreadsGraphic } from "./Unreads";
+import makeSvgDecorator from '../../../../decorators/SvgDecorator';
+import type { ComponentStory } from '../../../stories';
+import { UnreadsGraphic } from './Unreads';
 
 export default {
-  category: "Design System/Atoms/Indicators",
+  category: 'Design System/Atoms/Indicators',
   component: UnreadsGraphic,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
     },
     {
-      title: "With Count",
+      title: 'With Count',
       props: {
         count: 3,
       },
     },
     {
-      title: "Overflow Count",
+      title: 'Overflow Count',
       props: {
         count: 10,
       },
@@ -30,8 +29,8 @@ export default {
   },
   decorators: [makeSvgDecorator(32, 128)],
   propTypes: {
-    unread: "boolean",
-    count: "number",
+    unread: 'boolean',
+    count: 'number',
   },
 } as ComponentStory<
   typeof UnreadsGraphic,
diff --git a/packages/client/components/ui/components/design/atoms/indicators/Unreads.tsx b/packages/client/components/ui/components/design/atoms/indicators/Unreads.tsx
index bc2d7a51b..c3ee0f88f 100644
--- a/packages/client/components/ui/components/design/atoms/indicators/Unreads.tsx
+++ b/packages/client/components/ui/components/design/atoms/indicators/Unreads.tsx
@@ -1,27 +1,26 @@
-import { Match, Switch } from "solid-js";
-import { useTheme } from "solid-styled-components";
+import { Match, Switch } from 'solid-js';
+import { useTheme } from 'solid-styled-components';
+import { styled } from 'styled-system/jsx';
 
-import { styled } from "styled-system/jsx";
-
-export type Props = {
+export interface Props {
   unread: boolean;
   count: number;
-};
+}
 
 /**
  * Styles for the counter
  */
-const UnreadCounter = styled("div", {
+const UnreadCounter = styled('div', {
   base: {
-    width: "10px",
-    height: "10px",
-    marginTop: "-1px",
-    textAlign: "center",
+    width: '10px',
+    height: '10px',
+    marginTop: '-1px',
+    textAlign: 'center',
 
-    fontSize: "8px",
+    fontSize: '8px',
     fontWeight: 600,
 
-    color: "var(--customColours-error-onColor)",
+    color: 'var(--customColours-error-onColor)',
   },
 });
 
@@ -34,13 +33,13 @@ export function UnreadsGraphic(props: Props) {
   return (
     <Switch>
       <Match when={props.count > 0}>
-        <circle cx="27" cy="5" r="5" fill={theme!.customColours.error.color} />
-        <foreignObject x="22" y="0" width="10" height="10">
-          <UnreadCounter>{props.count < 10 ? props.count : "9+"}</UnreadCounter>
+        <circle cx='27' cy='5' r='5' fill={theme!.customColours.error.color} />
+        <foreignObject x='22' y='0' width='10' height='10'>
+          <UnreadCounter>{props.count < 10 ? props.count : '9+'}</UnreadCounter>
         </foreignObject>
       </Match>
       <Match when={props.unread}>
-        <circle cx="27" cy="5" r="5" fill={theme!.colours.foreground} />
+        <circle cx='27' cy='5' r='5' fill={theme!.colours.foreground} />
       </Match>
     </Switch>
   );
@@ -51,7 +50,7 @@ export function UnreadsGraphic(props: Props) {
  */
 export function Unreads(props: Props & { size: string }) {
   return (
-    <svg viewBox="22 0 10 10" height={props.size}>
+    <svg viewBox='22 0 10 10' height={props.size}>
       <UnreadsGraphic {...props} />
     </svg>
   );
diff --git a/packages/client/components/ui/components/design/atoms/indicators/UserStatus.stories.tsx b/packages/client/components/ui/components/design/atoms/indicators/UserStatus.stories.tsx
index 536f9c72f..1353adf77 100644
--- a/packages/client/components/ui/components/design/atoms/indicators/UserStatus.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/indicators/UserStatus.stories.tsx
@@ -1,48 +1,47 @@
-import type { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import makeSvgDecorator from "../../../../decorators/SvgDecorator";
-import type { ComponentStory } from "../../../stories";
-
-import { UserStatusGraphic } from "./UserStatus";
+import makeSvgDecorator from '../../../../decorators/SvgDecorator';
+import type { ComponentStory } from '../../../stories';
+import { UserStatusGraphic } from './UserStatus';
 
 export default {
-  category: "Design System/Atoms/Indicators",
+  category: 'Design System/Atoms/Indicators',
   component: UserStatusGraphic,
   stories: [
     {
-      title: "Online",
+      title: 'Online',
     },
     {
-      title: "Idle",
+      title: 'Idle',
       props: {
-        status: "Idle",
+        status: 'Idle',
       },
     },
     {
-      title: "Busy",
+      title: 'Busy',
       props: {
-        status: "Busy",
+        status: 'Busy',
       },
     },
     {
-      title: "Focus",
+      title: 'Focus',
       props: {
-        status: "Focus",
+        status: 'Focus',
       },
     },
     {
-      title: "Invisible",
+      title: 'Invisible',
       props: {
-        status: "Invisible",
+        status: 'Invisible',
       },
     },
   ],
   props: {
-    status: "Online",
+    status: 'Online',
   },
   decorators: [makeSvgDecorator(32, 128)],
   propTypes: {
-    status: "string",
+    status: 'string',
   },
 } as ComponentStory<
   typeof UserStatusGraphic,
diff --git a/packages/client/components/ui/components/design/atoms/indicators/UserStatus.tsx b/packages/client/components/ui/components/design/atoms/indicators/UserStatus.tsx
index 036717069..a158ffb7a 100644
--- a/packages/client/components/ui/components/design/atoms/indicators/UserStatus.tsx
+++ b/packages/client/components/ui/components/design/atoms/indicators/UserStatus.tsx
@@ -1,14 +1,13 @@
-import { useTheme } from "solid-styled-components";
+import type { API } from 'revolt.js';
+import { useTheme } from 'solid-styled-components';
 
-import type { API } from "revolt.js";
-
-export type Props = {
+export interface Props {
   /**
    * User we are dealing with
    * @default Invisible
    */
   status?: API.Presence;
-};
+}
 
 /**
  * Overlays user status in current SVG
@@ -19,15 +18,15 @@ export const UserStatusGraphic = (props: Props) => {
   /**
    * Convert status to lower case
    */
-  const statusLowercase = () => props.status?.toLowerCase() ?? "invisible";
+  const statusLowercase = () => props.status?.toLowerCase() ?? 'invisible';
 
   return (
     <circle
-      cx="27"
-      cy="27"
-      r="5"
+      cx='27'
+      cy='27'
+      r='5'
       fill={
-        theme.customColours[`status-${statusLowercase() as "online"}`].color
+        theme.customColours[`status-${statusLowercase() as 'online'}`].color
       }
       mask={`url(#accessible-status-${statusLowercase()})`}
     />
@@ -39,7 +38,7 @@ export const UserStatusGraphic = (props: Props) => {
  */
 export function UserStatus(props: Props & { size: string }) {
   return (
-    <svg viewBox="22 22 10 10" height={props.size}>
+    <svg viewBox='22 22 10 10' height={props.size}>
       <UserStatusGraphic {...props} />
     </svg>
   );
diff --git a/packages/client/components/ui/components/design/atoms/indicators/index.tsx b/packages/client/components/ui/components/design/atoms/indicators/index.tsx
index 439bc0036..3d6282b13 100644
--- a/packages/client/components/ui/components/design/atoms/indicators/index.tsx
+++ b/packages/client/components/ui/components/design/atoms/indicators/index.tsx
@@ -1,7 +1,7 @@
-export { MessageDivider } from "./MessageDivider";
-export { BlockedMessage } from "./BlockedMessage";
-export { Preloader } from "./Preloader";
-export { SaveStatus } from "./SaveStatus";
-export { UnreadsGraphic, Unreads } from "./Unreads";
-export { UserStatusGraphic, UserStatus } from "./UserStatus";
-export { ConversationStart } from "./ConversationStart";
+export { BlockedMessage } from './BlockedMessage';
+export { ConversationStart } from './ConversationStart';
+export { MessageDivider } from './MessageDivider';
+export { Preloader } from './Preloader';
+export { SaveStatus } from './SaveStatus';
+export { Unreads, UnreadsGraphic } from './Unreads';
+export { UserStatus, UserStatusGraphic } from './UserStatus';
diff --git a/packages/client/components/ui/components/design/atoms/inputs/Button.story.tsx b/packages/client/components/ui/components/design/atoms/inputs/Button.story.tsx
index f47dadc71..889d2f8b8 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/Button.story.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/Button.story.tsx
@@ -1,23 +1,22 @@
-import type { ComponentProps } from "solid-js";
+import type { Meta, StoryObj } from '@storybook/html';
+import type { ComponentProps } from 'solid-js';
 
-import type { Meta, StoryObj } from "@storybook/html";
-
-import { Button } from "./Button";
+import { Button } from './Button';
 
 type Story = StoryObj<ComponentProps<typeof Button>>;
 
 export default {
-  title: "Design System/Atoms/Inputs/Button",
-  tags: ["autodocs"],
+  title: 'Design System/Atoms/Inputs/Button',
+  tags: ['autodocs'],
   render: (props: any) => <Button {...props} />,
   argTypes: {
     size: {
-      options: ["normal", "icon", "fluid"],
-      control: { type: "radio" },
+      options: ['normal', 'icon', 'fluid'],
+      control: { type: 'radio' },
     },
     variant: {
-      options: ["primary", "secondary", "plain", "success", "warning", "error"],
-      control: { type: "radio" },
+      options: ['primary', 'secondary', 'plain', 'success', 'warning', 'error'],
+      control: { type: 'radio' },
     },
   },
 } as Meta<ComponentProps<typeof Button>>;
@@ -25,55 +24,55 @@ export default {
 export const Primary: Story = {
   args: {
     children: "Hello, I'm a button!",
-    size: "normal",
-    variant: "primary",
+    size: 'normal',
+    variant: 'primary',
   },
 };
 
 export const Secondary: Story = {
   args: {
-    children: "Secondary Style",
-    size: "normal",
-    variant: "secondary",
+    children: 'Secondary Style',
+    size: 'normal',
+    variant: 'secondary',
   },
 };
 
 export const Success: Story = {
   args: {
-    children: "Awesome!",
-    size: "normal",
-    variant: "success",
+    children: 'Awesome!',
+    size: 'normal',
+    variant: 'success',
   },
 };
 
 export const Warning: Story = {
   args: {
-    children: "This looks wrong...",
-    size: "normal",
-    variant: "warning",
+    children: 'This looks wrong...',
+    size: 'normal',
+    variant: 'warning',
   },
 };
 
 export const Error: Story = {
   args: {
-    children: "Stop! Look at me first!",
-    size: "normal",
-    variant: "error",
+    children: 'Stop! Look at me first!',
+    size: 'normal',
+    variant: 'error',
   },
 };
 
 export const Plain: Story = {
   args: {
-    children: "Just some plain old text...",
-    size: "fluid",
-    variant: "plain",
+    children: 'Just some plain old text...',
+    size: 'fluid',
+    variant: 'plain',
   },
 };
 
 export const Icon: Story = {
   args: {
-    children: "🦄",
-    size: "icon",
-    variant: "secondary",
+    children: '🦄',
+    size: 'icon',
+    variant: 'secondary',
   },
 };
diff --git a/packages/client/components/ui/components/design/atoms/inputs/Button.tsx b/packages/client/components/ui/components/design/atoms/inputs/Button.tsx
index 1428a5ddd..60d24766a 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/Button.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/Button.tsx
@@ -1,78 +1,78 @@
-import { splitProps } from "solid-js";
-import { JSX } from "solid-js/jsx-runtime";
-
-import { AriaButtonProps, createButton } from "@solid-aria/button";
-import { cva } from "styled-system/css/cva";
+import type { AriaButtonProps } from '@solid-aria/button';
+import { createButton } from '@solid-aria/button';
+import { splitProps } from 'solid-js';
+import type { JSX } from 'solid-js/jsx-runtime';
+import { cva } from 'styled-system/css/cva';
 
 const button = cva({
   base: {
     flexShrink: 0,
-    display: "flex",
-    alignItems: "center",
-    justifyContent: "center",
+    display: 'flex',
+    alignItems: 'center',
+    justifyContent: 'center',
 
     fontWeight: 500,
-    fontFamily: "inherit",
+    fontFamily: 'inherit',
 
-    cursor: "pointer",
-    border: "none",
-    borderRadius: "var(--borderRadius-xxl)",
-    transition: "var(--transitions-fast) all",
+    cursor: 'pointer',
+    border: 'none',
+    borderRadius: 'var(--borderRadius-xxl)',
+    transition: 'var(--transitions-fast) all',
 
     // "&:hover": {
     //   filter: "brightness(1.2)",
     // },
 
-    "&:disabled": {
-      cursor: "not-allowed",
+    '&:disabled': {
+      cursor: 'not-allowed',
     },
   },
   variants: {
     variant: {
       success: {
-        fill: "var(--customColours-success-onColor)",
-        color: "var(--customColours-success-onColor)",
-        background: "var(--customColours-success-color)",
+        fill: 'var(--customColours-success-onColor)',
+        color: 'var(--customColours-success-onColor)',
+        background: 'var(--customColours-success-color)',
       },
       warning: {
-        fill: "var(--customColours-warning-onColor)",
-        color: "var(--customColours-warning-onColor)",
-        background: "var(--customColours-warning-color)",
+        fill: 'var(--customColours-warning-onColor)',
+        color: 'var(--customColours-warning-onColor)',
+        background: 'var(--customColours-warning-color)',
       },
       error: {
-        fill: "var(--customColours-error-onColor)",
-        color: "var(--customColours-error-onColor)",
-        background: "var(--customColours-error-color)",
+        fill: 'var(--customColours-error-onColor)',
+        color: 'var(--customColours-error-onColor)',
+        background: 'var(--customColours-error-color)',
       },
       primary: {
-        fill: "var(--colours-component-btn-foreground-primary)",
-        color: "var(--colours-component-btn-foreground-primary)",
-        background: "var(--colours-component-btn-background-primary)",
+        fill: 'var(--colours-component-btn-foreground-primary)',
+        color: 'var(--colours-component-btn-foreground-primary)',
+        background: 'var(--colours-component-btn-background-primary)',
       },
       secondary: {
-        fill: "var(--colours-component-btn-foreground-secondary)",
-        color: "var(--colours-component-btn-foreground-secondary)",
-        background: "var(--colours-component-btn-background-secondary)",
+        fill: 'var(--colours-component-btn-foreground-secondary)',
+        color: 'var(--colours-component-btn-foreground-secondary)',
+        background: 'var(--colours-component-btn-background-secondary)',
       },
       plain: {
-        fill: "var(--colours-component-btn-foreground-plain)",
-        color: "var(--colours-component-btn-foreground-plain)",
+        fill: 'var(--colours-component-btn-foreground-plain)',
+        color: 'var(--colours-component-btn-foreground-plain)',
 
-        "&:hover": {
-          textDecoration: "underline",
+        '&:hover': {
+          textDecoration: 'underline',
         },
 
-        "&:disabled": {
-          textDecoration: "none",
+        '&:disabled': {
+          textDecoration: 'none',
         },
       },
     },
     size: {
       normal: {
-        height: "38px",
-        minWidth: "96px",
-        padding: "2px 16px",
-        fontSize: "0.8125rem",
+        height: '38px',
+        minWidth: '96px',
+        padding: '2px 16px',
+        fontSize: '0.8125rem',
       },
       // compact: {
       //   minWidth: "96px",
@@ -81,32 +81,32 @@ const button = cva({
       //   padding: "2px 12px",
       // },
       icon: {
-        width: "38px",
-        height: "38px",
+        width: '38px',
+        height: '38px',
       },
       fab: {
-        width: "42px",
-        height: "42px",
-        borderRadius: "var(--borderRadius-xl)",
+        width: '42px',
+        height: '42px',
+        borderRadius: 'var(--borderRadius-xl)',
       },
       fluid: {
-        borderRadius: "var(--borderRadius-md)",
+        borderRadius: 'var(--borderRadius-md)',
       },
     },
   },
   defaultVariants: {
-    size: "normal",
-    variant: "primary",
+    size: 'normal',
+    variant: 'primary',
   },
 });
 
 export function Button(
   props: Omit<
     Parameters<typeof button>[0] & AriaButtonProps & JSX.DirectiveAttributes,
-    "onClick"
+    'onClick'
   >
 ) {
-  const [style, rest] = splitProps(props, ["size", "variant"]);
+  const [style, rest] = splitProps(props, ['size', 'variant']);
   let ref: HTMLButtonElement | undefined;
 
   const { buttonProps } = createButton(rest, () => ref);
diff --git a/packages/client/components/ui/components/design/atoms/inputs/CategoryButton.tsx b/packages/client/components/ui/components/design/atoms/inputs/CategoryButton.tsx
index cadcd30bf..883f682af 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/CategoryButton.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/CategoryButton.tsx
@@ -1,28 +1,27 @@
-import { For, JSX, Match, Show, Switch } from "solid-js";
-import { styled } from "solid-styled-components";
+import MdChevronRight from '@material-design-icons/svg/outlined/chevron_right.svg?component-solid';
+import MdContentCopy from '@material-design-icons/svg/outlined/content_copy.svg?component-solid';
+import MdKeyboardDown from '@material-design-icons/svg/outlined/keyboard_arrow_down.svg?component-solid';
+import MdOpenInNew from '@material-design-icons/svg/outlined/open_in_new.svg?component-solid';
+import { iconSize } from '@revolt/ui';
+import type { JSX } from 'solid-js';
+import { For, Match, Show, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { iconSize } from "@revolt/ui";
-
-import MdChevronRight from "@material-design-icons/svg/outlined/chevron_right.svg?component-solid";
-import MdContentCopy from "@material-design-icons/svg/outlined/content_copy.svg?component-solid";
-import MdKeyboardDown from "@material-design-icons/svg/outlined/keyboard_arrow_down.svg?component-solid";
-import MdOpenInNew from "@material-design-icons/svg/outlined/open_in_new.svg?component-solid";
-
-import { Column, OverflowingText } from "../../layout";
+import { Column, OverflowingText } from '../../layout';
 
 /**
  * Permissible actions
  */
 type Action =
-  | "chevron"
-  | "collapse"
-  | "external"
-  | "edit"
-  | "copy"
+  | 'chevron'
+  | 'collapse'
+  | 'external'
+  | 'edit'
+  | 'copy'
   | JSX.Element;
 
 export interface Props {
-  readonly icon?: JSX.Element | "blank";
+  readonly icon?: JSX.Element | 'blank';
   readonly children?: JSX.Element;
   readonly description?: JSX.Element;
 
@@ -42,11 +41,11 @@ export function CategoryButton(props: Props) {
       aria-disabled={props.disabled}
       onClick={props.disabled ? undefined : props.onClick}
     >
-      <Show when={props.icon !== "blank"}>
+      <Show when={props.icon !== 'blank'}>
         <IconWrapper>{props.icon}</IconWrapper>
       </Show>
 
-      <Show when={props.icon === "blank"}>
+      <Show when={props.icon === 'blank'}>
         <BlankIconWrapper />
       </Show>
 
@@ -61,22 +60,22 @@ export function CategoryButton(props: Props) {
       <For each={Array.isArray(props.action) ? props.action : [props.action]}>
         {(action) => (
           <Switch fallback={action}>
-            <Match when={action === "chevron"}>
+            <Match when={action === 'chevron'}>
               <Action>
                 <MdChevronRight {...iconSize(18)} />
               </Action>
             </Match>
-            <Match when={action === "collapse"}>
+            <Match when={action === 'collapse'}>
               <Action>
                 <MdKeyboardDown {...iconSize(18)} />
               </Action>
             </Match>
-            <Match when={action === "external"}>
+            <Match when={action === 'external'}>
               <Action>
                 <MdOpenInNew {...iconSize(18)} />
               </Action>
             </Match>
-            <Match when={action === "copy"}>
+            <Match when={action === 'copy'}>
               <Action>
                 <MdContentCopy {...iconSize(18)} />
               </Action>
@@ -91,7 +90,7 @@ export function CategoryButton(props: Props) {
 /**
  * Base container for button
  */
-const Base = styled("a", "CategoryButton")<{
+const Base = styled('a', 'CategoryButton')<{
   isLink: boolean;
   disabled?: boolean;
 }>`
@@ -99,13 +98,13 @@ const Base = styled("a", "CategoryButton")<{
   padding: 13px; /*TODO: make this a prop*/
   border-radius: ${(props) => props.theme!.borderRadius.md};
 
-  color: ${(props) => props.theme!.colours["component-categorybtn-foreground"]};
+  color: ${(props) => props.theme!.colours['component-categorybtn-foreground']};
   background: ${(props) =>
-    props.theme!.colours["component-categorybtn-background"]};
+    props.theme!.colours['component-categorybtn-background']};
 
   user-select: none;
   cursor: ${(props) =>
-    props.disabled ? "not-allowed" : props.isLink ? "pointer" : "initial"};
+    props.disabled ? 'not-allowed' : props.isLink ? 'pointer' : 'initial'};
   transition: background-color 0.1s ease-in-out;
 
   display: flex;
@@ -118,12 +117,12 @@ const Base = styled("a", "CategoryButton")<{
 
   &:hover {
     background-color: ${(props) =>
-      props.theme!.colours["component-categorybtn-background-hover"]};
+      props.theme!.colours['component-categorybtn-background-hover']};
   }
 
   &:active {
     background-color: ${(props) =>
-      props.theme!.colours["component-categorybtn-background-active"]};
+      props.theme!.colours['component-categorybtn-background-active']};
   }
 `;
 
@@ -144,7 +143,7 @@ const Content = styled(Column)`
  */
 const IconWrapper = styled.div`
   background: ${(props) =>
-    props.theme!.colours["component-categorybtn-background-icon"]};
+    props.theme!.colours['component-categorybtn-background-icon']};
 
   width: 36px;
   height: 36px;
@@ -156,7 +155,7 @@ const IconWrapper = styled.div`
 
   svg {
     color: ${(props) =>
-      props.theme!.colours["component-categorybtn-foreground-description"]};
+      props.theme!.colours['component-categorybtn-foreground-description']};
   }
 `;
 
@@ -174,7 +173,7 @@ const Description = styled.span`
   font-weight: 500;
   font-size: 12px;
   color: ${(props) =>
-    props.theme!.colours["component-categorybtn-foreground-description"]};
+    props.theme!.colours['component-categorybtn-foreground-description']};
   text-wrap: wrap;
 
   a:hover {
diff --git a/packages/client/components/ui/components/design/atoms/inputs/CategoryButtonGroup.tsx b/packages/client/components/ui/components/design/atoms/inputs/CategoryButtonGroup.tsx
index 32de7e2ec..0c68856bf 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/CategoryButtonGroup.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/CategoryButtonGroup.tsx
@@ -1,4 +1,4 @@
-import { styled } from "solid-styled-components";
+import { styled } from 'solid-styled-components';
 
 /**
  * Group a set of category buttons (M3+Fluent)
diff --git a/packages/client/components/ui/components/design/atoms/inputs/CategoryCollapse.tsx b/packages/client/components/ui/components/design/atoms/inputs/CategoryCollapse.tsx
index 34d699406..9fa51d192 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/CategoryCollapse.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/CategoryCollapse.tsx
@@ -1,20 +1,13 @@
-import {
-  ComponentProps,
-  JSX,
-  Match,
-  Switch,
-  createSignal,
-  splitProps,
-} from "solid-js";
-import { styled } from "solid-styled-components";
+import type { ComponentProps, JSX } from 'solid-js';
+import { createSignal, Match, splitProps, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { Column } from "../../layout";
-
-import { CategoryButton } from "./CategoryButton";
+import { Column } from '../../layout';
+import { CategoryButton } from './CategoryButton';
 
 type Props = Omit<
   ComponentProps<typeof CategoryButton>,
-  "onClick" | "children"
+  'onClick' | 'children'
 > & {
   children?: JSX.Element;
   title?: JSX.Element;
@@ -26,7 +19,7 @@ type Props = Omit<
  * Category button with collapsed children (Fluent)
  */
 export function CategoryCollapse(props: Props) {
-  const [local, remote] = splitProps(props, ["action", "children"]);
+  const [local, remote] = splitProps(props, ['action', 'children']);
 
   const [opened, setOpened] = createSignal(false);
 
@@ -59,12 +52,12 @@ export function CategoryCollapse(props: Props) {
     <Details
       ref={details!}
       onClick={toggleOpened}
-      class={opened() ? "open" : undefined}
+      class={opened() ? 'open' : undefined}
     >
       <summary>
         <CategoryButton
           {...remote}
-          action={[local.action, "collapse"].flat()}
+          action={[local.action, 'collapse'].flat()}
           onClick={() => void 0}
         >
           {props.title}
@@ -73,7 +66,7 @@ export function CategoryCollapse(props: Props) {
       <Switch
         fallback={
           <StaticInnerColumn
-            gap="xs"
+            gap='xs'
             ref={column!}
             style={{ height: updatedHeight() }}
           >
@@ -83,7 +76,7 @@ export function CategoryCollapse(props: Props) {
       >
         <Match when={props.scrollable}>
           <InnerColumn
-            gap="xs"
+            gap='xs'
             ref={column!}
             style={{ height: updatedHeight() }}
             use:scrollable
@@ -158,7 +151,7 @@ const Details = styled.div`
   > :not(summary) .CategoryButton {
     /* and set child backgrounds */
     background: ${(props) =>
-      props.theme!.colours["component-categorybtn-background-collapse"]};
+      props.theme!.colours['component-categorybtn-background-collapse']};
   }
 
   /*> :not(summary) > :last-child.CategoryButton {
diff --git a/packages/client/components/ui/components/design/atoms/inputs/Checkbox.tsx b/packages/client/components/ui/components/design/atoms/inputs/Checkbox.tsx
index 01bb64fb1..070684c53 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/Checkbox.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/Checkbox.tsx
@@ -1,14 +1,14 @@
-import { BiRegularCheck } from "solid-icons/bi";
-import { createSignal, splitProps } from "solid-js";
-import { styled } from "solid-styled-components";
+import { BiRegularCheck } from 'solid-icons/bi';
+import { createSignal, splitProps } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-export type Props = {
+export interface Props {
   readonly disabled?: boolean;
 
   readonly name?: string;
   readonly value?: boolean;
   readonly onChange?: (state: boolean) => void;
-};
+}
 
 /**
  * Checkbox
@@ -18,14 +18,14 @@ export function Checkbox(props: Props) {
   const checked = () => props.value ?? controlledValue();
 
   return (
-    <Checkmark value={checked()} class="checkmark">
-      <BiRegularCheck size={20} class="check" />
+    <Checkmark value={checked()} class='checkmark'>
+      <BiRegularCheck size={20} class='check' />
       <Input
         name={props.name}
-        type="checkbox"
+        type='checkbox'
         checked={checked()}
         onChange={() =>
-          typeof props.value !== "undefined"
+          typeof props.value !== 'undefined'
             ? !props.disabled && props.onChange?.(!props.value)
             : setControlledValue((v) => !v)
         }
@@ -37,17 +37,17 @@ const Input = styled.input`
   display: none;
 `;
 
-const Checkmark = styled.div<Pick<Props, "value">>`
+const Checkmark = styled.div<Pick<Props, 'value'>>`
   display: flex;
   align-items: center;
   justify-content: center;
   width: 24px;
   height: 24px;
   border: 2px solid
-    ${(props) => props.theme!.colours["component-checkbox-foreground"]};
-  border-radius: ${(props) => props.theme!.borderRadius["md"]};
+    ${(props) => props.theme!.colours['component-checkbox-foreground']};
+  border-radius: ${(props) => props.theme!.borderRadius['md']};
   background: ${(props) =>
-    props.theme!.colours["component-checkbox-background"]};
+    props.theme!.colours['component-checkbox-background']};
   flex-shrink: 0;
   margin: 4px;
   transition: 0.1s ease-in-out all;
@@ -55,7 +55,7 @@ const Checkmark = styled.div<Pick<Props, "value">>`
   .check {
     transition: inherit;
     fill: ${(props) =>
-      props.theme!.colours["component-checkbox-foreground-check"]};
+      props.theme!.colours['component-checkbox-foreground-check']};
     visibility: hidden;
     opacity: 0;
   }
@@ -63,14 +63,14 @@ const Checkmark = styled.div<Pick<Props, "value">>`
   ${(props) =>
     props.value
       ? `
-    border-color: ${props.theme!.colours["component-checkbox-foreground"]};
-    background: ${props.theme!.colours["component-checkbox-foreground"]};
+    border-color: ${props.theme!.colours['component-checkbox-foreground']};
+    background: ${props.theme!.colours['component-checkbox-foreground']};
 
     .check {
       visibility: visible;
       opacity: 1;
-      color: ${props.theme!.colours["component-checkbox-foreground-check"]};
+      color: ${props.theme!.colours['component-checkbox-foreground-check']};
     }
   `
-      : ""}
+      : ''}
 `;
diff --git a/packages/client/components/ui/components/design/atoms/inputs/Chip.tsx b/packages/client/components/ui/components/design/atoms/inputs/Chip.tsx
index 6c01ab16d..e15d03d2f 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/Chip.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/Chip.tsx
@@ -1,7 +1,7 @@
-import { styled } from "solid-styled-components";
+import { styled } from 'solid-styled-components';
 
-import { Row } from "../../layout";
-import { generateTypographyCSS } from "../display/Typography";
+import { Row } from '../../layout';
+import { generateTypographyCSS } from '../display/Typography';
 
 /**
  * Chip (M3)
@@ -9,10 +9,10 @@ import { generateTypographyCSS } from "../display/Typography";
 export const Chip = styled(Row)`
   align-items: center;
   flex-shrink: 0;
-  ${(props) => generateTypographyCSS(props.theme!, "chip")}
+  ${(props) => generateTypographyCSS(props.theme!, 'chip')}
 
   gap: ${(props) => props.theme!.gap.s};
   border-radius: ${(props) => props.theme!.borderRadius.md};
-  background: ${(props) => props.theme!.colours["component-chip-background"]};
+  background: ${(props) => props.theme!.colours['component-chip-background']};
   padding: ${(props) => props.theme!.gap.sm} ${(props) => props.theme!.gap.s};
 `;
diff --git a/packages/client/components/ui/components/design/atoms/inputs/ColourSwatches.stories.tsx b/packages/client/components/ui/components/design/atoms/inputs/ColourSwatches.stories.tsx
index bfe8b1f3a..8c8fadf97 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/ColourSwatches.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/ColourSwatches.stories.tsx
@@ -1,30 +1,29 @@
-import type { ComponentStory } from "../../../stories";
-
-import { ColourSwatches } from "./ColourSwatches";
+import type { ComponentStory } from '../../../stories';
+import { ColourSwatches } from './ColourSwatches';
 
 export default {
-  category: "Design System/Atoms/Inputs",
+  category: 'Design System/Atoms/Inputs',
   component: ColourSwatches,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
       props: {
-        value: "#FD6671",
+        value: '#FD6671',
       },
     },
     {
-      title: "Default (Different Palette)",
+      title: 'Default (Different Palette)',
       props: {
-        value: "#cc6",
+        value: '#cc6',
         presets: [
-          ["#cc6", "#000", "#f55", "#a88"],
-          ["#bc2", "#aa5", "#fb8", "#16d"],
+          ['#cc6', '#000', '#f55', '#a88'],
+          ['#bc2', '#aa5', '#fb8', '#16d'],
         ],
       },
     },
   ],
   propTypes: {
-    value: "string",
-    onChange: "function",
+    value: 'string',
+    onChange: 'function',
   },
 } as ComponentStory<typeof ColourSwatches>;
diff --git a/packages/client/components/ui/components/design/atoms/inputs/ColourSwatches.tsx b/packages/client/components/ui/components/design/atoms/inputs/ColourSwatches.tsx
index 5d5e42f75..fb64794dc 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/ColourSwatches.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/ColourSwatches.tsx
@@ -1,6 +1,6 @@
-import { BiRegularCheck, BiSolidPalette } from "solid-icons/bi";
-import { For, Show, createSignal, splitProps } from "solid-js";
-import { styled } from "solid-styled-components";
+import { BiRegularCheck, BiSolidPalette } from 'solid-icons/bi';
+import { createSignal, For, Show, splitProps } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
 interface Props {
   readonly presets?: string[][];
@@ -9,30 +9,30 @@ interface Props {
 }
 
 interface SwatchProps {
-  type: "small" | "large";
+  type: 'small' | 'large';
   colour: string;
 }
 
 const DEFAULT_PRESETS = [
   [
-    "#7B68EE",
-    "#3498DB",
-    "#1ABC9C",
-    "#F1C40F",
-    "#FF7F50",
-    "#FD6671",
-    "#E91E63",
-    "#D468EE",
+    '#7B68EE',
+    '#3498DB',
+    '#1ABC9C',
+    '#F1C40F',
+    '#FF7F50',
+    '#FD6671',
+    '#E91E63',
+    '#D468EE',
   ],
   [
-    "#594CAD",
-    "#206694",
-    "#11806A",
-    "#C27C0E",
-    "#CD5B45",
-    "#FF424F",
-    "#AD1457",
-    "#954AA8",
+    '#594CAD',
+    '#206694',
+    '#11806A',
+    '#C27C0E',
+    '#CD5B45',
+    '#FF424F',
+    '#AD1457',
+    '#954AA8',
   ],
 ];
 
@@ -84,7 +84,7 @@ const Swatch = styled.div<SwatchProps>`
   }
 
   ${(props) =>
-    props.type === "small"
+    props.type === 'small'
       ? `
           height: 30px;
           width: 30px;
@@ -111,29 +111,29 @@ const Rows = styled.div`
 `;
 
 export function ColourSwatches(props: Props) {
-  let inputRef: HTMLInputElement | null = null!;
-  const [local, others] = splitProps(props, ["onChange", "presets", "value"]);
+  const inputRef: HTMLInputElement | null = null!;
+  const [local, others] = splitProps(props, ['onChange', 'presets', 'value']);
   const [controlledValue, setControlledValue] = createSignal<string>(
-    local.value || "#FD6671"
+    local.value || '#FD6671'
   );
 
   return (
     <Base {...others}>
       <input
         ref={inputRef}
-        type="color"
+        type='color'
         value={controlledValue()}
         onChange={(ev) => setControlledValue(ev.currentTarget.value)}
       />
       <Swatch
         colour={controlledValue()}
-        type="large"
+        type='large'
         onClick={() => inputRef!.click()}
       >
         <BiSolidPalette size={32} />
       </Swatch>
 
-      <div class="overlay">
+      <div class='overlay'>
         <div />
       </div>
       <Rows>
@@ -144,7 +144,7 @@ export function ColourSwatches(props: Props) {
                 {(swatch) => (
                   <Swatch
                     colour={swatch}
-                    type="small"
+                    type='small'
                     onClick={() => setControlledValue(swatch)}
                   >
                     <Show when={swatch === controlledValue()}>
diff --git a/packages/client/components/ui/components/design/atoms/inputs/ComboBox.stories.tsx b/packages/client/components/ui/components/design/atoms/inputs/ComboBox.stories.tsx
index 285be0558..ec085eb81 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/ComboBox.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/ComboBox.stories.tsx
@@ -1,13 +1,12 @@
-import type { ComponentStory } from "../../../stories";
-
-import { ComboBox } from "./ComboBox";
+import type { ComponentStory } from '../../../stories';
+import { ComboBox } from './ComboBox';
 
 export default {
-  category: "Design System/Atoms/Inputs",
+  category: 'Design System/Atoms/Inputs',
   component: ComboBox,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
     },
   ],
   props: {
diff --git a/packages/client/components/ui/components/design/atoms/inputs/ComboBox.tsx b/packages/client/components/ui/components/design/atoms/inputs/ComboBox.tsx
index a8ed1124b..16100272c 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/ComboBox.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/ComboBox.tsx
@@ -1,9 +1,9 @@
-import { styled } from "solid-styled-components";
+import { styled } from 'solid-styled-components';
 
 /**
  * Dropdown element
  */
-export const ComboBox = styled("select")`
+export const ComboBox = styled('select')`
   padding: 4px;
   height: fit-content;
 
@@ -11,19 +11,19 @@ export const ComboBox = styled("select")`
   font-size: 0.9375rem;
   font-family: inherit;
 
-  color: ${({ theme }) => theme!.colours["component-combo-foreground"]};
-  background: ${({ theme }) => theme!.colours["component-combo-background"]};
+  color: ${({ theme }) => theme!.colours['component-combo-foreground']};
+  background: ${({ theme }) => theme!.colours['component-combo-background']};
 
   box-sizing: border-box;
   border-radius: ${({ theme }) => theme!.borderRadius.md};
   border: 2px solid
-    ${({ theme }) => theme!.colours["component-combo-foreground"]};
+    ${({ theme }) => theme!.colours['component-combo-foreground']};
 
   outline: none;
   cursor: pointer;
 
   &:focus-visible {
     box-shadow: 0 0 0 1.5pt
-      ${({ theme }) => theme!.colours["component-combo-focus"]};
+      ${({ theme }) => theme!.colours['component-combo-focus']};
   }
 `; // TODO: re-do this and Input to work like Button
diff --git a/packages/client/components/ui/components/design/atoms/inputs/Input.stories.tsx b/packages/client/components/ui/components/design/atoms/inputs/Input.stories.tsx
index de0fada0e..bb4bd71f4 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/Input.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/Input.stories.tsx
@@ -1,60 +1,59 @@
-import type { ComponentStory } from "../../../stories";
-
-import { Input } from "./Input";
+import type { ComponentStory } from '../../../stories';
+import { Input } from './Input';
 
 export default {
-  category: "Design System/Atoms/Inputs",
+  category: 'Design System/Atoms/Inputs',
   component: Input,
   stories: [
     {
-      title: "Primary",
+      title: 'Primary',
       props: {
-        palette: "primary",
+        palette: 'primary',
       },
     },
     {
-      title: "Secondary",
+      title: 'Secondary',
       props: {
-        palette: "secondary",
+        palette: 'secondary',
       },
     },
     {
-      title: "Primary (Disabled)",
+      title: 'Primary (Disabled)',
       props: {
-        palette: "primary",
+        palette: 'primary',
         disabled: true,
       },
     },
     {
-      title: "Secondary (Disabled)",
+      title: 'Secondary (Disabled)',
       props: {
-        palette: "secondary",
+        palette: 'secondary',
         disabled: true,
       },
     },
     {
-      title: "Primary (Placeholder)",
+      title: 'Primary (Placeholder)',
       props: {
-        palette: "secondary",
-        value: "",
-        placeholder: "Placeholder text",
+        palette: 'secondary',
+        value: '',
+        placeholder: 'Placeholder text',
       },
     },
     {
-      title: "Secondary (Placeholder)",
+      title: 'Secondary (Placeholder)',
       props: {
-        palette: "secondary",
-        value: "",
-        placeholder: "Placeholder text",
+        palette: 'secondary',
+        value: '',
+        placeholder: 'Placeholder text',
       },
     },
   ],
   props: {
-    value: "I am an input...",
+    value: 'I am an input...',
   },
   propTypes: {
-    palette: ["primary", "secondary"],
-    value: "string",
-    placeholder: "string",
+    palette: ['primary', 'secondary'],
+    value: 'string',
+    placeholder: 'string',
   },
 } as ComponentStory<typeof Input>;
diff --git a/packages/client/components/ui/components/design/atoms/inputs/Input.tsx b/packages/client/components/ui/components/design/atoms/inputs/Input.tsx
index 153a4d15b..4e677b85c 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/Input.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/Input.tsx
@@ -1,10 +1,10 @@
-import { styled } from "solid-styled-components";
+import { styled } from 'solid-styled-components';
 
 export interface Props {
   /**
    * Colour scheme
    */
-  readonly palette?: "primary" | "secondary";
+  readonly palette?: 'primary' | 'secondary';
 
   /**
    * Whether a submission has been tried and errors should display on the input
@@ -15,7 +15,7 @@ export interface Props {
 /**
  * Input element
  */
-export const Input = styled("input")<Props>`
+export const Input = styled('input')<Props>`
   width: 100%;
   margin: 0.2em 0;
   padding: 0.75em 1em;
@@ -36,27 +36,27 @@ export const Input = styled("input")<Props>`
 
   &:focus-visible {
     box-shadow: 0 0 0 1.5pt
-      ${({ theme }) => theme!.colours["component-input-focus"]};
+      ${({ theme }) => theme!.colours['component-input-focus']};
   }
 
-  color: ${(props) => props.theme!.colours["component-input-foreground"]};
+  color: ${(props) => props.theme!.colours['component-input-foreground']};
 
   background: ${(props) =>
     props.theme!.colours[
-      `component-input-background-${props.palette ?? "primary"}`
+      `component-input-background-${props.palette ?? 'primary'}`
     ]};
 
   &:hover {
     background: ${(props) =>
       props.theme!.colours[
-        `component-input-hover-${props.palette ?? "primary"}`
+        `component-input-hover-${props.palette ?? 'primary'}`
       ]};
   }
 
   ${(props) =>
     props.submissionTried
       ? `&:invalid { border-color: ${props.theme!.customColours.error.color}; }`
-      : ""}
+      : ''}
 
   &:focus {
     outline-offset: 4px;
@@ -75,15 +75,15 @@ export const Input = styled("input")<Props>`
     -webkit-box-shadow: 0 0 0 30px
       ${(props) =>
         props.theme!.colours[
-          `component-input-background-${props.palette ?? "primary"}`
+          `component-input-background-${props.palette ?? 'primary'}`
         ]}
       inset !important;
   }
 
   &:-webkit-autofill {
     caret-color: ${(props) =>
-      props.theme!.colours["component-input-foreground"]} !important;
+      props.theme!.colours['component-input-foreground']} !important;
     -webkit-text-fill-color: ${(props) =>
-      props.theme!.colours["component-input-foreground"]} !important;
+      props.theme!.colours['component-input-foreground']} !important;
   }
 `;
diff --git a/packages/client/components/ui/components/design/atoms/inputs/LegacyCheckbox.stories.tsx b/packages/client/components/ui/components/design/atoms/inputs/LegacyCheckbox.stories.tsx
index ff557e12e..59403060a 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/LegacyCheckbox.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/LegacyCheckbox.stories.tsx
@@ -1,31 +1,30 @@
-import type { ComponentStory } from "../../../stories";
-
-import { LegacyCheckbox } from "./LegacyCheckbox";
+import type { ComponentStory } from '../../../stories';
+import { LegacyCheckbox } from './LegacyCheckbox';
 
 export default {
-  category: "Design System/Atoms/Inputs",
+  category: 'Design System/Atoms/Inputs',
   component: LegacyCheckbox,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
     },
     {
-      title: "Checked",
+      title: 'Checked',
       props: {
         value: true,
       },
     },
   ],
   props: {
-    title: "Do you want this enabled?",
-    description: "This will enable this specific thing for you.",
+    title: 'Do you want this enabled?',
+    description: 'This will enable this specific thing for you.',
   },
   propTypes: {
-    title: "string",
-    description: "string",
-    disabled: "boolean",
-    value: "boolean",
-    onChange: "function",
+    title: 'string',
+    description: 'string',
+    disabled: 'boolean',
+    value: 'boolean',
+    onChange: 'function',
   },
   effects: {
     onChange: (props) => ({
diff --git a/packages/client/components/ui/components/design/atoms/inputs/LegacyCheckbox.tsx b/packages/client/components/ui/components/design/atoms/inputs/LegacyCheckbox.tsx
index 5c31226d7..0fb0e7ca1 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/LegacyCheckbox.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/LegacyCheckbox.tsx
@@ -1,15 +1,16 @@
-import { BiRegularCheck } from "solid-icons/bi";
-import { JSX, Show, createSignal, splitProps } from "solid-js";
-import { styled } from "solid-styled-components";
+import { BiRegularCheck } from 'solid-icons/bi';
+import type { JSX } from 'solid-js';
+import { createSignal, Show, splitProps } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-const Base = styled("label")`
+const Base = styled('label')`
   gap: 10px;
   padding: 4px;
   display: flex;
   cursor: pointer;
   user-select: none;
   align-items: center;
-  border-radius: ${(props) => props.theme!.borderRadius["md"]};
+  border-radius: ${(props) => props.theme!.borderRadius['md']};
   transition: 0.1s ease background-color;
 
   input {
@@ -42,7 +43,7 @@ const TitleContent = styled.div`
   display: flex;
   align-items: center;
   gap: 8px;
-  color: ${(props) => props.theme!.colours["foreground"]};
+  color: ${(props) => props.theme!.colours['foreground']};
 `;
 
 const Title = styled.div`
@@ -64,14 +65,14 @@ const Description = styled.div`
   overflow: hidden;
 `;
 
-const Checkmark = styled.div<Pick<Props, "value">>`
+const Checkmark = styled.div<Pick<Props, 'value'>>`
   display: flex;
   align-items: center;
   justify-content: center;
   width: 24px;
   height: 24px;
   border: 2px solid var(--unset-fg);
-  border-radius: ${(props) => props.theme!.borderRadius["md"]};
+  border-radius: ${(props) => props.theme!.borderRadius['md']};
   background: var(--unset-bg);
   flex-shrink: 0;
   margin: 4px;
@@ -96,7 +97,7 @@ const Checkmark = styled.div<Pick<Props, "value">>`
       color: var(--accent-contrast);
     }
   `
-      : ""}
+      : ''}
 `;
 
 export type Props = {
@@ -110,17 +111,17 @@ export type Props = {
   readonly onChange?: (state: boolean) => void;
 } & Omit<
   JSX.LabelHTMLAttributes<HTMLLabelElement>,
-  "value" | "children" | "onChange" | "title"
+  'value' | 'children' | 'onChange' | 'title'
 >;
 
 export function LegacyCheckbox(props: Props) {
   const [local, others] = splitProps(props, [
-    "disabled",
-    "title",
-    "description",
-    "name",
-    "value",
-    "onChange",
+    'disabled',
+    'title',
+    'description',
+    'name',
+    'value',
+    'onChange',
   ]);
 
   const [controlledValue, setControlledValue] = createSignal(false);
@@ -140,16 +141,16 @@ export function LegacyCheckbox(props: Props) {
       </Content>
       <input
         name={local.name}
-        type="checkbox"
+        type='checkbox'
         checked={checked()}
         onChange={() =>
-          typeof local.value !== "undefined"
+          typeof local.value !== 'undefined'
             ? !local.disabled && local.onChange?.(!local.value)
             : setControlledValue((v) => !v)
         }
       />
-      <Checkmark value={checked()} class="checkmark">
-        <BiRegularCheck size={20} class="check" />
+      <Checkmark value={checked()} class='checkmark'>
+        <BiRegularCheck size={20} class='check' />
       </Checkmark>
     </Base>
   );
diff --git a/packages/client/components/ui/components/design/atoms/inputs/MenuButton.stories.tsx b/packages/client/components/ui/components/design/atoms/inputs/MenuButton.stories.tsx
index 2038d7e75..70d5f0a16 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/MenuButton.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/MenuButton.stories.tsx
@@ -1,76 +1,75 @@
-import { BiSolidUser } from "solid-icons/bi";
+import { BiSolidUser } from 'solid-icons/bi';
 
-import type { ComponentStory } from "../../../stories";
-
-import { MenuButton } from "./MenuButton";
+import type { ComponentStory } from '../../../stories';
+import { MenuButton } from './MenuButton';
 
 export default {
-  category: "Design System/Atoms/Inputs",
+  category: 'Design System/Atoms/Inputs',
   component: MenuButton,
   stories: [
     {
-      title: "Thin (default, active)",
+      title: 'Thin (default, active)',
       props: {
-        attention: "active",
+        attention: 'active',
       },
     },
     {
-      title: "Normal",
+      title: 'Normal',
       props: {
-        size: "normal",
+        size: 'normal',
       },
     },
     {
-      title: "Normal (selected)",
+      title: 'Normal (selected)',
       props: {
-        size: "normal",
-        attention: "selected",
+        size: 'normal',
+        attention: 'selected',
       },
     },
     {
-      title: "Normal (active)",
+      title: 'Normal (active)',
       props: {
-        size: "normal",
-        attention: "active",
+        size: 'normal',
+        attention: 'active',
       },
     },
     {
-      title: "Normal (muted)",
+      title: 'Normal (muted)',
       props: {
-        size: "normal",
-        attention: "muted",
+        size: 'normal',
+        attention: 'muted',
       },
     },
     {
-      title: "Normal (active, alert)",
+      title: 'Normal (active, alert)',
       props: {
-        size: "normal",
-        attention: "active",
+        size: 'normal',
+        attention: 'active',
         alert: true,
       },
     },
     {
-      title: "Normal (active, alert=1)",
+      title: 'Normal (active, alert=1)',
       props: {
-        size: "normal",
-        attention: "active",
+        size: 'normal',
+        attention: 'active',
         alert: 1,
       },
     },
     {
-      title: "Normal (active, icon)",
+      title: 'Normal (active, icon)',
       props: {
-        size: "normal",
-        attention: "active",
+        size: 'normal',
+        attention: 'active',
         icon: <BiSolidUser size={16} />,
-        children: "User Settings",
+        children: 'User Settings',
       },
     },
   ],
   props: {
-    children: "Menu Item",
+    children: 'Menu Item',
   },
   propTypes: {
-    children: "string",
+    children: 'string',
   },
 } as ComponentStory<typeof MenuButton>;
diff --git a/packages/client/components/ui/components/design/atoms/inputs/MenuButton.tsx b/packages/client/components/ui/components/design/atoms/inputs/MenuButton.tsx
index 97caf0007..68d36b5d6 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/MenuButton.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/MenuButton.tsx
@@ -1,23 +1,23 @@
-import { ComponentProps, JSX, Show, splitProps } from "solid-js";
+import type { ComponentProps, JSX } from 'solid-js';
+import { Show, splitProps } from 'solid-js';
+import { cva } from 'styled-system/css';
+import { styled } from 'styled-system/jsx';
 
-import { cva } from "styled-system/css";
-import { styled } from "styled-system/jsx";
+import type { Row } from '../../layout';
+import { Unreads } from '../indicators';
 
-import { Row } from "../../layout";
-import { Unreads } from "../indicators";
-
-export type Props = {
+export interface Props {
   /**
    * Button size
    * @default thin
    */
-  readonly size?: "thin" | "normal";
+  readonly size?: 'thin' | 'normal';
 
   /**
    * Button attention
    * @default normal
    */
-  readonly attention?: "muted" | "normal" | "active" | "selected";
+  readonly attention?: 'muted' | 'normal' | 'active' | 'selected';
 
   /**
    * Button icon
@@ -38,7 +38,7 @@ export type Props = {
    * Hover actions
    */
   readonly actions?: JSX.Element;
-};
+}
 
 /**
  * Top-level container
@@ -48,70 +48,70 @@ const base = cva({
     flexShrink: 0,
 
     fontWeight: 500,
-    fontSize: "15px",
-    userSelect: "none",
+    fontSize: '15px',
+    userSelect: 'none',
 
-    display: "flex",
-    margin: "0 var(--gap-lg)",
-    padding: "0 var(--gap-md)",
-    borderRadius: "var(--borderRadius-md)",
+    display: 'flex',
+    margin: '0 var(--gap-lg)',
+    padding: '0 var(--gap-md)',
+    borderRadius: 'var(--borderRadius-md)',
 
-    "& > svg": {
-      alignSelf: "center",
+    '& > svg': {
+      alignSelf: 'center',
     },
   },
   variants: {
     size: {
       normal: {
-        height: "42px",
-        gap: "var(--gap-md)",
+        height: '42px',
+        gap: 'var(--gap-md)',
       },
       thin: {
-        height: "32px",
-        gap: "var(--gap-sm)",
+        height: '32px',
+        gap: 'var(--gap-sm)',
 
         // implicitly align center since we won't stack anything
-        alignItems: "center",
+        alignItems: 'center',
       },
     },
     attention: {
       normal: {
-        color: "var(--colours-component-menubtn-default-foreground)",
-        background: "var(--colours-component-menubtn-default-background)",
+        color: 'var(--colours-component-menubtn-default-foreground)',
+        background: 'var(--colours-component-menubtn-default-background)',
       },
       muted: {
-        color: "var(--colours-component-menubtn-muted-foreground)",
-        background: "var(--colours-component-menubtn-muted-background)",
+        color: 'var(--colours-component-menubtn-muted-foreground)',
+        background: 'var(--colours-component-menubtn-muted-background)',
       },
       active: {
-        color: "var(--colours-component-menubtn-selected-foreground)",
-        background: "var(--colours-component-menubtn-default-background)",
+        color: 'var(--colours-component-menubtn-selected-foreground)',
+        background: 'var(--colours-component-menubtn-default-background)',
       },
       selected: {
-        color: "var(--colours-component-menubtn-selected-foreground)",
-        background: "var(--colours-component-menubtn-selected-background)",
+        color: 'var(--colours-component-menubtn-selected-foreground)',
+        background: 'var(--colours-component-menubtn-selected-background)',
       },
     },
     hasActions: {
       no: {},
       yes: {
-        "&:hover :last-child": {
-          display: "flex",
+        '&:hover :last-child': {
+          display: 'flex',
         },
       },
     },
   },
   defaultVariants: {
-    size: "normal",
-    attention: "normal",
-    hasActions: "no",
+    size: 'normal',
+    attention: 'normal',
+    hasActions: 'no',
   },
 });
 
 /**
  * Textual content
  */
-const Content = styled("div", {
+const Content = styled('div', {
   base: {
     flexGrow: 1,
     minWidth: 0,
@@ -121,14 +121,14 @@ const Content = styled("div", {
 /**
  * Right-side actions
  */
-const Actions = styled("div", {
+const Actions = styled('div', {
   base: {
-    alignSelf: "center",
+    alignSelf: 'center',
 
-    display: "none",
-    alignItems: "center",
-    flexDirection: "row",
-    gap: "var(--gap-sm)",
+    display: 'none',
+    alignItems: 'center',
+    flexDirection: 'row',
+    gap: 'var(--gap-sm)',
   },
 });
 
@@ -137,12 +137,12 @@ const Actions = styled("div", {
  */
 export function MenuButton(props: Props & ComponentProps<typeof Row>) {
   const [local, other] = splitProps(props, [
-    "attention",
-    "size",
-    "icon",
-    "children",
-    "alert",
-    "actions",
+    'attention',
+    'size',
+    'icon',
+    'children',
+    'alert',
+    'actions',
   ]);
 
   return (
@@ -152,7 +152,7 @@ export function MenuButton(props: Props & ComponentProps<typeof Row>) {
       class={base({
         attention: local.attention,
         size: local.size,
-        hasActions: local.actions ? "yes" : "no",
+        hasActions: local.actions ? 'yes' : 'no',
       })}
       use:ripple
       // @codegen directives props=other include=floating
@@ -162,8 +162,8 @@ export function MenuButton(props: Props & ComponentProps<typeof Row>) {
       <Content>{local.children}</Content>
       <Show when={local.alert}>
         <Unreads
-          count={typeof local.alert === "number" ? local.alert : 0}
-          size={typeof local.alert === "number" ? "0.85rem" : "0.4rem"}
+          count={typeof local.alert === 'number' ? local.alert : 0}
+          size={typeof local.alert === 'number' ? '0.85rem' : '0.4rem'}
           unread
         />
       </Show>
diff --git a/packages/client/components/ui/components/design/atoms/inputs/OverrideSwitch.stories.tsx b/packages/client/components/ui/components/design/atoms/inputs/OverrideSwitch.stories.tsx
index c9ff114f7..29ec15ecb 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/OverrideSwitch.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/OverrideSwitch.stories.tsx
@@ -1,28 +1,27 @@
-import type { ComponentStory } from "../../../stories";
-
-import { OverrideSwitch } from "./OverrideSwitch";
+import type { ComponentStory } from '../../../stories';
+import { OverrideSwitch } from './OverrideSwitch';
 
 export default {
-  category: "Design System/Atoms/Inputs",
+  category: 'Design System/Atoms/Inputs',
   component: OverrideSwitch,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
     },
     {
-      title: "Disabled",
+      title: 'Disabled',
       props: {
         disabled: true,
       },
     },
   ],
   propTypes: {
-    disabled: "boolean",
-    state: ["Allow", "Neutral", "Deny"],
-    onChange: "function",
+    disabled: 'boolean',
+    state: ['Allow', 'Neutral', 'Deny'],
+    onChange: 'function',
   },
   props: {
-    state: "Neutral",
+    state: 'Neutral',
   },
   effects: {
     onChange: (_, state) => ({
diff --git a/packages/client/components/ui/components/design/atoms/inputs/OverrideSwitch.tsx b/packages/client/components/ui/components/design/atoms/inputs/OverrideSwitch.tsx
index b50b9199b..cdcfb09a5 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/OverrideSwitch.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/OverrideSwitch.tsx
@@ -1,8 +1,8 @@
-import { BiRegularCheck, BiRegularX } from "solid-icons/bi";
-import { createSignal, splitProps } from "solid-js";
-import { styled } from "solid-styled-components";
+import { BiRegularCheck, BiRegularX } from 'solid-icons/bi';
+import { createSignal, splitProps } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-type State = "Allow" | "Neutral" | "Deny";
+type State = 'Allow' | 'Neutral' | 'Deny';
 
 interface Props {
   readonly state?: State;
@@ -51,61 +51,61 @@ const Switch = styled.div<{ state: State; selected: boolean }>`
  * Override Switch
  */
 export function OverrideSwitch(props: Props) {
-  const [local, others] = splitProps(props, ["disabled", "onChange", "state"]);
+  const [local, others] = splitProps(props, ['disabled', 'onChange', 'state']);
 
   const [controlledValue, setControlledValue] = createSignal<State>(
-    local.state || "Neutral"
+    local.state || 'Neutral'
   );
 
   const currentState = () => local.state ?? controlledValue();
   return (
     <SwitchContainer
-      role="radiogroup"
-      aria-orientiation="horizontal"
+      role='radiogroup'
+      aria-orientiation='horizontal'
       aria-disabled={local.disabled}
       state={currentState()}
       {...others}
     >
       <Switch
         onClick={() =>
-          typeof local.state !== "undefined"
-            ? !local.disabled && local.onChange?.("Allow")
-            : setControlledValue("Allow")
+          typeof local.state !== 'undefined'
+            ? !local.disabled && local.onChange?.('Allow')
+            : setControlledValue('Allow')
         }
-        state="Allow"
-        role="radio"
-        selected={currentState() === "Allow"}
+        state='Allow'
+        role='radio'
+        selected={currentState() === 'Allow'}
       >
         <BiRegularCheck size={24} />
       </Switch>
       <Switch
         onClick={() =>
-          typeof local.state !== "undefined"
-            ? !local.disabled && local.onChange?.("Neutral")
-            : setControlledValue("Neutral")
+          typeof local.state !== 'undefined'
+            ? !local.disabled && local.onChange?.('Neutral')
+            : setControlledValue('Neutral')
         }
-        state="Neutral"
-        role="radio"
-        selected={currentState() === "Neutral"}
+        state='Neutral'
+        role='radio'
+        selected={currentState() === 'Neutral'}
       >
         <svg
-          xmlns="http://www.w3.org/2000/svg"
-          height="24"
-          width="24"
-          viewBox="0 96 960 960"
+          xmlns='http://www.w3.org/2000/svg'
+          height='24'
+          width='24'
+          viewBox='0 96 960 960'
         >
-          <path d="M120 936v-60h60v60h-60Zm0-148v-83h60v83h-60Zm0-171v-83h60v83h-60Zm0-170v-83h60v83h-60Zm0-171v-60h60v60h-60Zm148 660v-60h83v60h-83Zm0-660v-60h83v60h-83Zm171 660v-60h83v60h-83Zm0-660v-60h83v60h-83Zm170 660v-60h83v60h-83Zm0-660v-60h83v60h-83Zm171 660v-60h60v60h-60Zm0-148v-83h60v83h-60Zm0-171v-83h60v83h-60Zm0-170v-83h60v83h-60Zm0-171v-60h60v60h-60Z" />
+          <path d='M120 936v-60h60v60h-60Zm0-148v-83h60v83h-60Zm0-171v-83h60v83h-60Zm0-170v-83h60v83h-60Zm0-171v-60h60v60h-60Zm148 660v-60h83v60h-83Zm0-660v-60h83v60h-83Zm171 660v-60h83v60h-83Zm0-660v-60h83v60h-83Zm170 660v-60h83v60h-83Zm0-660v-60h83v60h-83Zm171 660v-60h60v60h-60Zm0-148v-83h60v83h-60Zm0-171v-83h60v83h-60Zm0-170v-83h60v83h-60Zm0-171v-60h60v60h-60Z' />
         </svg>
       </Switch>
       <Switch
         onClick={() =>
-          typeof local.state !== "undefined"
-            ? !local.disabled && local.onChange?.("Deny")
-            : setControlledValue("Deny")
+          typeof local.state !== 'undefined'
+            ? !local.disabled && local.onChange?.('Deny')
+            : setControlledValue('Deny')
         }
-        state="Deny"
-        role="radio"
-        selected={currentState() === "Deny"}
+        state='Deny'
+        role='radio'
+        selected={currentState() === 'Deny'}
       >
         <BiRegularX size={24} />
       </Switch>
diff --git a/packages/client/components/ui/components/design/atoms/inputs/Radio.stories.tsx b/packages/client/components/ui/components/design/atoms/inputs/Radio.stories.tsx
index 5b5757388..e7da3a6d5 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/Radio.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/Radio.stories.tsx
@@ -1,40 +1,39 @@
-import type { ComponentStory } from "../../../stories";
-
-import { Radio } from "./Radio";
+import type { ComponentStory } from '../../../stories';
+import { Radio } from './Radio';
 
 export default {
-  category: "Design System/Atoms/Inputs",
+  category: 'Design System/Atoms/Inputs',
   component: Radio,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
       props: {
         value: false,
       },
     },
     {
-      title: "Checked",
+      title: 'Checked',
       props: {
         value: true,
       },
     },
     {
-      title: "Disabled",
+      title: 'Disabled',
       props: {
         disabled: true,
       },
     },
   ],
   props: {
-    title: "Hello, I am a radio button",
-    description: "And this is a cool description.",
+    title: 'Hello, I am a radio button',
+    description: 'And this is a cool description.',
   },
   propTypes: {
-    title: "string",
-    description: "string",
-    disabled: "boolean",
-    value: "boolean",
-    onSelect: "function",
+    title: 'string',
+    description: 'string',
+    disabled: 'boolean',
+    value: 'boolean',
+    onSelect: 'function',
   },
   effects: {
     onSelect: (props) => ({
diff --git a/packages/client/components/ui/components/design/atoms/inputs/Radio.tsx b/packages/client/components/ui/components/design/atoms/inputs/Radio.tsx
index d119a055f..10bd820d3 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/Radio.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/Radio.tsx
@@ -1,6 +1,7 @@
-import { FaSolidCircle as CircleIcon } from "solid-icons/fa";
-import { JSX, Show, createSignal, splitProps } from "solid-js";
-import { styled } from "solid-styled-components";
+import { FaSolidCircle as CircleIcon } from 'solid-icons/fa';
+import type { JSX } from 'solid-js';
+import { createSignal, Show, splitProps } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
 interface Props {
   title?: JSX.Element;
@@ -130,11 +131,11 @@ const Description = styled.div<BaseProps>`
 
 export function Radio(props: Props) {
   const [local, others] = splitProps(props, [
-    "disabled",
-    "title",
-    "description",
-    "value",
-    "onSelect",
+    'disabled',
+    'title',
+    'description',
+    'value',
+    'onSelect',
   ]);
 
   const [controlledValue, setControlledValue] = createSignal(false);
@@ -146,10 +147,10 @@ export function Radio(props: Props) {
         <CircleIcon size={12} />
       </RadioCircle>
       <input
-        type="radio"
+        type='radio'
         checked={selected()}
         onChange={() =>
-          typeof local.value !== "undefined"
+          typeof local.value !== 'undefined'
             ? !local.disabled && local.onSelect?.(!local.value)
             : setControlledValue((v) => !v)
         }
diff --git a/packages/client/components/ui/components/design/atoms/inputs/Tabs.stories.tsx b/packages/client/components/ui/components/design/atoms/inputs/Tabs.stories.tsx
index 2bfe78fd1..e24e3abff 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/Tabs.stories.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/Tabs.stories.tsx
@@ -1,27 +1,27 @@
-import { ComponentProps, createSignal } from "solid-js";
+import type { ComponentProps } from 'solid-js';
+import { createSignal } from 'solid-js';
 
-import type { ComponentStory } from "../../../stories";
+import type { ComponentStory } from '../../../stories';
+import { Tabs } from './Tabs';
 
-import { Tabs } from "./Tabs";
-
-const [tab, onSelect] = createSignal("a");
+const [tab, onSelect] = createSignal('a');
 
 export default {
-  category: "Design System/Atoms/Inputs",
+  category: 'Design System/Atoms/Inputs',
   component: Tabs,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
       props: {
         tabs: () => ({
           a: {
-            label: "First",
+            label: 'First',
           },
           b: {
-            label: "Second",
+            label: 'Second',
           },
           c: {
-            label: "Last",
+            label: 'Last',
           },
         }),
         tab,
diff --git a/packages/client/components/ui/components/design/atoms/inputs/Tabs.tsx b/packages/client/components/ui/components/design/atoms/inputs/Tabs.tsx
index e1cb2f100..6582a73a5 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/Tabs.tsx
+++ b/packages/client/components/ui/components/design/atoms/inputs/Tabs.tsx
@@ -1,8 +1,9 @@
-import { BiSolidXCircle } from "solid-icons/bi";
-import { Accessor, For, JSX } from "solid-js";
-import { styled } from "solid-styled-components";
+import { BiSolidXCircle } from 'solid-icons/bi';
+import type { Accessor, JSX } from 'solid-js';
+import { For } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { Row } from "../../layout";
+import { Row } from '../../layout';
 
 interface Props {
   /**
@@ -52,14 +53,14 @@ const Tab = styled.a<{ active: boolean }>`
   padding: 0.4em 1em;
   border-top: 4px solid transparent;
   border-bottom: 4px solid
-    ${(props) => (props.active ? "var(--unset-fg)" : "transparent")};
-  color: ${(props) => props.theme!.colours["foreground"]};
+    ${(props) => (props.active ? 'var(--unset-fg)' : 'transparent')};
+  color: ${(props) => props.theme!.colours['foreground']};
   background: var(--unset-bg);
   transition: ${(props) => props.theme!.transitions.fast};
 
   &:hover {
     filter: brightness(1.2);
-    color: ${(props) => props.theme!.colours["foreground"]};
+    color: ${(props) => props.theme!.colours['foreground']};
   }
 `;
 
@@ -76,7 +77,7 @@ const Dismiss = styled.a`
  */
 export function Tabs(props: Props) {
   return (
-    <Base role="tablist" gap="none">
+    <Base role='tablist' gap='none'>
       <For each={Object.keys(props.tabs())}>
         {(tab) => {
           /**
@@ -113,7 +114,7 @@ export function Tabs(props: Props) {
 
           return (
             <Tab
-              role="tab"
+              role='tab'
               aria-selected={active()}
               active={active()}
               onMouseDown={onMouseDown}
diff --git a/packages/client/components/ui/components/design/atoms/inputs/index.ts b/packages/client/components/ui/components/design/atoms/inputs/index.ts
index 32a36ff4e..159cd4d7a 100644
--- a/packages/client/components/ui/components/design/atoms/inputs/index.ts
+++ b/packages/client/components/ui/components/design/atoms/inputs/index.ts
@@ -1,13 +1,13 @@
-export { ComboBox } from "./ComboBox";
-export { LegacyCheckbox } from "./LegacyCheckbox";
-export { Checkbox } from "./Checkbox";
-export { Input } from "./Input";
-export { Button } from "./Button";
-export { MenuButton } from "./MenuButton";
-export { Radio } from "./Radio";
-export { Tabs } from "./Tabs";
-export { CategoryButton } from "./CategoryButton";
-export { OverrideSwitch } from "./OverrideSwitch";
-export { CategoryCollapse } from "./CategoryCollapse";
-export { CategoryButtonGroup } from "./CategoryButtonGroup";
-export { Chip } from "./Chip";
+export { Button } from './Button';
+export { CategoryButton } from './CategoryButton';
+export { CategoryButtonGroup } from './CategoryButtonGroup';
+export { CategoryCollapse } from './CategoryCollapse';
+export { Checkbox } from './Checkbox';
+export { Chip } from './Chip';
+export { ComboBox } from './ComboBox';
+export { Input } from './Input';
+export { LegacyCheckbox } from './LegacyCheckbox';
+export { MenuButton } from './MenuButton';
+export { OverrideSwitch } from './OverrideSwitch';
+export { Radio } from './Radio';
+export { Tabs } from './Tabs';
diff --git a/packages/client/components/ui/components/design/index.ts b/packages/client/components/ui/components/design/index.ts
index ea1cd44e2..5b88f533c 100644
--- a/packages/client/components/ui/components/design/index.ts
+++ b/packages/client/components/ui/components/design/index.ts
@@ -1,2 +1,2 @@
-export * from "./atoms";
-export * from "./layout";
+export * from './atoms';
+export * from './layout';
diff --git a/packages/client/components/ui/components/design/layout/BreakText.tsx b/packages/client/components/ui/components/design/layout/BreakText.tsx
index a599285b9..b2cbe343e 100644
--- a/packages/client/components/ui/components/design/layout/BreakText.tsx
+++ b/packages/client/components/ui/components/design/layout/BreakText.tsx
@@ -1,11 +1,11 @@
-import { styled } from "solid-styled-components";
+import { styled } from 'solid-styled-components';
 
 /**
  * Container to break all text and prevent overflow from math blocks
  *
  * Use this to wrap Markdown
  */
-export const BreakText = styled("div")`
+export const BreakText = styled('div')`
   word-break: break-word;
 
   .math {
diff --git a/packages/client/components/ui/components/design/layout/Column.stories.tsx b/packages/client/components/ui/components/design/layout/Column.stories.tsx
index 7e23bd0b1..b1fa60db7 100644
--- a/packages/client/components/ui/components/design/layout/Column.stories.tsx
+++ b/packages/client/components/ui/components/design/layout/Column.stories.tsx
@@ -1,35 +1,34 @@
-import TextColourDecorator from "../../../decorators/TextColourDecorator";
-import type { ComponentStory } from "../../stories";
-
-import { Column } from "./Column";
+import TextColourDecorator from '../../../decorators/TextColourDecorator';
+import type { ComponentStory } from '../../stories';
+import { Column } from './Column';
 
 export default {
-  category: "Design System/Layout",
+  category: 'Design System/Layout',
   component: Column,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
     },
     {
-      title: "No Gap",
+      title: 'No Gap',
       props: {
-        gap: "none",
+        gap: 'none',
       },
     },
     {
-      title: "Small Gap",
+      title: 'Small Gap',
       props: {
-        gap: "sm",
+        gap: 'sm',
       },
     },
     {
-      title: "Large Gap",
+      title: 'Large Gap',
       props: {
-        gap: "lg",
+        gap: 'lg',
       },
     },
     {
-      title: "Align (Center)",
+      title: 'Align (Center)',
       props: {
         children: (
           <>
@@ -42,21 +41,21 @@ export default {
       },
     },
     {
-      title: "Justify (End)",
+      title: 'Justify (End)',
       props: {
-        justify: "end",
+        justify: 'end',
         grow: true,
       },
       decorators: [
         (props) => (
-          <div style={{ height: "120px", display: "flex" }}>
+          <div style={{ height: '120px', display: 'flex' }}>
             {props.children}
           </div>
         ),
       ],
     },
     {
-      title: "Group",
+      title: 'Group',
       props: {
         group: true,
       },
@@ -70,19 +69,19 @@ export default {
         <div>Element 3</div>
       </>
     ),
-    gap: "md",
-    align: "start",
-    justify: "start",
+    gap: 'md',
+    align: 'start',
+    justify: 'start',
     grow: false,
     group: undefined,
   },
   decorators: [TextColourDecorator],
   propTypes: {
-    children: "component",
-    gap: ["none", "sm", "md", "lg"],
-    align: ["start", "end", "left", "right", "center", "stretch", true],
-    justify: ["start", "end", "left", "right", "center", "stretch", true],
-    grow: "boolean",
-    group: "boolean",
+    children: 'component',
+    gap: ['none', 'sm', 'md', 'lg'],
+    align: ['start', 'end', 'left', 'right', 'center', 'stretch', true],
+    justify: ['start', 'end', 'left', 'right', 'center', 'stretch', true],
+    grow: 'boolean',
+    group: 'boolean',
   },
 } as ComponentStory<typeof Column>;
diff --git a/packages/client/components/ui/components/design/layout/Column.tsx b/packages/client/components/ui/components/design/layout/Column.tsx
index a0cc760bd..a16928594 100644
--- a/packages/client/components/ui/components/design/layout/Column.tsx
+++ b/packages/client/components/ui/components/design/layout/Column.tsx
@@ -1,10 +1,11 @@
-import { DefaultTheme, styled } from "solid-styled-components";
+import type { DefaultTheme } from 'solid-styled-components';
+import { styled } from 'solid-styled-components';
 
 interface Props {
   /**
    * Gap between child elements.
    */
-  gap?: keyof DefaultTheme["gap"];
+  gap?: keyof DefaultTheme['gap'];
 
   /**
    * This column is a group of elements and should be visually distinct.
@@ -14,12 +15,12 @@ interface Props {
   /**
    * Item alignment
    */
-  align?: AlignSetting | "stretch" | true;
+  align?: AlignSetting | 'stretch' | true;
 
   /**
    * Content justification
    */
-  justify?: AlignSetting | "stretch" | true;
+  justify?: AlignSetting | 'stretch' | true;
 
   /**
    * This row should grow to fit parent container.
@@ -30,28 +31,28 @@ interface Props {
 /**
  * Generic Flex Column
  */
-export const Column = styled("div")<Props>`
+export const Column = styled('div')<Props>`
   display: flex;
   flex-direction: column;
-  flex-grow: ${(props) => (props.grow ? 1 : "initial")};
-  gap: ${(props) => props.theme!.gap[props.gap ?? "md"]};
+  flex-grow: ${(props) => (props.grow ? 1 : 'initial')};
+  gap: ${(props) => props.theme!.gap[props.gap ?? 'md']};
 
   margin: ${(props) =>
     props.group
-      ? `${typeof props.group === "string" ? props.group : "16px"} 0`
-      : "0"};
+      ? `${typeof props.group === 'string' ? props.group : '16px'} 0`
+      : '0'};
 
   align-items: ${(props) =>
     props.align
-      ? typeof props.align === "string"
+      ? typeof props.align === 'string'
         ? props.align
-        : "center"
-      : "initial"};
+        : 'center'
+      : 'initial'};
 
   justify-content: ${(props) =>
     props.justify
-      ? typeof props.justify === "string"
+      ? typeof props.justify === 'string'
         ? props.justify
-        : "center"
-      : "initial"};
+        : 'center'
+      : 'initial'};
 `;
diff --git a/packages/client/components/ui/components/design/layout/InlineIcon.tsx b/packages/client/components/ui/components/design/layout/InlineIcon.tsx
index fbf416cf7..981b89c26 100644
--- a/packages/client/components/ui/components/design/layout/InlineIcon.tsx
+++ b/packages/client/components/ui/components/design/layout/InlineIcon.tsx
@@ -1,12 +1,12 @@
-import { styled } from "solid-styled-components";
+import { styled } from 'solid-styled-components';
 
 /**
  * Specific-width icon container
  */
-export const InlineIcon = styled.div<{ size: "short" | "normal" | "wide" }>`
+export const InlineIcon = styled.div<{ size: 'short' | 'normal' | 'wide' }>`
   display: grid;
   flex-shrink: 0;
   place-items: center;
   width: ${({ size }) =>
-    size === "wide" ? 62 : size === "normal" ? 42 : 14}px;
+    size === 'wide' ? 62 : size === 'normal' ? 42 : 14}px;
 `;
diff --git a/packages/client/components/ui/components/design/layout/ListView.tsx b/packages/client/components/ui/components/design/layout/ListView.tsx
index eae680a02..eaa4ec277 100644
--- a/packages/client/components/ui/components/design/layout/ListView.tsx
+++ b/packages/client/components/ui/components/design/layout/ListView.tsx
@@ -1,5 +1,6 @@
-import { JSX, createSignal, createUniqueId } from "solid-js";
-import { styled } from "solid-styled-components";
+import type { JSX } from 'solid-js';
+import { createSignal, createUniqueId } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
 interface Props {
   /**
@@ -90,13 +91,13 @@ export function ListView(props: Props) {
     <div
       id={id}
       use:scrollable={{
-        direction: "y",
+        direction: 'y',
         offsetTop: props.offsetTop,
       }}
       style={{
-        "flex-grow": 1,
-        display: "flex",
-        "flex-direction": "column-reverse",
+        'flex-grow': 1,
+        display: 'flex',
+        'flex-direction': 'column-reverse',
       }}
       onScroll={onScroll}
     >
diff --git a/packages/client/components/ui/components/design/layout/NonBreakingText.tsx b/packages/client/components/ui/components/design/layout/NonBreakingText.tsx
index eeab8d607..3d09fcd67 100644
--- a/packages/client/components/ui/components/design/layout/NonBreakingText.tsx
+++ b/packages/client/components/ui/components/design/layout/NonBreakingText.tsx
@@ -1,9 +1,9 @@
-import { styled } from "solid-styled-components";
+import { styled } from 'solid-styled-components';
 
 /**
  * Container to prevent text breaking
  */
-export const NonBreakingText = styled("div")`
+export const NonBreakingText = styled('div')`
   white-space: nowrap;
 
   * {
diff --git a/packages/client/components/ui/components/design/layout/OverflowingText.stories.tsx b/packages/client/components/ui/components/design/layout/OverflowingText.stories.tsx
index 85a0a56fc..4ec6c270e 100644
--- a/packages/client/components/ui/components/design/layout/OverflowingText.stories.tsx
+++ b/packages/client/components/ui/components/design/layout/OverflowingText.stories.tsx
@@ -1,29 +1,28 @@
-import TextColourDecorator from "../../../decorators/TextColourDecorator";
-import type { ComponentStory } from "../../stories";
-
-import { OverflowingText } from "./OverflowingText";
+import TextColourDecorator from '../../../decorators/TextColourDecorator';
+import type { ComponentStory } from '../../stories';
+import { OverflowingText } from './OverflowingText';
 
 export default {
-  category: "Design System/Layout",
+  category: 'Design System/Layout',
   component: OverflowingText,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
     },
   ],
   props: {
-    children: "This is a long piece of text.",
+    children: 'This is a long piece of text.',
   },
   propTypes: {
-    children: "string",
+    children: 'string',
   },
   decorators: [
     (props) => (
       <div
         style={{
-          display: "flex",
-          "justify-content": "stretch",
-          width: "120px",
+          display: 'flex',
+          'justify-content': 'stretch',
+          width: '120px',
         }}
       >
         {props.children}
diff --git a/packages/client/components/ui/components/design/layout/OverflowingText.tsx b/packages/client/components/ui/components/design/layout/OverflowingText.tsx
index ad97f035d..2ed3693b9 100644
--- a/packages/client/components/ui/components/design/layout/OverflowingText.tsx
+++ b/packages/client/components/ui/components/design/layout/OverflowingText.tsx
@@ -1,9 +1,9 @@
-import { styled } from "solid-styled-components";
+import { styled } from 'solid-styled-components';
 
 /**
  * Container to prevent text overflow
  */
-export const OverflowingText = styled("div")`
+export const OverflowingText = styled('div')`
   overflow: hidden;
   white-space: nowrap;
   text-overflow: ellipsis;
diff --git a/packages/client/components/ui/components/design/layout/PreviewStack.tsx b/packages/client/components/ui/components/design/layout/PreviewStack.tsx
index e4891dc3c..073c6249b 100644
--- a/packages/client/components/ui/components/design/layout/PreviewStack.tsx
+++ b/packages/client/components/ui/components/design/layout/PreviewStack.tsx
@@ -1,5 +1,6 @@
-import { Accessor, For, JSX, onMount } from "solid-js";
-import { styled } from "solid-styled-components";
+import type { Accessor, JSX } from 'solid-js';
+import { For, onMount } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
 interface Props<T> {
   /**
@@ -72,7 +73,7 @@ const Overlay = styled.div`
 /**
  * Default transform used for children
  */
-const DEFAULT_TRANSFORM = "translate(-50%, -50%) scale(0.001)";
+const DEFAULT_TRANSFORM = 'translate(-50%, -50%) scale(0.001)';
 
 /**
  * Dynamic child positioning
@@ -94,5 +95,5 @@ const Base = styled.div<{ hideStack: boolean }>`
   ${(props) =>
     props.hideStack
       ? `> * { transform: ${DEFAULT_TRANSFORM} !important; }`
-      : ""}
+      : ''}
 `;
diff --git a/packages/client/components/ui/components/design/layout/Row.stories.tsx b/packages/client/components/ui/components/design/layout/Row.stories.tsx
index 2e9adfed4..fdbd2ff5c 100644
--- a/packages/client/components/ui/components/design/layout/Row.stories.tsx
+++ b/packages/client/components/ui/components/design/layout/Row.stories.tsx
@@ -1,35 +1,34 @@
-import TextColourDecorator from "../../../decorators/TextColourDecorator";
-import type { ComponentStory } from "../../stories";
-
-import { Row } from "./Row";
+import TextColourDecorator from '../../../decorators/TextColourDecorator';
+import type { ComponentStory } from '../../stories';
+import { Row } from './Row';
 
 export default {
-  category: "Design System/Layout",
+  category: 'Design System/Layout',
   component: Row,
   stories: [
     {
-      title: "Default",
+      title: 'Default',
     },
     {
-      title: "No Gap",
+      title: 'No Gap',
       props: {
-        gap: "none",
+        gap: 'none',
       },
     },
     {
-      title: "Small Gap",
+      title: 'Small Gap',
       props: {
-        gap: "sm",
+        gap: 'sm',
       },
     },
     {
-      title: "Large Gap",
+      title: 'Large Gap',
       props: {
-        gap: "lg",
+        gap: 'lg',
       },
     },
     {
-      title: "Align (Center)",
+      title: 'Align (Center)',
       props: {
         children: (
           <>
@@ -46,14 +45,14 @@ export default {
       },
     },
     {
-      title: "Justify (End)",
+      title: 'Justify (End)',
       props: {
-        justify: "end",
+        justify: 'end',
         grow: true,
       },
       decorators: [
         (props) => (
-          <div style={{ width: "360px", display: "flex" }}>
+          <div style={{ width: '360px', display: 'flex' }}>
             {props.children}
           </div>
         ),
@@ -68,17 +67,17 @@ export default {
         <div>Element 3</div>
       </>
     ),
-    gap: "md",
-    align: "start",
-    justify: "start",
+    gap: 'md',
+    align: 'start',
+    justify: 'start',
     grow: false,
   },
   decorators: [TextColourDecorator],
   propTypes: {
-    children: "component",
-    gap: ["none", "sm", "md", "lg"],
-    align: ["start", "end", "left", "right", "center", "stretch", true],
-    justify: ["start", "end", "left", "right", "center", "stretch", true],
-    grow: "boolean",
+    children: 'component',
+    gap: ['none', 'sm', 'md', 'lg'],
+    align: ['start', 'end', 'left', 'right', 'center', 'stretch', true],
+    justify: ['start', 'end', 'left', 'right', 'center', 'stretch', true],
+    grow: 'boolean',
   },
 } as ComponentStory<typeof Row>;
diff --git a/packages/client/components/ui/components/design/layout/Row.tsx b/packages/client/components/ui/components/design/layout/Row.tsx
index 8d910a836..0caf7880d 100644
--- a/packages/client/components/ui/components/design/layout/Row.tsx
+++ b/packages/client/components/ui/components/design/layout/Row.tsx
@@ -1,20 +1,21 @@
-import { DefaultTheme, styled } from "solid-styled-components";
+import type { DefaultTheme } from 'solid-styled-components';
+import { styled } from 'solid-styled-components';
 
 interface Props {
   /**
    * Gap between child elements.
    */
-  gap?: keyof DefaultTheme["gap"];
+  gap?: keyof DefaultTheme['gap'];
 
   /**
    * Item alignment
    */
-  align?: AlignSetting | "stretch" | true;
+  align?: AlignSetting | 'stretch' | true;
 
   /**
    * Content justification
    */
-  justify?: AlignSetting | "stretch" | true;
+  justify?: AlignSetting | 'stretch' | true;
 
   /**
    * This row should grow to fit parent container.
@@ -30,24 +31,24 @@ interface Props {
 /**
  * Generic Flex Row
  */
-export const Row = styled("div")<Props>`
+export const Row = styled('div')<Props>`
   display: flex;
   flex-direction: row;
-  flex-grow: ${(props) => (props.grow ? 1 : "initial")};
-  flex-wrap: ${(props) => (props.wrap ? "wrap" : "initial")};
-  gap: ${(props) => props.theme!.gap[props.gap ?? "md"]};
+  flex-grow: ${(props) => (props.grow ? 1 : 'initial')};
+  flex-wrap: ${(props) => (props.wrap ? 'wrap' : 'initial')};
+  gap: ${(props) => props.theme!.gap[props.gap ?? 'md']};
 
   align-items: ${(props) =>
     props.align
-      ? typeof props.align === "string"
+      ? typeof props.align === 'string'
         ? props.align
-        : "center"
-      : "initial"};
+        : 'center'
+      : 'initial'};
 
   justify-content: ${(props) =>
     props.justify
-      ? typeof props.justify === "string"
+      ? typeof props.justify === 'string'
         ? props.justify
-        : "center"
-      : "initial"};
+        : 'center'
+      : 'initial'};
 `;
diff --git a/packages/client/components/ui/components/design/layout/SizedContent.tsx b/packages/client/components/ui/components/design/layout/SizedContent.tsx
index 00bcf5183..6a641ebd1 100644
--- a/packages/client/components/ui/components/design/layout/SizedContent.tsx
+++ b/packages/client/components/ui/components/design/layout/SizedContent.tsx
@@ -1,5 +1,5 @@
-import { JSX } from "solid-js";
-import { styled } from "solid-styled-components";
+import type { JSX } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
 interface Props {
   /**
@@ -21,7 +21,7 @@ interface Props {
 /**
  * Sized content base container
  */
-const Base = styled("figure")`
+const Base = styled('figure')`
   margin: 0;
 
   > :not(.container),
@@ -35,11 +35,11 @@ const Base = styled("figure")`
   video,
   iframe,
   .Spoiler.Video {
-    min-width: ${(props) => props.theme!.layout.attachments["min-width"]};
-    max-width: ${(props) => props.theme!.layout.attachments["max-width"]};
+    min-width: ${(props) => props.theme!.layout.attachments['min-width']};
+    max-width: ${(props) => props.theme!.layout.attachments['max-width']};
 
-    min-height: ${(props) => props.theme!.layout.attachments["min-height"]};
-    max-height: ${(props) => props.theme!.layout.attachments["max-height"]};
+    min-height: ${(props) => props.theme!.layout.attachments['min-height']};
+    max-height: ${(props) => props.theme!.layout.attachments['max-height']};
   }
 `;
 
@@ -50,8 +50,8 @@ const Tall = styled(Base)`
   img,
   .Spoiler.Image {
     width: auto;
-    min-height: ${(props) => props.theme!.layout.attachments["min-height"]};
-    max-height: ${(props) => props.theme!.layout.attachments["max-height"]};
+    min-height: ${(props) => props.theme!.layout.attachments['min-height']};
+    max-height: ${(props) => props.theme!.layout.attachments['max-height']};
   }
 
   .Spoiler.Image {
@@ -66,8 +66,8 @@ const Wide = styled(Base)`
   img,
   .Spoiler.Image {
     height: auto;
-    min-width: ${(props) => props.theme!.layout.attachments["min-width"]};
-    max-width: ${(props) => props.theme!.layout.attachments["max-width"]};
+    min-width: ${(props) => props.theme!.layout.attachments['min-width']};
+    max-width: ${(props) => props.theme!.layout.attachments['max-width']};
   }
 
   .Spoiler.Image,
@@ -91,10 +91,10 @@ export function SizedContent(props: Props) {
   return (
     <Base
       style={{
-        "--width": props.width,
-        "--height": props.height,
-        "--width-px": props.width + "px",
-        "--height-px": props.height + "px",
+        '--width': props.width,
+        '--height': props.height,
+        '--width-px': props.width + 'px',
+        '--height-px': props.height + 'px',
       }}
     >
       {props.children}
diff --git a/packages/client/components/ui/components/design/layout/Spacer.tsx b/packages/client/components/ui/components/design/layout/Spacer.tsx
index 14ec16cf2..71278c618 100644
--- a/packages/client/components/ui/components/design/layout/Spacer.tsx
+++ b/packages/client/components/ui/components/design/layout/Spacer.tsx
@@ -1,4 +1,4 @@
-import { styled } from "solid-styled-components";
+import { styled } from 'solid-styled-components';
 
 /**
  * An empty container that fills all available space
diff --git a/packages/client/components/ui/components/design/layout/Spoiler.tsx b/packages/client/components/ui/components/design/layout/Spoiler.tsx
index c963dfe02..d34b67de6 100644
--- a/packages/client/components/ui/components/design/layout/Spoiler.tsx
+++ b/packages/client/components/ui/components/design/layout/Spoiler.tsx
@@ -1,13 +1,12 @@
-import { Show, createSignal } from "solid-js";
-import { styled } from "solid-styled-components";
-
-import { useTranslation } from "@revolt/i18n";
+import { useTranslation } from '@revolt/i18n';
+import { createSignal, Show } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
 interface Props {
-  contentType?: "Image" | "Video";
+  contentType?: 'Image' | 'Video';
 }
 
-const Base = styled("div")`
+const Base = styled('div')`
   z-index: 1;
   position: relative;
 
@@ -41,12 +40,12 @@ export function Spoiler(props: Props) {
 
   return (
     <Show when={shown()}>
-      <Base class="container">
+      <Base class='container'>
         <div
           class={`Spoiler ${props.contentType}`}
           onClick={() => setShown(false)}
         >
-          <span>{t("app.main.channel.misc.spoiler_attachment")}</span>
+          <span>{t('app.main.channel.misc.spoiler_attachment')}</span>
         </div>
       </Base>
     </Show>
diff --git a/packages/client/components/ui/components/design/layout/index.tsx b/packages/client/components/ui/components/design/layout/index.tsx
index 80b7f9f8c..aefeefb35 100644
--- a/packages/client/components/ui/components/design/layout/index.tsx
+++ b/packages/client/components/ui/components/design/layout/index.tsx
@@ -1,11 +1,11 @@
-export { Column } from "./Column";
-export { OverflowingText } from "./OverflowingText";
-export { Row } from "./Row";
-export { SizedContent } from "./SizedContent";
-export { Spoiler } from "./Spoiler";
-export { NonBreakingText } from "./NonBreakingText";
-export { Spacer } from "./Spacer";
-export { InlineIcon } from "./InlineIcon";
-export { PreviewStack } from "./PreviewStack";
-export { ListView } from "./ListView";
-export { BreakText } from "./BreakText";
+export { BreakText } from './BreakText';
+export { Column } from './Column';
+export { InlineIcon } from './InlineIcon';
+export { ListView } from './ListView';
+export { NonBreakingText } from './NonBreakingText';
+export { OverflowingText } from './OverflowingText';
+export { PreviewStack } from './PreviewStack';
+export { Row } from './Row';
+export { SizedContent } from './SizedContent';
+export { Spacer } from './Spacer';
+export { Spoiler } from './Spoiler';
diff --git a/packages/client/components/ui/components/floating/AutoComplete.tsx b/packages/client/components/ui/components/floating/AutoComplete.tsx
index 100fd1782..93cb762ac 100644
--- a/packages/client/components/ui/components/floating/AutoComplete.tsx
+++ b/packages/client/components/ui/components/floating/AutoComplete.tsx
@@ -1,26 +1,25 @@
-import { For, JSX, Match, Show, Switch } from "solid-js";
-import { styled } from "solid-styled-components";
+import { CustomEmoji, UnicodeEmoji } from '@revolt/markdown/emoji';
+import { ServerMember } from 'revolt.js';
+import type { JSX } from 'solid-js';
+import { For, Match, Show, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { ServerMember } from "revolt.js";
-
-import { CustomEmoji, UnicodeEmoji } from "@revolt/markdown/emoji";
-
-import { AutoCompleteState } from "../../directives";
-import { Avatar, Column, Row } from "../design";
+import type { AutoCompleteState } from '../../directives';
+import { Avatar, Column, Row } from '../design';
 
 /**
  * Auto complete popup
  */
 export function AutoComplete(
-  props: Exclude<JSX.Directives["floating"]["autoComplete"], undefined>
+  props: Exclude<JSX.Directives['floating']['autoComplete'], undefined>
 ) {
   return (
     <Base>
       <Switch>
-        <Match when={props.state().matched === "emoji"}>
+        <Match when={props.state().matched === 'emoji'}>
           <For
             each={
-              (props.state() as AutoCompleteState & { matched: "emoji" })
+              (props.state() as AutoCompleteState & { matched: 'emoji' })
                 .matches
             }
           >
@@ -31,13 +30,13 @@ export function AutoComplete(
                     <>
                       <UnicodeEmoji
                         emoji={(match as { codepoint: string }).codepoint}
-                      />{" "}
+                      />{' '}
                       <Name>:{match.shortcode}:</Name>
                     </>
                   }
                 >
-                  <Match when={match.type === "custom"}>
-                    <CustomEmoji id={(match as { id: string }).id} />{" "}
+                  <Match when={match.type === 'custom'}>
+                    <CustomEmoji id={(match as { id: string }).id} />{' '}
                     <Name>:{match.shortcode}:</Name>
                   </Match>
                 </Switch>
@@ -45,24 +44,24 @@ export function AutoComplete(
             )}
           </For>
         </Match>
-        <Match when={props.state().matched === "user"}>
+        <Match when={props.state().matched === 'user'}>
           <For
             each={
               (
                 props.state() as AutoCompleteState & {
-                  matched: "user";
+                  matched: 'user';
                 }
               ).matches
             }
           >
             {(match, index) => (
               <Entry align selected={index() === props.selection()}>
-                <Avatar src={match.user.animatedAvatarURL} size={24} />{" "}
+                <Avatar src={match.user.animatedAvatarURL} size={24} />{' '}
                 <Name>{match.user.displayName}</Name>
                 {match.user instanceof ServerMember &&
                   match.user.displayName !== match.user.user?.username && (
                     <>
-                      {" "}
+                      {' '}
                       @{match.user.user?.username}#
                       {match.user.user?.discriminator}
                     </>
@@ -71,12 +70,12 @@ export function AutoComplete(
             )}
           </For>
         </Match>
-        <Match when={props.state().matched === "channel"}>
+        <Match when={props.state().matched === 'channel'}>
           <For
             each={
               (
                 props.state() as AutoCompleteState & {
-                  matched: "channel";
+                  matched: 'channel';
                 }
               ).matches
             }
@@ -101,8 +100,8 @@ const Entry = styled(Row)<{ selected: boolean }>`
   padding: ${(props) => props.theme!.gap.sm} ${(props) => props.theme!.gap.md};
   background: ${(props) =>
     props.selected
-      ? props.theme!.colours["component-context-menu-item-hover-background"]
-      : "transparent"};
+      ? props.theme!.colours['component-context-menu-item-hover-background']
+      : 'transparent'};
 `;
 
 /**
@@ -123,7 +122,7 @@ const Base = styled(Column)`
 
   backdrop-filter: ${(props) => props.theme!.effects.blur.md};
   color: ${(props) =>
-    props.theme!.colours["component-context-menu-foreground"]};
+    props.theme!.colours['component-context-menu-foreground']};
   background: ${(props) =>
-    props.theme!.colours["component-context-menu-background"]};
+    props.theme!.colours['component-context-menu-background']};
 `;
diff --git a/packages/client/components/ui/components/floating/CompositionPicker.tsx b/packages/client/components/ui/components/floating/CompositionPicker.tsx
index 36d53b3ee..cf439507c 100644
--- a/packages/client/components/ui/components/floating/CompositionPicker.tsx
+++ b/packages/client/components/ui/components/floating/CompositionPicker.tsx
@@ -1,13 +1,13 @@
-import { useFloating } from "solid-floating-ui";
-import { For, JSX, Ref, Show, createEffect, createSignal, on } from "solid-js";
-import { Portal } from "solid-js/web";
-import { styled } from "solid-styled-components";
+import { autoUpdate, flip, offset, shift } from '@floating-ui/dom';
+import { useFloating } from 'solid-floating-ui';
+import type { JSX, Ref } from 'solid-js';
+import { createEffect, createSignal, For, on, Show } from 'solid-js';
+import { Portal } from 'solid-js/web';
+import { Motion, Presence } from 'solid-motionone';
+import { styled } from 'solid-styled-components';
 
-import { autoUpdate, flip, offset, shift } from "@floating-ui/dom";
-import { Motion, Presence } from "@motionone/solid";
-
-import { scrollable } from "../../directives";
-import { Column, Input } from "../design";
+import { scrollable } from '../../directives';
+import { Column, Input } from '../design';
 
 /**
  * Base element
@@ -22,7 +22,7 @@ const Base = styled(Column)`
 /**
  * Container element for the picker
  */
-const Container = styled("div", "Picker")`
+const Container = styled('div', 'Picker')`
   flex-grow: 1;
   display: flex;
   height: 400px;
@@ -59,7 +59,7 @@ interface Props {
   sendGIFMessage: (content: string) => void;
 }
 
-type GifBoxFile = {
+interface GifBoxFile {
   _id: string;
   fileName: string;
   originalFileName: string;
@@ -70,9 +70,9 @@ type GifBoxFile = {
   author: string;
   size: number;
   sha512: string;
-};
+}
 
-type Gif = {
+interface Gif {
   author: {
     _id: string;
     displayName: string;
@@ -88,7 +88,7 @@ type Gif = {
   file: GifBoxFile;
   createdAt: string;
   views: number;
-};
+}
 
 /**
  * CompositionPicker component
@@ -101,7 +101,7 @@ export function CompositionPicker(props: Props) {
   const [show, setShow] = createSignal(false);
 
   const position = useFloating(anchor, floating, {
-    placement: "top-end",
+    placement: 'top-end',
     whileElementsMounted: autoUpdate,
     middleware: [offset(5), flip(), shift()],
   });
@@ -115,7 +115,7 @@ export function CompositionPicker(props: Props) {
       () => show(),
       (show) => {
         if (show && !fetched) {
-          fetch("https://api.gifbox.me/post/popular")
+          fetch('https://api.gifbox.me/post/popular')
             .then((x) => x.json())
             .then(setData);
 
@@ -147,7 +147,7 @@ export function CompositionPicker(props: Props) {
         onClickGif: () => setShow(!show()),
         onClickEmoji: () => setShow(!show()),
       })}
-      <Portal mount={document.getElementById("floating")!}>
+      <Portal mount={document.getElementById('floating')!}>
         <Presence>
           <Show when={show()}>
             <Motion
@@ -163,13 +163,13 @@ export function CompositionPicker(props: Props) {
                   top: `${position.y ?? 0}px`,
                   left: `${position.x ?? 0}px`,
                 }}
-                role="tooltip"
+                role='tooltip'
               >
                 <Container>
                   <Input
-                    placeholder="search for gifs :)"
+                    placeholder='search for gifs :)'
                     onKeyDown={(e) => {
-                      if (e.key === "Enter") {
+                      if (e.key === 'Enter') {
                         e.preventDefault();
                         search(e.currentTarget.value);
                       }
@@ -187,7 +187,7 @@ export function CompositionPicker(props: Props) {
                             }
                           >
                             <img
-                              style={{ width: "100%" }}
+                              style={{ width: '100%' }}
                               src={`https://api.gifbox.me/file/${entry.file.bucket}/${entry.file.fileName}`}
                             />
                           </a>
diff --git a/packages/client/components/ui/components/floating/FloatingManager.tsx b/packages/client/components/ui/components/floating/FloatingManager.tsx
index 0a473991a..df56b3936 100644
--- a/packages/client/components/ui/components/floating/FloatingManager.tsx
+++ b/packages/client/components/ui/components/floating/FloatingManager.tsx
@@ -1,23 +1,22 @@
-import { useFloating } from "solid-floating-ui";
+import { autoUpdate, flip, offset, shift } from '@floating-ui/dom';
+import { useFloating } from 'solid-floating-ui';
 import {
+  createSignal,
   For,
   Match,
-  Show,
-  Switch,
-  createSignal,
   onCleanup,
   onMount,
-} from "solid-js";
-import { Portal } from "solid-js/web";
-
-import { autoUpdate, flip, offset, shift } from "@floating-ui/dom";
-import { Motion, Presence } from "@motionone/solid";
-
-import { FloatingElement, floatingElements } from "../../directives";
+  Show,
+  Switch,
+} from 'solid-js';
+import { Portal } from 'solid-js/web';
+import { Motion, Presence } from 'solid-motionone';
 
-import { AutoComplete } from "./AutoComplete";
-import { TooltipBase } from "./Tooltip";
-import { UserCard } from "./UserCard";
+import type { FloatingElement } from '../../directives';
+import { floatingElements } from '../../directives';
+import { AutoComplete } from './AutoComplete';
+import { TooltipBase } from './Tooltip';
+import { UserCard } from './UserCard';
 
 /**
  * Render the actual floating elements
@@ -34,11 +33,11 @@ export function FloatingManager() {
     mouseY = clientY;
   }
 
-  onMount(() => document.addEventListener("mousemove", onMouseMove));
-  onCleanup(() => document.addEventListener("mousemove", onMouseMove));
+  onMount(() => document.addEventListener('mousemove', onMouseMove));
+  onCleanup(() => document.addEventListener('mousemove', onMouseMove));
 
   return (
-    <Portal mount={document.getElementById("floating")!}>
+    <Portal mount={document.getElementById('floating')!}>
       <For each={floatingElements()}>
         {(element) => (
           <Presence>
@@ -68,11 +67,11 @@ function Floating(props: FloatingElement & { mouseX: number; mouseY: number }) {
     if (current.tooltip) {
       return current.tooltip.placement;
     } else if (current.userCard) {
-      return "right-start";
+      return 'right-start';
     } else if (current.contextMenu) {
-      return "right-start";
+      return 'right-start';
     } else if (current.autoComplete) {
-      return "top-start";
+      return 'top-start';
     }
   };
 
@@ -142,8 +141,8 @@ function Floating(props: FloatingElement & { mouseX: number; mouseY: number }) {
   // We know what we're doing here...
   // eslint-disable-next-line solid/reactivity
   if (props.config().userCard || props.config().contextMenu) {
-    onMount(() => document.addEventListener("mousedown", onMouseDown));
-    onCleanup(() => document.removeEventListener("mousedown", onMouseDown));
+    onMount(() => document.addEventListener('mousedown', onMouseDown));
+    onCleanup(() => document.removeEventListener('mousedown', onMouseDown));
   }
 
   return (
@@ -161,13 +160,13 @@ function Floating(props: FloatingElement & { mouseX: number; mouseY: number }) {
           top: `${position.y ?? 0}px`,
           left: `${position.x ?? 0}px`,
           // TODO: use floating-element zIndex from theme
-          "z-index": 10000,
+          'z-index': 10000,
         }}
       >
         <Switch>
           <Match when={props.show()?.tooltip}>
             <TooltipBase>
-              {typeof props.show()!.tooltip!.content === "function"
+              {typeof props.show()!.tooltip!.content === 'function'
                 ? (props.show()!.tooltip!.content as Function)({})
                 : props.show()!.tooltip!.content}
             </TooltipBase>
diff --git a/packages/client/components/ui/components/floating/Tooltip.stories.tsx b/packages/client/components/ui/components/floating/Tooltip.stories.tsx
index 0730ee517..90795d684 100644
--- a/packages/client/components/ui/components/floating/Tooltip.stories.tsx
+++ b/packages/client/components/ui/components/floating/Tooltip.stories.tsx
@@ -1,26 +1,25 @@
-import type { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import { Button } from "../design";
-import type { ComponentStory } from "../stories";
-
-import { Tooltip } from "./Tooltip";
+import { Button } from '../design';
+import type { ComponentStory } from '../stories';
+import { Tooltip } from './Tooltip';
 
 export default {
-  category: "Floating/Tooltip",
+  category: 'Floating/Tooltip',
   component: Tooltip,
-  stories: [{ title: "Default" }],
+  stories: [{ title: 'Default' }],
   props: {
     /**
      * Render the children
      */
     children(fn) {
       return (
-        <Button {...fn} type="button">
+        <Button {...fn} type='button'>
           Example
         </Button>
       );
     },
-    content: "Hello, I am a tooltip!",
+    content: 'Hello, I am a tooltip!',
     initialState: true,
   },
   propTypes: {},
diff --git a/packages/client/components/ui/components/floating/Tooltip.tsx b/packages/client/components/ui/components/floating/Tooltip.tsx
index f043d5435..5847f030a 100644
--- a/packages/client/components/ui/components/floating/Tooltip.tsx
+++ b/packages/client/components/ui/components/floating/Tooltip.tsx
@@ -1,15 +1,16 @@
-import { JSX, splitProps } from "solid-js";
-import { styled } from "solid-styled-components";
+import type { JSX } from 'solid-js';
+import { splitProps } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { generateTypographyCSS } from "../design/atoms/display/Typography";
+import { generateTypographyCSS } from '../design/atoms/display/Typography';
 
 /**
  * Base element for the tooltip
  */
-export const TooltipBase = styled("div", "Tooltip")`
+export const TooltipBase = styled('div', 'Tooltip')`
   color: white;
   background: black;
-  ${(props) => generateTypographyCSS(props.theme!, "tooltip")};
+  ${(props) => generateTypographyCSS(props.theme!, 'tooltip')};
 
   padding: ${(props) => props.theme!.gap.md};
   border-radius: ${(props) => props.theme!.borderRadius.md};
@@ -20,13 +21,13 @@ type Props = {
    * Tooltip trigger area
    */
   children: JSX.Element;
-} & (JSX.Directives["floating"] & object)["tooltip"];
+} & (JSX.Directives['floating'] & object)['tooltip'];
 
 /**
  * Tooltip component
  */
 export function Tooltip(props: Props) {
-  const [local, remote] = splitProps(props, ["children"]);
+  const [local, remote] = splitProps(props, ['children']);
 
   return (
     <div
diff --git a/packages/client/components/ui/components/floating/UserCard.tsx b/packages/client/components/ui/components/floating/UserCard.tsx
index 70f50e52f..836dfccc2 100644
--- a/packages/client/components/ui/components/floating/UserCard.tsx
+++ b/packages/client/components/ui/components/floating/UserCard.tsx
@@ -1,15 +1,15 @@
-import { JSX, createMemo } from "solid-js";
-import { For, Show } from "solid-js";
-import { styled } from "solid-styled-components";
+import { getController } from '@revolt/common';
+import type { JSX } from 'solid-js';
+import { createMemo } from 'solid-js';
+import { For, Show } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { getController } from "@revolt/common";
-
-import { ColouredText, Row, Username } from "../design";
+import { ColouredText, Row, Username } from '../design';
 
 /**
  * Base element for the card
  */
-const Base = styled("div", "Tooltip")`
+const Base = styled('div', 'Tooltip')`
   color: white;
   background: black;
   width: 400px;
@@ -20,14 +20,14 @@ const Base = styled("div", "Tooltip")`
  * User Card
  */
 export function UserCard(
-  props: JSX.Directives["floating"]["userCard"] & object
+  props: JSX.Directives['floating']['userCard'] & object
 ) {
   const roleIds = createMemo(
     () => new Set(props.member?.orderedRoles.map((role) => role.id))
   );
 
   // Disable it while it's being developed
-  if (!getController("state").experiments.isEnabled("user_card")) return null;
+  if (!getController('state').experiments.isEnabled('user_card')) return null;
 
   return (
     <Base>
@@ -53,7 +53,7 @@ export function UserCard(
             >
               <ColouredText
                 colour={role.colour!}
-                clip={role.colour?.includes("gradient")}
+                clip={role.colour?.includes('gradient')}
               >
                 {role.name}
               </ColouredText>
@@ -77,7 +77,7 @@ export function UserCard(
               >
                 <ColouredText
                   colour={role.colour!}
-                  clip={role.colour?.includes("gradient")}
+                  clip={role.colour?.includes('gradient')}
                 >
                   {role.name}
                 </ColouredText>
diff --git a/packages/client/components/ui/components/floating/index.ts b/packages/client/components/ui/components/floating/index.ts
index b29eab398..cdf677fc4 100644
--- a/packages/client/components/ui/components/floating/index.ts
+++ b/packages/client/components/ui/components/floating/index.ts
@@ -1,4 +1,4 @@
-export { UserCard } from "./UserCard";
-export { FloatingManager } from "./FloatingManager";
-export { Tooltip } from "./Tooltip";
-export { CompositionPicker } from "./CompositionPicker";
+export { CompositionPicker } from './CompositionPicker';
+export { FloatingManager } from './FloatingManager';
+export { Tooltip } from './Tooltip';
+export { UserCard } from './UserCard';
diff --git a/packages/client/components/ui/components/index.ts b/packages/client/components/ui/components/index.ts
index 5f025c5f4..33ba0751d 100644
--- a/packages/client/components/ui/components/index.ts
+++ b/packages/client/components/ui/components/index.ts
@@ -1,8 +1,8 @@
-export * from "./tools";
-export * from "./common";
-export * from "./design";
-export * from "./floating";
-export * from "./messaging";
-export * from "./navigation";
-export * from "./context";
-export * from "./native";
+export * from './common';
+export * from './context';
+export * from './design';
+export * from './floating';
+export * from './messaging';
+export * from './native';
+export * from './navigation';
+export * from './tools';
diff --git a/packages/client/components/ui/components/messaging/composition/FileCarousel.tsx b/packages/client/components/ui/components/messaging/composition/FileCarousel.tsx
index 0d96a06fc..09f2b6e2c 100644
--- a/packages/client/components/ui/components/messaging/composition/FileCarousel.tsx
+++ b/packages/client/components/ui/components/messaging/composition/FileCarousel.tsx
@@ -1,12 +1,11 @@
-import { BiRegularPlus, BiRegularXCircle, BiSolidFile } from "solid-icons/bi";
-import { For, Match, Show, Switch } from "solid-js";
-import { styled } from "solid-styled-components";
+import { CONFIGURATION } from '@revolt/common';
+import { BiRegularPlus, BiRegularXCircle, BiSolidFile } from 'solid-icons/bi';
+import { For, Match, Show, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { CONFIGURATION } from "@revolt/common";
-
-import { ALLOWED_IMAGE_TYPES } from "../../../../state/stores/Draft";
-import { OverflowingText } from "../../design";
-import { generateTypographyCSS } from "../../design/atoms/display/Typography";
+import { ALLOWED_IMAGE_TYPES } from '../../../../state/stores/Draft';
+import { OverflowingText } from '../../design';
+import { generateTypographyCSS } from '../../design/atoms/display/Typography';
 
 interface Props {
   /**
@@ -57,7 +56,7 @@ export function FileCarousel(props: Props) {
   return (
     <Show when={props.files.length}>
       <Container>
-        <Carousel use:scrollable={{ direction: "x" }}>
+        <Carousel use:scrollable={{ direction: 'x' }}>
           <For each={props.files}>
             {(id, index) => {
               /**
@@ -94,7 +93,7 @@ export function FileCarousel(props: Props) {
                           <Image
                             src={file().dataUri}
                             alt={file().file.name}
-                            loading="eager"
+                            loading='eager'
                           />
                         </Match>
                       </Switch>
@@ -126,9 +125,9 @@ export function FileCarousel(props: Props) {
 const PreviewBox = styled.div<{ image: boolean }>`
   display: grid;
   justify-items: center;
-  grid-template: "main" ${(props) =>
-      props.theme!.layout.height["attachment-preview"]} / minmax(
-      ${(props) => props.theme!.layout.height["attachment-preview"]},
+  grid-template: 'main' ${(props) =>
+      props.theme!.layout.height['attachment-preview']} / minmax(
+      ${(props) => props.theme!.layout.height['attachment-preview']},
       1fr
     );
 
@@ -138,7 +137,7 @@ const PreviewBox = styled.div<{ image: boolean }>`
 
   background: ${(props) =>
     props.theme!.colours[`messaging-upload-file-background`]};
-  color: ${(props) => props.theme!.colours["messaging-upload-file-foreground"]};
+  color: ${(props) => props.theme!.colours['messaging-upload-file-foreground']};
 
   > * {
     grid-area: main;
@@ -152,7 +151,7 @@ const Image = styled.img`
   width: 100%;
   object-fit: cover;
   margin-bottom: ${(props) => props.theme!.gap.md};
-  height: ${(props) => props.theme!.layout.height["attachment-preview"]};
+  height: ${(props) => props.theme!.layout.height['attachment-preview']};
 `;
 
 /**
@@ -183,8 +182,8 @@ const EmptyEntry = styled.div`
   display: grid;
   flex-shrink: 0;
   place-items: center;
-  width: ${(props) => props.theme!.layout.height["attachment-preview"]};
-  height: ${(props) => props.theme!.layout.height["attachment-preview"]};
+  width: ${(props) => props.theme!.layout.height['attachment-preview']};
+  height: ${(props) => props.theme!.layout.height['attachment-preview']};
 
   cursor: pointer;
   border-radius: ${(props) => props.theme!.gap.md};
@@ -198,7 +197,7 @@ const Entry = styled.div<{ ignored: boolean }>`
   display: flex;
   align-items: center;
   flex-direction: column;
-  opacity: ${(props) => (props.ignored ? "0.4" : "1")};
+  opacity: ${(props) => (props.ignored ? '0.4' : '1')};
 `;
 
 /**
@@ -206,8 +205,8 @@ const Entry = styled.div<{ ignored: boolean }>`
  */
 const FileName = styled.span`
   ${(props) =>
-    generateTypographyCSS(props.theme!, "composition-file-upload-name")}
-  max-width: ${(props) => props.theme!.layout.height["attachment-preview"]};
+    generateTypographyCSS(props.theme!, 'composition-file-upload-name')}
+  max-width: ${(props) => props.theme!.layout.height['attachment-preview']};
   text-align: center;
 `;
 
@@ -216,7 +215,7 @@ const FileName = styled.span`
  */
 const Size = styled.span`
   ${(props) =>
-    generateTypographyCSS(props.theme!, "composition-file-upload-size")}
+    generateTypographyCSS(props.theme!, 'composition-file-upload-size')}
 `;
 
 /**
@@ -227,7 +226,7 @@ const Divider = styled.div`
   flex-shrink: 0;
   width: ${(props) => props.theme!.gap.sm};
   border-radius: ${(props) => props.theme!.borderRadius.md};
-  background: ${(props) => props.theme!.colours["messaging-upload-divider"]};
+  background: ${(props) => props.theme!.colours['messaging-upload-divider']};
 `;
 
 /**
@@ -255,6 +254,6 @@ const Container = styled.div`
   border-radius: ${(props) => props.theme!.borderRadius.lg};
 
   background: ${(props) =>
-    props.theme!.colours["messaging-message-box-background"]};
-  color: ${(props) => props.theme!.colours["messaging-message-box-foreground"]};
+    props.theme!.colours['messaging-message-box-background']};
+  color: ${(props) => props.theme!.colours['messaging-message-box-foreground']};
 `;
diff --git a/packages/client/components/ui/components/messaging/composition/MessageBox.tsx b/packages/client/components/ui/components/messaging/composition/MessageBox.tsx
index 92c2e2835..1c5678a31 100644
--- a/packages/client/components/ui/components/messaging/composition/MessageBox.tsx
+++ b/packages/client/components/ui/components/messaging/composition/MessageBox.tsx
@@ -1,11 +1,11 @@
-import { BiRegularBlock } from "solid-icons/bi";
-import { JSX, Match, Show, Switch, onMount } from "solid-js";
-import { styled } from "solid-styled-components";
+import { useTranslation } from '@revolt/i18n';
+import { BiRegularBlock } from 'solid-icons/bi';
+import type { JSX } from 'solid-js';
+import { Match, onMount, Show, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { useTranslation } from "@revolt/i18n";
-
-import { generateTypographyCSS } from "../../design/atoms/display/Typography";
-import { InlineIcon, Row } from "../../design/layout";
+import { generateTypographyCSS } from '../../design/atoms/display/Typography';
+import { InlineIcon, Row } from '../../design/layout';
 
 interface Props {
   /**
@@ -54,7 +54,7 @@ interface Props {
   /**
    * Auto complete config
    */
-  autoCompleteConfig?: JSX.Directives["autoComplete"];
+  autoCompleteConfig?: JSX.Directives['autoComplete'];
 
   /**
    * Update the current draft selection
@@ -65,7 +65,7 @@ interface Props {
 /**
  * Message box container
  */
-const Base = styled("div", "MessageBox")`
+const Base = styled('div', 'MessageBox')`
   height: 48px;
   flex-shrink: 0;
 
@@ -74,14 +74,14 @@ const Base = styled("div", "MessageBox")`
 
   display: flex;
   background: ${({ theme }) =>
-    theme!.colours["messaging-message-box-background"]};
-  color: ${({ theme }) => theme!.colours["messaging-message-box-foreground"]};
+    theme!.colours['messaging-message-box-background']};
+  color: ${({ theme }) => theme!.colours['messaging-message-box-foreground']};
 `;
 
 /**
  * Input area
  */
-const Input = styled("textarea")`
+const Input = styled('textarea')`
   border: none;
   resize: none;
   outline: none;
@@ -91,8 +91,8 @@ const Input = styled("textarea")`
   padding: 14px 0;
 
   font-family: ${(props) => props.theme!.fonts.primary};
-  color: ${({ theme }) => theme!.colours["messaging-message-box-foreground"]};
-  ${(props) => generateTypographyCSS(props.theme!, "messages")}
+  color: ${({ theme }) => theme!.colours['messaging-message-box-foreground']};
+  ${(props) => generateTypographyCSS(props.theme!, 'messages')}
 `;
 
 /**
@@ -144,7 +144,7 @@ export function MessageBox(props: Props) {
     <Base>
       <Switch fallback={props.actionsStart}>
         <Match when={!props.sendingAllowed}>
-          <InlineIcon size="wide">
+          <InlineIcon size='wide'>
             <Blocked>
               <BiRegularBlock size={24} />
             </Blocked>
@@ -164,7 +164,7 @@ export function MessageBox(props: Props) {
         }
       >
         <Match when={!props.sendingAllowed}>
-          <Blocked align>{t("app.main.channel.misc.no_sending")}</Blocked>
+          <Blocked align>{t('app.main.channel.misc.no_sending')}</Blocked>
         </Match>
       </Switch>
       <Show when={props.sendingAllowed}>{props.actionsEnd}</Show>
diff --git a/packages/client/components/ui/components/messaging/composition/MessageReplyPreview.tsx b/packages/client/components/ui/components/messaging/composition/MessageReplyPreview.tsx
index 953b4d62b..fc628b3c0 100644
--- a/packages/client/components/ui/components/messaging/composition/MessageReplyPreview.tsx
+++ b/packages/client/components/ui/components/messaging/composition/MessageReplyPreview.tsx
@@ -1,13 +1,11 @@
-import { BiRegularAt, BiSolidXCircle } from "solid-icons/bi";
-import { Show } from "solid-js";
-import { styled } from "solid-styled-components";
+import { useTranslation } from '@revolt/i18n';
+import type { Message } from 'revolt.js';
+import { BiRegularAt, BiSolidXCircle } from 'solid-icons/bi';
+import { Show } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import type { Message } from "revolt.js";
-
-import { useTranslation } from "@revolt/i18n";
-
-import { Row } from "../../design";
-import { MessageReply } from "../message/MessageReply";
+import { Row } from '../../design';
+import { MessageReply } from '../message/MessageReply';
 
 interface Props {
   /**
@@ -56,7 +54,7 @@ const MentionToggle = styled.a<{ mention: boolean }>`
 
   color: ${(props) =>
     props.theme!.colours[
-      `messaging-indicator-reply-${props.mention ? "enabled" : "disabled"}`
+      `messaging-indicator-reply-${props.mention ? 'enabled' : 'disabled'}`
     ]};
 `;
 
@@ -78,9 +76,9 @@ const Base = styled(Row)`
   padding: ${(props) => props.theme!.gap.md} ${(props) => props.theme!.gap.lg};
   border-radius: ${(props) => props.theme!.borderRadius.lg};
 
-  color: ${(props) => props.theme!.colours["messaging-indicator-foreground"]};
+  color: ${(props) => props.theme!.colours['messaging-indicator-foreground']};
   background: ${(props) =>
-    props.theme!.colours["messaging-indicator-background"]};
+    props.theme!.colours['messaging-indicator-background']};
 
   a:hover {
     filter: brightness(1.2);
@@ -94,14 +92,14 @@ export function MessageReplyPreview(props: Props) {
   const t = useTranslation();
 
   return (
-    <Base gap="md" align>
-      <ReplyTo>{t("app.main.channel.reply.replying")}</ReplyTo>
+    <Base gap='md' align>
+      <ReplyTo>{t('app.main.channel.reply.replying')}</ReplyTo>
       <MessageReply message={props.message} noDecorations />
-      <Row gap="lg" align>
+      <Row gap='lg' align>
         <Show when={!props.self}>
           <MentionToggle mention={props.mention} onClick={props.toggle}>
             <BiRegularAt size={16} />
-            {props.mention ? t("general.on") : t("general.off")}
+            {props.mention ? t('general.on') : t('general.off')}
           </MentionToggle>
         </Show>
         <Dismiss onClick={props.dismiss}>
diff --git a/packages/client/components/ui/components/messaging/composition/TypingIndicator.tsx b/packages/client/components/ui/components/messaging/composition/TypingIndicator.tsx
index 5bc9c5332..3ec37dbb4 100644
--- a/packages/client/components/ui/components/messaging/composition/TypingIndicator.tsx
+++ b/packages/client/components/ui/components/messaging/composition/TypingIndicator.tsx
@@ -1,12 +1,10 @@
-import { For, Match, Show, Switch } from "solid-js";
-import { styled } from "solid-styled-components";
+import { useTranslation } from '@revolt/i18n';
+import { useUsers } from '@revolt/markdown/users';
+import type { User } from 'revolt.js';
+import { For, Match, Show, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { User } from "revolt.js";
-
-import { useTranslation } from "@revolt/i18n";
-import { useUsers } from "@revolt/markdown/users";
-
-import { Avatar, OverflowingText, Typography } from "../../design";
+import { Avatar, OverflowingText, Typography } from '../../design';
 
 interface Props {
   /**
@@ -34,9 +32,9 @@ export function TypingIndicator(props: Props) {
     (
       props.users.filter(
         (user) =>
-          typeof user !== "undefined" &&
+          typeof user !== 'undefined' &&
           user.id !== props.ownId &&
-          user.relationship !== "Blocked"
+          user.relationship !== 'Blocked'
       ) as User[]
     )
       .sort((a, b) => a!.id.toUpperCase().localeCompare(b!.id.toUpperCase()))
@@ -55,27 +53,27 @@ export function TypingIndicator(props: Props) {
                   src={user!.avatar}
                   size={15}
                   holepunch={
-                    index() + 1 < users().length ? "overlap-subtle" : "none"
+                    index() + 1 < users().length ? 'overlap-subtle' : 'none'
                   }
                 />
               )}
             </For>
           </Avatars>
           <OverflowingText>
-            <Typography variant="composition-typing-indicator">
-              <Switch fallback={t("app.main.channel.typing.several")}>
+            <Typography variant='composition-typing-indicator'>
+              <Switch fallback={t('app.main.channel.typing.several')}>
                 <Match when={users().length === 1}>
-                  {t("app.main.channel.typing.single", {
+                  {t('app.main.channel.typing.single', {
                     user: users()[0]!.username,
                   })}
                 </Match>
                 <Match when={users().length < 5}>
-                  {t("app.main.channel.typing.multiple", {
+                  {t('app.main.channel.typing.multiple', {
                     user: users().slice(-1)[0]!.username,
                     userlist: users()
                       .slice(0, -1)
                       .map((user) => user!.username)
-                      .join(", "),
+                      .join(', '),
                   })}
                 </Match>
               </Switch>
@@ -120,14 +118,14 @@ const Bar = styled.div`
   flex-direction: row;
 
   backdrop-filter: ${(props) => props.theme!.effects.blur.md};
-  color: ${(props) => props.theme!.colours["messaging-indicator-foreground"]};
+  color: ${(props) => props.theme!.colours['messaging-indicator-foreground']};
   background: ${(props) =>
-    props.theme!.colours["messaging-indicator-background"]};
+    props.theme!.colours['messaging-indicator-background']};
 `;
 
 /**
  * Position relatively to this space
  */
-const Base = styled("div", "TypingIndicator")`
+const Base = styled('div', 'TypingIndicator')`
   position: relative;
 `;
diff --git a/packages/client/components/ui/components/messaging/composition/index.ts b/packages/client/components/ui/components/messaging/composition/index.ts
index 00e21a5e7..2a46f7e70 100644
--- a/packages/client/components/ui/components/messaging/composition/index.ts
+++ b/packages/client/components/ui/components/messaging/composition/index.ts
@@ -1,4 +1,4 @@
-export { MessageReplyPreview } from "./MessageReplyPreview";
-export { TypingIndicator } from "./TypingIndicator";
-export { FileCarousel } from "./FileCarousel";
-export { MessageBox } from "./MessageBox";
+export { FileCarousel } from './FileCarousel';
+export { MessageBox } from './MessageBox';
+export { MessageReplyPreview } from './MessageReplyPreview';
+export { TypingIndicator } from './TypingIndicator';
diff --git a/packages/client/components/ui/components/messaging/index.ts b/packages/client/components/ui/components/messaging/index.ts
index 50dcdc3ab..57a4f55cf 100644
--- a/packages/client/components/ui/components/messaging/index.ts
+++ b/packages/client/components/ui/components/messaging/index.ts
@@ -1,3 +1,3 @@
-export * from "./composition";
-export * from "./message";
-export * from "./indicators";
+export * from './composition';
+export * from './indicators';
+export * from './message';
diff --git a/packages/client/components/ui/components/messaging/indicators/FloatingIndicator.tsx b/packages/client/components/ui/components/messaging/indicators/FloatingIndicator.tsx
index 54c15afce..e5b0e699d 100644
--- a/packages/client/components/ui/components/messaging/indicators/FloatingIndicator.tsx
+++ b/packages/client/components/ui/components/messaging/indicators/FloatingIndicator.tsx
@@ -1,12 +1,12 @@
-import { styled } from "solid-styled-components";
+import { styled } from 'solid-styled-components';
 
-import { generateTypographyCSS } from "../../design/atoms/display/Typography";
+import { generateTypographyCSS } from '../../design/atoms/display/Typography';
 
 /**
  * Common styles for the floating indicators
  */
-export const FloatingIndicator = styled("div", "FloatingIndicator")<{
-  position: "top" | "bottom";
+export const FloatingIndicator = styled('div', 'FloatingIndicator')<{
+  position: 'top' | 'bottom';
 }>`
   display: flex;
   user-select: none;
@@ -19,16 +19,16 @@ export const FloatingIndicator = styled("div", "FloatingIndicator")<{
 
   cursor: pointer;
   backdrop-filter: ${(props) => props.theme!.effects.blur.md};
-  color: ${(props) => props.theme!.colours["messaging-indicator-foreground"]};
+  color: ${(props) => props.theme!.colours['messaging-indicator-foreground']};
   background-color: ${(props) =>
-    props.theme!.colours["messaging-indicator-background"]};
+    props.theme!.colours['messaging-indicator-background']};
 
-  ${(props) => generateTypographyCSS(props.theme!, "conversation-indicator")}
+  ${(props) => generateTypographyCSS(props.theme!, 'conversation-indicator')}
 
   @keyframes anim {
     0% {
       transform: translateY(
-        ${(props) => (props.position === "top" ? "-33px" : "33px")}
+        ${(props) => (props.position === 'top' ? '-33px' : '33px')}
       );
     }
     100% {
diff --git a/packages/client/components/ui/components/messaging/indicators/JumpToBottom.tsx b/packages/client/components/ui/components/messaging/indicators/JumpToBottom.tsx
index e251ed335..f88d94d0a 100644
--- a/packages/client/components/ui/components/messaging/indicators/JumpToBottom.tsx
+++ b/packages/client/components/ui/components/messaging/indicators/JumpToBottom.tsx
@@ -1,10 +1,8 @@
-import { useTranslation } from "@revolt/i18n";
+import MdArrowForward from '@material-design-icons/svg/filled/arrow_forward.svg?component-solid';
+import { useTranslation } from '@revolt/i18n';
 
-import MdArrowForward from "@material-design-icons/svg/filled/arrow_forward.svg?component-solid";
-
-import { iconSize } from "../../..";
-
-import { FloatingIndicator } from "./FloatingIndicator";
+import { iconSize } from '../../..';
+import { FloatingIndicator } from './FloatingIndicator';
 
 interface Props {
   /**
@@ -20,11 +18,11 @@ export function JumpToBottom(props: Props) {
   const t = useTranslation();
 
   return (
-    <FloatingIndicator use:ripple position="bottom" onClick={props.onClick}>
-      <span style={{ "flex-grow": 1 }}>
-        {t("app.main.channel.misc.viewing_old")}
+    <FloatingIndicator use:ripple position='bottom' onClick={props.onClick}>
+      <span style={{ 'flex-grow': 1 }}>
+        {t('app.main.channel.misc.viewing_old')}
       </span>
-      <span>{t("app.main.channel.misc.jump_present")}</span>
+      <span>{t('app.main.channel.misc.jump_present')}</span>
       <MdArrowForward {...iconSize(16)} />
     </FloatingIndicator>
   );
diff --git a/packages/client/components/ui/components/messaging/indicators/NewMessages.tsx b/packages/client/components/ui/components/messaging/indicators/NewMessages.tsx
index fbbd99097..acd503db2 100644
--- a/packages/client/components/ui/components/messaging/indicators/NewMessages.tsx
+++ b/packages/client/components/ui/components/messaging/indicators/NewMessages.tsx
@@ -1,14 +1,11 @@
-import { Accessor, Show } from "solid-js";
+import MdClose from '@material-design-icons/svg/filled/close.svg?component-solid';
+import { dayjs, useTranslation } from '@revolt/i18n';
+import type { Accessor } from 'solid-js';
+import { Show } from 'solid-js';
+import { decodeTime } from 'ulid';
 
-import { decodeTime } from "ulid";
-
-import { dayjs, useTranslation } from "@revolt/i18n";
-
-import MdClose from "@material-design-icons/svg/filled/close.svg?component-solid";
-
-import { iconSize, styled } from "../../..";
-
-import { FloatingIndicator } from "./FloatingIndicator";
+import { iconSize, styled } from '../../..';
+import { FloatingIndicator } from './FloatingIndicator';
 
 interface Props {
   /**
@@ -45,13 +42,13 @@ export function NewMessages(props: Props) {
 
   return (
     <Show when={props.lastId()}>
-      <FloatingIndicator use:ripple position="top" onClick={props.jumpBack}>
-        <span style={{ "flex-grow": 1 }}>
-          {t("app.main.channel.misc.new_messages", {
+      <FloatingIndicator use:ripple position='top' onClick={props.jumpBack}>
+        <span style={{ 'flex-grow': 1 }}>
+          {t('app.main.channel.misc.new_messages', {
             time_ago: dayjs(decodeTime(props.lastId()!)).fromNow(),
           })}
         </span>
-        <span>{t("app.main.channel.misc.jump_beginning")}</span>
+        <span>{t('app.main.channel.misc.jump_beginning')}</span>
         <CancelIcon onClick={onCancel}>
           <MdClose {...iconSize(16)} />
         </CancelIcon>
diff --git a/packages/client/components/ui/components/messaging/indicators/index.tsx b/packages/client/components/ui/components/messaging/indicators/index.tsx
index e20d8dd8c..21da1971d 100644
--- a/packages/client/components/ui/components/messaging/indicators/index.tsx
+++ b/packages/client/components/ui/components/messaging/indicators/index.tsx
@@ -1,2 +1,2 @@
-export { NewMessages } from "./NewMessages";
-export { JumpToBottom } from "./JumpToBottom";
+export { JumpToBottom } from './JumpToBottom';
+export { NewMessages } from './NewMessages';
diff --git a/packages/client/components/ui/components/messaging/message/Attachment.stories.tsx b/packages/client/components/ui/components/messaging/message/Attachment.stories.tsx
index f11f245bb..191c23c3d 100644
--- a/packages/client/components/ui/components/messaging/message/Attachment.stories.tsx
+++ b/packages/client/components/ui/components/messaging/message/Attachment.stories.tsx
@@ -1,11 +1,10 @@
-import type { ComponentProps } from "solid-js";
+import type { API } from 'revolt.js';
+import { Client, File } from 'revolt.js';
+import type { ComponentProps } from 'solid-js';
 
-import { API, Client, File } from "revolt.js";
-
-import FitContentDecorator from "../../../decorators/FitContentDecorator";
-import type { ComponentStory } from "../../stories";
-
-import { Attachment } from "./Attachment";
+import FitContentDecorator from '../../../decorators/FitContentDecorator';
+import type { ComponentStory } from '../../stories';
+import { Attachment } from './Attachment';
 
 const client = new Client();
 
@@ -13,178 +12,178 @@ client.configuration = {
   features: {
     autumn: {
       enabled: true,
-      url: "http://local.revolt.chat:5273",
+      url: 'http://local.revolt.chat:5273',
     },
   },
 } as never;
 
 export const attachments: {
   [key in
-    | "audio"
-    | "text"
-    | "file"
-    | `${"tall" | "wide"}_${"image" | "video"}`]: API.File;
+    | 'audio'
+    | 'text'
+    | 'file'
+    | `${'tall' | 'wide'}_${'image' | 'video'}`]: API.File;
 } = {
   tall_image: {
-    tag: "attachments",
-    content_type: "image/jpg",
-    _id: "jeremy-hynes-4tmtN4YU5yM-unsplash.jpg",
-    filename: "jeremy-hynes-4tmtN4YU5yM-unsplash.jpg",
+    tag: 'attachments',
+    content_type: 'image/jpg',
+    _id: 'jeremy-hynes-4tmtN4YU5yM-unsplash.jpg',
+    filename: 'jeremy-hynes-4tmtN4YU5yM-unsplash.jpg',
     size: 5_000,
     metadata: {
-      type: "Image",
+      type: 'Image',
       width: 640,
       height: 960,
     },
   },
   wide_image: {
-    tag: "attachments",
-    content_type: "image/jpg",
-    _id: "maxim-berg-Ac02zYZs22Y-unsplash.jpg",
-    filename: "maxim-berg-Ac02zYZs22Y-unsplash.jpg",
+    tag: 'attachments',
+    content_type: 'image/jpg',
+    _id: 'maxim-berg-Ac02zYZs22Y-unsplash.jpg',
+    filename: 'maxim-berg-Ac02zYZs22Y-unsplash.jpg',
     size: 5_000,
     metadata: {
-      type: "Image",
+      type: 'Image',
       width: 640,
       height: 427,
     },
   },
   tall_video: {
-    tag: "attachments",
-    content_type: "video/mp4",
-    _id: "pexels-polina-kovaleva-8035714.mp4",
-    filename: "pexels-polina-kovaleva-8035714.mp4",
+    tag: 'attachments',
+    content_type: 'video/mp4',
+    _id: 'pexels-polina-kovaleva-8035714.mp4',
+    filename: 'pexels-polina-kovaleva-8035714.mp4',
     size: 5_000,
     metadata: {
-      type: "Video",
+      type: 'Video',
       width: 360,
       height: 640,
     },
   },
   wide_video: {
-    tag: "attachments",
-    content_type: "video/mp4",
-    _id: "pexels-lachlan-ross-8775687.mp4",
-    filename: "pexels-lachlan-ross-8775687.mp4",
+    tag: 'attachments',
+    content_type: 'video/mp4',
+    _id: 'pexels-lachlan-ross-8775687.mp4',
+    filename: 'pexels-lachlan-ross-8775687.mp4',
     size: 5_000,
     metadata: {
-      type: "Video",
+      type: 'Video',
       width: 640,
       height: 360,
     },
   },
   audio: {
-    tag: "attachments",
-    content_type: "audio/ogg",
-    _id: "667237__klankbeeld__pound-in-summer-hydrophone-1331-220725-0457.wav",
+    tag: 'attachments',
+    content_type: 'audio/ogg',
+    _id: '667237__klankbeeld__pound-in-summer-hydrophone-1331-220725-0457.wav',
     filename:
-      "667237__klankbeeld__pound-in-summer-hydrophone-1331-220725-0457.wav",
+      '667237__klankbeeld__pound-in-summer-hydrophone-1331-220725-0457.wav',
     size: 5_000,
     metadata: {
-      type: "Audio",
+      type: 'Audio',
     },
   },
   text: {
-    tag: "attachments",
-    content_type: "plain/text",
-    _id: "file.txt",
-    filename: "file.txt",
+    tag: 'attachments',
+    content_type: 'plain/text',
+    _id: 'file.txt',
+    filename: 'file.txt',
     size: 2_500,
     metadata: {
-      type: "Text",
+      type: 'Text',
     },
   },
   file: {
-    tag: "attachments",
-    content_type: "application/octet-stream",
-    _id: "file",
-    filename: "file",
+    tag: 'attachments',
+    content_type: 'application/octet-stream',
+    _id: 'file',
+    filename: 'file',
     size: 2_500,
     metadata: {
-      type: "File",
+      type: 'File',
     },
   },
 };
 
 export default {
-  category: "Messaging/Message/Attachment",
+  category: 'Messaging/Message/Attachment',
   component: Attachment,
   stories: [
     {
-      title: "Image (Tall)",
+      title: 'Image (Tall)',
       props: {
         file: new File(client, attachments.tall_image),
       },
     },
     {
-      title: "Image (Wide)",
+      title: 'Image (Wide)',
       props: {
         file: new File(client, attachments.wide_image),
       },
     },
     {
-      title: "Image (Tall Spoiler)",
+      title: 'Image (Tall Spoiler)',
       props: {
         file: new File(client, {
           ...attachments.tall_image,
-          filename: "SPOILER_tall.jpg",
+          filename: 'SPOILER_tall.jpg',
         }),
       },
     },
 
     {
-      title: "Image (Wide Spoiler)",
+      title: 'Image (Wide Spoiler)',
       props: {
         file: new File(client, {
           ...attachments.wide_image,
-          filename: "SPOILER_wide.jpg",
+          filename: 'SPOILER_wide.jpg',
         }),
       },
     },
     {
-      title: "Video (Tall)",
+      title: 'Video (Tall)',
       props: {
         file: new File(client, attachments.tall_video),
       },
     },
     {
-      title: "Video (Wide)",
+      title: 'Video (Wide)',
       props: {
         file: new File(client, attachments.wide_video),
       },
     },
     {
-      title: "Video (Tall Spoiler)",
+      title: 'Video (Tall Spoiler)',
       props: {
         file: new File(client, {
           ...attachments.tall_video,
-          filename: "SPOILER_tall.mp4",
+          filename: 'SPOILER_tall.mp4',
         }),
       },
     },
     {
-      title: "Video (Wide Spoiler)",
+      title: 'Video (Wide Spoiler)',
       props: {
         file: new File(client, {
           ...attachments.wide_video,
-          filename: "SPOILER_wide.mp4",
+          filename: 'SPOILER_wide.mp4',
         }),
       },
     },
     {
-      title: "Audio",
+      title: 'Audio',
       props: {
         file: new File(client, attachments.audio),
       },
     },
     {
-      title: "Text",
+      title: 'Text',
       props: {
         file: new File(client, attachments.text),
       },
     },
     {
-      title: "Text (Large)",
+      title: 'Text (Large)',
       props: {
         file: new File(client, {
           ...attachments.text,
@@ -193,7 +192,7 @@ export default {
       },
     },
     {
-      title: "File",
+      title: 'File',
       props: {
         file: new File(client, attachments.file),
       },
diff --git a/packages/client/components/ui/components/messaging/message/Attachment.tsx b/packages/client/components/ui/components/messaging/message/Attachment.tsx
index 246f5b6ac..24a66dbfc 100644
--- a/packages/client/components/ui/components/messaging/message/Attachment.tsx
+++ b/packages/client/components/ui/components/messaging/message/Attachment.tsx
@@ -1,16 +1,13 @@
-import { Match, Show, Switch } from "solid-js";
-import { styled } from "solid-styled-components";
+import { getController } from '@revolt/common';
+import type { File, ImageEmbed, VideoEmbed } from 'revolt.js';
+import { Match, Show, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { File, ImageEmbed, VideoEmbed } from "revolt.js";
-
-import { getController } from "@revolt/common";
-
-import { Column } from "../../design/layout";
-import { SizedContent } from "../../design/layout/SizedContent";
-import { Spoiler } from "../../design/layout/Spoiler";
-
-import { FileInfo } from "./FileInfo";
-import { TextFile } from "./TextFile";
+import { Column } from '../../design/layout';
+import { SizedContent } from '../../design/layout/SizedContent';
+import { Spoiler } from '../../design/layout/Spoiler';
+import { FileInfo } from './FileInfo';
+import { TextFile } from './TextFile';
 
 /**
  * List of attachments
@@ -20,9 +17,9 @@ export const AttachmentContainer = styled(Column)`
   border-radius: ${(props) => props.theme!.borderRadius.md};
 
   color: ${(props) =>
-    props.theme!.colours["messaging-component-attachment-foreground"]};
+    props.theme!.colours['messaging-component-attachment-foreground']};
   background: ${(props) =>
-    props.theme!.colours["messaging-component-attachment-background"]};
+    props.theme!.colours['messaging-component-attachment-background']};
 `;
 
 /**
@@ -44,39 +41,39 @@ export function humanFileSize(size: number) {
 export function Attachment(props: { file: File }) {
   return (
     <Switch fallback={`Could not render ${props.file.metadata.type}!`}>
-      <Match when={props.file.metadata.type === "Image"}>
+      <Match when={props.file.metadata.type === 'Image'}>
         <SizedContent
           width={(props.file.metadata as ImageEmbed).width}
           height={(props.file.metadata as ImageEmbed).height}
         >
           <Show when={props.file.isSpoiler}>
-            <Spoiler contentType="Image" />
+            <Spoiler contentType='Image' />
           </Show>
           <img
             // TODO: cursor: pointer
             onClick={() =>
-              getController("modal").push({
-                type: "image_viewer",
+              getController('modal').push({
+                type: 'image_viewer',
                 file: props.file,
               })
             }
-            loading="lazy"
+            loading='lazy'
             src={props.file.createFileURL({ max_side: 512 }, true)}
           />
         </SizedContent>
       </Match>
-      <Match when={props.file.metadata.type === "Video"}>
+      <Match when={props.file.metadata.type === 'Video'}>
         <SizedContent
           width={(props.file.metadata as VideoEmbed).width}
           height={(props.file.metadata as VideoEmbed).height}
         >
           <Show when={props.file.isSpoiler}>
-            <Spoiler contentType="Video" />
+            <Spoiler contentType='Video' />
           </Show>
-          <video controls preload="metadata" src={props.file.url} />
+          <video controls preload='metadata' src={props.file.url} />
         </SizedContent>
       </Match>
-      <Match when={props.file.metadata.type === "Audio"}>
+      <Match when={props.file.metadata.type === 'Audio'}>
         <AttachmentContainer>
           <FileInfo file={props.file} />
           <SizedContent width={360} height={48}>
@@ -84,12 +81,12 @@ export function Attachment(props: { file: File }) {
           </SizedContent>
         </AttachmentContainer>
       </Match>
-      <Match when={props.file.metadata.type === "File"}>
+      <Match when={props.file.metadata.type === 'File'}>
         <AttachmentContainer>
           <FileInfo file={props.file} />
         </AttachmentContainer>
       </Match>
-      <Match when={props.file.metadata.type === "Text"}>
+      <Match when={props.file.metadata.type === 'Text'}>
         <AttachmentContainer>
           <FileInfo file={props.file} />
           <SizedContent width={480} height={120}>
diff --git a/packages/client/components/ui/components/messaging/message/Container.stories.tsx b/packages/client/components/ui/components/messaging/message/Container.stories.tsx
index aa7f4a793..c784f4e4a 100644
--- a/packages/client/components/ui/components/messaging/message/Container.stories.tsx
+++ b/packages/client/components/ui/components/messaging/message/Container.stories.tsx
@@ -1,59 +1,58 @@
-import type { ComponentProps } from "solid-js";
+import type { ComponentProps } from 'solid-js';
 
-import TestImage from "../../../test-images/the-halal-design-studio-ZrJpH6W-HDs-unsplash.jpg";
-import type { ComponentStory } from "../../stories";
-
-import { MessageContainer } from "./Container";
+import TestImage from '../../../test-images/the-halal-design-studio-ZrJpH6W-HDs-unsplash.jpg';
+import type { ComponentStory } from '../../stories';
+import { MessageContainer } from './Container';
 
 export default {
-  category: "Messaging/Message/Container",
+  category: 'Messaging/Message/Container',
   component: MessageContainer,
   stories: [
-    { title: "Default" },
+    { title: 'Default' },
     {
-      title: "Tail",
+      title: 'Tail',
       props: {
         tail: true,
       },
     },
     {
-      title: "Edited Message",
+      title: 'Edited Message',
       props: {
-        children: "hello this is an edit",
-        edited: +new Date("Thu, 30 Dec 2022 12:33:35 GMT"),
+        children: 'hello this is an edit',
+        edited: +new Date('Thu, 30 Dec 2022 12:33:35 GMT'),
       },
     },
     {
-      title: "Edited Tail",
+      title: 'Edited Tail',
       props: {
         tail: true,
-        children: "hello this is an edit",
-        edited: +new Date("Thu, 30 Dec 2022 12:33:35 GMT"),
+        children: 'hello this is an edit',
+        edited: +new Date('Thu, 30 Dec 2022 12:33:35 GMT'),
       },
     },
     {
-      title: "Coloured Username",
+      title: 'Coloured Username',
       props: {
-        colour: "linear-gradient(30deg, purple, orange)",
+        colour: 'linear-gradient(30deg, purple, orange)',
       },
     },
   ],
   props: {
-    children: "I love rolt!!!!!",
-    timestamp: +new Date("Thu, 29 Dec 2022 12:33:35 GMT"),
+    children: 'I love rolt!!!!!',
+    timestamp: +new Date('Thu, 29 Dec 2022 12:33:35 GMT'),
     avatar: TestImage,
-    username: "rolt user",
-    _referenceTime: +new Date("Thu, 29 Dec 2022 13:00:00 GMT"),
+    username: 'rolt user',
+    _referenceTime: +new Date('Thu, 29 Dec 2022 13:00:00 GMT'),
   },
   propTypes: {
-    children: "string",
-    avatar: "string",
-    colour: "string",
-    username: "string",
-    timestamp: "number",
-    edited: "number",
-    header: "component",
-    tail: "boolean",
+    children: 'string',
+    avatar: 'string',
+    colour: 'string',
+    username: 'string',
+    timestamp: 'number',
+    edited: 'number',
+    header: 'component',
+    tail: 'boolean',
   },
 } as ComponentStory<
   typeof MessageContainer,
diff --git a/packages/client/components/ui/components/messaging/message/Container.tsx b/packages/client/components/ui/components/messaging/message/Container.tsx
index a3c3d09fd..4301c8f5a 100644
--- a/packages/client/components/ui/components/messaging/message/Container.tsx
+++ b/packages/client/components/ui/components/messaging/message/Container.tsx
@@ -1,17 +1,18 @@
-import { Component, JSX, Match, Show, Switch } from "solid-js";
-import { styled } from "solid-styled-components";
+import type { Component, JSX } from 'solid-js';
+import { Match, Show, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { Time } from "../../design/atoms/display/Time";
+import { Time } from '../../design/atoms/display/Time';
 import {
-  Typography,
   generateTypographyCSS,
-} from "../../design/atoms/display/Typography";
+  Typography,
+} from '../../design/atoms/display/Typography';
 import {
   Column,
   NonBreakingText,
   OverflowingText,
   Row,
-} from "../../design/layout";
+} from '../../design/layout';
 
 interface CommonProps {
   /**
@@ -76,7 +77,7 @@ type Props = CommonProps & {
   /**
    * Send status of this message
    */
-  sendStatus?: "sending" | "failed";
+  sendStatus?: 'sending' | 'failed';
 
   /**
    * Component to render message context menu
@@ -97,25 +98,25 @@ type Props = CommonProps & {
 /**
  * Message container layout
  */
-const Base = styled(Column as Component, "Message")<
-  CommonProps & Pick<Props, "mentioned" | "highlight" | "sendStatus">
+const Base = styled(Column as Component, 'Message')<
+  CommonProps & Pick<Props, 'mentioned' | 'highlight' | 'sendStatus'>
 >`
-  ${(props) => generateTypographyCSS(props.theme!, "messages")}
+  ${(props) => generateTypographyCSS(props.theme!, 'messages')}
 
   padding: 2px 0;
   color: ${(props) =>
-    props.sendStatus === "failed"
+    props.sendStatus === 'failed'
       ? props.theme!.customColours.error.color
       : props.theme!.colours.foreground};
   background: ${(props) =>
     props.mentioned
-      ? props.theme!.colours["messaging-message-mentioned-background"]
-      : "transparent"};
-  margin-top: ${(props) => (props.tail ? 0 : "12px")} !important;
+      ? props.theme!.colours['messaging-message-mentioned-background']
+      : 'transparent'};
+  margin-top: ${(props) => (props.tail ? 0 : '12px')} !important;
   border-radius: ${(props) => props.theme!.borderRadius.md};
   min-height: 1em;
 
-  ${(props) => (props.highlight ? "outline: 2px solid red;" : "")}
+  ${(props) => (props.highlight ? 'outline: 2px solid red;' : '')}
 
   .hidden {
     display: none;
@@ -135,12 +136,12 @@ const Base = styled(Column as Component, "Message")<
 /**
  * Left-side information or avatar
  */
-const Info = styled("div", "Info")<Pick<CommonProps, "tail" | "compact">>`
+const Info = styled('div', 'Info')<Pick<CommonProps, 'tail' | 'compact'>>`
   display: flex;
   flex-shrink: 0;
   justify-content: center;
   padding: ${(props) => (props.tail ? 0 : 2)}px 0;
-  ${(props) => (props.compact ? "" : "width: 62px;")}
+  ${(props) => (props.compact ? '' : 'width: 62px;')}
 `;
 
 /**
@@ -159,7 +160,7 @@ const Content = styled(Column)`
  */
 const InfoText = styled(Row)`
   color: var(--unset-fg);
-  ${(props) => generateTypographyCSS(props.theme!, "small")}
+  ${(props) => generateTypographyCSS(props.theme!, 'small')}
 `;
 
 /**
@@ -186,15 +187,15 @@ export function MessageContainer(props: Props) {
       use:ripple={{ enable: false }}
     >
       {props.header}
-      <Row gap="none">
+      <Row gap='none'>
         <Info tail={props.tail} compact={props.compact}>
           <Switch fallback={props.avatar}>
             {props.infoMatch ?? <Match when={false} children={null} />}
             <Match when={props.compact}>
-              <CompactInfo gap="sm" align>
-                <InfoText gap="sm">
+              <CompactInfo gap='sm' align>
+                <InfoText gap='sm'>
                   <Time
-                    format="time"
+                    format='time'
                     value={props.timestamp}
                     referenceTime={props._referenceTime}
                   />
@@ -204,13 +205,13 @@ export function MessageContainer(props: Props) {
               </CompactInfo>
             </Match>
             <Match when={props.tail}>
-              <InfoText class={!props.edited ? "hidden" : undefined}>
-                <Typography variant="small">
+              <InfoText class={!props.edited ? 'hidden' : undefined}>
+                <Typography variant='small'>
                   <Show when={props.edited}>(edited)</Show>
                   <Show when={!props.edited}>
                     <Time
                       value={props.timestamp}
-                      format="time"
+                      format='time'
                       referenceTime={props._referenceTime}
                     />
                   </Show>
@@ -221,15 +222,15 @@ export function MessageContainer(props: Props) {
         </Info>
         <Content>
           <Show when={!props.tail && !props.compact}>
-            <Row gap="sm" align>
+            <Row gap='sm' align>
               <OverflowingText>{props.username}</OverflowingText>
               <NonBreakingText>
-                <InfoText gap="sm" align>
+                <InfoText gap='sm' align>
                   {props.info}
                   <Switch fallback={props.timestamp as string}>
                     <Match when={props.timestamp instanceof Date}>
                       <Time
-                        format="calendar"
+                        format='calendar'
                         value={props.timestamp}
                         referenceTime={props._referenceTime}
                       />
diff --git a/packages/client/components/ui/components/messaging/message/Embed.stories.tsx b/packages/client/components/ui/components/messaging/message/Embed.stories.tsx
index 99168db6f..d525c2a0d 100644
--- a/packages/client/components/ui/components/messaging/message/Embed.stories.tsx
+++ b/packages/client/components/ui/components/messaging/message/Embed.stories.tsx
@@ -1,14 +1,13 @@
-import type { ComponentProps } from "solid-js";
+import type { API } from 'revolt.js';
+import { Client, WebsiteEmbed } from 'revolt.js';
+import { MessageEmbed } from 'revolt.js';
+import type { ComponentProps } from 'solid-js';
 
-import { API, Client, WebsiteEmbed } from "revolt.js";
-import { MessageEmbed } from "revolt.js";
-
-import FitContentDecorator from "../../../decorators/FitContentDecorator";
-import MotherboardIcon from "../../../test-images/icons8-motherboard-48.png";
-import type { ComponentStory } from "../../stories";
-
-import { attachments } from "./Attachment.stories";
-import { Embed } from "./Embed";
+import FitContentDecorator from '../../../decorators/FitContentDecorator';
+import MotherboardIcon from '../../../test-images/icons8-motherboard-48.png';
+import type { ComponentStory } from '../../stories';
+import { attachments } from './Attachment.stories';
+import { Embed } from './Embed';
 
 const client = new Client();
 
@@ -16,7 +15,7 @@ client.configuration = {
   features: {
     autumn: {
       enabled: true,
-      url: "http://local.revolt.chat:5273",
+      url: 'http://local.revolt.chat:5273',
     },
     january: {
       enabled: false,
@@ -25,92 +24,92 @@ client.configuration = {
 } as never;
 
 const embeds: {
-  [key in "text" | "website" | "image" | "video"]: API.Embed;
+  [key in 'text' | 'website' | 'image' | 'video']: API.Embed;
 } = {
   text: {
-    type: "Text",
-    title: "My Text Embed",
-    description: "hello and welcome to my embed",
+    type: 'Text',
+    title: 'My Text Embed',
+    description: 'hello and welcome to my embed',
     icon_url: MotherboardIcon,
-    colour: "#ff4655",
-    url: "https://revolt.chat",
+    colour: '#ff4655',
+    url: 'https://revolt.chat',
     media: {
       ...attachments.tall_image,
-      _id: "jeremy-hynes-3qe0f3-i-Pc-unsplash.jpg",
+      _id: 'jeremy-hynes-3qe0f3-i-Pc-unsplash.jpg',
       metadata: {
-        type: "Image",
+        type: 'Image',
         width: 360,
         height: 640,
       },
     },
   },
   website: {
-    type: "Website",
-    site_name: "Motherboard",
+    type: 'Website',
+    site_name: 'Motherboard',
     icon_url: MotherboardIcon,
-    title: "This Is The Article Of All Time",
-    description: "This embed has a small preview image on the right...",
-    original_url: "https://revolt.chat",
-    url: "https://revolt.chat/posts/eat-drywall",
+    title: 'This Is The Article Of All Time',
+    description: 'This embed has a small preview image on the right...',
+    original_url: 'https://revolt.chat',
+    url: 'https://revolt.chat/posts/eat-drywall',
     image: {
-      url: "http://local.revolt.chat:5273/attachments/maxim-berg-Ac02zYZs22Y-unsplash.jpg",
+      url: 'http://local.revolt.chat:5273/attachments/maxim-berg-Ac02zYZs22Y-unsplash.jpg',
       width: 640,
       height: 427,
-      size: "Preview",
+      size: 'Preview',
     },
   },
   image: {
-    type: "Image",
-    url: "http://local.revolt.chat:5273/attachments/jeremy-hynes-3qe0f3-i-Pc-unsplash.jpg",
+    type: 'Image',
+    url: 'http://local.revolt.chat:5273/attachments/jeremy-hynes-3qe0f3-i-Pc-unsplash.jpg',
     width: 640,
     height: 1138,
-    size: "Large",
+    size: 'Large',
   },
   video: {
-    type: "Video",
-    url: "http://local.revolt.chat:5273/attachments/pexels-polina-kovaleva-8035714.mp4",
+    type: 'Video',
+    url: 'http://local.revolt.chat:5273/attachments/pexels-polina-kovaleva-8035714.mp4',
     width: 360,
     height: 640,
   },
 };
 
 export default {
-  category: "Messaging/Message/Embed",
+  category: 'Messaging/Message/Embed',
   component: Embed,
   stories: [
     {
-      title: "Text",
+      title: 'Text',
       props: {
         embed: MessageEmbed.from(client, embeds.text),
       },
     },
     {
-      title: "Website",
+      title: 'Website',
       props: {
         embed: MessageEmbed.from(client, embeds.website),
       },
     },
     {
-      title: "Website (Large Preview)",
+      title: 'Website (Large Preview)',
       props: {
         embed: new WebsiteEmbed(client, {
           ...embeds.website,
-          description: "This embed has a large image preview attached.",
+          description: 'This embed has a large image preview attached.',
           image: {
-            ...(embeds.website as API.Embed & { type: "Website" }).image!,
-            size: "Large",
+            ...(embeds.website as API.Embed & { type: 'Website' }).image!,
+            size: 'Large',
           },
         }),
       },
     },
     {
-      title: "Website (With Video)",
+      title: 'Website (With Video)',
       props: {
         embed: new WebsiteEmbed(client, {
           ...embeds.website,
-          description: "This embed has a video attached.",
+          description: 'This embed has a video attached.',
           video: {
-            url: "http://local.revolt.chat:5273/attachments/pexels-lachlan-ross-8775687.mp4",
+            url: 'http://local.revolt.chat:5273/attachments/pexels-lachlan-ross-8775687.mp4',
             width: 640,
             height: 360,
           },
@@ -118,121 +117,121 @@ export default {
       },
     },
     {
-      title: "Image",
+      title: 'Image',
       props: {
         embed: MessageEmbed.from(client, embeds.image),
       },
     },
     {
-      title: "Video",
+      title: 'Video',
       props: {
         embed: MessageEmbed.from(client, embeds.video),
       },
     },
     {
-      title: "GIF (Video)",
+      title: 'GIF (Video)',
       props: {
         embed: new WebsiteEmbed(client, {
           ...embeds.website,
           video: {
-            url: "http://local.revolt.chat:5273/attachments/pexels-lachlan-ross-8775687.mp4",
+            url: 'http://local.revolt.chat:5273/attachments/pexels-lachlan-ross-8775687.mp4',
             width: 640,
             height: 360,
           },
           special: {
-            type: "GIF",
+            type: 'GIF',
           },
         }),
       },
     },
     {
-      title: "GIF (Image)",
+      title: 'GIF (Image)',
       props: {
         embed: new WebsiteEmbed(client, {
           ...embeds.website,
           special: {
-            type: "GIF",
+            type: 'GIF',
           },
         }),
       },
     },
     {
-      title: "YouTube",
+      title: 'YouTube',
       props: {
         embed: MessageEmbed.from(client, {
-          type: "Website",
+          type: 'Website',
           special: {
-            type: "YouTube",
-            id: "LXb3EKWsInQ",
+            type: 'YouTube',
+            id: 'LXb3EKWsInQ',
           },
         }),
       },
       skipRegressionTests: true,
     },
     {
-      title: "Twitch",
+      title: 'Twitch',
       props: {
         embed: MessageEmbed.from(client, {
-          type: "Website",
+          type: 'Website',
           special: {
-            type: "Twitch",
-            content_type: "Channel",
-            id: "insertpaulhere",
+            type: 'Twitch',
+            content_type: 'Channel',
+            id: 'insertpaulhere',
           },
         }),
       },
       skipRegressionTests: true,
     },
     {
-      title: "Lightspeed",
+      title: 'Lightspeed',
       props: {
         embed: MessageEmbed.from(client, {
-          type: "Website",
+          type: 'Website',
           special: {
-            type: "Lightspeed",
-            content_type: "Channel",
-            id: "insert",
+            type: 'Lightspeed',
+            content_type: 'Channel',
+            id: 'insert',
           },
         }),
       },
       skipRegressionTests: true,
     },
     {
-      title: "Spotify",
+      title: 'Spotify',
       props: {
         embed: MessageEmbed.from(client, {
-          type: "Website",
+          type: 'Website',
           special: {
-            type: "Spotify",
-            content_type: "track",
-            id: "4NsPgRYUdHu2Q5JRNgXYU5",
+            type: 'Spotify',
+            content_type: 'track',
+            id: '4NsPgRYUdHu2Q5JRNgXYU5',
           },
         }),
       },
       skipRegressionTests: true,
     },
     {
-      title: "Soundcloud",
+      title: 'Soundcloud',
       props: {
         embed: MessageEmbed.from(client, {
-          type: "Website",
-          url: "https://soundcloud.com/minecraftwizards/18-c418-sweden",
+          type: 'Website',
+          url: 'https://soundcloud.com/minecraftwizards/18-c418-sweden',
           special: {
-            type: "Soundcloud",
+            type: 'Soundcloud',
           },
         }),
       },
       skipRegressionTests: true,
     },
     {
-      title: "Bandcamp",
+      title: 'Bandcamp',
       props: {
         embed: MessageEmbed.from(client, {
-          type: "Website",
+          type: 'Website',
           special: {
-            type: "Bandcamp",
-            content_type: "Album",
-            id: "1349219244",
+            type: 'Bandcamp',
+            content_type: 'Album',
+            id: '1349219244',
           },
         }),
       },
diff --git a/packages/client/components/ui/components/messaging/message/Embed.tsx b/packages/client/components/ui/components/messaging/message/Embed.tsx
index f68e372e5..4a2f7201d 100644
--- a/packages/client/components/ui/components/messaging/message/Embed.tsx
+++ b/packages/client/components/ui/components/messaging/message/Embed.tsx
@@ -1,16 +1,14 @@
-import { Match, Switch } from "solid-js";
-
-import {
+import type {
   ImageEmbed,
   MessageEmbed,
   TextEmbed as TextEmbedClass,
   VideoEmbed,
   WebsiteEmbed,
-} from "revolt.js";
-
-import { SizedContent } from "../../design/layout/SizedContent";
+} from 'revolt.js';
+import { Match, Switch } from 'solid-js';
 
-import { TextEmbed } from "./TextEmbed";
+import { SizedContent } from '../../design/layout/SizedContent';
+import { TextEmbed } from './TextEmbed';
 
 /**
  * Render a given embed
@@ -20,14 +18,14 @@ export function Embed(props: { embed: MessageEmbed }) {
    * Whether the embed is a GIF
    */
   const isGIF = () =>
-    props.embed.type === "Website" &&
-    (props.embed as WebsiteEmbed).specialContent?.type === "GIF";
+    props.embed.type === 'Website' &&
+    (props.embed as WebsiteEmbed).specialContent?.type === 'GIF';
 
   /**
    * Whether there is a video
    */
   const video = () =>
-    (props.embed.type === "Video"
+    (props.embed.type === 'Video'
       ? (props.embed as VideoEmbed)
       : isGIF() && (props.embed as WebsiteEmbed).video) || undefined;
 
@@ -35,7 +33,7 @@ export function Embed(props: { embed: MessageEmbed }) {
    * Whether there is a image
    */
   const image = () =>
-    (props.embed.type === "Image"
+    (props.embed.type === 'Image'
       ? (props.embed as ImageEmbed)
       : isGIF() && (props.embed as WebsiteEmbed).image) || undefined;
 
@@ -48,7 +46,7 @@ export function Embed(props: { embed: MessageEmbed }) {
             muted={isGIF()}
             autoplay={isGIF()}
             controls={!isGIF()}
-            preload="metadata"
+            preload='metadata'
             // bypass proxy for known GIF providers
             src={isGIF() ? video()!.url : video()!.proxiedURL}
           />
@@ -59,16 +57,16 @@ export function Embed(props: { embed: MessageEmbed }) {
           <img
             // bypass proxy for known GIF providers
             src={isGIF() ? image()!.url : image()!.proxiedURL}
-            loading="lazy"
+            loading='lazy'
           />
         </SizedContent>
       </Match>
       <Match
-        when={props.embed.type === "Website" || props.embed.type === "Text"}
+        when={props.embed.type === 'Website' || props.embed.type === 'Text'}
       >
         <TextEmbed embed={props.embed as WebsiteEmbed | TextEmbedClass} />
       </Match>
-      <Match when={props.embed.type === "None"}> </Match>
+      <Match when={props.embed.type === 'None'}> </Match>
     </Switch>
   );
 }
diff --git a/packages/client/components/ui/components/messaging/message/FileInfo.tsx b/packages/client/components/ui/components/messaging/message/FileInfo.tsx
index 24e2f9067..5f1f55789 100644
--- a/packages/client/components/ui/components/messaging/message/FileInfo.tsx
+++ b/packages/client/components/ui/components/messaging/message/FileInfo.tsx
@@ -1,3 +1,4 @@
+import type { File, MessageEmbed } from 'revolt.js';
 import {
   BiRegularDownload,
   BiRegularHeadphone,
@@ -6,16 +7,13 @@ import {
   BiSolidFileTxt,
   BiSolidImage,
   BiSolidVideo,
-} from "solid-icons/bi";
-import { Match, Show, Switch } from "solid-js";
-import { styled } from "solid-styled-components";
+} from 'solid-icons/bi';
+import { Match, Show, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { File, MessageEmbed } from "revolt.js";
-
-import { Typography } from "../../design/atoms/display/Typography";
-import { Column, Row } from "../../design/layout";
-
-import { humanFileSize } from "./Attachment";
+import { Typography } from '../../design/atoms/display/Typography';
+import { Column, Row } from '../../design/layout';
+import { humanFileSize } from './Attachment';
 
 interface Props {
   /**
@@ -33,13 +31,13 @@ interface Props {
  * Base container
  */
 const Base = styled(Row)`
-  color: ${(props) => props.theme!.colours["foreground"]};
+  color: ${(props) => props.theme!.colours['foreground']};
 `;
 
 /**
  * Link action
  */
-const Action = styled("a")`
+const Action = styled('a')`
   color: var(--unset-fg);
 
   display: grid;
@@ -56,38 +54,38 @@ export function FileInfo(props: Props) {
         <Switch fallback={<BiSolidFile size={24} />}>
           <Match
             when={
-              props.file?.metadata.type === "Image" ||
-              props.embed?.type === "Image"
+              props.file?.metadata.type === 'Image' ||
+              props.embed?.type === 'Image'
             }
           >
             <BiSolidImage size={24} />
           </Match>
           <Match
             when={
-              props.file?.metadata.type === "Video" ||
-              props.embed?.type === "Video"
+              props.file?.metadata.type === 'Video' ||
+              props.embed?.type === 'Video'
             }
           >
             <BiSolidVideo size={24} />
           </Match>
-          <Match when={props.file?.metadata.type === "Audio"}>
+          <Match when={props.file?.metadata.type === 'Audio'}>
             <BiRegularHeadphone size={24} />
           </Match>
-          <Match when={props.file?.metadata.type === "Text"}>
+          <Match when={props.file?.metadata.type === 'Text'}>
             <BiSolidFileTxt size={24} />
           </Match>
         </Switch>
       </Action>
-      <Column grow gap="none">
+      <Column grow gap='none'>
         <span>{props.file?.filename}</span>
         <Show when={props.file?.size}>
-          <Typography variant="small">
+          <Typography variant='small'>
             {humanFileSize(props.file!.size!)}
           </Typography>
         </Show>
       </Column>
       <Show when={props.file?.url}>
-        <Action href={props.file?.url} target="_blank" rel="noreferrer">
+        <Action href={props.file?.url} target='_blank' rel='noreferrer'>
           <BiRegularLinkExternal size={24} />
         </Action>
       </Show>
diff --git a/packages/client/components/ui/components/messaging/message/MessageReply.tsx b/packages/client/components/ui/components/messaging/message/MessageReply.tsx
index 85af42435..f10b71806 100644
--- a/packages/client/components/ui/components/messaging/message/MessageReply.tsx
+++ b/packages/client/components/ui/components/messaging/message/MessageReply.tsx
@@ -1,24 +1,22 @@
-import { BiSolidFile } from "solid-icons/bi";
-import { Match, Switch } from "solid-js";
-import { Show } from "solid-js";
-import { styled as styledL } from "solid-styled-components";
-
-import type { Message } from "revolt.js";
-import { styled } from "styled-system/jsx";
-
-import { useTranslation } from "@revolt/i18n";
-import { TextWithEmoji } from "@revolt/markdown";
+import { useTranslation } from '@revolt/i18n';
+import { TextWithEmoji } from '@revolt/markdown';
+import type { Message } from 'revolt.js';
+import { BiSolidFile } from 'solid-icons/bi';
+import { Match, Switch } from 'solid-js';
+import { Show } from 'solid-js';
+import { styled as styledL } from 'solid-styled-components';
+import { styled } from 'styled-system/jsx';
 
 import {
   Avatar,
   ColouredText,
   NonBreakingText,
   OverflowingText,
-} from "../../design";
+} from '../../design';
 import {
-  Typography,
   generateTypographyCSS,
-} from "../../design/atoms/display/Typography";
+  Typography,
+} from '../../design/atoms/display/Typography';
 
 interface Props {
   /**
@@ -37,17 +35,17 @@ interface Props {
   noDecorations?: boolean;
 }
 
-export const Base = styledL("div", "Reply")<Pick<Props, "noDecorations">>`
+export const Base = styledL('div', 'Reply')<Pick<Props, 'noDecorations'>>`
   min-width: 0;
   flex-grow: 1;
   display: flex;
   user-select: none;
   align-items: center;
 
-  margin-inline-end: ${(props) => (props.noDecorations ? "0" : "12px")};
-  margin-inline-start: ${(props) => (props.noDecorations ? "0" : "30px")};
+  margin-inline-end: ${(props) => (props.noDecorations ? '0' : '12px')};
+  margin-inline-start: ${(props) => (props.noDecorations ? '0' : '30px')};
 
-  ${(props) => generateTypographyCSS(props.theme!, "reply")}
+  ${(props) => generateTypographyCSS(props.theme!, 'reply')}
 
   gap: ${(props) => props.theme!.gap.md};
 
@@ -56,7 +54,7 @@ export const Base = styledL("div", "Reply")<Pick<Props, "noDecorations">>`
   }
 
   &::before {
-    display: ${(props) => (props.noDecorations ? "none" : "block")};
+    display: ${(props) => (props.noDecorations ? 'none' : 'block')};
 
     content: "";
     width: 22px;
@@ -88,12 +86,12 @@ const InfoText = styledL.a`
 /**
  * Link styling
  */
-const Link = styled("a", {
+const Link = styled('a', {
   base: {
     minWidth: 0,
-    display: "flex",
-    alignItems: "center",
-    gap: "var(--gap-md)",
+    display: 'flex',
+    alignItems: 'center',
+    gap: 'var(--gap-md)',
   },
 });
 
@@ -106,20 +104,20 @@ export function MessageReply(props: Props) {
   return (
     <Base noDecorations={props.noDecorations}>
       <Switch
-        fallback={<InfoText>{t("app.main.channel.misc.not_loaded")}</InfoText>}
+        fallback={<InfoText>{t('app.main.channel.misc.not_loaded')}</InfoText>}
       >
-        <Match when={props.message?.author?.relationship === "Blocked"}>
-          {t("app.main.channel.misc.blocked_user")}
+        <Match when={props.message?.author?.relationship === 'Blocked'}>
+          {t('app.main.channel.misc.blocked_user')}
         </Match>
         <Match when={props.message}>
           <Avatar src={props.message!.avatarURL} size={14} />
           <NonBreakingText>
             <ColouredText
               colour={props.message!.roleColour!}
-              clip={props.message!.roleColour?.includes("gradient")}
+              clip={props.message!.roleColour?.includes('gradient')}
             >
-              <Typography variant="username">
-                {props.mention && "@"}
+              <Typography variant='username'>
+                {props.mention && '@'}
                 {props.message!.username}
               </Typography>
             </ColouredText>
@@ -129,8 +127,8 @@ export function MessageReply(props: Props) {
               <Attachments>
                 <BiSolidFile size={16} />
                 {props.message!.attachments!.length > 1
-                  ? t("app.main.channel.misc.sent_multiple_files")
-                  : t("app.main.channel.misc.sent_file")}
+                  ? t('app.main.channel.misc.sent_multiple_files')
+                  : t('app.main.channel.misc.sent_file')}
               </Attachments>
             </Show>
             <Show when={props.message!.content}>
diff --git a/packages/client/components/ui/components/messaging/message/Reactions.tsx b/packages/client/components/ui/components/messaging/message/Reactions.tsx
index 97b0299e4..bf118746d 100644
--- a/packages/client/components/ui/components/messaging/message/Reactions.tsx
+++ b/packages/client/components/ui/components/messaging/message/Reactions.tsx
@@ -1,14 +1,12 @@
-import { For, Show, createMemo } from "solid-js";
-import { styled } from "solid-styled-components";
+import { useTranslation } from '@revolt/i18n';
+import { Emoji } from '@revolt/markdown';
+import { useUsers } from '@revolt/markdown/users';
+import type { API } from 'revolt.js';
+import { createMemo, For, Show } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { API } from "revolt.js";
-
-import { useTranslation } from "@revolt/i18n";
-import { Emoji } from "@revolt/markdown";
-import { useUsers } from "@revolt/markdown/users";
-
-import { OverflowingText, Row, Typography } from "../../design";
-import { Tooltip } from "../../floating";
+import { OverflowingText, Row, Typography } from '../../design';
+import { Tooltip } from '../../floating';
 
 interface Props {
   /**
@@ -19,7 +17,7 @@ interface Props {
   /**
    * Interactions
    */
-  interactions: API.Message["interactions"];
+  interactions: API.Message['interactions'];
 
   /**
    * ID of current user
@@ -110,7 +108,7 @@ export function Reactions(props: Props) {
             />
           )}
         </For>
-        <AddReaction class="add">{"+"}</AddReaction>
+        <AddReaction class='add'>{'+'}</AddReaction>
       </List>
     </Show>
   );
@@ -152,23 +150,23 @@ function Reaction(props: {
     const usernames = list
       .slice(0, 2)
       .map((user) => user?.username)
-      .join(", ");
+      .join(', ');
 
     if (unknown) {
       if (usernames) {
-        return t("app.main.channel.reactions.others_reacted", {
+        return t('app.main.channel.reactions.others_reacted', {
           userlist: usernames,
           count: unknown.toString(),
         });
       } else if (unknown === 1) {
-        return t("app.main.channel.reactions.single_reacted");
+        return t('app.main.channel.reactions.single_reacted');
       } else {
-        return t("app.main.channel.reactions.unknown_reacted", {
+        return t('app.main.channel.reactions.unknown_reacted', {
           count: unknown.toString(),
         });
       }
     } else {
-      return t("app.main.channel.reactions.people_reacted", {
+      return t('app.main.channel.reactions.people_reacted', {
         people: usernames,
       });
     }
@@ -176,13 +174,13 @@ function Reaction(props: {
 
   return (
     <Tooltip
-      placement="top"
+      placement='top'
       content={() => (
-        <Row align gap="lg">
-          <span style={{ "--emoji-size": "3em" }}>
+        <Row align gap='lg'>
+          <span style={{ '--emoji-size': '3em' }}>
             <Emoji emoji={props.reaction} />
           </span>
-          <Typography variant="messages">
+          <Typography variant='messages'>
             <PeopleList>{peopleList()}</PeopleList>
           </Typography>
         </Row>
@@ -199,7 +197,7 @@ function Reaction(props: {
 /**
  * Reaction styling
  */
-const ReactionBase = styled("div", "Reaction")<{ active?: boolean }>`
+const ReactionBase = styled('div', 'Reaction')<{ active?: boolean }>`
   display: flex;
   flex-direction: row;
   gap: ${(props) => props.theme!.gap.md};
@@ -213,19 +211,19 @@ const ReactionBase = styled("div", "Reaction")<{ active?: boolean }>`
   color: ${(props) =>
     props.theme!.colours[
       `messaging-component-reaction${
-        props.active ? "-selected" : ""
+        props.active ? '-selected' : ''
       }-foreground`
     ]};
   background: ${(props) =>
     props.theme!.colours[
       `messaging-component-reaction${
-        props.active ? "-selected" : ""
+        props.active ? '-selected' : ''
       }-background`
     ]};
   transition: ${(props) => props.theme!.transitions.fast} all;
 
   font-weight: 600;
-  font-feature-settings: "tnum" 1;
+  font-feature-settings: 'tnum' 1;
 
   img {
     width: 1.2em;
@@ -251,7 +249,7 @@ const AddReaction = styled(ReactionBase)`
 
   font-size: var(--emoji-size);
   background: ${(props) =>
-    props.theme!.colours["messaging-component-reaction-background"]};
+    props.theme!.colours['messaging-component-reaction-background']};
 
   height: 33px;
   aspect-ratio: 1/1;
@@ -265,7 +263,7 @@ const Divider = styled.div`
   width: 1px;
   height: 14px;
   background: ${(props) =>
-    props.theme!.colours["messaging-component-reaction-foreground"]};
+    props.theme!.colours['messaging-component-reaction-foreground']};
 `;
 
 /**
diff --git a/packages/client/components/ui/components/messaging/message/SpecialEmbed.tsx b/packages/client/components/ui/components/messaging/message/SpecialEmbed.tsx
index d783bd634..7a1fde45c 100644
--- a/packages/client/components/ui/components/messaging/message/SpecialEmbed.tsx
+++ b/packages/client/components/ui/components/messaging/message/SpecialEmbed.tsx
@@ -1,6 +1,6 @@
-import type { WebsiteEmbed } from "revolt.js";
+import type { WebsiteEmbed } from 'revolt.js';
 
-import { SizedContent } from "../../design";
+import { SizedContent } from '../../design';
 
 /**
  * Special Embed
@@ -15,28 +15,28 @@ export function SpecialEmbed(props: { embed: WebsiteEmbed }) {
     let width = 0,
       height = 0;
     switch (special.type) {
-      case "YouTube": {
+      case 'YouTube': {
         width = props.embed.video?.width ?? 1280;
         height = props.embed.video?.height ?? 720;
         break;
       }
-      case "Twitch": {
+      case 'Twitch': {
         (width = 1280), (height = 720);
         break;
       }
-      case "Lightspeed": {
+      case 'Lightspeed': {
         (width = 1280), (height = 720);
         break;
       }
-      case "Spotify": {
+      case 'Spotify': {
         (width = 420), (height = 355);
         break;
       }
-      case "Soundcloud": {
+      case 'Soundcloud': {
         (width = 480), (height = 460);
         break;
       }
-      case "Bandcamp": {
+      case 'Bandcamp': {
         width = props.embed.video?.width ?? 1280;
         height = props.embed.video?.height ?? 720;
         break;
@@ -49,13 +49,13 @@ export function SpecialEmbed(props: { embed: WebsiteEmbed }) {
   return (
     <SizedContent width={getSize()?.width} height={getSize()?.height}>
       <iframe
-        loading="lazy"
+        loading='lazy'
         // @ts-expect-error attributes are not recognised
-        scrolling="no"
+        scrolling='no'
         allowFullScreen
         allowTransparency
         frameBorder={0}
-        style={{ width: getSize()?.width + "px" }}
+        style={{ width: getSize()?.width + 'px' }}
         src={props.embed.embedURL}
       />
     </SizedContent>
diff --git a/packages/client/components/ui/components/messaging/message/SystemMessage.tsx b/packages/client/components/ui/components/messaging/message/SystemMessage.tsx
index 2015bbb91..b57f0026f 100644
--- a/packages/client/components/ui/components/messaging/message/SystemMessage.tsx
+++ b/packages/client/components/ui/components/messaging/message/SystemMessage.tsx
@@ -1,7 +1,4 @@
-import { JSX, Match, Switch } from "solid-js";
-import { styled } from "solid-styled-components";
-
-import {
+import type {
   ChannelEditSystemMessage,
   ChannelOwnershipChangeSystemMessage,
   ChannelRenamedSystemMessage,
@@ -10,9 +7,12 @@ import {
   User,
   UserModeratedSystemMessage,
   UserSystemMessage,
-} from "revolt.js";
+} from 'revolt.js';
+import type { JSX } from 'solid-js';
+import { Match, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { Typography } from "../../design";
+import { Typography } from '../../design';
 
 interface Props {
   /**
@@ -23,7 +23,7 @@ interface Props {
   /**
    * Menu generator
    */
-  menuGenerator: (user?: User) => JSX.Directives["floating"];
+  menuGenerator: (user?: User) => JSX.Directives['floating'];
 
   /**
    * Whether this is rendered within a server
@@ -34,7 +34,7 @@ interface Props {
 /**
  * Render the actual user
  */
-function Usr(props: { user?: User } & Pick<Props, "menuGenerator">) {
+function Usr(props: { user?: User } & Pick<Props, 'menuGenerator'>) {
   return (
     <Username use:floating={props.menuGenerator(props.user)}>
       {props.user?.username}
@@ -49,97 +49,97 @@ export function SystemMessage(props: Props) {
   // TODO: i18n with components
   return (
     <Base>
-      <Typography variant="system-message">
+      <Typography variant='system-message'>
         <Switch fallback={props.systemMessage.type}>
-          <Match when={props.systemMessage.type === "user_added"}>
+          <Match when={props.systemMessage.type === 'user_added'}>
             <Usr
               menuGenerator={props.menuGenerator}
               user={(props.systemMessage as UserModeratedSystemMessage).user}
-            />{" "}
-            has been added by{" "}
+            />{' '}
+            has been added by{' '}
             <Usr
               menuGenerator={props.menuGenerator}
               user={(props.systemMessage as UserModeratedSystemMessage).by}
             />
           </Match>
           <Match
-            when={props.systemMessage.type === "user_left" && !props.isServer}
+            when={props.systemMessage.type === 'user_left' && !props.isServer}
           >
             <Usr
               menuGenerator={props.menuGenerator}
               user={(props.systemMessage as UserSystemMessage).user}
-            />{" "}
+            />{' '}
             left the group
           </Match>
-          <Match when={props.systemMessage.type === "user_remove"}>
+          <Match when={props.systemMessage.type === 'user_remove'}>
             <Usr
               menuGenerator={props.menuGenerator}
               user={(props.systemMessage as UserModeratedSystemMessage).user}
-            />{" "}
-            has been removed by{" "}
+            />{' '}
+            has been removed by{' '}
             <Usr
               menuGenerator={props.menuGenerator}
               user={(props.systemMessage as UserModeratedSystemMessage).by}
             />
           </Match>
-          <Match when={props.systemMessage.type === "user_kicked"}>
+          <Match when={props.systemMessage.type === 'user_kicked'}>
             <Usr
               menuGenerator={props.menuGenerator}
               user={(props.systemMessage as UserSystemMessage).user}
-            />{" "}
+            />{' '}
             has been kicked from the server
           </Match>
-          <Match when={props.systemMessage.type === "user_banned"}>
+          <Match when={props.systemMessage.type === 'user_banned'}>
             <Usr
               menuGenerator={props.menuGenerator}
               user={(props.systemMessage as UserSystemMessage).user}
-            />{" "}
+            />{' '}
             has been banned from the server
           </Match>
-          <Match when={props.systemMessage.type === "user_joined"}>
+          <Match when={props.systemMessage.type === 'user_joined'}>
             <Usr
               menuGenerator={props.menuGenerator}
               user={(props.systemMessage as UserSystemMessage).user}
-            />{" "}
+            />{' '}
             joined the server
           </Match>
           <Match
-            when={props.systemMessage.type === "user_left" && props.isServer}
+            when={props.systemMessage.type === 'user_left' && props.isServer}
           >
             <Usr
               menuGenerator={props.menuGenerator}
               user={(props.systemMessage as UserSystemMessage).user}
-            />{" "}
+            />{' '}
             left the server
           </Match>
-          <Match when={props.systemMessage.type === "channel_renamed"}>
+          <Match when={props.systemMessage.type === 'channel_renamed'}>
             <Usr
               menuGenerator={props.menuGenerator}
               user={(props.systemMessage as ChannelRenamedSystemMessage).by}
-            />{" "}
-            updated the group name to{" "}
+            />{' '}
+            updated the group name to{' '}
             <Username>
               {(props.systemMessage as ChannelRenamedSystemMessage).name}
             </Username>
           </Match>
           <Match
-            when={props.systemMessage.type === "channel_description_changed"}
+            when={props.systemMessage.type === 'channel_description_changed'}
           >
             <Usr
               menuGenerator={props.menuGenerator}
               user={(props.systemMessage as ChannelEditSystemMessage).by}
-            />{" "}
+            />{' '}
             updated the group description
           </Match>
-          <Match when={props.systemMessage.type === "channel_icon_changed"}>
+          <Match when={props.systemMessage.type === 'channel_icon_changed'}>
             <Usr
               menuGenerator={props.menuGenerator}
               user={(props.systemMessage as ChannelEditSystemMessage).by}
-            />{" "}
+            />{' '}
             updated the group icon
           </Match>
           <Match
-            when={props.systemMessage.type === "channel_ownership_changed"}
+            when={props.systemMessage.type === 'channel_ownership_changed'}
           >
             <Usr
               menuGenerator={props.menuGenerator}
@@ -147,8 +147,8 @@ export function SystemMessage(props: Props) {
                 (props.systemMessage as ChannelOwnershipChangeSystemMessage)
                   .from
               }
-            />{" "}
-            transferred group ownership to{" "}
+            />{' '}
+            transferred group ownership to{' '}
             <Usr
               menuGenerator={props.menuGenerator}
               user={
@@ -156,7 +156,7 @@ export function SystemMessage(props: Props) {
               }
             />
           </Match>
-          <Match when={props.systemMessage.type === "text"}>
+          <Match when={props.systemMessage.type === 'text'}>
             {(props.systemMessage as TextSystemMessage).content}
           </Match>
         </Switch>
@@ -165,7 +165,7 @@ export function SystemMessage(props: Props) {
   );
 }
 
-const Base = styled("div", "SystemMessage")`
+const Base = styled('div', 'SystemMessage')`
   display: flex;
   min-height: 20px;
   align-items: center;
@@ -173,5 +173,5 @@ const Base = styled("div", "SystemMessage")`
 `;
 
 const Username = styled.span`
-  color: ${(props) => props.theme!.colours["foreground"]};
+  color: ${(props) => props.theme!.colours['foreground']};
 `;
diff --git a/packages/client/components/ui/components/messaging/message/SystemMessageIcon.tsx b/packages/client/components/ui/components/messaging/message/SystemMessageIcon.tsx
index 269d53931..34dbac491 100644
--- a/packages/client/components/ui/components/messaging/message/SystemMessageIcon.tsx
+++ b/packages/client/components/ui/components/messaging/message/SystemMessageIcon.tsx
@@ -1,3 +1,4 @@
+import type { SystemMessage } from 'revolt.js';
 import {
   BiRegularAlignLeft,
   BiRegularLeftArrowAlt,
@@ -11,15 +12,13 @@ import {
   BiSolidPurchaseTag,
   BiSolidShieldX,
   BiSolidXCircle,
-} from "solid-icons/bi";
-import { Match, Switch } from "solid-js";
-import { styled } from "solid-styled-components";
+} from 'solid-icons/bi';
+import { Match, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { SystemMessage } from "revolt.js";
-
-import { Time } from "../../design";
-import { formatTime } from "../../design/atoms/display/Time";
-import { Tooltip } from "../../floating";
+import { Time } from '../../design';
+import { formatTime } from '../../design/atoms/display/Time';
+import { Tooltip } from '../../floating';
 
 /**
  * System Message Icon
@@ -32,49 +31,49 @@ export function SystemMessageIcon(props: {
   return (
     <Base type={props.systemMessage.type}>
       <Tooltip
-        content={() => <Time format="relative" value={props.createdAt} />}
-        aria={formatTime({ format: "relative", value: props.createdAt })}
-        placement="top"
+        content={() => <Time format='relative' value={props.createdAt} />}
+        aria={formatTime({ format: 'relative', value: props.createdAt })}
+        placement='top'
       >
         <Switch fallback={<BiSolidInfoCircle size={16} />}>
-          <Match when={props.systemMessage.type === "user_added"}>
+          <Match when={props.systemMessage.type === 'user_added'}>
             <BiRegularPlus size={16} />
           </Match>
           <Match
-            when={props.systemMessage.type === "user_left" && !props.isServer}
+            when={props.systemMessage.type === 'user_left' && !props.isServer}
           >
             <BiRegularMinus size={16} />
           </Match>
-          <Match when={props.systemMessage.type === "user_remove"}>
+          <Match when={props.systemMessage.type === 'user_remove'}>
             <BiRegularX size={16} />
           </Match>
-          <Match when={props.systemMessage.type === "user_kicked"}>
+          <Match when={props.systemMessage.type === 'user_kicked'}>
             <BiSolidXCircle size={16} />
           </Match>
-          <Match when={props.systemMessage.type === "user_banned"}>
+          <Match when={props.systemMessage.type === 'user_banned'}>
             <BiSolidShieldX size={16} />
           </Match>
-          <Match when={props.systemMessage.type === "user_joined"}>
+          <Match when={props.systemMessage.type === 'user_joined'}>
             <BiRegularRightArrowAlt size={16} />
           </Match>
           <Match
-            when={props.systemMessage.type === "user_left" && props.isServer}
+            when={props.systemMessage.type === 'user_left' && props.isServer}
           >
             <BiRegularLeftArrowAlt size={16} />
           </Match>
-          <Match when={props.systemMessage.type === "channel_renamed"}>
+          <Match when={props.systemMessage.type === 'channel_renamed'}>
             <BiSolidPurchaseTag size={16} />
           </Match>
           <Match
-            when={props.systemMessage.type === "channel_description_changed"}
+            when={props.systemMessage.type === 'channel_description_changed'}
           >
             <BiRegularAlignLeft size={16} />
           </Match>
-          <Match when={props.systemMessage.type === "channel_icon_changed"}>
+          <Match when={props.systemMessage.type === 'channel_icon_changed'}>
             <BiSolidImage size={16} />
           </Match>
           <Match
-            when={props.systemMessage.type === "channel_ownership_changed"}
+            when={props.systemMessage.type === 'channel_ownership_changed'}
           >
             <BiSolidKey size={16} />
           </Match>
@@ -84,23 +83,23 @@ export function SystemMessageIcon(props: {
   );
 }
 
-const success = new Set<SystemMessage["type"]>(["user_added", "user_joined"]);
+const success = new Set<SystemMessage['type']>(['user_added', 'user_joined']);
 
-const warning = new Set<SystemMessage["type"]>(["channel_ownership_changed"]);
+const warning = new Set<SystemMessage['type']>(['channel_ownership_changed']);
 
-const danger = new Set<SystemMessage["type"]>([
-  "user_left",
-  "user_kicked",
-  "user_banned",
+const danger = new Set<SystemMessage['type']>([
+  'user_left',
+  'user_kicked',
+  'user_banned',
 ]);
 
-const Base = styled.div<{ type: SystemMessage["type"] }>`
+const Base = styled.div<{ type: SystemMessage['type'] }>`
   width: 62px;
   display: grid;
   place-items: center;
 
   color: ${
-    "var(--unset-fg)"
+    'var(--unset-fg)'
     // (props) =>
     // props.theme!.colours[
     //   danger.has(props.type)
diff --git a/packages/client/components/ui/components/messaging/message/TextEmbed.tsx b/packages/client/components/ui/components/messaging/message/TextEmbed.tsx
index 919a9c14f..75cb55be0 100644
--- a/packages/client/components/ui/components/messaging/message/TextEmbed.tsx
+++ b/packages/client/components/ui/components/messaging/message/TextEmbed.tsx
@@ -1,21 +1,18 @@
-import { Match, Show, Switch } from "solid-js";
-import { styled } from "solid-styled-components";
-
-import { TextEmbed as TextEmbedClass, WebsiteEmbed } from "revolt.js";
-
-import { Markdown } from "@revolt/markdown";
+import { Markdown } from '@revolt/markdown';
+import type { TextEmbed as TextEmbedClass, WebsiteEmbed } from 'revolt.js';
+import { Match, Show, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
 import {
   Column,
   OverflowingText,
   SizedContent,
   Typography,
-} from "../../design";
-
-import { Attachment } from "./Attachment";
-import { SpecialEmbed } from "./SpecialEmbed";
+} from '../../design';
+import { Attachment } from './Attachment';
+import { SpecialEmbed } from './SpecialEmbed';
 
-const Base = styled("div", "TextEmbed")<{ borderColour?: string }>`
+const Base = styled('div', 'TextEmbed')<{ borderColour?: string }>`
   display: flex;
   max-width: 480px; /* TODO: theme this */
   flex-direction: row;
@@ -25,37 +22,37 @@ const Base = styled("div", "TextEmbed")<{ borderColour?: string }>`
   border-radius: ${(props) => props.theme!.borderRadius.md};
 
   color: ${(props) =>
-    props.theme!.colours["messaging-component-text-embed-foreground"]};
+    props.theme!.colours['messaging-component-text-embed-foreground']};
   background: ${(props) =>
-    props.theme!.colours["messaging-component-text-embed-background"]};
+    props.theme!.colours['messaging-component-text-embed-background']};
 
   border-inline-start: var(--gap-sm) solid
     ${(props) =>
       props.borderColour ??
-      props.theme!.colours["messaging-component-text-embed-foreground"]};
+      props.theme!.colours['messaging-component-text-embed-foreground']};
 `;
 
-const SiteInformation = styled("div", "SiteInfo")`
+const SiteInformation = styled('div', 'SiteInfo')`
   display: flex;
   flex-direction: row;
   gap: ${(props) => props.theme!.gap.md};
   color: var(--unset-fg);
 `;
 
-const Favicon = styled("img", "Favicon")`
+const Favicon = styled('img', 'Favicon')`
   width: 14px;
   height: 14px;
   flex-shrink: 0;
 `;
 
-const PreviewImage = styled("img", "PreviewImage")`
+const PreviewImage = styled('img', 'PreviewImage')`
   max-width: 120px;
   max-height: 120px;
   border-radius: ${(props) => props.theme!.borderRadius.md};
 `;
 
 // TODO: move all font sizes into typography
-const Title = styled("div", "Title")`
+const Title = styled('div', 'Title')`
   font-size: 16px;
 `;
 
@@ -63,7 +60,7 @@ const Content = styled(Column)`
   min-width: 0;
 `;
 
-const Description = styled("div", "Description")`
+const Description = styled('div', 'Description')`
   font-size: 12px;
   overflow: hidden;
   word-wrap: break-word;
@@ -75,24 +72,24 @@ const Description = styled("div", "Description")`
 export function TextEmbed(props: { embed: TextEmbedClass | WebsiteEmbed }) {
   return (
     <Base borderColour={props.embed.colour!}>
-      <Content gap="md" grow>
+      <Content gap='md' grow>
         <Show
           when={
-            props.embed.type === "Website" &&
+            props.embed.type === 'Website' &&
             (props.embed as WebsiteEmbed).siteName
           }
         >
           <SiteInformation>
             <Show when={props.embed.iconUrl}>
               <Favicon
-                loading="lazy"
+                loading='lazy'
                 draggable={false}
                 src={props.embed.proxiedIconURL}
-                onError={(e) => (e.currentTarget.style.display = "none")}
+                onError={(e) => (e.currentTarget.style.display = 'none')}
               />
             </Show>
             <OverflowingText>
-              <Typography variant="small">
+              <Typography variant='small'>
                 {(props.embed as WebsiteEmbed).siteName}
               </Typography>
             </OverflowingText>
@@ -110,7 +107,7 @@ export function TextEmbed(props: { embed: TextEmbedClass | WebsiteEmbed }) {
         <Show when={props.embed.description}>
           <Description>
             <Switch fallback={props.embed.description}>
-              <Match when={props.embed.type === "Text"}>
+              <Match when={props.embed.type === 'Text'}>
                 <Markdown content={props.embed.description!} />
               </Match>
             </Switch>
@@ -119,18 +116,18 @@ export function TextEmbed(props: { embed: TextEmbedClass | WebsiteEmbed }) {
 
         <Show
           when={
-            props.embed.type === "Text" && (props.embed as TextEmbedClass).media
+            props.embed.type === 'Text' && (props.embed as TextEmbedClass).media
           }
         >
           <Attachment file={(props.embed as TextEmbedClass).media!} />
         </Show>
 
-        <Show when={props.embed.type === "Website"}>
+        <Show when={props.embed.type === 'Website'}>
           <Switch>
             <Match
               when={
                 (props.embed as WebsiteEmbed).specialContent?.type &&
-                (props.embed as WebsiteEmbed).specialContent?.type !== "None"
+                (props.embed as WebsiteEmbed).specialContent?.type !== 'None'
               }
             >
               <SpecialEmbed embed={props.embed as WebsiteEmbed} />
@@ -142,19 +139,19 @@ export function TextEmbed(props: { embed: TextEmbedClass | WebsiteEmbed }) {
               >
                 <video
                   controls
-                  preload="metadata"
+                  preload='metadata'
                   src={(props.embed as WebsiteEmbed).video!.proxiedURL}
                 />
               </SizedContent>
             </Match>
-            <Match when={(props.embed as WebsiteEmbed).image?.size === "Large"}>
+            <Match when={(props.embed as WebsiteEmbed).image?.size === 'Large'}>
               <SizedContent
                 width={(props.embed as WebsiteEmbed).image!.width}
                 height={(props.embed as WebsiteEmbed).image!.height}
               >
                 <img
                   src={(props.embed as WebsiteEmbed).image!.proxiedURL}
-                  loading="lazy"
+                  loading='lazy'
                 />
               </SizedContent>
             </Match>
@@ -164,14 +161,14 @@ export function TextEmbed(props: { embed: TextEmbedClass | WebsiteEmbed }) {
 
       <Show
         when={
-          props.embed.type === "Website" &&
-          (props.embed as WebsiteEmbed).image?.size === "Preview" &&
+          props.embed.type === 'Website' &&
+          (props.embed as WebsiteEmbed).image?.size === 'Preview' &&
           !(props.embed as WebsiteEmbed).video
         }
       >
         <PreviewImage
           src={(props.embed as WebsiteEmbed).image!.proxiedURL}
-          loading="lazy"
+          loading='lazy'
         />
       </Show>
     </Base>
diff --git a/packages/client/components/ui/components/messaging/message/TextFile.tsx b/packages/client/components/ui/components/messaging/message/TextFile.tsx
index 603ccc31e..0652a1d39 100644
--- a/packages/client/components/ui/components/messaging/message/TextFile.tsx
+++ b/packages/client/components/ui/components/messaging/message/TextFile.tsx
@@ -1,15 +1,12 @@
-import { Match, Switch, createSignal, onMount } from "solid-js";
-import { styled } from "solid-styled-components";
+import { useTranslation } from '@revolt/i18n';
+import type { File } from 'revolt.js';
+import { createSignal, Match, onMount, Switch } from 'solid-js';
+import { styled } from 'solid-styled-components';
 
-import { File } from "revolt.js";
-
-import { useTranslation } from "@revolt/i18n";
-
-import { Preloader } from "../../design/atoms/indicators";
-import { Button } from "../../design/atoms/inputs";
-import { Row } from "../../design/layout";
-
-import { humanFileSize } from "./Attachment";
+import { Preloader } from '../../design/atoms/indicators';
+import { Button } from '../../design/atoms/inputs';
+import { Row } from '../../design/layout';
+import { humanFileSize } from './Attachment';
 
 interface Props {
   /**
@@ -21,12 +18,12 @@ interface Props {
 /**
  * Text file container
  */
-const Container = styled("pre")`
+const Container = styled('pre')`
   display: flex;
   overflow: auto;
   scrollbar-width: thin;
   flex-direction: column;
-  color: ${(props) => props.theme!.colours["foreground"]};
+  color: ${(props) => props.theme!.colours['foreground']};
 `;
 
 /**
@@ -62,7 +59,7 @@ export function TextFile(props: Props) {
 
   return (
     <Container>
-      <Switch fallback={<Preloader type="ring" grow />}>
+      <Switch fallback={<Preloader type='ring' grow />}>
         <Match
           when={
             !loading() &&
@@ -71,13 +68,13 @@ export function TextFile(props: Props) {
           }
         >
           <Row align justify grow>
-            <Button variant="secondary" onClick={load}>
-              {t("app.main.channel.misc.load_file")} (
+            <Button variant='secondary' onClick={load}>
+              {t('app.main.channel.misc.load_file')} (
               {humanFileSize(props.file.size ?? 0)})
             </Button>
           </Row>
         </Match>
-        <Match when={typeof contents() !== "undefined"}>
+        <Match when={typeof contents() !== 'undefined'}>
           <code>{contents()}</code>
         </Match>
       </Switch>
diff --git a/packages/client/components/ui/components/messaging/message/index.ts b/packages/client/components/ui/components/messaging/message/index.ts
index fb7c71fe1..a1052adc8 100644
--- a/packages/client/components/ui/components/messaging/message/index.ts
+++ b/packages/client/components/ui/components/messaging/message/index.ts
@@ -1,11 +1,11 @@
-export { Attachment, AttachmentContainer } from "./Attachment";
-export { MessageContainer } from "./Container";
-export { Embed } from "./Embed";
-export { FileInfo } from "./FileInfo";
-export { MessageReply } from "./MessageReply";
-export { Reactions } from "./Reactions";
-export { SpecialEmbed } from "./SpecialEmbed";
-export { SystemMessage } from "./SystemMessage";
-export { SystemMessageIcon } from "./SystemMessageIcon";
-export { TextEmbed } from "./TextEmbed";
-export { TextFile } from "./TextFile";
+export { Attachment, AttachmentContainer } from './Attachment';
+export { MessageContainer } from './Container';
+export { Embed } from './Embed';
+export { FileInfo } from './FileInfo';
+export { MessageReply } from './MessageReply';
+export { Reactions } from './Reactions';
+export { SpecialEmbed } from './SpecialEmbed';
+export { SystemMessage } from './SystemMessage';
+export { SystemMessageIcon } from './SystemMessageIcon';
+export { TextEmbed } from './TextEmbed';
+export { TextFile } from './TextFile';
diff --git a/packages/client/components/ui/components/native/Titlebar.tsx b/packages/client/components/ui/components/native/Titlebar.tsx
index 7fb67feb7..e342eafe8 100644
--- a/packages/client/components/ui/components/native/Titlebar.tsx
+++ b/packages/client/components/ui/components/native/Titlebar.tsx
@@ -1,7 +1,7 @@
-import { BiSolidWrench } from "solid-icons/bi";
-import type { Component } from "solid-js";
-import { Show } from "solid-js";
-import { css, styled, useTheme } from "solid-styled-components";
+import { BiSolidWrench } from 'solid-icons/bi';
+import type { Component } from 'solid-js';
+import { Show } from 'solid-js';
+import { css, styled, useTheme } from 'solid-styled-components';
 
 // TODO
 // import UpdateIndicator from "../common/UpdateIndicator";
@@ -20,10 +20,10 @@ type Props = BaseProps & {
 };
 
 // TODO: Should maybe be moved to `theme`?
-const TITLEBAR_HEIGHT = "29px";
-const TITLEBAR_ACTION_PADDING = "8px";
+const TITLEBAR_HEIGHT = '29px';
+const TITLEBAR_ACTION_PADDING = '8px';
 
-const TitlebarBase = styled("div", "Titlebar")<BaseProps>`
+const TitlebarBase = styled('div', 'Titlebar')<BaseProps>`
   flex-shrink: 0;
   height: ${TITLEBAR_HEIGHT};
   display: flex;
@@ -113,18 +113,18 @@ export const Titlebar: Component<Props> = (props) => {
 
   return (
     <TitlebarBase {...props}>
-      <div data-tauri-drag-region class="title">
-        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 193.733 37.438">
+      <div data-tauri-drag-region class='title'>
+        <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 193.733 37.438'>
           <path
-            d="M23.393,1.382c0,2.787-1.52,4.46-4.764,4.46H13.258V-2.977H18.63C21.873-2.977,23.393-1.254,23.393,1.382Zm-24-11.555,5.2,7.213V25.4h8.666V11.973h2.078l7.4,13.43h9.781l-8.21-14.089A10.355,10.355,0,0,0,32.212,1.027c0-6.183-4.358-11.2-13.075-11.2Zm60.035,0H37.634V25.4H59.426V18.46H46.3v-7.8H57.906V3.966H46.3V-2.969H59.426Zm20.981,26.86-8.818-26.86H62.365L74.984,25.4H85.83L98.449-10.173H89.276Zm56.659-9.173c0-10.693-8.058-18.194-18.194-18.194-10.085,0-18.3,7.5-18.3,18.194a17.9,17.9,0,0,0,18.3,18.244A17.815,17.815,0,0,0,137.066,7.514Zm-27.62,0c0-6.335,3.649-10.338,9.426-10.338,5.676,0,9.376,4,9.376,10.338,0,6.233-3.7,10.338-9.376,10.338C113.095,17.852,109.446,13.747,109.446,7.514ZM141.88-10.173V25.4H161.9v-6.95H150.545V-10.173Zm22.248,7.2h9.426V25.4h8.666V-2.975h9.426v-7.2H164.128Z"
-            transform="translate(1.586 11.18)"
+            d='M23.393,1.382c0,2.787-1.52,4.46-4.764,4.46H13.258V-2.977H18.63C21.873-2.977,23.393-1.254,23.393,1.382Zm-24-11.555,5.2,7.213V25.4h8.666V11.973h2.078l7.4,13.43h9.781l-8.21-14.089A10.355,10.355,0,0,0,32.212,1.027c0-6.183-4.358-11.2-13.075-11.2Zm60.035,0H37.634V25.4H59.426V18.46H46.3v-7.8H57.906V3.966H46.3V-2.969H59.426Zm20.981,26.86-8.818-26.86H62.365L74.984,25.4H85.83L98.449-10.173H89.276Zm56.659-9.173c0-10.693-8.058-18.194-18.194-18.194-10.085,0-18.3,7.5-18.3,18.194a17.9,17.9,0,0,0,18.3,18.244A17.815,17.815,0,0,0,137.066,7.514Zm-27.62,0c0-6.335,3.649-10.338,9.426-10.338,5.676,0,9.376,4,9.376,10.338,0,6.233-3.7,10.338-9.376,10.338C113.095,17.852,109.446,13.747,109.446,7.514ZM141.88-10.173V25.4H161.9v-6.95H150.545V-10.173Zm22.248,7.2h9.426V25.4h8.666V-2.975h9.426v-7.2H164.128Z'
+            transform='translate(1.586 11.18)'
             // fill={theme.colours["foreground-200"]}
             // stroke={theme.colours["foreground-200"]}
-            stroke-width="1"
+            stroke-width='1'
           />
         </svg>
         <Show when={props.isBuildDev}>
-          <BiSolidWrench size="12.5" />
+          <BiSolidWrench size='12.5' />
         </Show>
       </div>
       {/*<div class="actions quick">
@@ -143,34 +143,34 @@ export const Titlebar: Component<Props> = (props) => {
             </div>
         </Tooltip>
       </div>*/}
-      <div data-tauri-drag-region class="drag" />
+      <div data-tauri-drag-region class='drag' />
       {/* <UpdateIndicator style="titlebar" /> */}
-      <div class="actions">
+      <div class='actions'>
         <div onClick={() => props.onMinimize()}>
-          <svg aria-hidden="false" width="12" height="12" viewBox="0 0 12 12">
-            <rect fill="currentColor" width="10" height="1" x="1" y="6" />
+          <svg aria-hidden='false' width='12' height='12' viewBox='0 0 12 12'>
+            <rect fill='currentColor' width='10' height='1' x='1' y='6' />
           </svg>
         </div>
         <div onClick={() => props.onMaximize()}>
-          <svg aria-hidden="false" width="12" height="12" viewBox="0 0 12 12">
+          <svg aria-hidden='false' width='12' height='12' viewBox='0 0 12 12'>
             <rect
-              width="9"
-              height="9"
-              x="1.5"
-              y="1.5"
-              fill="none"
-              stroke="currentColor"
+              width='9'
+              height='9'
+              x='1.5'
+              y='1.5'
+              fill='none'
+              stroke='currentColor'
             />
           </svg>
         </div>
-        <div onClick={() => props.onClose()} class="error">
-          <svg aria-hidden="false" width="12" height="12" viewBox="0 0 12 12">
+        <div onClick={() => props.onClose()} class='error'>
+          <svg aria-hidden='false' width='12' height='12' viewBox='0 0 12 12'>
             <polygon
-              fill="currentColor"
-              stroke-width="1"
-              fill-rule="evenodd"
-              points="11 1.576 6.583 6 11 10.424 10.424 11 6 6.583 1.576 11 1 10.424 5.417 6 1 1.576 1.576 1 6 5.417 10.424 1"
-              style="stroke:currentColor;stroke-width:0.4"
+              fill='currentColor'
+              stroke-width='1'
+              fill-rule='evenodd'
+              points='11 1.576 6.583 6 11 10.424 10.424 11 6 6.583 1.576 11 1 10.424 5.417 6 1 1.576 1.576 1 6 5.417 10.424 1'
+              style={{ stroke: 'currentColor', 'stroke-width': '0.4' }}
             />
           </svg>
         </div>
diff --git a/packages/client/components/ui/components/native/index.ts b/packages/client/components/ui/components/native/index.ts
index aa4b8e029..9e86de940 100644
--- a/packages/client/components/ui/components/native/index.ts
+++ b/packages/client/components/ui/components/native/index.ts
@@ -1 +1 @@
-export { Titlebar } from "./Titlebar";
+export { Titlebar } from './Titlebar';
diff --git a/packages/client/components/ui/components/navigation/channels/AdminSidebar.tsx b/packages/client/components/ui/components/navigation/channels/AdminSidebar.tsx
index 50471d2e4..72cc04daa 100644
--- a/packages/client/components/ui/components/navigation/channels/AdminSidebar.tsx
+++ b/packages/client/components/ui/components/navigation/channels/AdminSidebar.tsx
@@ -1,8 +1,7 @@
-import { MenuButton } from "../../design";
-import { Typography } from "../../design/atoms/display/Typography";
-import { Column } from "../../design/layout";
-
-import { SidebarBase } from "./common";
+import { MenuButton } from '../../design';
+import { Typography } from '../../design/atoms/display/Typography';
+import { Column } from '../../design/layout';
+import { SidebarBase } from './common';
 
 interface Props {
   /**
@@ -22,10 +21,10 @@ export const AdminSidebar = (props: Props) => {
       <div use:scrollable>
         <Column>
           <p>
-            <Typography variant="legacy-settings-title">Admin Panel</Typography>
+            <Typography variant='legacy-settings-title'>Admin Panel</Typography>
           </p>
-          <a onClick={() => props.openTab("inspector", "Inspector")}>
-            <MenuButton attention="active">Inspector</MenuButton>
+          <a onClick={() => props.openTab('inspector', 'Inspector')}>
+            <MenuButton attention='active'>Inspector</MenuButton>
           </a>
         </Column>
       </div>
diff --git a/packages/client/components/ui/components/navigation/channels/HomeSidebar.tsx b/packages/client/components/ui/components/navigation/channels/HomeSidebar.tsx
index 0f813f720..09dace89d 100644
--- a/packages/client/components/ui/components/navigation/channels/HomeSidebar.tsx
+++ b/packages/client/components/ui/components/navigation/channels/HomeSidebar.tsx
@@ -1,32 +1,28 @@
-import { BiSolidHome, BiSolidNotepad, BiSolidUserDetail } from "solid-icons/bi";
-import { Match, Show, Switch, createMemo, splitProps } from "solid-js";
-import { styled as styledLegacy } from "solid-styled-components";
+import MdPlus from '@material-design-icons/svg/outlined/add.svg?component-solid';
+import MdClose from '@material-design-icons/svg/outlined/close.svg?component-solid';
+import { VirtualContainer } from '@minht11/solid-virtual-container';
+import { ChannelContextMenu, UserContextMenu } from '@revolt/app';
+import { useClient } from '@revolt/client';
+import { getController } from '@revolt/common';
+import { useQuantity, useTranslation } from '@revolt/i18n';
+import { TextWithEmoji } from '@revolt/markdown';
+import { modalController } from '@revolt/modal';
+import { useLocation, useNavigate } from '@revolt/routing';
+import { iconSize } from '@revolt/ui';
+import type { Channel } from 'revolt.js';
+import { BiSolidHome, BiSolidNotepad, BiSolidUserDetail } from 'solid-icons/bi';
+import { createMemo, Match, Show, splitProps, Switch } from 'solid-js';
+import { styled as styledLegacy } from 'solid-styled-components';
+import { styled } from 'styled-system/jsx';
 
-import { VirtualContainer } from "@minht11/solid-virtual-container";
-import { Channel } from "revolt.js";
-import { styled } from "styled-system/jsx";
-
-import { ChannelContextMenu, UserContextMenu } from "@revolt/app";
-import { useClient } from "@revolt/client";
-import { getController } from "@revolt/common";
-import { useQuantity, useTranslation } from "@revolt/i18n";
-import { TextWithEmoji } from "@revolt/markdown";
-import { modalController } from "@revolt/modal";
-import { useLocation, useNavigate } from "@revolt/routing";
-import { iconSize } from "@revolt/ui";
-
-import MdPlus from "@material-design-icons/svg/outlined/add.svg?component-solid";
-import MdClose from "@material-design-icons/svg/outlined/close.svg?component-solid";
-
-import { Avatar } from "../../design/atoms/display/Avatar";
-import { Typography } from "../../design/atoms/display/Typography";
-import { UserStatusGraphic } from "../../design/atoms/indicators";
-import { MenuButton } from "../../design/atoms/inputs/MenuButton";
-import { OverflowingText } from "../../design/layout/OverflowingText";
-import { Tooltip } from "../../floating";
-import { Deferred } from "../../tools";
-
-import { SidebarBase } from "./common";
+import { Avatar } from '../../design/atoms/display/Avatar';
+import { Typography } from '../../design/atoms/display/Typography';
+import { UserStatusGraphic } from '../../design/atoms/indicators';
+import { MenuButton } from '../../design/atoms/inputs/MenuButton';
+import { OverflowingText } from '../../design/layout/OverflowingText';
+import { Tooltip } from '../../floating';
+import { Deferred } from '../../tools';
+import { SidebarBase } from './common';
 
 interface Props {
   /**
@@ -52,11 +48,11 @@ interface Props {
   __tempDisplayFriends: () => boolean;
 }
 
-const ButtonTitle = styled("div", {
+const ButtonTitle = styled('div', {
   base: {
-    height: "100%",
-    display: "flex",
-    alignItems: "center",
+    height: '100%',
+    display: 'flex',
+    alignItems: 'center',
   },
 });
 
@@ -77,35 +73,35 @@ export const HomeSidebar = (props: Props) => {
     <SidebarBase>
       <div
         ref={scrollTargetElement}
-        use:scrollable={{ direction: "y", showOnHover: true }}
+        use:scrollable={{ direction: 'y', showOnHover: true }}
       >
         <List>
           <SidebarTitle>
-            <Typography variant="sidebar-title">
-              {t("app.main.categories.conversations")}
+            <Typography variant='sidebar-title'>
+              {t('app.main.categories.conversations')}
             </Typography>
           </SidebarTitle>
 
-          <a href="/app">
+          <a href='/app'>
             <MenuButton
-              size="normal"
+              size='normal'
               icon={<BiSolidHome size={24} />}
-              attention={location.pathname === "/app" ? "selected" : "normal"}
+              attention={location.pathname === '/app' ? 'selected' : 'normal'}
             >
-              <ButtonTitle>{t("app.navigation.tabs.home")}</ButtonTitle>
+              <ButtonTitle>{t('app.navigation.tabs.home')}</ButtonTitle>
             </MenuButton>
           </a>
 
           <Show when={props.__tempDisplayFriends()}>
-            <a href="/friends">
+            <a href='/friends'>
               <MenuButton
-                size="normal"
+                size='normal'
                 icon={<BiSolidUserDetail size={24} />}
                 attention={
-                  location.pathname === "/friends" ? "selected" : "normal"
+                  location.pathname === '/friends' ? 'selected' : 'normal'
                 }
               >
-                <ButtonTitle>{t("app.navigation.tabs.friends")}</ButtonTitle>
+                <ButtonTitle>{t('app.navigation.tabs.friends')}</ButtonTitle>
               </MenuButton>
             </a>
           </Show>
@@ -113,28 +109,27 @@ export const HomeSidebar = (props: Props) => {
           <Switch
             fallback={
               <MenuButton
-                size="normal"
-                attention={"normal"}
+                size='normal'
+                attention={'normal'}
                 icon={<BiSolidNotepad size={24} />}
-                // eslint-disable-next-line solid/reactivity
                 onClick={() => props.openSavedNotes(navigate)}
               >
-                <ButtonTitle>{t("app.navigation.tabs.saved")}</ButtonTitle>
+                <ButtonTitle>{t('app.navigation.tabs.saved')}</ButtonTitle>
               </MenuButton>
             }
           >
             <Match when={savedNotesChannelId()}>
               <a href={`/channel/${savedNotesChannelId()}`}>
                 <MenuButton
-                  size="normal"
+                  size='normal'
                   icon={<BiSolidNotepad size={24} />}
                   attention={
                     props.channelId && savedNotesChannelId() === props.channelId
-                      ? "selected"
-                      : "normal"
+                      ? 'selected'
+                      : 'normal'
                   }
                 >
-                  <ButtonTitle>{t("app.navigation.tabs.saved")}</ButtonTitle>
+                  <ButtonTitle>{t('app.navigation.tabs.saved')}</ButtonTitle>
                 </MenuButton>
               </a>
             </Match>
@@ -142,19 +137,19 @@ export const HomeSidebar = (props: Props) => {
 
           <span
             style={{
-              display: "flex",
-              "padding-top": "var(--gap-md)",
-              "padding-inline": "var(--gap-lg)",
-              "align-items": "center",
-              "justify-content": "space-between",
+              display: 'flex',
+              'padding-top': 'var(--gap-md)',
+              'padding-inline': 'var(--gap-lg)',
+              'align-items': 'center',
+              'justify-content': 'space-between',
               // TODO style this
             }}
           >
-            <Typography variant="category">Direct Messages</Typography>
+            <Typography variant='category'>Direct Messages</Typography>
             <a
               onClick={() =>
                 modalController.push({
-                  type: "create_group",
+                  type: 'create_group',
                   client: client(),
                 })
               }
@@ -173,13 +168,13 @@ export const HomeSidebar = (props: Props) => {
                 <div
                   style={{
                     ...item.style,
-                    width: "100%",
-                    "padding-block": "3px",
+                    width: '100%',
+                    'padding-block': '3px',
                   }}
                 >
                   <Entry
                     // @ts-expect-error missing type on Entry
-                    role="listitem"
+                    role='listitem'
                     tabIndex={item.tabIndex}
                     style={item.style}
                     channel={item.item}
@@ -206,13 +201,13 @@ const SidebarTitle = styledLegacy.p`
 /**
  * Styles required to correctly display name and status
  */
-const NameStatusStack = styled("div", {
+const NameStatusStack = styled('div', {
   base: {
-    height: "100%",
+    height: '100%',
 
-    display: "flex",
-    flexDirection: "column",
-    justifyContent: "center",
+    display: 'flex',
+    flexDirection: 'column',
+    justifyContent: 'center',
   },
 });
 
@@ -225,7 +220,7 @@ function Entry(
     "href"
   >*/
 ) {
-  const [local, remote] = splitProps(props, ["channel", "active"]);
+  const [local, remote] = splitProps(props, ['channel', 'active']);
 
   const q = useQuantity();
   const t = useTranslation();
@@ -241,31 +236,31 @@ function Entry(
   return (
     <a {...remote} href={`/channel/${local.channel.id}`}>
       <MenuButton
-        size="normal"
+        size='normal'
         alert={
           !local.active &&
           local.channel.unread &&
           (local.channel.mentions?.size || true)
         }
         attention={
-          local.active ? "selected" : local.channel.unread ? "active" : "normal"
+          local.active ? 'selected' : local.channel.unread ? 'active' : 'normal'
         }
         icon={
           <Switch>
-            <Match when={local.channel.type === "Group"}>
+            <Match when={local.channel.type === 'Group'}>
               <Avatar
                 size={32}
-                shape="rounded-square"
+                shape='rounded-square'
                 fallback={local.channel.name}
                 src={local.channel.iconURL}
                 primaryContrast
               />
             </Match>
-            <Match when={local.channel.type === "DirectMessage"}>
+            <Match when={local.channel.type === 'DirectMessage'}>
               <Avatar
                 size={32}
                 src={local.channel.iconURL}
-                holepunch="bottom-right"
+                holepunch='bottom-right'
                 overlay={
                   <UserStatusGraphic
                     status={local.channel?.recipient?.presence}
@@ -279,18 +274,18 @@ function Entry(
           <a
             onClick={(e) => {
               e.preventDefault();
-              getController("modal").push({
-                type: "delete_channel",
+              getController('modal').push({
+                type: 'delete_channel',
                 channel: local.channel,
               });
             }}
           >
-            <MdClose {...iconSize("18px")} />
+            <MdClose {...iconSize('18px')} />
           </a>
         }
         use:floating={{
           contextMenu: () =>
-            local.channel.type === "DirectMessage" ? (
+            local.channel.type === 'DirectMessage' ? (
               <UserContextMenu
                 user={local.channel.recipient!}
                 channel={local.channel}
@@ -302,26 +297,26 @@ function Entry(
       >
         <NameStatusStack>
           <Switch>
-            <Match when={local.channel.type === "Group"}>
+            <Match when={local.channel.type === 'Group'}>
               <OverflowingText>
                 <TextWithEmoji content={local.channel.name!} />
               </OverflowingText>
-              <Typography variant="status">
-                {q("members", local.channel.recipients.length || 0)}
+              <Typography variant='status'>
+                {q('members', local.channel.recipients.length || 0)}
               </Typography>
             </Match>
-            <Match when={local.channel.type === "DirectMessage"}>
+            <Match when={local.channel.type === 'DirectMessage'}>
               <OverflowingText>
                 {local.channel?.recipient?.displayName}
               </OverflowingText>
               <Show when={status()}>
                 <Tooltip
                   content={() => <TextWithEmoji content={status()!} />}
-                  placement="top-start"
+                  placement='top-start'
                   aria={status()!}
                 >
                   <OverflowingText>
-                    <Typography variant="status">
+                    <Typography variant='status'>
                       <TextWithEmoji content={status()!} />
                     </Typography>
                   </OverflowingText>
@@ -341,5 +336,5 @@ function Entry(
  */
 const List = styledLegacy.div`
   /* padding: ${(props) => props.theme!.gap.md}; */
-  width: ${(props) => props.theme!.layout.width["channel-sidebar"]};
+  width: ${(props) => props.theme!.layout.width['channel-sidebar']};
 `;
diff --git a/packages/client/components/ui/components/navigation/channels/ServerSidebar.tsx b/packages/client/components/ui/components/navigation/channels/ServerSidebar.tsx
index 47e42d8c7..958647b2c 100644
--- a/packages/client/components/ui/components/navigation/channels/ServerSidebar.tsx
+++ b/packages/client/components/ui/components/navigation/channels/ServerSidebar.tsx
@@ -1,3 +1,11 @@
+import MdPersonAdd from '@material-design-icons/svg/filled/person_add.svg?component-solid';
+import MdSettings from '@material-design-icons/svg/filled/settings.svg?component-solid';
+import { getController } from '@revolt/common';
+import { useTranslation } from '@revolt/i18n';
+import { KeybindAction } from '@revolt/keybinds/actions';
+import { TextWithEmoji } from '@revolt/markdown';
+import { useNavigate } from '@revolt/routing';
+import type { API, Channel, Server, ServerFlags } from 'revolt.js';
 import {
   BiRegularCheckCircle,
   BiRegularHash,
@@ -5,40 +13,28 @@ import {
   BiSolidCheckCircle,
   BiSolidChevronRight,
   BiSolidCog,
-} from "solid-icons/bi";
+} from 'solid-icons/bi';
+import type { JSX } from 'solid-js';
 import {
-  For,
-  JSX,
-  Match,
-  Show,
-  Switch,
   createMemo,
   createSignal,
+  For,
+  Match,
   onCleanup,
   onMount,
-} from "solid-js";
-import { styled } from "solid-styled-components";
-
-import type { API, Channel, Server, ServerFlags } from "revolt.js";
-
-import { getController } from "@revolt/common";
-import { useTranslation } from "@revolt/i18n";
-import { KeybindAction } from "@revolt/keybinds/actions";
-import { TextWithEmoji } from "@revolt/markdown";
-import { useNavigate } from "@revolt/routing";
-
-import MdPersonAdd from "@material-design-icons/svg/filled/person_add.svg?component-solid";
-import MdSettings from "@material-design-icons/svg/filled/settings.svg?component-solid";
-
-import { iconSize } from "../../..";
-import { useKeybindActions } from "../../context/Keybinds";
-import { Header, HeaderWithImage } from "../../design/atoms/display/Header";
-import { Typography } from "../../design/atoms/display/Typography";
-import { MenuButton } from "../../design/atoms/inputs/MenuButton";
-import { Column, OverflowingText, Row } from "../../design/layout";
-import { Tooltip } from "../../floating";
-
-import { SidebarBase } from "./common";
+  Show,
+  Switch,
+} from 'solid-js';
+import { styled } from 'solid-styled-components';
+
+import { iconSize } from '../../..';
+import { useKeybindActions } from '../../context/Keybinds';
+import { Header, HeaderWithImage } from '../../design/atoms/display/Header';
+import { Typography } from '../../design/atoms/display/Typography';
+import { MenuButton } from '../../design/atoms/inputs/MenuButton';
+import { Column, OverflowingText, Row } from '../../design/layout';
+import { Tooltip } from '../../floating';
+import { SidebarBase } from './common';
 
 interface Props {
   /**
@@ -64,13 +60,13 @@ interface Props {
   /**
    * Menu generator
    */
-  menuGenerator: (target: Server | Channel) => JSX.Directives["floating"];
+  menuGenerator: (target: Server | Channel) => JSX.Directives['floating'];
 }
 
 /**
  * Ordered category data returned from server
  */
-type CategoryData = Omit<API.Category, "channels"> & { channels: Channel[] };
+type CategoryData = Omit<API.Category, 'channels'> & { channels: Channel[] };
 
 /**
  * Display server information and channels
@@ -139,7 +135,7 @@ export const ServerSidebar = (props: Props) => {
     <SidebarBase>
       <Switch
         fallback={
-          <Header placement="secondary">
+          <Header placement='secondary'>
             <ServerInfo
               server={props.server}
               openServerInfo={props.openServerInfo}
@@ -150,7 +146,7 @@ export const ServerSidebar = (props: Props) => {
       >
         <Match when={props.server.banner}>
           <HeaderWithImage
-            placement="secondary"
+            placement='secondary'
             style={{
               background: `url('${props.server.bannerURL}')`,
             }}
@@ -165,10 +161,10 @@ export const ServerSidebar = (props: Props) => {
       </Switch>
       <div
         use:scrollable={{ showOnHover: true }}
-        style={{ "flex-grow": 1 }}
+        style={{ 'flex-grow': 1 }}
         use:floating={props.menuGenerator(props.server)}
       >
-        <List gap="lg">
+        <List gap='lg'>
           <div />
           <For each={props.server.orderedChannels}>
             {(category) => (
@@ -190,7 +186,7 @@ export const ServerSidebar = (props: Props) => {
  * Server Information
  */
 function ServerInfo(
-  props: Pick<Props, "server" | "openServerInfo" | "openServerSettings">
+  props: Pick<Props, 'server' | 'openServerInfo' | 'openServerSettings'>
 ) {
   return (
     <Row align grow>
@@ -236,10 +232,10 @@ function ServerBadge(props: { flags: ServerFlags }) {
       <Tooltip
         content={
           props.flags === 1
-            ? t("app.special.server-badges.official")
-            : t("app.special.server-badges.verified")
+            ? t('app.special.server-badges.official')
+            : t('app.special.server-badges.verified')
         }
-        placement="top"
+        placement='top'
       >
         {props.flags === 1 ? (
           <BiSolidCheckCircle size={12} />
@@ -258,13 +254,13 @@ function Category(
   props: {
     category: CategoryData;
     channelId: string | undefined;
-  } & Pick<Props, "menuGenerator">
+  } & Pick<Props, 'menuGenerator'>
 ) {
   const [shown, setShown] = createSignal(true);
   const channels = createMemo(() =>
     props.category.channels.filter(
       (channel) =>
-        props.category.id === "default" ||
+        props.category.id === 'default' ||
         shown() ||
         channel.unread ||
         channel.id === props.channelId
@@ -272,16 +268,16 @@ function Category(
   );
 
   return (
-    <Column gap="sm">
-      <Show when={props.category.id !== "default"}>
+    <Column gap='sm'>
+      <Show when={props.category.id !== 'default'}>
         <CategoryBase
           open={shown()}
           onClick={() => setShown((shown) => !shown)}
           align
-          gap="sm"
+          gap='sm'
         >
           <BiSolidChevronRight size={12} />
-          <Typography variant="category">{props.category.title}</Typography>
+          <Typography variant='category'>{props.category.title}</Typography>
         </CategoryBase>
       </Show>
       <For each={channels()}>
@@ -308,7 +304,7 @@ const CategoryBase = styled(Row)<{ open: boolean }>`
   transition: ${(props) => props.theme!.transitions.fast} all;
 
   color: ${(props) =>
-    props.theme!.colours["sidebar-channels-category-foreground"]};
+    props.theme!.colours['sidebar-channels-category-foreground']};
 
   &:hover {
     filter: brightness(1.1);
@@ -328,25 +324,25 @@ const CategoryBase = styled(Row)<{ open: boolean }>`
  * Server channel entry
  */
 function Entry(
-  props: { channel: Channel; active: boolean } & Pick<Props, "menuGenerator">
+  props: { channel: Channel; active: boolean } & Pick<Props, 'menuGenerator'>
 ) {
   return (
     <a href={`/server/${props.channel.serverId}/channel/${props.channel.id}`}>
       <MenuButton
         use:floating={props.menuGenerator(props.channel)}
-        size="thin"
+        size='thin'
         alert={
           !props.active &&
           props.channel.unread &&
           (props.channel.mentions?.size || true)
         }
         attention={
-          props.active ? "selected" : props.channel.unread ? "active" : "normal"
+          props.active ? 'selected' : props.channel.unread ? 'active' : 'normal'
         }
         icon={
           <>
             <Switch fallback={<BiRegularHash size={20} />}>
-              <Match when={props.channel.type === "VoiceChannel"}>
+              <Match when={props.channel.type === 'VoiceChannel'}>
                 <BiRegularPhoneCall size={20} />
               </Match>
             </Switch>
@@ -360,38 +356,38 @@ function Entry(
             <a
               use:floating={{
                 tooltip: {
-                  placement: "top",
-                  content: "Create Invite",
+                  placement: 'top',
+                  content: 'Create Invite',
                 },
               }}
               onClick={(e) => {
                 e.preventDefault();
-                getController("modal").push({
-                  type: "create_invite",
+                getController('modal').push({
+                  type: 'create_invite',
                   channel: props.channel,
                 });
               }}
             >
-              <MdPersonAdd {...iconSize("14px")} />
+              <MdPersonAdd {...iconSize('14px')} />
             </a>
 
             <a
               use:floating={{
                 tooltip: {
-                  placement: "top",
-                  content: "Edit Channel",
+                  placement: 'top',
+                  content: 'Edit Channel',
                 },
               }}
               onClick={(e) => {
                 e.preventDefault();
-                getController("modal").push({
-                  type: "settings",
-                  config: "channel",
+                getController('modal').push({
+                  type: 'settings',
+                  config: 'channel',
                   context: props.channel,
                 });
               }}
             >
-              <MdSettings {...iconSize("14px")} />
+              <MdSettings {...iconSize('14px')} />
             </a>
           </>
         }
@@ -407,7 +403,7 @@ function Entry(
 /**
  * Channel icon styling
  */
-const ChannelIcon = styled("img")`
+const ChannelIcon = styled('img')`
   width: 16px;
   height: 16px;
   object-fit: contain;
@@ -418,5 +414,5 @@ const ChannelIcon = styled("img")`
  * We fix the width in order to prevent scrollbar from moving stuff around
  */
 const List = styled(Column)`
-  width: ${(props) => props.theme!.layout.width["channel-sidebar"]};
+  width: ${(props) => props.theme!.layout.width['channel-sidebar']};
 `;
diff --git a/packages/client/components/ui/components/navigation/channels/common.tsx b/packages/client/components/ui/components/navigation/channels/common.tsx
index 4d25a3a87..02569ebb4 100644
--- a/packages/client/components/ui/components/navigation/channels/common.tsx
+++ b/packages/client/components/ui/components/navigation/channels/common.tsx
@@ -1,20 +1,20 @@
-import { styled } from "solid-styled-components";
+import { styled } from 'solid-styled-components';
 
 /**
  * Common styles for sidebar
  */
-export const SidebarBase = styled("div", "Sidebar")`
+export const SidebarBase = styled('div', 'Sidebar')`
   display: flex;
   flex-shrink: 0;
   flex-direction: column;
 
   overflow: hidden;
   border-radius: ${(props) => props.theme!.borderRadius.lg};
-  margin: ${(props) => (props.theme!.gap.md + " ").repeat(3)}0;
-  width: ${(props) => props.theme!.layout.width["channel-sidebar"]};
+  margin: ${(props) => (props.theme!.gap.md + ' ').repeat(3)}0;
+  width: ${(props) => props.theme!.layout.width['channel-sidebar']};
 
-  color: ${({ theme }) => theme!.colours["sidebar-channels-foreground"]};
-  background: ${({ theme }) => theme!.colours["sidebar-channels-background"]};
+  color: ${({ theme }) => theme!.colours['sidebar-channels-foreground']};
+  background: ${({ theme }) => theme!.colours['sidebar-channels-background']};
 
   a {
     text-decoration: none;
diff --git a/packages/client/components/ui/components/navigation/channels/index.ts b/packages/client/components/ui/components/navigation/channels/index.ts
index 226314bd4..8174a34a7 100644
--- a/packages/client/components/ui/components/navigation/channels/index.ts
+++ b/packages/client/components/ui/components/navigation/channels/index.ts
@@ -1,3 +1,3 @@
-export { HomeSidebar } from "./HomeSidebar";
-export { AdminSidebar } from "./AdminSidebar";
-export { ServerSidebar } from "./ServerSidebar";
+export { AdminSidebar } from './AdminSidebar';
+export { HomeSidebar } from './HomeSidebar';
+export { ServerSidebar } from './ServerSidebar';
diff --git a/packages/client/components/ui/components/navigation/index.ts b/packages/client/components/ui/components/navigation/index.ts
index a218d936b..d0f3d4b7f 100644
--- a/packages/client/components/ui/components/navigation/index.ts
+++ b/packages/client/components/ui/components/navigation/index.ts
@@ -1,2 +1,2 @@
-export * from "./channels";
-export * from "./servers";
+export * from './channels';
+export * from './servers';
diff --git a/packages/client/components/ui/components/navigation/servers/ServerList.tsx b/packages/client/components/ui/components/navigation/servers/ServerList.tsx
index 51db21bda..00bc7c60c 100644
--- a/packages/client/components/ui/components/navigation/servers/ServerList.tsx
+++ b/packages/client/components/ui/components/navigation/servers/ServerList.tsx
@@ -1,30 +1,27 @@
-import { Accessor, For, Show, onCleanup, onMount } from "solid-js";
-import { JSX } from "solid-js";
-import { styled as styledLegacy } from "solid-styled-components";
-
-import { Channel, Server, User } from "revolt.js";
-import { cva } from "styled-system/css";
-import { styled } from "styled-system/jsx";
-
-import { KeybindAction } from "@revolt/keybinds";
-import { useNavigate } from "@revolt/routing";
-
-import MdAdd from "@material-design-icons/svg/filled/add.svg?component-solid";
-import MdExplore from "@material-design-icons/svg/filled/explore.svg?component-solid";
-import MdHome from "@material-design-icons/svg/filled/home.svg?component-solid";
-import MdSettings from "@material-design-icons/svg/filled/settings.svg?component-solid";
-
-import { Draggable } from "../../common/Draggable";
-import { useKeybindActions } from "../../context/Keybinds";
-import { Column, Typography } from "../../design";
-import { Avatar } from "../../design/atoms/display/Avatar";
+import MdAdd from '@material-design-icons/svg/filled/add.svg?component-solid';
+import MdExplore from '@material-design-icons/svg/filled/explore.svg?component-solid';
+import MdHome from '@material-design-icons/svg/filled/home.svg?component-solid';
+import MdSettings from '@material-design-icons/svg/filled/settings.svg?component-solid';
+import { KeybindAction } from '@revolt/keybinds';
+import { useNavigate } from '@revolt/routing';
+import type { Channel, Server, User } from 'revolt.js';
+import type { Accessor } from 'solid-js';
+import type { JSX } from 'solid-js';
+import { For, onCleanup, onMount, Show } from 'solid-js';
+import { styled as styledLegacy } from 'solid-styled-components';
+import { cva } from 'styled-system/css';
+import { styled } from 'styled-system/jsx';
+
+import { Draggable } from '../../common/Draggable';
+import { useKeybindActions } from '../../context/Keybinds';
+import { Column, Typography } from '../../design';
+import { Avatar } from '../../design/atoms/display/Avatar';
 import {
   UnreadsGraphic,
   UserStatusGraphic,
-} from "../../design/atoms/indicators";
-import { Tooltip } from "../../floating";
-
-import { Swoosh } from "./Swoosh";
+} from '../../design/atoms/indicators';
+import { Tooltip } from '../../floating';
+import { Swoosh } from './Swoosh';
 
 interface Props {
   /**
@@ -61,7 +58,7 @@ interface Props {
   /**
    * Menu generator
    */
-  menuGenerator: (target: Server | Channel) => JSX.Directives["floating"];
+  menuGenerator: (target: Server | Channel) => JSX.Directives['floating'];
 }
 
 /**
@@ -93,7 +90,7 @@ export const ServerList = (props: Props) => {
     const nextIndex = currentServerIndex + byOffset;
 
     if (nextIndex === -1) {
-      return navigate("/app");
+      return navigate('/app');
     }
 
     // this will wrap the index around
@@ -130,34 +127,34 @@ export const ServerList = (props: Props) => {
 
   return (
     <ServerListBase>
-      <div use:invisibleScrollable={{ direction: "y", class: listBase() }}>
+      <div use:invisibleScrollable={{ direction: 'y', class: listBase() }}>
         <EntryContainer>
           {/* <Show when={!props.selectedServer()}>
             <PositionSwoosh>
               <Swoosh topItem />
             </PositionSwoosh>
           </Show> */}
-          <a href="/app">
+          <a href='/app'>
             <Avatar size={42} fallback={<MdHome />} />
           </a>
         </EntryContainer>
         <Tooltip
-          placement="right"
+          placement='right'
           content={() => (
-            <Column gap="none">
+            <Column gap='none'>
               <span>{props.user.username}</span>
-              <Typography variant="small">{props.user.presence}</Typography>
+              <Typography variant='small'>{props.user.presence}</Typography>
             </Column>
           )}
           aria={props.user.username}
         >
           <EntryContainer>
             {/* TODO: Make this open user status context menu */}
-            <a href="/app">
+            <a href='/app'>
               <Avatar
                 size={42}
                 src={props.user.avatarURL}
-                holepunch={"bottom-right"}
+                holepunch={'bottom-right'}
                 overlay={<UserStatusGraphic status={props.user.presence} />}
                 interactive
               />
@@ -166,14 +163,14 @@ export const ServerList = (props: Props) => {
         </Tooltip>
         <For each={props.unreadConversations.slice(0, 9)}>
           {(conversation) => (
-            <Tooltip placement="right" content={conversation.displayName}>
+            <Tooltip placement='right' content={conversation.displayName}>
               <EntryContainer use:floating={props.menuGenerator(conversation)}>
                 <a href={`/channel/${conversation.id}`}>
                   <Avatar
                     size={42}
                     // TODO: fix this
                     src={conversation.iconURL}
-                    holepunch={conversation.unread ? "top-right" : "none"}
+                    holepunch={conversation.unread ? 'top-right' : 'none'}
                     overlay={
                       <>
                         <Show when={conversation.unread}>
@@ -213,7 +210,7 @@ export const ServerList = (props: Props) => {
                                  just check existence before continuing */
               }
             >
-              <Tooltip placement="right" content={item.name}>
+              <Tooltip placement='right' content={item.name}>
                 <EntryContainer use:floating={props.menuGenerator(item)}>
                   <Show when={props.selectedServer() === item.id}>
                     <PositionSwoosh>
@@ -224,7 +221,7 @@ export const ServerList = (props: Props) => {
                     <Avatar
                       size={42}
                       src={item.iconURL}
-                      holepunch={item.unread ? "top-right" : "none"}
+                      holepunch={item.unread ? 'top-right' : 'none'}
                       overlay={
                         <>
                           <Show when={item.unread}>
@@ -244,14 +241,14 @@ export const ServerList = (props: Props) => {
             </Show>
           )}
         </Draggable>
-        <Tooltip placement="right" content={"Create or join a server"}>
+        <Tooltip placement='right' content={'Create or join a server'}>
           <EntryContainer>
             <a onClick={() => props.onCreateOrJoinServer()}>
               <Avatar size={42} fallback={<MdAdd />} />
             </a>
           </EntryContainer>
         </Tooltip>
-        <Tooltip placement="right" content={"Find new servers to join"}>
+        <Tooltip placement='right' content={'Find new servers to join'}>
           <EntryContainer>
             <Avatar size={42} fallback={<MdExplore />} />
           </EntryContainer>
@@ -260,9 +257,9 @@ export const ServerList = (props: Props) => {
       <Shadow>
         <div />
       </Shadow>
-      <Tooltip placement="right" content="Settings">
+      <Tooltip placement='right' content='Settings'>
         <EntryContainer>
-          <a href="/settings">
+          <a href='/settings'>
             <Avatar size={42} fallback={<MdSettings />} interactive />
           </a>
         </EntryContainer>
@@ -274,11 +271,11 @@ export const ServerList = (props: Props) => {
 /**
  * Server list container
  */
-const ServerListBase = styled("div", {
+const ServerListBase = styled('div', {
   base: {
-    display: "flex",
-    flexDirection: "column",
-    background: "var(--colours-background)",
+    display: 'flex',
+    flexDirection: 'column',
+    background: 'var(--colours-background)',
   },
 });
 
@@ -294,7 +291,7 @@ const listBase = cva({
 /**
  * Server entries
  */
-const EntryContainer = styledLegacy("div", "Entry")`
+const EntryContainer = styledLegacy('div', 'Entry')`
   width: 56px;
   height: 56px;
   position: relative;
@@ -316,7 +313,7 @@ const LineDivider = styledLegacy.div`
   margin: 6px auto;
   width: calc(100% - 24px);
   background: ${({ theme }) =>
-    theme!.colours["sidebar-server-list-foreground"]};
+    theme!.colours['sidebar-server-list-foreground']};
 `;
 
 /**
@@ -331,7 +328,7 @@ const PositionSwoosh = styledLegacy.div`
 /**
  * Shadow at the bottom of the list
  */
-const Shadow = styledLegacy("div", "Shadow")`
+const Shadow = styledLegacy('div', 'Shadow')`
   height: 0;
   z-index: 1;
   display: relative;
@@ -343,7 +340,7 @@ const Shadow = styledLegacy("div", "Shadow")`
     background: linear-gradient(
       to bottom,
       transparent,
-      ${(props) => props.theme!.colours["background"]}
+      ${(props) => props.theme!.colours['background']}
     );
   }
 `;
diff --git a/packages/client/components/ui/components/navigation/servers/Swoosh.tsx b/packages/client/components/ui/components/navigation/servers/Swoosh.tsx
index f958f2b65..a63f6649d 100644
--- a/packages/client/components/ui/components/navigation/servers/Swoosh.tsx
+++ b/packages/client/components/ui/components/navigation/servers/Swoosh.tsx
@@ -1,4 +1,4 @@
-import { useTheme } from "solid-styled-components";
+import { useTheme } from 'solid-styled-components';
 
 interface Props {
   // Whether this is being placed under the top item on the list
@@ -14,31 +14,31 @@ export function Swoosh(props: Props) {
   // TODO: should depend on if server sidebar is hidden
   return (
     <svg
-      width="56"
-      height="106"
-      viewBox="0 0 56 106"
-      xmlns="http://www.w3.org/2000/svg"
+      width='56'
+      height='106'
+      viewBox='0 0 56 106'
+      xmlns='http://www.w3.org/2000/svg'
     >
       <path
-        d="M54 53C54 67.9117 41.9117 80 27 80C12.0883 80 0 67.9117 0 53C0 38.0883 12.0883 26 27 26C41.9117 26 54 38.0883 54 53Z"
-        fill={theme.colours["sidebar-channels-background"]}
+        d='M54 53C54 67.9117 41.9117 80 27 80C12.0883 80 0 67.9117 0 53C0 38.0883 12.0883 26 27 26C41.9117 26 54 38.0883 54 53Z'
+        fill={theme.colours['sidebar-channels-background']}
       />
       <path
-        d="M27.0002 80C4.50023 80 56.0002 53 56.0002 53V106C56.0002 106 49.5002 80 27.0002 80Z"
-        fill={theme.colours["sidebar-channels-background"]}
+        d='M27.0002 80C4.50023 80 56.0002 53 56.0002 53V106C56.0002 106 49.5002 80 27.0002 80Z'
+        fill={theme.colours['sidebar-channels-background']}
       />
       {!props.topItem && (
         <path
-          d="M27.0003 26C4.50025 26 56 53 56 53L56.0003 0C56.0003 0 49.5003 26 27.0003 26Z"
-          fill={theme.colours["sidebar-channels-background"]}
+          d='M27.0003 26C4.50025 26 56 53 56 53L56.0003 0C56.0003 0 49.5003 26 27.0003 26Z'
+          fill={theme.colours['sidebar-channels-background']}
         />
       )}
       <rect
-        x="51"
-        y="50"
-        width="5"
-        height="7"
-        fill={theme.colours["sidebar-channels-background"]}
+        x='51'
+        y='50'
+        width='5'
+        height='7'
+        fill={theme.colours['sidebar-channels-background']}
       />
     </svg>
   );
diff --git a/packages/client/components/ui/components/navigation/servers/index.ts b/packages/client/components/ui/components/navigation/servers/index.ts
index e16cddd33..45408704e 100644
--- a/packages/client/components/ui/components/navigation/servers/index.ts
+++ b/packages/client/components/ui/components/navigation/servers/index.ts
@@ -1 +1 @@
-export { ServerList } from "./ServerList";
+export { ServerList } from './ServerList';
diff --git a/packages/client/components/ui/components/stories.d.ts b/packages/client/components/ui/components/stories.d.ts
index f069a0018..1c6dbfcbd 100644
--- a/packages/client/components/ui/components/stories.d.ts
+++ b/packages/client/components/ui/components/stories.d.ts
@@ -1,20 +1,20 @@
-import type { Component, ComponentProps } from "solid-js";
-import type { JSX } from "solid-js";
+import type { Component, ComponentProps } from 'solid-js';
+import type { JSX } from 'solid-js';
 
 type Decorator<T extends Component<P>, P = object> = Component<{
   children: JSX.Element;
   childProps: ComponentProps<T>;
 }>;
 
-declare type Story<T extends Component<P>, P = object> = {
+declare interface Story<T extends Component<P>, P = object> {
   title: string;
   props?: ComponentProps<T>;
   decorators?: Decorator<T, P>[];
   component?: T;
   skipRegressionTests?: boolean;
-};
+}
 
-declare type ComponentStory<T extends Component<P>, P = object> = {
+declare interface ComponentStory<T extends Component<P>, P = object> {
   category?: string;
   component: T;
   stories: Story<T, P>[];
@@ -22,15 +22,15 @@ declare type ComponentStory<T extends Component<P>, P = object> = {
   decorators?: Decorator<T, P>[];
   propTypes?: Record<
     keyof ComponentProps<T>,
-    | "string"
-    | "boolean"
-    | "number"
-    | "function"
-    | "component"
+    | 'string'
+    | 'boolean'
+    | 'number'
+    | 'function'
+    | 'component'
     | (string | boolean)[]
   >;
   effects?: Record<
     keyof ComponentProps<T>,
     (props: ComponentProps<T>, ...args: unknown[]) => Partial<ComponentProps<T>>
   >;
-};
+}
diff --git a/packages/client/components/ui/components/tools/Deferred.tsx b/packages/client/components/ui/components/tools/Deferred.tsx
index f6caa1e4e..7d660a761 100644
--- a/packages/client/components/ui/components/tools/Deferred.tsx
+++ b/packages/client/components/ui/components/tools/Deferred.tsx
@@ -1,7 +1,8 @@
-import { Match } from "solid-js";
-import { JSX, Switch, createSignal, onMount } from "solid-js";
+import type { JSX } from 'solid-js';
+import { Match } from 'solid-js';
+import { createSignal, onMount, Switch } from 'solid-js';
 
-import { Preloader } from "../design";
+import { Preloader } from '../design';
 
 /**
  * Render component after other elements have been drawn to DOM
@@ -12,7 +13,7 @@ export function Deferred(props: { children: JSX.Element }) {
   const [render, setRender] = createSignal(false);
   onMount(() => setTimeout(() => setRender(true)));
   return (
-    <Switch fallback={<Preloader type="ring" />}>
+    <Switch fallback={<Preloader type='ring' />}>
       <Match when={render()}>{props.children}</Match>
     </Switch>
   );
diff --git a/packages/client/components/ui/components/tools/Form.tsx b/packages/client/components/ui/components/tools/Form.tsx
index 0f9f3d93c..9bb114dec 100644
--- a/packages/client/components/ui/components/tools/Form.tsx
+++ b/packages/client/components/ui/components/tools/Form.tsx
@@ -1,16 +1,12 @@
 /* eslint-disable solid/reactivity */
-import { ComponentProps, For, JSX, Match, Show, Switch } from "solid-js";
-import { SetStoreFunction, createStore } from "solid-js/store";
+import type { ComponentProps, JSX } from 'solid-js';
+import { For, Match, Show, Switch } from 'solid-js';
+import type { SetStoreFunction } from 'solid-js/store';
+import { createStore } from 'solid-js/store';
 
-import { Button, Column } from "../design";
-
-import {
-  InputElement,
-  Type,
-  TypeProps,
-  Value,
-  emptyValue,
-} from "./InputElement";
+import { Button, Column } from '../design';
+import type { Type, TypeProps, Value } from './InputElement';
+import { emptyValue, InputElement } from './InputElement';
 
 /**
  * Form schema
@@ -73,7 +69,7 @@ export interface Props<T extends FormTemplate> {
   /**
    * Submit button properties
    */
-  submitBtn?: Omit<ComponentProps<typeof Button>, "type">;
+  submitBtn?: Omit<ComponentProps<typeof Button>, 'type'>;
 
   /**
    * Whether all elements are disabled
@@ -158,8 +154,8 @@ export function Form<T extends FormTemplate>(props: Props<T>) {
 
         <Show when={props.submitBtn}>
           <Button
-            type="submit"
-            children="Submit"
+            type='submit'
+            children='Submit'
             isDisabled={props.disabled}
             {...props.submitBtn}
           />
diff --git a/packages/client/components/ui/components/tools/files/FileDropAnywhereCollector.tsx b/packages/client/components/ui/components/tools/files/FileDropAnywhereCollector.tsx
index 898e9ab0b..bd0b96f8f 100644
--- a/packages/client/components/ui/components/tools/files/FileDropAnywhereCollector.tsx
+++ b/packages/client/components/ui/components/tools/files/FileDropAnywhereCollector.tsx
@@ -1,27 +1,25 @@
+import { getController } from '@revolt/common';
+import { useQuantity } from '@revolt/i18n';
 import {
   BiSolidFile,
   BiSolidFileImage,
   BiSolidFileTxt,
   BiSolidVideoRecording,
-} from "solid-icons/bi";
+} from 'solid-icons/bi';
 import {
-  Match,
-  Show,
-  Switch,
   createSignal,
+  Match,
   onCleanup,
   onMount,
-} from "solid-js";
-import { Portal } from "solid-js/web";
-import { styled } from "solid-styled-components";
-
-import { Motion } from "@motionone/solid";
-
-import { getController } from "@revolt/common";
-import { useQuantity } from "@revolt/i18n";
+  Show,
+  Switch,
+} from 'solid-js';
+import { Portal } from 'solid-js/web';
+import { Motion } from 'solid-motionone';
+import { styled } from 'solid-styled-components';
 
-import { PreviewStack } from "../../design";
-import { generateTypographyCSS } from "../../design/atoms/display/Typography";
+import { PreviewStack } from '../../design';
+import { generateTypographyCSS } from '../../design/atoms/display/Typography';
 
 interface Props {
   /**
@@ -64,7 +62,7 @@ const DimScreen = styled.div`
  * File drop information
  */
 const DropText = styled(Motion.div)`
-  ${(props) => generateTypographyCSS(props.theme!, "label")}
+  ${(props) => generateTypographyCSS(props.theme!, 'label')}
 
   margin-top: 48px;
   white-space: nowrap;
@@ -91,13 +89,13 @@ export function FileDropAnywhereCollector(props: Props) {
    * @param event Drag event
    */
   function onDragOver(event: DragEvent) {
-    if (getController("modal").isOpen()) return;
+    if (getController('modal').isOpen()) return;
 
     event.preventDefault();
     clearTimeout(deferredHide);
 
     if (event.dataTransfer) {
-      event.dataTransfer.dropEffect = "copy";
+      event.dataTransfer.dropEffect = 'copy';
 
       if (!showIndicator()) {
         setShowIndicator(true);
@@ -136,15 +134,15 @@ export function FileDropAnywhereCollector(props: Props) {
   }
 
   onMount(() => {
-    document.addEventListener("dragover", onDragOver);
-    document.addEventListener("dragleave", onDragLeave);
-    document.addEventListener("drop", onDrop);
+    document.addEventListener('dragover', onDragOver);
+    document.addEventListener('dragleave', onDragLeave);
+    document.addEventListener('drop', onDrop);
   });
 
   onCleanup(() => {
-    document.removeEventListener("dragover", onDragOver);
-    document.removeEventListener("dragleave", onDragLeave);
-    document.removeEventListener("drop", onDrop);
+    document.removeEventListener('dragover', onDragOver);
+    document.removeEventListener('dragleave', onDragLeave);
+    document.removeEventListener('drop', onDrop);
   });
 
   /**
@@ -176,19 +174,19 @@ export function FileDropAnywhereCollector(props: Props) {
                 animate={{ opacity: 1 }}
                 transition={{ duration: 0.2 }}
               >
-                {q("dropFiles", items().length)}
+                {q('dropFiles', items().length)}
               </DropText>
             }
           >
             {(item) => (
               <Switch fallback={<BiSolidFile size={64} />}>
-                <Match when={item.type.startsWith("text/")}>
+                <Match when={item.type.startsWith('text/')}>
                   <BiSolidFileTxt size={64} />
                 </Match>
-                <Match when={item.type.startsWith("image/")}>
+                <Match when={item.type.startsWith('image/')}>
                   <BiSolidFileImage size={64} />
                 </Match>
-                <Match when={item.type.startsWith("video/")}>
+                <Match when={item.type.startsWith('video/')}>
                   <BiSolidVideoRecording size={64} />
                 </Match>
               </Switch>
diff --git a/packages/client/components/ui/components/tools/files/FilePasteCollector.tsx b/packages/client/components/ui/components/tools/files/FilePasteCollector.tsx
index 0475da8bc..7b1900392 100644
--- a/packages/client/components/ui/components/tools/files/FilePasteCollector.tsx
+++ b/packages/client/components/ui/components/tools/files/FilePasteCollector.tsx
@@ -1,4 +1,4 @@
-import { onCleanup, onMount } from "solid-js";
+import { onCleanup, onMount } from 'solid-js';
 
 interface Props {
   /**
@@ -18,11 +18,11 @@ export function FilePasteCollector(props: Props) {
    */
   function onPaste(event: ClipboardEvent) {
     const items = event.clipboardData?.items;
-    if (typeof items === "undefined") return;
+    if (typeof items === 'undefined') return;
 
     // Filter for files
     const files: File[] = [...items]
-      .filter((item) => !item.type.startsWith("text/"))
+      .filter((item) => !item.type.startsWith('text/'))
       .map((item) => item.getAsFile()!)
       .filter((item) => item);
 
@@ -32,8 +32,8 @@ export function FilePasteCollector(props: Props) {
     }
   }
 
-  onMount(() => document.addEventListener("paste", onPaste));
-  onCleanup(() => document.removeEventListener("paste", onPaste));
+  onMount(() => document.addEventListener('paste', onPaste));
+  onCleanup(() => document.removeEventListener('paste', onPaste));
 
   return <></>;
 }
diff --git a/packages/client/components/ui/components/tools/files/index.ts b/packages/client/components/ui/components/tools/files/index.ts
index 8aef99654..c7bbb8406 100644
--- a/packages/client/components/ui/components/tools/files/index.ts
+++ b/packages/client/components/ui/components/tools/files/index.ts
@@ -1,2 +1,2 @@
-export { FilePasteCollector } from "./FilePasteCollector";
-export { FileDropAnywhereCollector } from "./FileDropAnywhereCollector";
+export { FileDropAnywhereCollector } from './FileDropAnywhereCollector';
+export { FilePasteCollector } from './FilePasteCollector';
diff --git a/packages/client/components/ui/components/tools/index.ts b/packages/client/components/ui/components/tools/index.ts
index f2de4d81c..979befea6 100644
--- a/packages/client/components/ui/components/tools/index.ts
+++ b/packages/client/components/ui/components/tools/index.ts
@@ -1,4 +1,4 @@
-export { InputElement } from "./InputElement";
-export { Form } from "./Form";
-export { Deferred } from "./Deferred";
-export * from "./files";
+export { Deferred } from './Deferred';
+export * from './files';
+export { Form } from './Form';
+export { InputElement } from './InputElement';
diff --git a/packages/client/components/ui/decorators/ContainerDecorator.tsx b/packages/client/components/ui/decorators/ContainerDecorator.tsx
index 8e06e0dbf..cd13023ac 100644
--- a/packages/client/components/ui/decorators/ContainerDecorator.tsx
+++ b/packages/client/components/ui/decorators/ContainerDecorator.tsx
@@ -1,4 +1,4 @@
-import type { JSX } from "solid-js";
+import type { JSX } from 'solid-js';
 
 /**
  * Create container around some element
@@ -10,15 +10,15 @@ export default function makeContainerDecorator({
 }: {
   width?: number;
   height?: number;
-  flex?: "col" | "row";
+  flex?: 'col' | 'row';
 }) {
   return (props: { children: JSX.Element }) => (
     <div
       style={{
-        "min-width": width ? `${width}px` : undefined,
-        "min-height": height ? `${height}px` : undefined,
-        display: flex ? "flex" : "block",
-        "flex-direction": flex === "col" ? "column" : undefined,
+        'min-width': width ? `${width}px` : undefined,
+        'min-height': height ? `${height}px` : undefined,
+        display: flex ? 'flex' : 'block',
+        'flex-direction': flex === 'col' ? 'column' : undefined,
       }}
     >
       {props.children}
diff --git a/packages/client/components/ui/decorators/FitContentDecorator.tsx b/packages/client/components/ui/decorators/FitContentDecorator.tsx
index d5da534b6..95bd0360f 100644
--- a/packages/client/components/ui/decorators/FitContentDecorator.tsx
+++ b/packages/client/components/ui/decorators/FitContentDecorator.tsx
@@ -1,8 +1,8 @@
-import type { JSX } from "solid-js";
+import type { JSX } from 'solid-js';
 
 /**
  * Create fit-content container around some content
  */
 export default function FitContentDecorator(props: { children: JSX.Element }) {
-  return <div style={{ width: "fit-content" }}>{props.children}</div>;
+  return <div style={{ width: 'fit-content' }}>{props.children}</div>;
 }
diff --git a/packages/client/components/ui/decorators/ResizeContainerDecorator.tsx b/packages/client/components/ui/decorators/ResizeContainerDecorator.tsx
index 24eb31780..f20a2d264 100644
--- a/packages/client/components/ui/decorators/ResizeContainerDecorator.tsx
+++ b/packages/client/components/ui/decorators/ResizeContainerDecorator.tsx
@@ -1,4 +1,4 @@
-import type { JSX } from "solid-js";
+import type { JSX } from 'solid-js';
 
 /**
  * Create resize container around some content
@@ -9,12 +9,12 @@ export default function ResizeContentDecorator(props: {
   return (
     <div
       style={{
-        width: "460px",
-        height: "640px",
-        display: "flex",
-        "flex-direction": "column",
-        resize: "both",
-        overflow: "hidden",
+        width: '460px',
+        height: '640px',
+        display: 'flex',
+        'flex-direction': 'column',
+        resize: 'both',
+        overflow: 'hidden',
       }}
     >
       {props.children}
diff --git a/packages/client/components/ui/decorators/SvgDecorator.tsx b/packages/client/components/ui/decorators/SvgDecorator.tsx
index af5dbfe11..80966ede5 100644
--- a/packages/client/components/ui/decorators/SvgDecorator.tsx
+++ b/packages/client/components/ui/decorators/SvgDecorator.tsx
@@ -1,4 +1,4 @@
-import type { JSX } from "solid-js";
+import type { JSX } from 'solid-js';
 
 /**
  * Create SVG container around some content
diff --git a/packages/client/components/ui/decorators/TextColourDecorator.tsx b/packages/client/components/ui/decorators/TextColourDecorator.tsx
index 90f7c613b..ca4a50826 100644
--- a/packages/client/components/ui/decorators/TextColourDecorator.tsx
+++ b/packages/client/components/ui/decorators/TextColourDecorator.tsx
@@ -1,8 +1,8 @@
-import type { JSX } from "solid-js";
+import type { JSX } from 'solid-js';
 
 /**
  * Set text colour to white for content
  */
 export default function TextColourDecorator(props: { children: JSX.Element }) {
-  return <div style={{ color: "white" }}>{props.children}</div>;
+  return <div style={{ color: 'white' }}>{props.children}</div>;
 }
diff --git a/packages/client/components/ui/directives/autoComplete.ts b/packages/client/components/ui/directives/autoComplete.ts
index b1321fcff..3ea2550cd 100644
--- a/packages/client/components/ui/directives/autoComplete.ts
+++ b/packages/client/components/ui/directives/autoComplete.ts
@@ -1,45 +1,45 @@
-import { Accessor, JSX, createSignal, onCleanup } from "solid-js";
+import type { Channel, Client, User } from 'revolt.js';
+import { ServerMember } from 'revolt.js';
+import type { Accessor, JSX } from 'solid-js';
+import { createSignal, onCleanup } from 'solid-js';
 
-import { Channel, Client, ServerMember, User } from "revolt.js";
-
-import emojiMapping from "../emojiMapping.json";
-
-import { registerFloatingElement, unregisterFloatingElement } from "./floating";
+import emojiMapping from '../emojiMapping.json';
+import { registerFloatingElement, unregisterFloatingElement } from './floating';
 
 const EMOJI_KEYS = Object.keys(emojiMapping).sort();
 const MAPPED_EMOJI_KEYS = EMOJI_KEYS.map((id) => ({ id, name: id }));
 
-type Operator = "@" | ":" | "#";
+type Operator = '@' | ':' | '#';
 
 export type AutoCompleteState =
   | {
-      matched: "none";
+      matched: 'none';
     }
   | ({
       length: number;
     } & (
       | {
-          matched: "emoji";
+          matched: 'emoji';
           matches: ((
             | {
-                type: "unicode";
+                type: 'unicode';
                 codepoint: string;
               }
             | {
-                type: "custom";
+                type: 'custom';
                 id: string;
               }
           ) & { replacement: string; shortcode: string })[];
         }
       | {
-          matched: "user";
+          matched: 'user';
           matches: {
             user: User | ServerMember;
             replacement: string;
           }[];
         }
       | {
-          matched: "channel";
+          matched: 'channel';
           matches: {
             channel: Channel;
             replacement: string;
@@ -54,12 +54,12 @@ export type AutoCompleteState =
  */
 export function autoComplete(
   element: HTMLInputElement,
-  config: Accessor<JSX.Directives["autoComplete"]>
+  config: Accessor<JSX.Directives['autoComplete']>
 ) {
   if (!config()) return;
 
   const [state, setState] = createSignal<AutoCompleteState>({
-    matched: "none",
+    matched: 'none',
   });
 
   const [selection, setSelection] = createSignal(0);
@@ -70,7 +70,7 @@ export function autoComplete(
    */
   function select(index: number) {
     const info = state() as AutoCompleteState & {
-      matched: "emoji" | "user" | "member";
+      matched: 'emoji' | 'user' | 'member';
     };
     const currentPosition = element.selectionStart;
     if (!currentPosition) return;
@@ -84,16 +84,16 @@ export function autoComplete(
     element.value =
       originalValue.slice(0, currentPosition - info.length) +
       replacement +
-      " " +
+      ' ' +
       originalValue.slice(currentPosition);
 
     const newPosition = currentPosition - info.length + replacement.length + 1;
-    element.setSelectionRange(newPosition, newPosition, "none");
+    element.setSelectionRange(newPosition, newPosition, 'none');
 
     // Bubble up this change to the rest of the application,
     // we should do this directly through state in the future
     // but for now this will do.
-    element.dispatchEvent(new Event("input", { bubbles: true }));
+    element.dispatchEvent(new Event('input', { bubbles: true }));
   }
 
   // TODO: use a virtual element on the caret
@@ -109,7 +109,7 @@ export function autoComplete(
   registerFloatingElement({
     element,
     config: accessor,
-    show: () => (state().matched === "none" ? undefined : accessor()),
+    show: () => (state().matched === 'none' ? undefined : accessor()),
     hide: () => void 0,
   });
 
@@ -120,14 +120,14 @@ export function autoComplete(
     event: KeyboardEvent & { currentTarget: HTMLTextAreaElement }
   ) {
     const current = state();
-    if (current.matched !== "none") {
-      if (event.key === "Enter") {
+    if (current.matched !== 'none') {
+      if (event.key === 'Enter') {
         event.preventDefault();
         select(selection());
         return;
       }
 
-      if (event.key === "ArrowUp") {
+      if (event.key === 'ArrowUp') {
         event.preventDefault();
         setSelection(
           (prev) => (prev === 0 ? current.matches.length : prev) - 1
@@ -135,7 +135,7 @@ export function autoComplete(
         return;
       }
 
-      if (event.key === "ArrowDown") {
+      if (event.key === 'ArrowDown') {
         event.preventDefault();
         setSelection(
           (prev) => (prev + 1 === current.matches.length ? -1 : prev) + 1
@@ -145,7 +145,7 @@ export function autoComplete(
     }
 
     const value = config();
-    if (typeof value === "object") {
+    if (typeof value === 'object') {
       value.onKeyDown?.(event);
     }
   }
@@ -156,8 +156,8 @@ export function autoComplete(
   function onKeyUp(event: unknown) {
     if (event instanceof KeyboardEvent) {
       const current = state();
-      if (current.matched !== "none") {
-        if (["ArrowUp", "ArrowDown"].includes(event.key)) {
+      if (current.matched !== 'none') {
+        if (['ArrowUp', 'ArrowDown'].includes(event.key)) {
           return;
         }
       }
@@ -168,7 +168,7 @@ export function autoComplete(
       const content = element.value.slice(0, cursor);
 
       // Try to figure out what we're matching
-      const current = (["@", ":", "#"] as Operator[])
+      const current = (['@', ':', '#'] as Operator[])
         // First find any applicable string
         .map((searchType) => {
           const index = content.lastIndexOf(searchType);
@@ -184,7 +184,7 @@ export function autoComplete(
         .filter(([, matchedString]) => /^[^\s@:#]*$/.test(matchedString))
         // Enforce minimum length for emoji matching
         .filter(([searchType, matchedString]) =>
-          searchType === ":" ? matchedString.length > 0 : true
+          searchType === ':' ? matchedString.length > 0 : true
         )[0];
 
       if (current) {
@@ -194,9 +194,9 @@ export function autoComplete(
       }
     }
 
-    if (state().matched !== "none")
+    if (state().matched !== 'none')
       setState({
-        matched: "none",
+        matched: 'none',
       });
   }
 
@@ -204,24 +204,24 @@ export function autoComplete(
    * Hide if currently showing if input loses focus
    */
   function onBlur() {
-    if (state().matched !== "none")
+    if (state().matched !== 'none')
       setState({
-        matched: "none",
+        matched: 'none',
       });
   }
 
-  element.addEventListener("keydown", onKeyDown as never);
-  element.addEventListener("keyup", onKeyUp);
-  element.addEventListener("focus", onKeyUp);
-  element.addEventListener("blur", onBlur);
+  element.addEventListener('keydown', onKeyDown as never);
+  element.addEventListener('keyup', onKeyUp);
+  element.addEventListener('focus', onKeyUp);
+  element.addEventListener('blur', onBlur);
 
   onCleanup(() => {
     unregisterFloatingElement(element);
 
-    element.removeEventListener("keydown", onKeyDown as never);
-    element.removeEventListener("keyup", onKeyUp);
-    element.removeEventListener("focus", onKeyUp);
-    element.removeEventListener("blur", onBlur);
+    element.removeEventListener('keydown', onKeyDown as never);
+    element.removeEventListener('keyup', onKeyUp);
+    element.removeEventListener('focus', onKeyUp);
+    element.removeEventListener('blur', onBlur);
   });
 }
 
@@ -231,12 +231,12 @@ export function autoComplete(
 function searchMatches(
   operator: Operator,
   query: string,
-  config: JSX.Directives["autoComplete"]
+  config: JSX.Directives['autoComplete']
 ): AutoCompleteState {
-  if (operator === ":") {
+  if (operator === ':') {
     const matches: string[] = [];
 
-    if (typeof config === "object" && config.client) {
+    if (typeof config === 'object' && config.client) {
       const searchSpace = [
         ...MAPPED_EMOJI_KEYS,
         ...config.client.emojis.toList(),
@@ -263,24 +263,24 @@ function searchMatches(
 
     if (!matches.length) {
       return {
-        matched: "none",
+        matched: 'none',
       };
     }
 
     return {
-      matched: "emoji",
+      matched: 'emoji',
       length: query.length + 1,
       matches: matches.map((id) =>
         id.length === 26
           ? {
-              type: "custom",
+              type: 'custom',
               id,
               shortcode: (config as { client: Client }).client!.emojis.get(id)!
                 .name,
-              replacement: ":" + id + ":",
+              replacement: ':' + id + ':',
             }
           : {
-              type: "unicode",
+              type: 'unicode',
               shortcode: id,
               codepoint: emojiMapping[id as keyof typeof emojiMapping],
               replacement: emojiMapping[id as keyof typeof emojiMapping],
@@ -289,8 +289,8 @@ function searchMatches(
     };
   }
 
-  if (typeof config === "object" && config.client) {
-    if (operator === "@") {
+  if (typeof config === 'object' && config.client) {
+    if (operator === '@') {
       const matches: (User | ServerMember)[] = [];
       const searchSpace = (
         config.searchSpace?.members ??
@@ -314,7 +314,7 @@ function searchMatches(
 
       if (matches.length) {
         return {
-          matched: "user",
+          matched: 'user',
           length: query.length + 1,
           matches: matches.map((user) => ({
             user,
@@ -324,7 +324,7 @@ function searchMatches(
       }
     }
 
-    if (operator === "#") {
+    if (operator === '#') {
       const matches: Channel[] = [];
       const searchSpace = (
         config.searchSpace?.channels ?? config.client.channels.toList()
@@ -343,7 +343,7 @@ function searchMatches(
 
       if (matches.length) {
         return {
-          matched: "channel",
+          matched: 'channel',
           length: query.length + 1,
           matches: matches.map((channel) => ({
             channel,
@@ -355,6 +355,6 @@ function searchMatches(
   }
 
   return {
-    matched: "none",
+    matched: 'none',
   };
 }
diff --git a/packages/client/components/ui/directives/floating.ts b/packages/client/components/ui/directives/floating.ts
index e9058d132..774f7a320 100644
--- a/packages/client/components/ui/directives/floating.ts
+++ b/packages/client/components/ui/directives/floating.ts
@@ -1,13 +1,13 @@
-import { Accessor, JSX, createSignal, onCleanup } from "solid-js";
+import { type Accessor, createSignal, type JSX, onCleanup } from 'solid-js';
 
-type Props = JSX.Directives["floating"] & object;
+type Props = JSX.Directives['floating'] & object;
 
-export type FloatingElement = {
+export interface FloatingElement {
   config: () => Props;
   element: HTMLElement;
   hide: () => void;
   show: Accessor<Props | undefined>;
-};
+}
 
 const [floatingElements, setFloatingElements] = createSignal<FloatingElement[]>(
   []
@@ -63,7 +63,7 @@ export function floating(element: HTMLElement, accessor: Accessor<Props>) {
     const current = show();
     const config = accessor();
 
-    if (target === "userCard" && config.userCard) {
+    if (target === 'userCard' && config.userCard) {
       if (current?.userCard) {
         setShow(undefined);
       } else if (!current) {
@@ -74,7 +74,7 @@ export function floating(element: HTMLElement, accessor: Accessor<Props>) {
       }
     }
 
-    if (target === "tooltip" && config.tooltip) {
+    if (target === 'tooltip' && config.tooltip) {
       if (current?.tooltip) {
         if (desiredState !== true) {
           setShow(undefined);
@@ -86,7 +86,7 @@ export function floating(element: HTMLElement, accessor: Accessor<Props>) {
       }
     }
 
-    if (target === "contextMenu" && config.contextMenu) {
+    if (target === 'contextMenu' && config.contextMenu) {
       if (current?.contextMenu) {
         setShow(undefined);
       } else if (!current) {
@@ -103,7 +103,7 @@ export function floating(element: HTMLElement, accessor: Accessor<Props>) {
    */
   function onClick() {
     // TODO: handle shift+click for mention
-    trigger("userCard");
+    trigger('userCard');
   }
 
   /**
@@ -112,41 +112,41 @@ export function floating(element: HTMLElement, accessor: Accessor<Props>) {
   function onContextMenu(event: MouseEvent) {
     event.preventDefault();
     event.stopPropagation();
-    trigger("contextMenu");
+    trigger('contextMenu');
   }
 
   /**
    * Handle mouse entering
    */
   function onMouseEnter() {
-    trigger("tooltip", true);
+    trigger('tooltip', true);
   }
 
   /**
    * Handle mouse leaving
    */
   function onMouseLeave() {
-    trigger("tooltip", false);
+    trigger('tooltip', false);
   }
 
   if (config.userCard) {
-    element.style.cursor = "pointer";
-    element.style.userSelect = "none";
-    element.addEventListener("click", onClick);
+    element.style.cursor = 'pointer';
+    element.style.userSelect = 'none';
+    element.addEventListener('click', onClick);
   }
 
   if (config.tooltip) {
     element.ariaLabel =
-      typeof config.tooltip.content === "string"
+      typeof config.tooltip.content === 'string'
         ? config.tooltip.content
         : config.tooltip!.aria!;
 
-    element.addEventListener("mouseenter", onMouseEnter);
-    element.addEventListener("mouseleave", onMouseLeave);
+    element.addEventListener('mouseenter', onMouseEnter);
+    element.addEventListener('mouseleave', onMouseLeave);
   }
 
   if (config.contextMenu) {
-    element.addEventListener("contextmenu", onContextMenu);
+    element.addEventListener('contextmenu', onContextMenu);
     // TODO: iOS events for touch
   }
 
@@ -154,16 +154,16 @@ export function floating(element: HTMLElement, accessor: Accessor<Props>) {
     unregisterFloatingElement(element);
 
     if (config.userCard) {
-      element.removeEventListener("click", onClick);
+      element.removeEventListener('click', onClick);
     }
 
     if (config.tooltip) {
-      element.removeEventListener("mouseenter", onMouseEnter);
-      element.removeEventListener("mouseleave", onMouseLeave);
+      element.removeEventListener('mouseenter', onMouseEnter);
+      element.removeEventListener('mouseleave', onMouseLeave);
     }
 
     if (config.contextMenu) {
-      element.removeEventListener("contextmenu", onContextMenu);
+      element.removeEventListener('contextmenu', onContextMenu);
     }
   });
 }
diff --git a/packages/client/components/ui/directives/index.ts b/packages/client/components/ui/directives/index.ts
index 13f8077d2..92ae0e5b6 100644
--- a/packages/client/components/ui/directives/index.ts
+++ b/packages/client/components/ui/directives/index.ts
@@ -1,5 +1,5 @@
-export * from "./scrollable";
-export * from "./floating";
-export * from "./autoComplete";
-export * from "./ripple";
-export * from "./invisibleScrollable";
+export * from './autoComplete';
+export * from './floating';
+export * from './invisibleScrollable';
+export * from './ripple';
+export * from './scrollable';
diff --git a/packages/client/components/ui/directives/invisibleScrollable.ts b/packages/client/components/ui/directives/invisibleScrollable.ts
index 1dc2e10eb..3fc7d2c0b 100644
--- a/packages/client/components/ui/directives/invisibleScrollable.ts
+++ b/packages/client/components/ui/directives/invisibleScrollable.ts
@@ -1,5 +1,5 @@
-import { Accessor, JSX } from "solid-js";
-import { css } from "solid-styled-components";
+import type { Accessor, JSX } from 'solid-js';
+import { css } from 'solid-styled-components';
 
 /**
  * Add styles for an invisible scrollable container
@@ -8,13 +8,13 @@ import { css } from "solid-styled-components";
  */
 export function invisibleScrollable(
   el: HTMLDivElement,
-  accessor: Accessor<JSX.Directives["invisibleScrollable"] & object>
+  accessor: Accessor<JSX.Directives['invisibleScrollable'] & object>
 ) {
   const props = accessor();
 
   el.classList.add(css`
     will-change: transform;
-    ${"overflow-" + (props?.direction ?? "y")}: scroll;
+    ${'overflow-' + (props?.direction ?? 'y')}: scroll;
 
     scrollbar-width: none;
 
@@ -24,6 +24,6 @@ export function invisibleScrollable(
   `);
 
   if (props.class) {
-    props.class.split(" ").forEach((cls) => el.classList.add(cls));
+    props.class.split(' ').forEach((cls) => el.classList.add(cls));
   }
 }
diff --git a/packages/client/components/ui/directives/ripple.ts b/packages/client/components/ui/directives/ripple.ts
index 00f02f64d..d3156823b 100644
--- a/packages/client/components/ui/directives/ripple.ts
+++ b/packages/client/components/ui/directives/ripple.ts
@@ -1,5 +1,6 @@
-import { Accessor, JSX, createEffect, on, onMount } from "solid-js";
-import { css, useTheme } from "solid-styled-components";
+import type { Accessor, JSX } from 'solid-js';
+import { createEffect, on, onMount } from 'solid-js';
+import { css, useTheme } from 'solid-styled-components';
 
 /**
  * Add styles and events for ripple
@@ -8,7 +9,7 @@ import { css, useTheme } from "solid-styled-components";
  */
 export function ripple(
   el: HTMLDivElement,
-  accessor: Accessor<JSX.Directives["ripple"] & object>
+  accessor: Accessor<JSX.Directives['ripple'] & object>
 ) {
   const props = accessor();
   if (!props) return;
@@ -18,40 +19,38 @@ export function ripple(
   // FIXME: there is a bug here if theme is changed, this class just disappears
 
   createEffect(() => {
-    el.classList.add(
-      css`
-        overflow: hidden;
-        position: relative;
+    el.classList.add(css`
+      overflow: hidden;
+      position: relative;
 
-        * {
-          z-index: 1;
-        }
+      * {
+        z-index: 1;
+      }
 
-        &::before {
-          content: " ";
-          position: absolute;
-          width: 100%;
-          height: 100%;
+      &::before {
+        content: ' ';
+        position: absolute;
+        width: 100%;
+        height: 100%;
 
-          opacity: 0;
-          z-index: 0;
-          transform: scale(2);
-          pointer-events: none;
-          background: ${theme.darkMode ? "white" : "black"};
+        opacity: 0;
+        z-index: 0;
+        transform: scale(2);
+        pointer-events: none;
+        background: ${theme.darkMode ? 'white' : 'black'};
 
-          transition: ${theme.transitions.fast};
-        }
+        transition: ${theme.transitions.fast};
+      }
 
-        &:hover::before {
-          opacity: ${theme.effects.ripple.hover.toString()};
-        }
-      `
-    );
+      &:hover::before {
+        opacity: ${theme.effects.ripple.hover.toString()};
+      }
+    `);
 
-    if (typeof props === "boolean" || props.enable)
+    if (typeof props === 'boolean' || props.enable)
       el.classList.add(css`
         &::after {
-          content: " ";
+          content: ' ';
           position: absolute;
           width: 100%;
           aspect-ratio: 1;
@@ -60,7 +59,7 @@ export function ripple(
           border-radius: 50%;
           transform: scale(0);
           pointer-events: none;
-          background: ${theme.darkMode ? "white" : "black"};
+          background: ${theme.darkMode ? 'white' : 'black'};
           opacity: ${theme.effects.ripple.hover.toString()};
 
           transition: ${theme.transitions.medium};
diff --git a/packages/client/components/ui/directives/scrollable.ts b/packages/client/components/ui/directives/scrollable.ts
index 2e185201b..71f8138a6 100644
--- a/packages/client/components/ui/directives/scrollable.ts
+++ b/packages/client/components/ui/directives/scrollable.ts
@@ -1,5 +1,5 @@
-import { Accessor, JSX, onCleanup } from "solid-js";
-import { css, useTheme } from "solid-styled-components";
+import { type Accessor, type JSX, onCleanup } from 'solid-js';
+import { css, useTheme } from 'solid-styled-components';
 
 /**
  * Add styles and events for a scrollable container
@@ -8,7 +8,7 @@ import { css, useTheme } from "solid-styled-components";
  */
 export function scrollable(
   el: HTMLDivElement,
-  accessor: Accessor<JSX.Directives["scrollable"] & object>
+  accessor: Accessor<JSX.Directives['scrollable'] & object>
 ) {
   const props = accessor();
   if (!props) return;
@@ -17,29 +17,29 @@ export function scrollable(
 
   el.classList.add(css`
     will-change: transform;
-    ${props.offsetTop ? "padding-top: " + props.offsetTop + "px;" : ""}
-    ${"overflow-" + (props?.direction ?? "y")}: scroll;
-    ${"overflow-" + ((props?.direction ?? "y") === "y" ? "x" : "y")}: hidden;
+    ${props.offsetTop ? 'padding-top: ' + props.offsetTop + 'px;' : ''}
+    ${'overflow-' + (props?.direction ?? 'y')}: scroll;
+    ${'overflow-' + ((props?.direction ?? 'y') === 'y' ? 'x' : 'y')}: hidden;
 
-    scrollbar-width: ${props?.showOnHover ? "none" : "initial"};
+    scrollbar-width: ${props?.showOnHover ? 'none' : 'initial'};
     scrollbar-color: ${props.foreground ??
-      theme!.colours["component-scrollbar-foreground"]}
-      ${props.background ?? theme!.colours["component-scrollbar-background"]};
+      theme!.colours['component-scrollbar-foreground']}
+      ${props.background ?? theme!.colours['component-scrollbar-background']};
 
     &::-webkit-scrollbar {
       width: 8px;
       height: 8px;
-      ${props?.showOnHover ? "display: none;" : ""}
+      ${props?.showOnHover ? 'display: none;' : ''}
     }
 
     &::-webkit-scrollbar-track {
       background: ${props.background ??
-      theme!.colours["component-scrollbar-background"]};
+      theme!.colours['component-scrollbar-background']};
     }
 
     &::-webkit-scrollbar-thumb {
       background: ${props.foreground ??
-      theme!.colours["component-scrollbar-foreground"]};
+      theme!.colours['component-scrollbar-foreground']};
       background-clip: content-box;
 
       border: 1px solid transparent;
@@ -49,7 +49,7 @@ export function scrollable(
   `);
 
   if (props.class) {
-    props.class.split(" ").forEach((cls) => el.classList.add(cls));
+    props.class.split(' ').forEach((cls) => el.classList.add(cls));
   }
 
   if (props.showOnHover) {
@@ -75,12 +75,12 @@ export function scrollable(
       el.classList.remove(showClass);
     };
 
-    el.addEventListener("mouseenter", onMouseEnter);
-    el.addEventListener("mouseleave", onMouseLeave);
+    el.addEventListener('mouseenter', onMouseEnter);
+    el.addEventListener('mouseleave', onMouseLeave);
 
     onCleanup(() => {
-      el.removeEventListener("mouseenter", onMouseEnter);
-      el.removeEventListener("mouseleave", onMouseLeave);
+      el.removeEventListener('mouseenter', onMouseEnter);
+      el.removeEventListener('mouseleave', onMouseLeave);
     });
   }
 }
diff --git a/packages/client/components/ui/index.tsx b/packages/client/components/ui/index.tsx
index d7cad9db4..3f56c64ce 100644
--- a/packages/client/components/ui/index.tsx
+++ b/packages/client/components/ui/index.tsx
@@ -1,24 +1,17 @@
-import { Component, createEffect } from "solid-js";
-import type { JSX } from "solid-js";
-import { useTheme } from "solid-styled-components";
-import { DirectiveProvider } from "solid-styled-components";
+import type { Placement } from '@floating-ui/dom';
+import type { Channel, Client, ServerMember, User } from 'revolt.js';
+import type { Component, JSX } from 'solid-js';
+import { createEffect } from 'solid-js';
+import { useTheme } from 'solid-styled-components';
+import { DirectiveProvider } from 'solid-styled-components';
 
-import { Placement } from "@floating-ui/dom";
-import { Channel, Client, ServerMember, User } from "revolt.js";
+import type { AutoCompleteState } from './directives';
+import { autoComplete, floating, ripple, scrollable } from './directives';
 
-import {
-  AutoCompleteState,
-  autoComplete,
-  floating,
-  ripple,
-  scrollable,
-} from "./directives";
-
-export * from "./components";
-export { darkTheme } from "./themes/darkTheme";
-
-export { ThemeProvider, styled, useTheme } from "solid-styled-components";
-export type { DefaultTheme } from "solid-styled-components";
+export * from './components';
+export { darkTheme } from './themes/darkTheme';
+export type { DefaultTheme } from 'solid-styled-components';
+export { styled, ThemeProvider, useTheme } from 'solid-styled-components';
 
 /**
  * Generate SVG props to configure icon size
@@ -30,7 +23,7 @@ export function iconSize(size: string | number, viewBox?: string) {
   return {
     width: size,
     height: size,
-    viewBox: viewBox ?? "0 0 24 24",
+    viewBox: viewBox ?? '0 0 24 24',
   };
 }
 
@@ -41,10 +34,10 @@ export function ProvideDirectives(props: { children: JSX.Element }) {
   return (
     <DirectiveProvider
       directives={{
-        "use:floating": floating,
-        "use:scrollable": scrollable,
-        "use:autoComplete": autoComplete,
-        "use:ripple": ripple,
+        'use:floating': floating,
+        'use:scrollable': scrollable,
+        'use:autoComplete': autoComplete,
+        'use:ripple': ripple,
       }}
     >
       {props.children}
@@ -61,162 +54,34 @@ export function ApplyGlobalStyles() {
   createEffect(() => {
     // Inject common theme styles
     Object.assign(document.body.style, {
-      "font-family": theme.fonts.primary,
+      'font-family': theme.fonts.primary,
       background: theme.colours.background,
       color: theme.colours.foreground,
     });
 
     // Set default emoji size
-    document.body.style.setProperty("--emoji-size", theme.layout.emoji.small);
+    document.body.style.setProperty('--emoji-size', theme.layout.emoji.small);
 
     // Unset variables
-    document.body.style.setProperty("--unset-fg", "red");
+    document.body.style.setProperty('--unset-fg', 'red');
     document.body.style.setProperty(
-      "--unset-bg",
-      "repeating-conic-gradient(red 0% 25%, transparent 0% 50%) 50% / 5px 5px"
+      '--unset-bg',
+      'repeating-conic-gradient(red 0% 25%, transparent 0% 50%) 50% / 5px 5px'
     );
 
     // Inject all theme properties
     function recursivelyInject(key: string, obj: any) {
-      if (typeof obj === "object") {
+      if (typeof obj === 'object') {
         for (const subkey of Object.keys(obj)) {
-          recursivelyInject(key + "-" + subkey, obj[subkey]);
+          recursivelyInject(key + '-' + subkey, obj[subkey]);
         }
       } else {
         document.body.style.setProperty(`-${key}`, obj);
       }
     }
 
-    recursivelyInject("", theme);
+    recursivelyInject('', theme);
   });
 
   return <></>;
 }
-
-/**
- * Export directive typing
- */
-declare module "solid-js" {
-  // eslint-disable-next-line
-  namespace JSX {
-    interface Directives {
-      ripple:
-        | true
-        | {
-            enable: boolean;
-
-            /**
-             * Pass-through class names
-             */
-            class?: string;
-          };
-      scrollable:
-        | true
-        | {
-            /**
-             * Scroll direction
-             */
-            direction?: "x" | "y";
-
-            /**
-             * Offset to apply to top of scroll container
-             */
-            offsetTop?: number;
-
-            /**
-             * Whether to only show scrollbar on hover
-             */
-            showOnHover?: boolean;
-
-            /**
-             * Pass-through class names
-             */
-            class?: string;
-
-            /**
-             * Set custom foreground on track
-             */
-            foreground?: string;
-
-            /**
-             * Set custom background on track
-             */
-            background?: string;
-          };
-      invisibleScrollable:
-        | true
-        | {
-            /**
-             * Scroll direction
-             */
-            direction?: "x" | "y";
-
-            /**
-             * Pass-through class names
-             */
-            class?: string;
-          };
-      floating: {
-        tooltip?: {
-          /**
-           * Where the tooltip should be placed
-           */
-          placement: Placement;
-        } & (
-          | {
-              /**
-               * Tooltip content
-               */
-              content: Component;
-
-              /**
-               * Aria label fallback
-               */
-              aria: string;
-            }
-          | {
-              /**
-               * Tooltip content
-               */
-              content: string | undefined;
-
-              /**
-               * Content is used as aria fallback
-               */
-              aria?: undefined;
-            }
-        );
-        userCard?: {
-          /**
-           * User to display
-           */
-          user: User;
-
-          /**
-           * Member to display
-           */
-          member?: ServerMember;
-        };
-        contextMenu?: Component;
-        autoComplete?: {
-          state: Accessor<AutoCompleteState>;
-          selection: Accessor<number>;
-          select: (index: number) => void;
-        };
-      };
-      autoComplete:
-        | true
-        | {
-            client?: Client;
-            onKeyDown?: (
-              event: KeyboardEvent & { currentTarget: HTMLTextAreaElement }
-            ) => void;
-            searchSpace?: {
-              users?: User[];
-              members?: ServerMember[];
-              channels?: Channel[];
-            };
-          };
-    }
-  }
-}
diff --git a/packages/client/components/ui/styled.d.ts b/packages/client/components/ui/styled.d.ts
index 80878b1f9..901984134 100644
--- a/packages/client/components/ui/styled.d.ts
+++ b/packages/client/components/ui/styled.d.ts
@@ -1,16 +1,16 @@
-import "solid-styled-components";
+import 'solid-styled-components';
 
 import type {
   ColorGroup,
   CustomColorGroup,
   Scheme,
   TonalPalette,
-} from "@material/material-color-utilities";
+} from '@material/material-color-utilities';
 
 /**
  * Declare our custom theme options
  */
-declare module "solid-styled-components" {
+declare module 'solid-styled-components' {
   export interface DefaultTheme {
     /* colour(base: keyof Scheme, tone?: number): string;
     scheme: Record<keyof Scheme, string>;
@@ -18,166 +18,166 @@ declare module "solid-styled-components" {
     darkMode: boolean;
     customColours: Record<
       | `status-${
-          | "online"
-          | "idle"
-          | "focus"
-          | "busy"
-          | "streaming"
-          | "invisible"}`
-      | "success"
-      | "warning"
-      | "error",
+          | 'online'
+          | 'idle'
+          | 'focus'
+          | 'busy'
+          | 'streaming'
+          | 'invisible'}`
+      | 'success'
+      | 'warning'
+      | 'error',
       Record<keyof ColorGroup, string>
     >;
     colours: {
       [key in
-        | "background"
-        | "foreground"
+        | 'background'
+        | 'foreground'
         | `component-${
-            | `${"fab" | "checkbox" | "scrollbar"}-${
-                | "background"
-                | "foreground"}`
-            | "checkbox-foreground-check"
-            | "chip-background"
-            | `btn-${"background" | "foreground"}-${"primary" | "secondary"}`
-            | `btn-foreground-${"plain" | "plain-secondary"}`
-            | `menubtn-${"default" | "selected" | "muted" | "hover"}-${
-                | "background"
-                | "foreground"}`
-            | `input-${"foreground" | "focus"}`
-            | `input-${"background" | "hover"}-${"primary" | "secondary"}`
+            | `${'fab' | 'checkbox' | 'scrollbar'}-${
+                | 'background'
+                | 'foreground'}`
+            | 'checkbox-foreground-check'
+            | 'chip-background'
+            | `btn-${'background' | 'foreground'}-${'primary' | 'secondary'}`
+            | `btn-foreground-${'plain' | 'plain-secondary'}`
+            | `menubtn-${'default' | 'selected' | 'muted' | 'hover'}-${
+                | 'background'
+                | 'foreground'}`
+            | `input-${'foreground' | 'focus'}`
+            | `input-${'background' | 'hover'}-${'primary' | 'secondary'}`
             | `categorybtn-${
-                | "background"
-                | "foreground"
-                | "foreground-description"
-                | `background-${"icon" | "collapse" | "hover" | "active"}`}`
-            | `modal-${"background" | "foreground"}`
-            | `avatar-fallback${"-contrast" | ""}-${
-                | "background"
-                | "foreground"}`
+                | 'background'
+                | 'foreground'
+                | 'foreground-description'
+                | `background-${'icon' | 'collapse' | 'hover' | 'active'}`}`
+            | `modal-${'background' | 'foreground'}`
+            | `avatar-fallback${'-contrast' | ''}-${
+                | 'background'
+                | 'foreground'}`
             | `context-menu-${
-                | "background"
-                | "foreground"
-                | "item-hover-background"
-                | "divider"
-                | "shadow"}`
-            | `key-${"background" | "foreground"}`
-            | `combo-${"focus" | "background" | "foreground"}`}`
+                | 'background'
+                | 'foreground'
+                | 'item-hover-background'
+                | 'divider'
+                | 'shadow'}`
+            | `key-${'background' | 'foreground'}`
+            | `combo-${'focus' | 'background' | 'foreground'}`}`
         | `preloader-foreground`
         | `sidebar-${
-            | "header-transparent-background"
-            | "server-list-foreground"
-            | "channels-category-foreground"
+            | 'header-transparent-background'
+            | 'server-list-foreground'
+            | 'channels-category-foreground'
             | `${
-                | "channels"
-                | "members"
-                | "header"
-                | "header-with-image-text"}-${"background" | "foreground"}`}`
+                | 'channels'
+                | 'members'
+                | 'header'
+                | 'header-with-image-text'}-${'background' | 'foreground'}`}`
         | `messaging-${
-            | `indicator-${"background" | "foreground"}`
-            | `indicator-reply-${"enabled" | "disabled"}`
-            | `upload-${"file-background" | "file-foreground" | "divider"}`
-            | `message-box-${"background" | "foreground"}`
+            | `indicator-${'background' | 'foreground'}`
+            | `indicator-reply-${'enabled' | 'disabled'}`
+            | `upload-${'file-background' | 'file-foreground' | 'divider'}`
+            | `message-box-${'background' | 'foreground'}`
             | `message-mentioned-background`
             | `component-${`${
-                | "blocked-message"
-                | "code-block"
-                | "blockquote"
-                | "text-embed"
-                | "attachment"
-                | "code-block-language"
-                | "message-divider"
-                | "message-divider-unread"
-                | "reaction"
-                | "reaction-selected"
-                | "mention"}-${"background" | "foreground"}`}`}`
+                | 'blocked-message'
+                | 'code-block'
+                | 'blockquote'
+                | 'text-embed'
+                | 'attachment'
+                | 'code-block-language'
+                | 'message-divider'
+                | 'message-divider-unread'
+                | 'reaction'
+                | 'reaction-selected'
+                | 'mention'}-${'background' | 'foreground'}`}`}`
         | `settings-${
-            | "background"
-            | "foreground"
-            | `content-${"background" | "foreground" | "scroll-thumb"}`
-            | `close-anchor${"" | "-hover"}`
+            | 'background'
+            | 'foreground'
+            | `content-${'background' | 'foreground' | 'scroll-thumb'}`
+            | `close-anchor${'' | '-hover'}`
             | `sidebar-${
-                | "category"
-                | "foreground"
-                | `button-${"hover" | "active"}`}`}`
+                | 'category'
+                | 'foreground'
+                | `button-${'hover' | 'active'}`}`}`
         | `temp-1`]: string;
     };
     rgb: {
-      [key in "header" | "typing-indicator"]: string;
+      [key in 'header' | 'typing-indicator']: string;
     };
     breakpoints: {
-      [key in "sm" | "md" | "lg" | "xl"]: string;
+      [key in 'sm' | 'md' | 'lg' | 'xl']: string;
     };
     borderRadius: {
-      [key in "sm" | "md" | "lg" | "xl" | "xxl" | "full"]: string;
+      [key in 'sm' | 'md' | 'lg' | 'xl' | 'xxl' | 'full']: string;
     };
     gap: {
       [key in
-        | "none"
-        | "xxs"
-        | "xs"
-        | "s"
-        | "sm"
-        | "md"
-        | "l"
-        | "lg"
-        | "x"
-        | "xl"
-        | "xxl"]: string;
+        | 'none'
+        | 'xxs'
+        | 'xs'
+        | 's'
+        | 'sm'
+        | 'md'
+        | 'l'
+        | 'lg'
+        | 'x'
+        | 'xl'
+        | 'xxl']: string;
     };
     fonts: {
-      [key in "primary" | "monospace"]: string;
+      [key in 'primary' | 'monospace']: string;
     };
     typography: {
       [key in
-        | "label"
-        | "chip"
-        | "username"
-        | "status"
-        | "tooltip"
-        | "category"
-        | "menu-button"
-        | "messages"
-        | "reply"
-        | "composition-file-upload-name"
-        | "composition-file-upload-size"
-        | "composition-typing-indicator"
-        | "conversation-channel-name"
-        | "conversation-start"
-        | "conversation-indicator"
-        | "system-message"
-        | "sidebar-title"
-        | "channel-topic"
-        | "settings-title"
-        | "settings-account-username"
-        | "settings-account-card-title"
-        | "settings-account-card-subtitle"
-        | "modal-title"
-        | "modal-description"
-        | "home-page-title"
-        | "legacy-settings-title"
-        | "small"
-        | "legacy-modal-title"
-        | "legacy-settings-section-title"
-        | "legacy-modal-title-2"
-        | "legacy-settings-description"]: {
+        | 'label'
+        | 'chip'
+        | 'username'
+        | 'status'
+        | 'tooltip'
+        | 'category'
+        | 'menu-button'
+        | 'messages'
+        | 'reply'
+        | 'composition-file-upload-name'
+        | 'composition-file-upload-size'
+        | 'composition-typing-indicator'
+        | 'conversation-channel-name'
+        | 'conversation-start'
+        | 'conversation-indicator'
+        | 'system-message'
+        | 'sidebar-title'
+        | 'channel-topic'
+        | 'settings-title'
+        | 'settings-account-username'
+        | 'settings-account-card-title'
+        | 'settings-account-card-subtitle'
+        | 'modal-title'
+        | 'modal-description'
+        | 'home-page-title'
+        | 'legacy-settings-title'
+        | 'small'
+        | 'legacy-modal-title'
+        | 'legacy-settings-section-title'
+        | 'legacy-modal-title-2'
+        | 'legacy-settings-description']: {
         [key in
-          | "margin"
-          | "fontWeight"
-          | "fontSize"
-          | "lineHeight"
-          | "textTransform"]?: number | string;
+          | 'margin'
+          | 'fontWeight'
+          | 'fontSize'
+          | 'lineHeight'
+          | 'textTransform']?: number | string;
       } & {
-        element?: "h1" | "h2" | "h3" | "h4" | "h5" | "span" | "div" | "label";
-        colour?: keyof DefaultTheme["colours"];
+        element?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'span' | 'div' | 'label';
+        colour?: keyof DefaultTheme['colours'];
       };
     };
     transitions: {
-      [key in "fast" | "medium"]: string;
+      [key in 'fast' | 'medium']: string;
     };
     effects: {
       blur: {
-        [key in "md"]: string;
+        [key in 'md']: string;
       };
       ripple: {
         hover: number;
@@ -193,23 +193,23 @@ declare module "solid-styled-components" {
     };
     layout: {
       width: {
-        [key in "channel-sidebar"]: string;
+        [key in 'channel-sidebar']: string;
       };
       height: {
         [key in
-          | "header"
-          | "tall-header"
-          | "message-box"
-          | "attachment-preview"]: string;
+          | 'header'
+          | 'tall-header'
+          | 'message-box'
+          | 'attachment-preview']: string;
       };
       attachments: {
-        [key in `${"min" | "max"}-${"width" | "height"}`]: string;
+        [key in `${'min' | 'max'}-${'width' | 'height'}`]: string;
       };
       emoji: {
-        [key in "small" | "medium" | "large"]: string;
+        [key in 'small' | 'medium' | 'large']: string;
       };
       zIndex: {
-        [key in "floating-bar" | "modal" | "floating-element"]: number;
+        [key in 'floating-bar' | 'modal' | 'floating-element']: number;
       };
     };
   }
diff --git a/packages/client/components/ui/styles.ts b/packages/client/components/ui/styles.ts
index fed29db17..46dea4530 100644
--- a/packages/client/components/ui/styles.ts
+++ b/packages/client/components/ui/styles.ts
@@ -1 +1 @@
-import "./styles.css";
+import './styles.css';
diff --git a/packages/client/components/ui/themes/darkTheme.ts b/packages/client/components/ui/themes/darkTheme.ts
index 5fc97454b..b6f7ce9cb 100644
--- a/packages/client/components/ui/themes/darkTheme.ts
+++ b/packages/client/components/ui/themes/darkTheme.ts
@@ -1,14 +1,12 @@
-import { DefaultTheme } from "solid-styled-components";
-
+import type { ColorGroup, Scheme } from '@material/material-color-utilities';
 import {
-  ColorGroup,
-  Hct,
-  Scheme,
-  TonalPalette,
   argbFromHex,
+  Hct,
   hexFromArgb,
   themeFromSourceColor,
-} from "@material/material-color-utilities";
+  TonalPalette,
+} from '@material/material-color-utilities';
+import type { DefaultTheme } from 'solid-styled-components';
 
 /**
  * Convert a scheme to usable hex colours
@@ -24,7 +22,7 @@ function schemeToHex(scheme: Scheme) {
       Object.getOwnPropertyDescriptors(Object.getPrototypeOf(scheme))
     ) as (keyof Scheme)[]
   )
-    .filter((key) => typeof scheme[key] === "number")
+    .filter((key) => typeof scheme[key] === 'number')
     .forEach((key) => {
       const colour = Hct.fromInt(scheme[key] as number);
       hexScheme[key] = hexFromArgb(colour.toInt());
@@ -48,7 +46,7 @@ function hexToRgb(v: string) {
 export const darkTheme: (
   accentColour?: string,
   darkMode?: boolean
-) => DefaultTheme = (accentColour = "#FF5733", darkMode = false) => {
+) => DefaultTheme = (accentColour = '#FF5733', darkMode = false) => {
   // const hex = "#d59ff5";
   // const hex = "#FF7F50";
   // const hex = "#B4CBAF"; // Green
@@ -57,60 +55,60 @@ export const darkTheme: (
   // const darkMode = false;
   const theme = themeFromSourceColor(argbFromHex(accentColour), [
     {
-      name: "success",
-      value: argbFromHex("#65E572"),
+      name: 'success',
+      value: argbFromHex('#65E572'),
       blend: true,
     },
     {
-      name: "warning",
-      value: argbFromHex("#FAA352"),
+      name: 'warning',
+      value: argbFromHex('#FAA352'),
       blend: true,
     },
     {
-      name: "error",
-      value: argbFromHex("#FF3322"),
+      name: 'error',
+      value: argbFromHex('#FF3322'),
       blend: true,
     },
   ]);
 
   const customColours = {
-    "status-online": {
-      color: "#3ABF7E",
-      onColor: "black",
+    'status-online': {
+      color: '#3ABF7E',
+      onColor: 'black',
     },
-    "status-idle": {
-      color: "#F39F00",
-      onColor: "black",
+    'status-idle': {
+      color: '#F39F00',
+      onColor: 'black',
     },
-    "status-focus": {
-      color: "#4799F0",
-      onColor: "black",
+    'status-focus': {
+      color: '#4799F0',
+      onColor: 'black',
     },
-    "status-busy": {
-      color: "#F84848",
-      onColor: "white",
+    'status-busy': {
+      color: '#F84848',
+      onColor: 'white',
     },
-    "status-invisible": {
-      color: "#A5A5A5",
-      onColor: "black",
+    'status-invisible': {
+      color: '#A5A5A5',
+      onColor: 'black',
     },
   } as Record<
     | `status-${
-        | "online"
-        | "idle"
-        | "focus"
-        | "busy"
-        | "streaming"
-        | "invisible"}`
-    | "success"
-    | "warning"
-    | "error",
+        | 'online'
+        | 'idle'
+        | 'focus'
+        | 'busy'
+        | 'streaming'
+        | 'invisible'}`
+    | 'success'
+    | 'warning'
+    | 'error',
     Record<keyof ColorGroup, string>
   >;
 
   for (const c of theme.customColors) {
     const output: Record<string, string> = {};
-    const source = c[darkMode ? "dark" : "light"] as unknown as Record<
+    const source = c[darkMode ? 'dark' : 'light'] as unknown as Record<
       string,
       number
     >;
@@ -124,7 +122,7 @@ export const darkTheme: (
     ] = output as Record<keyof ColorGroup, string>;
   }
 
-  const materialTheme = schemeToHex(theme.schemes[darkMode ? "dark" : "light"]);
+  const materialTheme = schemeToHex(theme.schemes[darkMode ? 'dark' : 'light']);
 
   function materialColour(base: keyof Scheme, tone?: number) {
     return tone
@@ -138,133 +136,133 @@ export const darkTheme: (
     darkMode,
     colours: {
       // Global
-      background: materialColour("background"),
-      foreground: materialColour("onBackground"),
+      background: materialColour('background'),
+      foreground: materialColour('onBackground'),
       // Component: Button
-      "component-btn-background-primary": materialColour("primary"),
-      "component-btn-foreground-primary": materialColour("onBackground", 98),
-      "component-btn-background-secondary": materialColour("surfaceVariant"),
-      "component-btn-foreground-secondary": materialColour(
-        "onSurfaceVariant",
+      'component-btn-background-primary': materialColour('primary'),
+      'component-btn-foreground-primary': materialColour('onBackground', 98),
+      'component-btn-background-secondary': materialColour('surfaceVariant'),
+      'component-btn-foreground-secondary': materialColour(
+        'onSurfaceVariant',
         30
       ),
-      "component-btn-foreground-plain": materialColour("onBackground"),
-      "component-btn-foreground-plain-secondary": materialColour(
-        "onBackground",
+      'component-btn-foreground-plain': materialColour('onBackground'),
+      'component-btn-foreground-plain-secondary': materialColour(
+        'onBackground',
         40
       ),
       // Component: Menu Button
-      "component-menubtn-default-background": "transparent",
-      "component-menubtn-default-foreground": materialColour(
-        "onSurfaceVariant",
+      'component-menubtn-default-background': 'transparent',
+      'component-menubtn-default-foreground': materialColour(
+        'onSurfaceVariant',
         55
       ),
-      "component-menubtn-selected-background": materialColour("surfaceVariant"),
-      "component-menubtn-selected-foreground": materialColour(
-        "onSurfaceVariant",
+      'component-menubtn-selected-background': materialColour('surfaceVariant'),
+      'component-menubtn-selected-foreground': materialColour(
+        'onSurfaceVariant',
         30
       ),
-      "component-menubtn-muted-background": "transparent",
-      "component-menubtn-muted-foreground": materialColour(
-        "onSurfaceVariant",
+      'component-menubtn-muted-background': 'transparent',
+      'component-menubtn-muted-foreground': materialColour(
+        'onSurfaceVariant',
         45
       ),
-      "component-menubtn-hover-background": materialColour("surfaceVariant"), // DEPRECATE
-      "component-menubtn-hover-foreground": materialColour(
+      'component-menubtn-hover-background': materialColour('surfaceVariant'), // DEPRECATE
+      'component-menubtn-hover-foreground': materialColour(
         // DEPRECATE
-        "onSurfaceVariant",
+        'onSurfaceVariant',
         25
       ),
       // Component: Input
-      "component-input-focus": materialColour("primary"),
-      "component-input-foreground": materialColour("onBackground"),
-      "component-input-background-primary": materialColour("background", 100),
-      "component-input-background-secondary": materialColour("background", 98),
-      "component-input-hover-primary": materialColour("background", 98), // DEPRECATE?
-      "component-input-hover-secondary": materialColour("background", 100), // DEPRECATE?
+      'component-input-focus': materialColour('primary'),
+      'component-input-foreground': materialColour('onBackground'),
+      'component-input-background-primary': materialColour('background', 100),
+      'component-input-background-secondary': materialColour('background', 98),
+      'component-input-hover-primary': materialColour('background', 98), // DEPRECATE?
+      'component-input-hover-secondary': materialColour('background', 100), // DEPRECATE?
       // Component: Chip
-      "component-chip-background": materialColour("secondary", 96),
+      'component-chip-background': materialColour('secondary', 96),
       // Component: Checkbox
-      "component-checkbox-background": materialColour("primary", 92),
-      "component-checkbox-foreground": materialColour("primary"),
-      "component-checkbox-foreground-check": materialColour("onPrimary"),
+      'component-checkbox-background': materialColour('primary', 92),
+      'component-checkbox-foreground': materialColour('primary'),
+      'component-checkbox-foreground-check': materialColour('onPrimary'),
       // Component: FAB
-      "component-fab-background": materialColour("primary"),
-      "component-fab-foreground": materialColour("primary", 90),
+      'component-fab-background': materialColour('primary'),
+      'component-fab-foreground': materialColour('primary', 90),
       // Component: Scrollbar
-      "component-scrollbar-background": "transparent",
-      "component-scrollbar-foreground": materialColour("primary", 85),
+      'component-scrollbar-background': 'transparent',
+      'component-scrollbar-foreground': materialColour('primary', 85),
       // Component: Category Button
-      "component-categorybtn-background": materialColour("background", 99),
-      "component-categorybtn-background-icon": materialColour("primary", 90),
-      "component-categorybtn-background-collapse": materialColour(
-        "background",
+      'component-categorybtn-background': materialColour('background', 99),
+      'component-categorybtn-background-icon': materialColour('primary', 90),
+      'component-categorybtn-background-collapse': materialColour(
+        'background',
         97
       ),
-      "component-categorybtn-background-hover": materialColour(
-        "background",
+      'component-categorybtn-background-hover': materialColour(
+        'background',
         100
       ),
-      "component-categorybtn-background-active": materialColour(
-        "background",
+      'component-categorybtn-background-active': materialColour(
+        'background',
         94
       ),
-      "component-categorybtn-foreground": materialColour("onBackground", 10),
-      "component-categorybtn-foreground-description": materialColour(
-        "onBackground",
+      'component-categorybtn-foreground': materialColour('onBackground', 10),
+      'component-categorybtn-foreground-description': materialColour(
+        'onBackground',
         30
       ),
       // Component: Modal
-      "component-modal-background": materialColour("secondary", 96),
-      "component-modal-foreground": materialColour("onBackground"),
+      'component-modal-background': materialColour('secondary', 96),
+      'component-modal-foreground': materialColour('onBackground'),
       // Component: Avatar (Fallback)
-      "component-avatar-fallback-background": materialColour(
-        "onBackground",
+      'component-avatar-fallback-background': materialColour(
+        'onBackground',
         94
       ),
-      "component-avatar-fallback-foreground": materialColour("onBackground"),
-      "component-avatar-fallback-contrast-background":
-        materialColour("primary"),
-      "component-avatar-fallback-contrast-foreground":
-        materialColour("onPrimary"),
+      'component-avatar-fallback-foreground': materialColour('onBackground'),
+      'component-avatar-fallback-contrast-background':
+        materialColour('primary'),
+      'component-avatar-fallback-contrast-foreground':
+        materialColour('onPrimary'),
       // Component: Context Menu
-      "component-context-menu-background": materialColour("surfaceVariant", 97),
-      "component-context-menu-foreground": materialColour("onSurface"),
-      "component-context-menu-item-hover-background": materialColour(
-        "surfaceVariant",
+      'component-context-menu-background': materialColour('surfaceVariant', 97),
+      'component-context-menu-foreground': materialColour('onSurface'),
+      'component-context-menu-item-hover-background': materialColour(
+        'surfaceVariant',
         92
       ),
-      "component-context-menu-divider": materialColour("onSurface", 92),
-      "component-context-menu-shadow": "#0004",
+      'component-context-menu-divider': materialColour('onSurface', 92),
+      'component-context-menu-shadow': '#0004',
       // Component: Key
-      "component-key-background": materialColour("secondary"),
-      "component-key-foreground": materialColour("onSecondary"),
+      'component-key-background': materialColour('secondary'),
+      'component-key-foreground': materialColour('onSecondary'),
       // Component: Combo Box
-      "component-combo-focus": materialColour("primary"),
-      "component-combo-foreground": materialColour("onBackground"),
-      "component-combo-background": materialColour("background", 100),
+      'component-combo-focus': materialColour('primary'),
+      'component-combo-foreground': materialColour('onBackground'),
+      'component-combo-background': materialColour('background', 100),
       // Component: Preloader
-      "preloader-foreground": materialColour("primary"),
+      'preloader-foreground': materialColour('primary'),
 
       // Sidebar
       // TODO: figure this out
       // works better for both dark and light theme but more muted:
-      "sidebar-channels-background": materialColour("onBackground", 94),
-      "sidebar-channels-foreground": materialColour("onPrimaryContainer"),
-      "sidebar-members-background": materialColour("onBackground", 94),
-      "sidebar-members-foreground": materialColour("onPrimaryContainer"),
-      "sidebar-header-background": materialColour("onBackground", 94),
-      "sidebar-header-foreground": materialColour("onPrimaryContainer"),
-      "sidebar-header-transparent-background": `rgba(${hexToRgb(
-        materialColour("onBackground", 94)
+      'sidebar-channels-background': materialColour('onBackground', 94),
+      'sidebar-channels-foreground': materialColour('onPrimaryContainer'),
+      'sidebar-members-background': materialColour('onBackground', 94),
+      'sidebar-members-foreground': materialColour('onPrimaryContainer'),
+      'sidebar-header-background': materialColour('onBackground', 94),
+      'sidebar-header-foreground': materialColour('onPrimaryContainer'),
+      'sidebar-header-transparent-background': `rgba(${hexToRgb(
+        materialColour('onBackground', 94)
       )}, 0.75)`,
-      "sidebar-header-with-image-text-background": `rgba(${hexToRgb(
-        materialColour("onBackground")
+      'sidebar-header-with-image-text-background': `rgba(${hexToRgb(
+        materialColour('onBackground')
       )}, 0.5)`,
-      "sidebar-header-with-image-text-foreground": materialColour("background"),
-      "sidebar-server-list-foreground": materialColour("onBackground", 80),
-      "sidebar-channels-category-foreground": materialColour(
-        "onSurfaceVariant",
+      'sidebar-header-with-image-text-foreground': materialColour('background'),
+      'sidebar-server-list-foreground': materialColour('onBackground', 80),
+      'sidebar-channels-category-foreground': materialColour(
+        'onSurfaceVariant',
         60
       ),
       // OR balls to the wall: (but dark mode gets fucked)
@@ -284,123 +282,123 @@ export const darkTheme: (
       // "sidebar-server-list-foreground": materialColour("onBackground", 80),
 
       // Messaging: Interface
-      "messaging-indicator-background": `rgba(${hexToRgb(
-        materialColour("background", 94)
+      'messaging-indicator-background': `rgba(${hexToRgb(
+        materialColour('background', 94)
       )}, 0.50)`,
-      "messaging-indicator-foreground": materialColour("onBackground"),
-      "messaging-indicator-reply-enabled": materialColour("primary"),
-      "messaging-indicator-reply-disabled": materialColour("onBackground", 60),
-      "messaging-upload-file-background": materialColour("surfaceVariant", 80),
-      "messaging-upload-file-foreground": materialColour("onBackground", 98),
-      "messaging-upload-divider": materialColour("primary", 85),
-      "messaging-message-box-background": materialColour("onBackground", 94),
-      "messaging-message-box-foreground": materialColour("onPrimaryContainer"),
-      "messaging-message-mentioned-background": materialColour(
-        "surfaceVariant",
+      'messaging-indicator-foreground': materialColour('onBackground'),
+      'messaging-indicator-reply-enabled': materialColour('primary'),
+      'messaging-indicator-reply-disabled': materialColour('onBackground', 60),
+      'messaging-upload-file-background': materialColour('surfaceVariant', 80),
+      'messaging-upload-file-foreground': materialColour('onBackground', 98),
+      'messaging-upload-divider': materialColour('primary', 85),
+      'messaging-message-box-background': materialColour('onBackground', 94),
+      'messaging-message-box-foreground': materialColour('onPrimaryContainer'),
+      'messaging-message-mentioned-background': materialColour(
+        'surfaceVariant',
         97
       ),
       // "messaging-message-box-background": materialColour("primaryContainer"),
       // "messaging-message-box-foreground": materialColour("onPrimaryContainer"),
 
       // Messaging: Components
-      "messaging-component-blocked-message-background": "transparent",
-      "messaging-component-blocked-message-foreground": materialColour(
-        "onBackground",
+      'messaging-component-blocked-message-background': 'transparent',
+      'messaging-component-blocked-message-foreground': materialColour(
+        'onBackground',
         60
       ),
-      "messaging-component-code-block-background":
-        materialColour("surfaceVariant"),
-      "messaging-component-code-block-foreground":
-        materialColour("onSurfaceVariant"),
-      "messaging-component-code-block-language-background":
-        materialColour("primary"),
-      "messaging-component-code-block-language-foreground":
-        materialColour("onPrimary"),
-      "messaging-component-blockquote-background":
-        materialColour("surfaceVariant"),
-      "messaging-component-blockquote-foreground":
-        materialColour("onSurfaceVariant"),
-      "messaging-component-text-embed-background":
-        materialColour("surfaceVariant"),
-      "messaging-component-text-embed-foreground":
-        materialColour("onSurfaceVariant"),
-      "messaging-component-attachment-background":
-        materialColour("surfaceVariant"),
-      "messaging-component-attachment-foreground":
-        materialColour("onSurfaceVariant"),
-      "messaging-component-message-divider-background": materialColour(
-        "onSurfaceVariant",
+      'messaging-component-code-block-background':
+        materialColour('surfaceVariant'),
+      'messaging-component-code-block-foreground':
+        materialColour('onSurfaceVariant'),
+      'messaging-component-code-block-language-background':
+        materialColour('primary'),
+      'messaging-component-code-block-language-foreground':
+        materialColour('onPrimary'),
+      'messaging-component-blockquote-background':
+        materialColour('surfaceVariant'),
+      'messaging-component-blockquote-foreground':
+        materialColour('onSurfaceVariant'),
+      'messaging-component-text-embed-background':
+        materialColour('surfaceVariant'),
+      'messaging-component-text-embed-foreground':
+        materialColour('onSurfaceVariant'),
+      'messaging-component-attachment-background':
+        materialColour('surfaceVariant'),
+      'messaging-component-attachment-foreground':
+        materialColour('onSurfaceVariant'),
+      'messaging-component-message-divider-background': materialColour(
+        'onSurfaceVariant',
         80
       ),
-      "messaging-component-message-divider-foreground": materialColour(
-        "onSurfaceVariant",
+      'messaging-component-message-divider-foreground': materialColour(
+        'onSurfaceVariant',
         60
       ),
-      "messaging-component-message-divider-unread-background":
-        materialColour("primary"),
-      "messaging-component-message-divider-unread-foreground":
-        materialColour("onPrimary"),
-      "messaging-component-reaction-background": materialColour(
-        "onBackground",
+      'messaging-component-message-divider-unread-background':
+        materialColour('primary'),
+      'messaging-component-message-divider-unread-foreground':
+        materialColour('onPrimary'),
+      'messaging-component-reaction-background': materialColour(
+        'onBackground',
         97
       ),
-      "messaging-component-reaction-foreground": materialColour("onBackground"),
-      "messaging-component-reaction-selected-background":
-        materialColour("primaryContainer"),
-      "messaging-component-reaction-selected-foreground":
-        materialColour("onPrimaryContainer"),
-      "messaging-component-mention-background":
-        materialColour("surfaceVariant"),
-      "messaging-component-mention-foreground":
-        materialColour("onSurfaceVariant"),
+      'messaging-component-reaction-foreground': materialColour('onBackground'),
+      'messaging-component-reaction-selected-background':
+        materialColour('primaryContainer'),
+      'messaging-component-reaction-selected-foreground':
+        materialColour('onPrimaryContainer'),
+      'messaging-component-mention-background':
+        materialColour('surfaceVariant'),
+      'messaging-component-mention-foreground':
+        materialColour('onSurfaceVariant'),
 
       // Settings
-      "settings-background": materialColour("secondary", 96),
-      "settings-foreground": materialColour("onSecondaryContainer"),
-      "settings-content-background": materialColour("secondary", 92),
-      "settings-content-foreground": materialColour("onSecondary", 20),
-      "settings-content-scroll-thumb": materialColour("secondary", 70),
-      "settings-close-anchor": materialColour("primary"),
-      "settings-close-anchor-hover": materialColour("onPrimary"),
-      "settings-sidebar-category": materialColour("primary"),
-      "settings-sidebar-foreground": materialColour("onSecondary", 20),
-      "settings-sidebar-button-hover": materialColour("secondary", 90),
-      "settings-sidebar-button-active": materialColour("secondary", 82),
+      'settings-background': materialColour('secondary', 96),
+      'settings-foreground': materialColour('onSecondaryContainer'),
+      'settings-content-background': materialColour('secondary', 92),
+      'settings-content-foreground': materialColour('onSecondary', 20),
+      'settings-content-scroll-thumb': materialColour('secondary', 70),
+      'settings-close-anchor': materialColour('primary'),
+      'settings-close-anchor-hover': materialColour('onPrimary'),
+      'settings-sidebar-category': materialColour('primary'),
+      'settings-sidebar-foreground': materialColour('onSecondary', 20),
+      'settings-sidebar-button-hover': materialColour('secondary', 90),
+      'settings-sidebar-button-active': materialColour('secondary', 82),
       // Temporary Colours
-      "temp-1": materialColour("secondary", 85),
+      'temp-1': materialColour('secondary', 85),
     },
     customColours,
     // TODO: deprecate, provide hexToRgb utility instead
     rgb: {
-      header: "54,54,54",
-      "typing-indicator": "30,30,30",
+      header: '54,54,54',
+      'typing-indicator': '30,30,30',
     },
     breakpoints: {
-      sm: "640px",
-      md: "768px",
-      lg: "1024px",
-      xl: "1280px",
+      sm: '640px',
+      md: '768px',
+      lg: '1024px',
+      xl: '1280px',
     },
     borderRadius: {
-      sm: "2px",
-      md: "6px",
-      lg: "12px",
-      xl: "16px",
-      xxl: "28px",
-      full: "100%",
+      sm: '2px',
+      md: '6px',
+      lg: '12px',
+      xl: '16px',
+      xxl: '28px',
+      full: '100%',
     },
     gap: {
-      none: "0",
-      xxs: "1px",
-      xs: "2px",
-      s: "6px",
-      sm: "4px",
-      md: "8px",
-      l: "12px",
-      lg: "15px",
-      x: "28px",
-      xl: "32px",
-      xxl: "64px",
+      none: '0',
+      xxs: '1px',
+      xs: '2px',
+      s: '6px',
+      sm: '4px',
+      md: '8px',
+      l: '12px',
+      lg: '15px',
+      x: '28px',
+      xl: '32px',
+      xxl: '64px',
     },
     fonts: {
       primary: '"Inter", sans-serif',
@@ -409,201 +407,201 @@ export const darkTheme: (
     typography: {
       // Form elements
       label: {
-        textTransform: "capitalize",
+        textTransform: 'capitalize',
       },
       // Common UI elements
       chip: {
         fontWeight: 500,
-        fontSize: "12px",
+        fontSize: '12px',
       },
       username: {
         fontWeight: 600,
       },
       status: {
-        fontSize: "11px",
+        fontSize: '11px',
         fontWeight: 400,
       },
       tooltip: {
         fontWeight: 600,
-        fontSize: "13px",
+        fontSize: '13px',
       },
       category: {
         fontWeight: 600,
-        fontSize: "0.7rem",
+        fontSize: '0.7rem',
       },
-      "menu-button": {
+      'menu-button': {
         fontWeight: 600,
-        fontSize: "0.90625rem",
+        fontSize: '0.90625rem',
       },
-      "sidebar-title": {
+      'sidebar-title': {
         margin: 0,
-        element: "h1",
+        element: 'h1',
         fontWeight: 600,
-        fontSize: "1.2rem",
+        fontSize: '1.2rem',
       },
-      "channel-topic": {
+      'channel-topic': {
         fontWeight: 400,
-        fontSize: "0.8em",
+        fontSize: '0.8em',
       },
       // Messaging specific
       messages: {
-        fontSize: "14px",
+        fontSize: '14px',
         fontWeight: 400,
       },
       reply: {
-        fontSize: "0.8rem",
+        fontSize: '0.8rem',
       },
-      "composition-file-upload-name": {
-        fontSize: "0.8em",
+      'composition-file-upload-name': {
+        fontSize: '0.8em',
       },
-      "composition-file-upload-size": {
-        fontSize: "0.6em",
+      'composition-file-upload-size': {
+        fontSize: '0.6em',
       },
-      "composition-typing-indicator": {
-        element: "div",
-        fontSize: "13px",
+      'composition-typing-indicator': {
+        element: 'div',
+        fontSize: '13px',
       },
-      "conversation-channel-name": {
-        element: "h1",
-        fontSize: "23px",
-        margin: "0 0 8px 0",
+      'conversation-channel-name': {
+        element: 'h1',
+        fontSize: '23px',
+        margin: '0 0 8px 0',
       },
-      "conversation-start": {
-        element: "h4",
+      'conversation-start': {
+        element: 'h4',
         fontWeight: 400,
         margin: 0,
-        fontSize: "14px",
+        fontSize: '14px',
       },
-      "conversation-indicator": {
-        fontSize: "12px",
+      'conversation-indicator': {
+        fontSize: '12px',
         fontWeight: 600,
       },
-      "system-message": {
+      'system-message': {
         fontWeight: 700,
       },
       // Settings
-      "settings-title": {
-        element: "h1",
+      'settings-title': {
+        element: 'h1',
         margin: 0,
         fontWeight: 500,
-        fontSize: "1.75rem",
+        fontSize: '1.75rem',
       },
-      "settings-account-username": {
-        fontSize: "20px",
+      'settings-account-username': {
+        fontSize: '20px',
         fontWeight: 600,
       },
-      "settings-account-card-title": {
+      'settings-account-card-title': {
         fontWeight: 600,
       },
-      "settings-account-card-subtitle": {
-        fontSize: "12px",
+      'settings-account-card-subtitle': {
+        fontSize: '12px',
       },
       // Modal
-      "modal-title": {
-        element: "h2",
+      'modal-title': {
+        element: 'h2',
         margin: 0,
         fontWeight: 700,
-        fontSize: "1.2rem",
+        fontSize: '1.2rem',
       },
-      "modal-description": {
-        element: "h2",
+      'modal-description': {
+        element: 'h2',
         margin: 0,
         fontWeight: 500,
-        fontSize: "0.9rem",
+        fontSize: '0.9rem',
       },
       // Home
-      "home-page-title": {
-        element: "h1",
+      'home-page-title': {
+        element: 'h1',
         margin: 0,
-        lineHeight: "1rem",
+        lineHeight: '1rem',
         fontWeight: 600,
-        fontSize: "1.4rem",
+        fontSize: '1.4rem',
       },
       // Legacy
-      "legacy-settings-title": {
-        element: "h1",
+      'legacy-settings-title': {
+        element: 'h1',
         margin: 0,
-        lineHeight: "1rem",
+        lineHeight: '1rem',
         fontWeight: 600,
-        fontSize: "1.2rem",
+        fontSize: '1.2rem',
       },
       small: {
-        fontSize: "0.7rem",
+        fontSize: '0.7rem',
       },
-      "legacy-modal-title": {
-        element: "h2",
+      'legacy-modal-title': {
+        element: 'h2',
         margin: 0,
         fontWeight: 700,
-        fontSize: "0.9375rem",
+        fontSize: '0.9375rem',
       },
-      "legacy-settings-section-title": {
-        element: "h3",
+      'legacy-settings-section-title': {
+        element: 'h3',
         margin: 0,
         fontWeight: 700,
-        fontSize: "0.75rem",
+        fontSize: '0.75rem',
       },
-      "legacy-modal-title-2": {
-        element: "h4",
+      'legacy-modal-title-2': {
+        element: 'h4',
         margin: 0,
         fontWeight: 500,
-        fontSize: "0.8125rem",
+        fontSize: '0.8125rem',
       },
-      "legacy-settings-description": {
-        element: "span",
+      'legacy-settings-description': {
+        element: 'span',
         margin: 0,
         fontWeight: 500,
-        fontSize: "0.8rem",
+        fontSize: '0.8rem',
       },
     },
     transitions: {
-      fast: ".1s ease-in-out",
-      medium: ".2s ease",
+      fast: '.1s ease-in-out',
+      medium: '.2s ease',
     },
     effects: {
       blur: {
-        md: "blur(20px)",
+        md: 'blur(20px)',
       },
       ripple: {
         hover: 0.05,
       },
       invert: {
-        black: darkMode ? "invert(100%)" : "invert(0%)",
-        white: darkMode ? "invert(0%)" : "invert(100%)",
+        black: darkMode ? 'invert(100%)' : 'invert(0%)',
+        white: darkMode ? 'invert(0%)' : 'invert(100%)',
       },
-      muted: "brightness(0)", // DEPRECATE
-      hover: "brightness(0)", // DEPRECATE
-      active: "brightness(0)", // DEPRECATE
+      muted: 'brightness(0)', // DEPRECATE
+      hover: 'brightness(0)', // DEPRECATE
+      active: 'brightness(0)', // DEPRECATE
       // muted: "brightness(0.5) saturate(0.75)",
       // hover: "brightness(1.1)",
       // active: "brightness(0.9)",
-      spoiler: "brightness(0.2) contrast(0.8) blur(24px)",
+      spoiler: 'brightness(0.2) contrast(0.8) blur(24px)',
     },
     layout: {
       width: {
         // "channel-sidebar": "232px", (without margins)
-        "channel-sidebar": "248px",
+        'channel-sidebar': '248px',
       },
       height: {
-        header: "48px",
-        "tall-header": "120px",
-        "message-box": "48px",
-        "attachment-preview": "100px",
+        header: '48px',
+        'tall-header': '120px',
+        'message-box': '48px',
+        'attachment-preview': '100px',
       },
       attachments: {
-        "min-width": "240px",
-        "max-width": "420px",
-        "min-height": "120px",
-        "max-height": "420px",
+        'min-width': '240px',
+        'max-width': '420px',
+        'min-height': '120px',
+        'max-height': '420px',
       },
       emoji: {
-        small: "1.4em",
-        medium: "48px",
-        large: "96px",
+        small: '1.4em',
+        medium: '48px',
+        large: '96px',
       },
       zIndex: {
-        "floating-bar": 20,
+        'floating-bar': 20,
         modal: 50,
-        "floating-element": 100,
+        'floating-element': 100,
       },
     },
   };
diff --git a/packages/client/package.json b/packages/client/package.json
index f0d0bddf6..ae390ccff 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -16,97 +16,94 @@
     "build-storybook": "storybook build"
   },
   "devDependencies": {
-    "@chromatic-com/storybook": "^1.5.0",
-    "@pandacss/dev": "^0.35.0",
-    "@solid-devtools/transform": "^0.10.4",
-    "@solidjs/testing-library": "^0.8.6",
-    "@storybook/addon-essentials": "8.2.0-alpha.5",
-    "@storybook/addon-interactions": "8.2.0-alpha.5",
-    "@storybook/addon-links": "8.2.0-alpha.5",
-    "@storybook/blocks": "8.2.0-alpha.5",
-    "@storybook/html": "^8.1.6",
+    "@chromatic-com/storybook": "^2.0.2",
+    "@pandacss/dev": "^0.46.1",
+    "@solidjs/testing-library": "^0.8.10",
+    "@storybook/addon-essentials": "8.3.5",
+    "@storybook/addon-interactions": "8.3.5",
+    "@storybook/addon-links": "8.3.5",
+    "@storybook/blocks": "8.3.5",
+    "@storybook/html": "^8.3.5",
     "@storybook/testing-library": "^0.2.2",
-    "@testing-library/jest-dom": "^6.4.2",
+    "@testing-library/jest-dom": "^6.5.0",
     "@types/hast": "^3.0.4",
     "@types/lodash.defaultsdeep": "^4.6.9",
     "@types/lodash.isequal": "^4.5.8",
-    "@types/unist": "^3.0.2",
-    "@vitest/coverage-v8": "^1.6.0",
+    "@types/unist": "^3.0.3",
+    "@vitest/coverage-v8": "^2.1.2",
     "babel-plugin-codegen": "^4.1.5",
-    "jsdom": "^24.0.0",
+    "jsdom": "^25.0.1",
     "lnk": "^1.1.0",
-    "rehype-stringify": "^10.0.0",
+    "rehype-stringify": "^10.0.1",
     "revolt.js": "workspace:^",
-    "storybook": "8.2.0-alpha.5",
-    "storybook-solidjs": "^1.0.0-beta.2",
-    "storybook-solidjs-vite": "^1.0.0-beta.2",
-    "typescript": "^5.4.2",
-    "vite": "^5.1.6",
-    "vite-plugin-inspect": "^0.8.3",
-    "vite-plugin-pwa": "^0.19.4",
+    "solid-devtools": "^0.30.1",
+    "solid-motionone": "^1.0.2",
+    "storybook": "8.3.5",
+    "storybook-solidjs": "1.0.0-beta.2",
+    "storybook-solidjs-vite": "1.0.0-beta.2",
+    "typescript": "^5.6.3",
+    "vite": "^5.4.8",
+    "vite-plugin-inspect": "^0.8.7",
+    "vite-plugin-pwa": "^0.20.5",
     "vite-plugin-solid": "^2.10.2",
-    "vite-plugin-solid-svg": "^0.8.0",
-    "vitest": "^1.4.0"
+    "vite-plugin-solid-svg": "^0.8.1",
+    "vitest": "^2.1.2"
   },
   "dependencies": {
-    "@floating-ui/dom": "^1.6.3",
-    "@fontsource/inter": "^5.0.17",
-    "@fontsource/jetbrains-mono": "^5.0.19",
-    "@fontsource/open-sans": "^5.0.27",
+    "@floating-ui/dom": "^1.6.11",
+    "@fontsource/inter": "^5.1.0",
+    "@fontsource/jetbrains-mono": "^5.1.1",
+    "@fontsource/open-sans": "^5.1.0",
     "@material-design-icons/svg": "^0.14.13",
-    "@material/material-color-utilities": "^0.2.7",
+    "@material/material-color-utilities": "^0.3.0",
     "@minht11/solid-virtual-container": "^0.2.1",
-    "@motionone/solid": "^10.16.4",
-    "@sentry/browser": "^7.107.0",
-    "@sentry/tracing": "^7.107.0",
+    "@sentry/browser": "^8.33.1",
+    "@sentry/tracing": "^7.114.0",
     "@solid-aria/button": "^0.1.3",
-    "@solid-devtools/debugger": "^0.23.3",
-    "@solid-devtools/overlay": "^0.29.3",
-    "@solid-primitives/i18n": "^1.1.1",
+    "@solid-primitives/i18n": "^2.1.1",
     "@solid-primitives/keyed": "^1.2.2",
-    "@solid-primitives/map": "^0.4.11",
-    "@solidjs/router": "^0.13.0",
-    "@tanstack/solid-query": "^5.48.0",
-    "@tauri-apps/api": "^1.5.3",
+    "@solid-primitives/map": "^0.4.13",
+    "@solidjs/router": "^0.14.7",
+    "@tanstack/solid-query": "^5.59.0",
+    "@tauri-apps/api": "^2.0.2",
     "@thisbeyond/solid-dnd": "^0.7.5",
     "color-rgba": "^3.0.0",
     "comma-separated-tokens": "^2.0.3",
-    "dayjs": "^1.11.10",
+    "dayjs": "^1.11.13",
     "detect-browser": "^5.3.0",
-    "emoji-regex": "^10.3.0",
+    "emoji-regex": "^10.4.0",
     "fast-deep-equal": "^3.1.3",
-    "hast": "^1.0.0",
     "json-stringify-deterministic": "^1.0.12",
-    "katex": "^0.16.9",
+    "katex": "^0.16.11",
     "localforage": "^1.10.0",
     "lodash.defaultsdeep": "^4.6.1",
     "lodash.isequal": "^4.5.0",
-    "mdast-util-to-hast": "^12.2.4",
-    "property-information": "^6.2.0",
+    "mdast-util-to-hast": "^13.2.0",
+    "property-information": "^6.5.0",
     "rehype-highlight": "^7.0.0",
-    "rehype-katex": "^7.0.0",
+    "rehype-katex": "^7.0.1",
     "rehype-prism": "^2.3.2",
     "remark-breaks": "^4.0.0",
     "remark-gfm": "^4.0.0",
     "remark-math": "^6.0.0",
     "remark-parse": "^11.0.0",
-    "remark-rehype": "^11.1.0",
+    "remark-rehype": "^11.1.1",
     "revolt.js": "workspace:^",
-    "shiki": "^1.9.0",
+    "shiki": "^1.22.0",
     "solid-dnd-directive": "^0.2.0",
     "solid-floating-ui": "^0.3.1",
     "solid-hcaptcha": "^0.4.0",
     "solid-icons": "^1.1.0",
-    "solid-js": "^1.8.15",
+    "solid-js": "^1.9.2",
     "solid-qr-code": "^0.1.11",
-    "solid-styled-components": "workspace:^0.28.5",
+    "solid-styled-components": "workspace:^",
     "space-separated-tokens": "^2.0.2",
-    "style-to-object": "^0.4.4",
+    "style-to-object": "^1.0.8",
     "ulid": "^2.3.0",
-    "unified": "^11.0.4",
+    "unified": "^11.0.5",
     "unist-util-visit": "^5.0.0",
-    "vfile": "^6.0.1",
-    "workbox-precaching": "^7.0.0"
+    "vfile": "^6.0.3",
+    "workbox-precaching": "^7.1.0"
   },
   "private": true
 }
diff --git a/packages/client/panda.config.ts b/packages/client/panda.config.ts
index 1f368a9d8..c8608593f 100644
--- a/packages/client/panda.config.ts
+++ b/packages/client/panda.config.ts
@@ -1,11 +1,11 @@
-import { defineConfig } from "@pandacss/dev";
+import { defineConfig } from '@pandacss/dev';
 
 export default defineConfig({
   // Whether to use css reset
   preflight: true,
 
   // Where to look for your css declarations
-  include: ["./src/**/*.{js,jsx,ts,tsx}", "./components/**/*.{js,jsx,ts,tsx}"],
+  include: ['./src/**/*.{js,jsx,ts,tsx}', './components/**/*.{js,jsx,ts,tsx}'],
 
   // Files to exclude
   exclude: [],
@@ -16,10 +16,10 @@ export default defineConfig({
   },
 
   // The output directory for your css system
-  outdir: "styled-system",
+  outdir: 'styled-system',
 
   // Enable jsx code gen
-  jsxFramework: "solid",
+  jsxFramework: 'solid',
 
   // Use template style
   // syntax: "template-literal",
diff --git a/packages/client/src/Auth.tsx b/packages/client/src/Auth.tsx
index 81004104c..034eb6d40 100644
--- a/packages/client/src/Auth.tsx
+++ b/packages/client/src/Auth.tsx
@@ -1,4 +1,4 @@
-import { AuthPage } from "@revolt/auth";
+import { AuthPage } from '@revolt/auth';
 
 /**
  * Re-export to take advantage of lazy-loaded components
diff --git a/packages/client/src/Interface.tsx b/packages/client/src/Interface.tsx
index 02e456814..4236732e5 100644
--- a/packages/client/src/Interface.tsx
+++ b/packages/client/src/Interface.tsx
@@ -1,18 +1,17 @@
-import { Component, JSX, Match, Switch, onCleanup, onMount } from "solid-js";
+import { ChannelContextMenu, ServerContextMenu } from '@revolt/app';
+import { clientController } from '@revolt/client';
+import { State, TransitionType } from '@revolt/client/Controller';
+import { KeybindAction } from '@revolt/keybinds';
+import { modalController } from '@revolt/modal';
+import { Navigate, useBeforeLeave } from '@revolt/routing';
+import { state } from '@revolt/state';
+import { Button, Preloader, styled } from '@revolt/ui';
+import { useKeybindActions } from '@revolt/ui/components/context/Keybinds';
+import { Server } from 'revolt.js';
+import type { JSX } from 'solid-js';
+import { Component, Match, onCleanup, onMount, Switch } from 'solid-js';
 
-import { Server } from "revolt.js";
-
-import { ChannelContextMenu, ServerContextMenu } from "@revolt/app";
-import { clientController } from "@revolt/client";
-import { State, TransitionType } from "@revolt/client/Controller";
-import { KeybindAction } from "@revolt/keybinds";
-import { modalController } from "@revolt/modal";
-import { Navigate, useBeforeLeave } from "@revolt/routing";
-import { state } from "@revolt/state";
-import { Button, Preloader, styled } from "@revolt/ui";
-import { useKeybindActions } from "@revolt/ui/components/context/Keybinds";
-
-import { Sidebar } from "./interface/Sidebar";
+import { Sidebar } from './interface/Sidebar';
 
 /**
  * Application layout
@@ -22,13 +21,13 @@ const Interface = (props: { children: JSX.Element }) => {
 
   useBeforeLeave((e) => {
     if (!e.defaultPrevented) {
-      if (e.to === "/settings") {
+      if (e.to === '/settings') {
         e.preventDefault();
         modalController.push({
-          type: "settings",
-          config: "user",
+          type: 'settings',
+          config: 'user',
         });
-      } else if (typeof e.to === "string") {
+      } else if (typeof e.to === 'string') {
         state.layout.setLastActivePath(e.to);
       }
     }
@@ -49,20 +48,20 @@ const Interface = (props: { children: JSX.Element }) => {
   });
 
   return (
-    <Switch fallback={<Preloader grow type="spinner" />}>
+    <Switch fallback={<Preloader grow type='spinner' />}>
       <Match when={!clientController.isLoggedIn()}>
-        <Navigate href="/login" />
+        <Navigate href='/login' />
       </Match>
       <Match when={clientController.lifecycle.loadedOnce()}>
         <div
           style={{
-            display: "flex",
-            "flex-direction": "column",
-            height: "100%",
+            display: 'flex',
+            'flex-direction': 'column',
+            height: '100%',
           }}
         >
           <Notice>
-            ⚠️ This is beta software, things will break! State:{" "}
+            ⚠️ This is beta software, things will break! State:{' '}
             <Switch>
               <Match
                 when={clientController.lifecycle.state() === State.Connecting}
@@ -77,7 +76,7 @@ const Interface = (props: { children: JSX.Element }) => {
               <Match
                 when={clientController.lifecycle.state() === State.Disconnected}
               >
-                Disconnected{" "}
+                Disconnected{' '}
                 <a
                   onClick={() =>
                     clientController.lifecycle.transition({
@@ -101,9 +100,9 @@ const Interface = (props: { children: JSX.Element }) => {
             </Switch>
           </Notice>
           <Layout
-            style={{ "flex-grow": 1, "min-height": 0 }}
+            style={{ 'flex-grow': 1, 'min-height': 0 }}
             onDragOver={(e) => {
-              if (e.dataTransfer) e.dataTransfer.dropEffect = "none";
+              if (e.dataTransfer) e.dataTransfer.dropEffect = 'none';
             }}
             onDrop={(e) => e.preventDefault()}
           >
@@ -137,15 +136,15 @@ const Notice = styled.div`
     ${(props) => props.theme!.gap.md};
   padding: ${(props) => props.theme!.gap.md};
   background: ${(props) =>
-    props.theme!.colours["messaging-message-box-background"]};
-  color: ${(props) => props.theme!.colours["messaging-message-box-foreground"]};
+    props.theme!.colours['messaging-message-box-background']};
+  color: ${(props) => props.theme!.colours['messaging-message-box-foreground']};
   border-radius: ${(props) => props.theme!.borderRadius.md};
 `;
 
 /**
  * Parent container
  */
-const Layout = styled("div", "Layout")`
+const Layout = styled('div', 'Layout')`
   display: flex;
   height: 100%;
 `;
diff --git a/packages/client/src/globals.d.ts b/packages/client/src/globals.d.ts
index e62b23cb3..66e614323 100644
--- a/packages/client/src/globals.d.ts
+++ b/packages/client/src/globals.d.ts
@@ -1,7 +1,138 @@
-export { };
+import type { Placement } from '@floating-ui/dom';
+import type { AutoCompleteState } from '@revolt/ui/directives';
+import type { Channel, Client, ServerMember, User } from 'revolt.js';
+import { type SolidOptions } from 'solid-dnd-directive';
+import type { Component } from 'solid-js';
+
+export {};
 
 declare global {
   interface Window {
-    __TAURI__: Object;
+    __TAURI__: object;
+  }
+}
+
+declare module 'solid-js' {
+  namespace JSX {
+    interface Directives {
+      dndzone: SolidOptions;
+      ripple:
+        | true
+        | {
+            enable: boolean;
+
+            /**
+             * Pass-through class names
+             */
+            class?: string;
+          };
+      scrollable:
+        | true
+        | {
+            /**
+             * Scroll direction
+             */
+            direction?: 'x' | 'y';
+
+            /**
+             * Offset to apply to top of scroll container
+             */
+            offsetTop?: number;
+
+            /**
+             * Whether to only show scrollbar on hover
+             */
+            showOnHover?: boolean;
+
+            /**
+             * Pass-through class names
+             */
+            class?: string;
+
+            /**
+             * Set custom foreground on track
+             */
+            foreground?: string;
+
+            /**
+             * Set custom background on track
+             */
+            background?: string;
+          };
+      invisibleScrollable:
+        | true
+        | {
+            /**
+             * Scroll direction
+             */
+            direction?: 'x' | 'y';
+
+            /**
+             * Pass-through class names
+             */
+            class?: string;
+          };
+      floating: {
+        tooltip?: {
+          /**
+           * Where the tooltip should be placed
+           */
+          placement: Placement;
+        } & (
+          | {
+              /**
+               * Tooltip content
+               */
+              content: Component;
+
+              /**
+               * Aria label fallback
+               */
+              aria: string;
+            }
+          | {
+              /**
+               * Tooltip content
+               */
+              content: string | undefined;
+
+              /**
+               * Content is used as aria fallback
+               */
+              aria?: undefined;
+            }
+        );
+        userCard?: {
+          /**
+           * User to display
+           */
+          user: User;
+
+          /**
+           * Member to display
+           */
+          member?: ServerMember;
+        };
+        contextMenu?: Component;
+        autoComplete?: {
+          state: Accessor<AutoCompleteState>;
+          selection: Accessor<number>;
+          select: (index: number) => void;
+        };
+      };
+      autoComplete:
+        | true
+        | {
+            client?: Client;
+            onKeyDown?: (
+              event: KeyboardEvent & { currentTarget: HTMLTextAreaElement }
+            ) => void;
+            searchSpace?: {
+              users?: User[];
+              members?: ServerMember[];
+              channels?: Channel[];
+            };
+          };
+    }
   }
-}
\ No newline at end of file
+}
diff --git a/packages/client/src/index.tsx b/packages/client/src/index.tsx
index 10141ad82..f5f945b0e 100644
--- a/packages/client/src/index.tsx
+++ b/packages/client/src/index.tsx
@@ -1,55 +1,68 @@
 /**
  * Configure contexts and render App
  */
-import { JSX, Show, createEffect, createSignal, on, onMount } from "solid-js";
-import { createStore } from "solid-js/store";
-import { render } from "solid-js/web";
-
-import { attachDevtoolsOverlay } from "@solid-devtools/overlay";
-import { Navigate, Route, Router } from "@solidjs/router";
-import { QueryClient, QueryClientProvider } from "@tanstack/solid-query";
-import { appWindow } from "@tauri-apps/api/window";
+/* @refresh reload */
+import '@revolt/ui/styles';
+import './index.css';
+import './sentry';
+import 'solid-devtools';
 
-import FlowCheck from "@revolt/auth/src/flows/FlowCheck";
-import FlowConfirmReset from "@revolt/auth/src/flows/FlowConfirmReset";
-import FlowCreate from "@revolt/auth/src/flows/FlowCreate";
-import FlowHome from "@revolt/auth/src/flows/FlowHome";
-import FlowLogin from "@revolt/auth/src/flows/FlowLogin";
-import FlowResend from "@revolt/auth/src/flows/FlowResend";
-import FlowReset from "@revolt/auth/src/flows/FlowReset";
-import FlowVerify from "@revolt/auth/src/flows/FlowVerify";
-import i18n, { I18nContext } from "@revolt/i18n";
-import { ModalRenderer, modalController } from "@revolt/modal";
-import { Hydrate, state } from "@revolt/state";
+import FlowCheck from '@revolt/auth/src/flows/FlowCheck';
+import FlowConfirmReset from '@revolt/auth/src/flows/FlowConfirmReset';
+import FlowCreate from '@revolt/auth/src/flows/FlowCreate';
+import FlowHome from '@revolt/auth/src/flows/FlowHome';
+import FlowLogin from '@revolt/auth/src/flows/FlowLogin';
+import FlowResend from '@revolt/auth/src/flows/FlowResend';
+import FlowReset from '@revolt/auth/src/flows/FlowReset';
+import FlowVerify from '@revolt/auth/src/flows/FlowVerify';
+import {
+  dict,
+  fetchLanguage,
+  I18nContext,
+  language,
+  setLanguage,
+} from '@revolt/i18n';
+import { modalController, ModalRenderer } from '@revolt/modal';
+import { Hydrate, state } from '@revolt/state';
 import {
   ApplyGlobalStyles,
+  darkTheme,
   FloatingManager,
   KeybindsProvider,
   Masks,
   ProvideDirectives,
   ThemeProvider,
   Titlebar,
-  darkTheme,
-} from "@revolt/ui";
-
-/* @refresh reload */
-import "@revolt/ui/styles";
-
-import AuthPage from "./Auth";
-import Interface from "./Interface";
-import "./index.css";
-import { DevelopmentPage } from "./interface/Development";
-import { Friends } from "./interface/Friends";
-import { HomePage } from "./interface/Home";
-import { ServerHome } from "./interface/ServerHome";
-import { ChannelPage } from "./interface/channels/ChannelPage";
-import "./sentry";
+} from '@revolt/ui';
+import * as i18n from '@solid-primitives/i18n';
+import { Navigate, Route, Router } from '@solidjs/router';
+import { QueryClient, QueryClientProvider } from '@tanstack/solid-query';
+import { isTauri } from '@tauri-apps/api/core';
+import { getCurrentWindow } from '@tauri-apps/api/window';
+import type { JSX } from 'solid-js';
+import {
+  createEffect,
+  createMemo,
+  createResource,
+  createSignal,
+  on,
+  onMount,
+  Show,
+} from 'solid-js';
+import { createStore } from 'solid-js/store';
+import { render } from 'solid-js/web';
 
-attachDevtoolsOverlay();
+import AuthPage from './Auth';
+import Interface from './Interface';
+import { ChannelPage } from './interface/channels/ChannelPage';
+import { DevelopmentPage } from './interface/Development';
+import { Friends } from './interface/Friends';
+import { HomePage } from './interface/Home';
+import { ServerHome } from './interface/ServerHome';
 
 /** TEMPORARY */
 function MountTheme(props: { children: any }) {
-  const [accent, setAccent] = createSignal("#FF5733");
+  const [accent, setAccent] = createSignal('#FF5733');
   const [darkMode, setDarkMode] = createSignal(false);
 
   (window as any)._demo_setAccent = setAccent;
@@ -79,27 +92,35 @@ function PWARedirect() {
  * Open settings and redirect to last active path
  */
 function SettingsRedirect() {
-  onMount(() => modalController.push({ type: "settings", config: "user" }));
+  onMount(() => modalController.push({ type: 'settings', config: 'user' }));
   return <PWARedirect />;
 }
 
 const client = new QueryClient();
 
 function MountContext(props: { children?: JSX.Element }) {
+  const [dictionary] = createResource(language, fetchLanguage, {
+    initialValue: i18n.flatten(dict.en),
+  });
+
+  const t = createMemo(() => i18n.translator(dictionary, i18n.resolveTemplate));
+
+  const appWindow = isTauri() ? getCurrentWindow() : null;
+
   return (
-    <QueryClientProvider client={client}>
-      <Hydrate>
-        <Masks />
-        <I18nContext.Provider value={i18n}>
+    <I18nContext.Provider value={t()}>
+      <QueryClientProvider client={client}>
+        <Hydrate>
+          <Masks />
           <MountTheme>
             <ProvideDirectives>
               <KeybindsProvider keybinds={() => state.keybinds.getKeybinds()}>
                 <Show when={window.__TAURI__}>
                   <Titlebar
                     isBuildDev={import.meta.env.DEV}
-                    onMinimize={() => appWindow.minimize()}
-                    onMaximize={() => appWindow.toggleMaximize()}
-                    onClose={() => appWindow.hide()}
+                    onMinimize={() => appWindow?.minimize?.()}
+                    onMaximize={() => appWindow?.toggleMaximize?.()}
+                    onClose={() => appWindow?.hide?.()}
                   />
                 </Show>
                 {props.children}
@@ -109,38 +130,38 @@ function MountContext(props: { children?: JSX.Element }) {
               <ApplyGlobalStyles />
             </ProvideDirectives>
           </MountTheme>
-        </I18nContext.Provider>
-      </Hydrate>
-    </QueryClientProvider>
+        </Hydrate>
+      </QueryClientProvider>
+    </I18nContext.Provider>
   );
 }
 
 render(
   () => (
     <Router root={MountContext}>
-      <Route path="/login" component={AuthPage as never}>
-        <Route path="/check" component={FlowCheck} />
-        <Route path="/create" component={FlowCreate} />
-        <Route path="/auth" component={FlowLogin} />
-        <Route path="/resend" component={FlowResend} />
-        <Route path="/reset" component={FlowReset} />
-        <Route path="/verify/:token" component={FlowVerify} />
-        <Route path="/reset/:token" component={FlowConfirmReset} />
-        <Route path="/*" component={FlowHome} />
+      <Route path='/login' component={AuthPage as never}>
+        <Route path='/check' component={FlowCheck} />
+        <Route path='/create' component={FlowCreate} />
+        <Route path='/auth' component={FlowLogin} />
+        <Route path='/resend' component={FlowResend} />
+        <Route path='/reset' component={FlowReset} />
+        <Route path='/verify/:token' component={FlowVerify} />
+        <Route path='/reset/:token' component={FlowConfirmReset} />
+        <Route path='/*' component={FlowHome} />
       </Route>
-      <Route path="/" component={Interface as never}>
-        <Route path="/pwa" component={PWARedirect} />
-        <Route path="/dev" component={DevelopmentPage} />
-        <Route path="/settings" component={SettingsRedirect} />
-        <Route path="/friends" component={Friends} />
-        <Route path="/server/:server/*">
-          <Route path="/channel/:channel/*" component={ChannelPage} />
-          <Route path="/*" component={ServerHome} />
+      <Route path='/' component={Interface as never}>
+        <Route path='/pwa' component={PWARedirect} />
+        <Route path='/dev' component={DevelopmentPage} />
+        <Route path='/settings' component={SettingsRedirect} />
+        <Route path='/friends' component={Friends} />
+        <Route path='/server/:server/*'>
+          <Route path='/channel/:channel/*' component={ChannelPage} />
+          <Route path='/*' component={ServerHome} />
         </Route>
-        <Route path="/channel/:channel/*" component={ChannelPage} />
-        <Route path="/*" component={HomePage} />
+        <Route path='/channel/:channel/*' component={ChannelPage} />
+        <Route path='/*' component={HomePage} />
       </Route>
     </Router>
   ),
-  document.getElementById("root") as HTMLElement
+  document.getElementById('root') as HTMLElement
 );
diff --git a/packages/client/src/interface/Content.tsx b/packages/client/src/interface/Content.tsx
index fa1754e58..5716bc139 100644
--- a/packages/client/src/interface/Content.tsx
+++ b/packages/client/src/interface/Content.tsx
@@ -1,14 +1,14 @@
-import { Component, Match, Switch, onMount } from "solid-js";
+import { modalController } from '@revolt/modal';
+import { Navigate, Route, useParams } from '@revolt/routing';
+import { state } from '@revolt/state';
+import type { Component } from 'solid-js';
+import { Match, onMount, Switch } from 'solid-js';
 
-import { modalController } from "@revolt/modal";
-import { Navigate, Route, useParams } from "@revolt/routing";
-import { state } from "@revolt/state";
-
-import { DevelopmentPage } from "./Development";
-import { Friends } from "./Friends";
-import { HomePage } from "./Home";
-import { ServerHome } from "./ServerHome";
-import { ChannelPage } from "./channels/ChannelPage";
+import { ChannelPage } from './channels/ChannelPage';
+import { DevelopmentPage } from './Development';
+import { Friends } from './Friends';
+import { HomePage } from './Home';
+import { ServerHome } from './ServerHome';
 
 /**
  * Render content without sidebars
diff --git a/packages/client/src/interface/Friends.tsx b/packages/client/src/interface/Friends.tsx
index 9215c2088..81eeb866e 100644
--- a/packages/client/src/interface/Friends.tsx
+++ b/packages/client/src/interface/Friends.tsx
@@ -1,37 +1,28 @@
-import { BiSolidChevronDown, BiSolidUserDetail } from "solid-icons/bi";
-import {
-  Accessor,
-  For,
-  JSX,
-  Show,
-  createMemo,
-  createSignal,
-  splitProps,
-} from "solid-js";
-
-import { VirtualContainer } from "@minht11/solid-virtual-container";
-import type { User } from "revolt.js";
-import { styled } from "styled-system/jsx";
-
-import { useClient } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
+import { VirtualContainer } from '@minht11/solid-virtual-container';
+import { useClient } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
 import {
   Avatar,
   CategoryButton,
   Deferred,
   Header,
   OverflowingText,
+  styled as styledLegacy,
   Typography,
   UserStatusGraphic,
-  styled as styledLegacy,
-} from "@revolt/ui";
+} from '@revolt/ui';
+import type { User } from 'revolt.js';
+import { BiSolidChevronDown, BiSolidUserDetail } from 'solid-icons/bi';
+import type { Accessor, JSX } from 'solid-js';
+import { createMemo, createSignal, For, Show, splitProps } from 'solid-js';
+import { styled } from 'styled-system/jsx';
 
-import { HeaderIcon } from "./common/CommonHeader";
+import { HeaderIcon } from './common/CommonHeader';
 
 /**
  * Base layout of the friends page
  */
-const Base = styledLegacy("div")`
+const Base = styledLegacy('div')`
   width: 100%;
   display: flex;
   flex-direction: column;
@@ -41,10 +32,10 @@ const Base = styledLegacy("div")`
   }
 `;
 
-const ListBase = styled("div", {
+const ListBase = styled('div', {
   base: {
-    "&:not(:first-child)": {
-      paddingTop: "var(--gap-lg)",
+    '&:not(:first-child)': {
+      paddingTop: 'var(--gap-lg)',
     },
   },
 });
@@ -53,7 +44,7 @@ const ListBase = styled("div", {
  * Typed accessor for lists
  */
 type FriendLists = Accessor<{
-  [key in "online" | "offline" | "incoming" | "outgoing" | "blocked"]: User[];
+  [key in 'online' | 'offline' | 'incoming' | 'outgoing' | 'blocked']: User[];
 }>;
 
 /**
@@ -79,20 +70,20 @@ export function Friends() {
     const list = client()!.users.toList();
 
     const friends = list
-      .filter((user) => user.relationship === "Friend")
+      .filter((user) => user.relationship === 'Friend')
       .sort((a, b) => a.username.localeCompare(b.username));
 
     return {
       online: friends.filter((user) => user.online),
       offline: friends.filter((user) => !user.online),
       incoming: list
-        .filter((user) => user.relationship === "Incoming")
+        .filter((user) => user.relationship === 'Incoming')
         .sort((a, b) => a.username.localeCompare(b.username)),
       outgoing: list
-        .filter((user) => user.relationship === "Outgoing")
+        .filter((user) => user.relationship === 'Outgoing')
         .sort((a, b) => a.username.localeCompare(b.username)),
       blocked: list
-        .filter((user) => user.relationship === "Blocked")
+        .filter((user) => user.relationship === 'Blocked')
         .sort((a, b) => a.username.localeCompare(b.username)),
     };
   });
@@ -100,32 +91,32 @@ export function Friends() {
   return (
     // TODO: i18n
     <Base>
-      <Header placement="primary">
+      <Header placement='primary'>
         <HeaderIcon>
           <BiSolidUserDetail size={24} />
         </HeaderIcon>
         Friends
       </Header>
       <Deferred>
-        <div class="FriendsList" ref={scrollTargetElement} use:scrollable>
+        <div class='FriendsList' ref={scrollTargetElement} use:scrollable>
           {/* <PendingRequests lists={lists} /> */}
           <List
-            title="Outgoing"
+            title='Outgoing'
             users={lists().outgoing}
             scrollTargetElement={targetSignal}
           />
           <List
-            title="Online"
+            title='Online'
             users={lists().online}
             scrollTargetElement={targetSignal}
           />
           <List
-            title="Offline"
+            title='Offline'
             users={lists().offline}
             scrollTargetElement={targetSignal}
           />
           <List
-            title="Blocked"
+            title='Blocked'
             users={lists().blocked}
             scrollTargetElement={targetSignal}
           />
@@ -145,8 +136,8 @@ function List(props: {
 }) {
   return (
     <ListBase>
-      <Typography variant="category">
-        {props.title} {"–"} {props.users.length}
+      <Typography variant='category'>
+        {props.title} {'–'} {props.users.length}
       </Typography>
       <VirtualContainer
         items={props.users}
@@ -162,9 +153,9 @@ function List(props: {
               ...item.style,
             }}
           >
-            <div style={{ margin: "6px" }}>
+            <div style={{ margin: '6px' }}>
               <Entry
-                role="listitem"
+                role='listitem'
                 tabIndex={item.tabIndex}
                 style={item.style}
                 user={item.item}
@@ -180,12 +171,12 @@ function List(props: {
 /**
  * Some temporary styles for friend entries
  */
-const Friend = styled("div", {
+const Friend = styled('div', {
   base: {
     minWidth: 0,
-    display: "flex",
-    gap: "var(--gap-md)",
-    alignItems: "center",
+    display: 'flex',
+    gap: 'var(--gap-md)',
+    alignItems: 'center',
     // padding: "var(--gap-md)",
     // borderRadius: "var(--borderRadius-lg)",
     // background: "var(--colours-sidebar-channels-background)",
@@ -198,10 +189,10 @@ const Friend = styled("div", {
 function Entry(
   props: { user: User } & Omit<
     JSX.AnchorHTMLAttributes<HTMLAnchorElement>,
-    "href"
+    'href'
   >
 ) {
-  const [local, remote] = splitProps(props, ["user"]);
+  const [local, remote] = splitProps(props, ['user']);
 
   return (
     <a {...remote}>
@@ -210,12 +201,12 @@ function Entry(
           size={36}
           src={local.user.animatedAvatarURL}
           holepunch={
-            props.user.relationship === "Friend" ? "bottom-right" : "none"
+            props.user.relationship === 'Friend' ? 'bottom-right' : 'none'
           }
           overlay={
-            <Show when={props.user.relationship === "Friend"}>
+            <Show when={props.user.relationship === 'Friend'}>
               <UserStatusGraphic
-                status={props.user.status?.presence ?? "Online"}
+                status={props.user.status?.presence ?? 'Online'}
               />
             </Show>
           }
@@ -229,7 +220,7 @@ function Entry(
 /**
  * Overlapping avatars
  */
-const Avatars = styledLegacy("div", "Avatars")`
+const Avatars = styledLegacy('div', 'Avatars')`
   flex-shrink: 0;
 
   svg:not(:first-child) {
@@ -259,21 +250,21 @@ function PendingRequests(props: { lists: FriendLists }) {
     const length = list.length;
 
     if (length === 1) {
-      return t("app.special.friends.from.single", { user: list[0].username });
+      return t('app.special.friends.from.single', { user: list[0].username });
     } else if (length <= 3) {
-      return t("app.special.friends.from.multiple", {
+      return t('app.special.friends.from.multiple', {
         userlist: list
           .slice(0, 2)
           .map((user) => user.username)
-          .join(", "),
+          .join(', '),
         user: list.slice(-1)[0].username,
       });
     } else {
-      return t("app.special.friends.from.several", {
+      return t('app.special.friends.from.several', {
         userlist: list
           .slice(0, 3)
           .map((user) => user.username)
-          .join(", "),
+          .join(', '),
         count: (length - 3).toString(),
       });
     }
@@ -282,7 +273,7 @@ function PendingRequests(props: { lists: FriendLists }) {
   return (
     <Show when={incoming().length}>
       <CategoryButton
-        action="chevron"
+        action='chevron'
         icon={
           <Avatars>
             <For each={incoming().slice(0, 3)}>
@@ -290,7 +281,7 @@ function PendingRequests(props: { lists: FriendLists }) {
                 <Avatar
                   src={user.animatedAvatarURL}
                   size={64}
-                  holepunch={index() == 2 ? "none" : "overlap"}
+                  holepunch={index() == 2 ? 'none' : 'overlap'}
                 />
               )}
             </For>
diff --git a/packages/client/src/interface/Home.tsx b/packages/client/src/interface/Home.tsx
index 3ae1fc1e5..0a6a2b9ed 100644
--- a/packages/client/src/interface/Home.tsx
+++ b/packages/client/src/interface/Home.tsx
@@ -1,42 +1,39 @@
-import { Match, Show, Switch } from "solid-js";
-
-import { cva } from "styled-system/css";
-
-import { IS_DEV, IS_REVOLT, useClient } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
-import { modalController } from "@revolt/modal";
-import { useNavigate } from "@revolt/routing";
+import MdAddCircle from '@material-design-icons/svg/filled/add_circle.svg?component-solid';
+import MdExplore from '@material-design-icons/svg/filled/explore.svg?component-solid';
+import MdGroups3 from '@material-design-icons/svg/filled/groups_3.svg?component-solid';
+import MdHome from '@material-design-icons/svg/filled/home.svg?component-solid';
+import MdPayments from '@material-design-icons/svg/filled/payments.svg?component-solid';
+import MdRateReview from '@material-design-icons/svg/filled/rate_review.svg?component-solid';
+import MdSettings from '@material-design-icons/svg/filled/settings.svg?component-solid';
+import { IS_DEV, IS_REVOLT, useClient } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
+import { modalController } from '@revolt/modal';
+import { useNavigate } from '@revolt/routing';
 import {
   Button,
   CategoryButton,
   Column,
   Header,
-  Typography,
   iconSize,
   styled,
-} from "@revolt/ui";
-
-import MdAddCircle from "@material-design-icons/svg/filled/add_circle.svg?component-solid";
-import MdExplore from "@material-design-icons/svg/filled/explore.svg?component-solid";
-import MdGroups3 from "@material-design-icons/svg/filled/groups_3.svg?component-solid";
-import MdHome from "@material-design-icons/svg/filled/home.svg?component-solid";
-import MdPayments from "@material-design-icons/svg/filled/payments.svg?component-solid";
-import MdRateReview from "@material-design-icons/svg/filled/rate_review.svg?component-solid";
-import MdSettings from "@material-design-icons/svg/filled/settings.svg?component-solid";
-
-import RevoltSvg from "../../public/assets/wordmark_wide_500px.svg?component-solid";
+  Typography,
+} from '@revolt/ui';
+import { Match, Show, Switch } from 'solid-js';
+import { cva } from 'styled-system/css';
 
-import { HeaderIcon } from "./common/CommonHeader";
+//
+// import RevoltSvg from "../../public/assets/wordmark_wide_500px.svg?component-solid";
+import { HeaderIcon } from './common/CommonHeader';
 
-const Logo = styled(RevoltSvg)`
+const Logo = styled('div')`
   width: 240px;
-  fill: ${(props) => props.theme!.colours["foreground"]};
+  fill: ${(props) => props.theme!.colours['foreground']};
 `;
 
 /**
  * Base layout of the home page (i.e. the header/background)
  */
-const Base = styled("div")`
+const Base = styled('div')`
   width: 100%;
   display: flex;
   flex-direction: column;
@@ -48,27 +45,27 @@ const Base = styled("div")`
 const content = cva({
   base: {
     minHeight: 0,
-    width: "100%",
-    margin: "auto",
-    padding: "var(--gap-xxl) 0",
-
-    display: "flex",
-    gap: "var(--gap-xl)",
-    alignItems: "center",
-    flexDirection: "column",
+    width: '100%',
+    margin: 'auto',
+    padding: 'var(--gap-xxl) 0',
+
+    display: 'flex',
+    gap: 'var(--gap-xl)',
+    alignItems: 'center',
+    flexDirection: 'column',
   },
 });
 
 /**
  * Layout of the buttons
  */
-const Buttons = styled("div")`
+const Buttons = styled('div')`
   display: flex;
 
   padding: ${(props) => props.theme!.gap.md};
 
   border-radius: ${(props) => props.theme!.borderRadius.lg};
-  background: ${(props) => props.theme!.colours["sidebar-channels-background"]};
+  background: ${(props) => props.theme!.colours['sidebar-channels-background']};
 `;
 
 /**
@@ -87,7 +84,7 @@ const SeparatedColumn = styled(Column)`
 /**
  * Make sure the image is separated from the welcome text
  */
-const Image = styled("img")`
+const Image = styled('img')`
   margin-top: 0.5em;
   height: 36px;
 
@@ -105,12 +102,12 @@ export function HomePage() {
   // check if we're revolt.chat; if so, check if the user is in the Lounge
   const showLoungeButton = IS_REVOLT;
   const isInLounge =
-    client()!.servers.get("01F7ZSBSFHQ8TA81725KQCSDDP") !== undefined;
+    client()!.servers.get('01F7ZSBSFHQ8TA81725KQCSDDP') !== undefined;
 
   return (
     // TODO: i18n
     <Base>
-      <Header placement="primary">
+      <Header placement='primary'>
         <HeaderIcon>
           <MdHome {...iconSize(22)} />
         </HeaderIcon>
@@ -118,8 +115,8 @@ export function HomePage() {
       </Header>
       <div use:scrollable={{ class: content() }}>
         <Column>
-          <Typography variant="home-page-title">
-            {t("app.special.modals.onboarding.welcome")}
+          <Typography variant='home-page-title'>
+            {t('app.special.modals.onboarding.welcome')}
           </Typography>
           <Logo />
         </Column>
@@ -128,73 +125,73 @@ export function HomePage() {
             <CategoryButton
               onClick={() =>
                 modalController.push({
-                  type: "create_group",
+                  type: 'create_group',
                   client: client()!,
                 })
               }
-              description={t("app.home.group_desc")}
+              description={t('app.home.group_desc')}
               icon={<MdAddCircle />}
             >
-              {t("app.home.group")}
+              {t('app.home.group')}
             </CategoryButton>
             <Switch fallback={null}>
               <Match when={showLoungeButton && isInLounge}>
                 <CategoryButton
-                  onClick={() => navigate("/server/01F7ZSBSFHQ8TA81725KQCSDDP")}
-                  description={t("app.home.goto-testers_desc")}
+                  onClick={() => navigate('/server/01F7ZSBSFHQ8TA81725KQCSDDP')}
+                  description={t('app.home.goto-testers_desc')}
                   icon={<MdGroups3 />}
                 >
-                  {t("app.home.goto-testers")}
+                  {t('app.home.goto-testers')}
                 </CategoryButton>
               </Match>
               <Match when={showLoungeButton && !isInLounge}>
                 <CategoryButton
-                  description={t("app.home.join-testers_desc")}
+                  description={t('app.home.join-testers_desc')}
                   icon={<MdGroups3 />}
                 >
-                  {t("app.home.join-testers")}
+                  {t('app.home.join-testers')}
                 </CategoryButton>
               </Match>
             </Switch>
             <CategoryButton
               onClick={() =>
-                window.open("https://insrt.uk/donate?utm_source=revoltapp")
+                window.open('https://insrt.uk/donate?utm_source=revoltapp')
               }
-              description={t("app.home.donate_desc")}
+              description={t('app.home.donate_desc')}
               icon={<MdPayments />}
             >
-              {t("app.home.donate")}
+              {t('app.home.donate')}
             </CategoryButton>
           </SeparatedColumn>
           <SeparatedColumn>
             <Show when={IS_REVOLT}>
               <CategoryButton
-                onClick={() => navigate("/discover")}
-                description={t("app.home.discover_desc")}
+                onClick={() => navigate('/discover')}
+                description={t('app.home.discover_desc')}
                 icon={<MdExplore />}
               >
-                {t("app.home.discover")}
+                {t('app.home.discover')}
               </CategoryButton>
             </Show>
             <CategoryButton
-              description={t("app.home.feedback_desc")}
+              description={t('app.home.feedback_desc')}
               icon={<MdRateReview {...iconSize(22)} />}
             >
-              {t("app.home.feedback")}
+              {t('app.home.feedback')}
             </CategoryButton>
             <CategoryButton
               onClick={() =>
-                modalController.push({ type: "settings", config: "user" })
+                modalController.push({ type: 'settings', config: 'user' })
               }
-              description={t("app.home.settings-tooltip")}
+              description={t('app.home.settings-tooltip')}
               icon={<MdSettings />}
             >
-              {t("app.home.settings")}
+              {t('app.home.settings')}
             </CategoryButton>
           </SeparatedColumn>
         </Buttons>
         <Show when={IS_DEV}>
-          <Button onPress={() => navigate("/dev")}>
+          <Button onPress={() => navigate('/dev')}>
             Open Development Page
           </Button>
         </Show>
diff --git a/packages/client/src/interface/ServerHome.tsx b/packages/client/src/interface/ServerHome.tsx
index 1de543d0f..6966808a0 100644
--- a/packages/client/src/interface/ServerHome.tsx
+++ b/packages/client/src/interface/ServerHome.tsx
@@ -1,7 +1,7 @@
-import { Component, Match, Switch, createMemo } from "solid-js";
-
-import { useClient } from "@revolt/client";
-import { Navigate, useParams } from "@revolt/routing";
+import { useClient } from '@revolt/client';
+import { Navigate, useParams } from '@revolt/routing';
+import type { Component } from 'solid-js';
+import { createMemo, Match, Switch } from 'solid-js';
 
 /**
  * Server home component
@@ -13,9 +13,9 @@ export const ServerHome: Component = () => {
 
   return (
     // TODO: port the nice fallback
-    <Switch fallback="No channels!">
+    <Switch fallback='No channels!'>
       <Match when={!server()}>
-        <Navigate href={"/"} />
+        <Navigate href={'/'} />
       </Match>
       <Match when={server().defaultChannel}>
         <Navigate href={`channel/${server().defaultChannel!.id}`} />
diff --git a/packages/client/src/interface/Sidebar.tsx b/packages/client/src/interface/Sidebar.tsx
index f924bf807..357705e3c 100644
--- a/packages/client/src/interface/Sidebar.tsx
+++ b/packages/client/src/interface/Sidebar.tsx
@@ -1,14 +1,14 @@
-import { Component, Match, Show, Switch, createMemo } from "solid-js";
-import { JSX } from "solid-js";
-
-import { Channel, Server as ServerI } from "revolt.js";
-
-import { ChannelContextMenu, ServerSidebarContextMenu } from "@revolt/app";
-import { useClient, useUser } from "@revolt/client";
-import { modalController } from "@revolt/modal";
-import { Route, useParams, useSmartParams } from "@revolt/routing";
-import { state } from "@revolt/state";
-import { HomeSidebar, ServerList, ServerSidebar } from "@revolt/ui";
+import { ChannelContextMenu, ServerSidebarContextMenu } from '@revolt/app';
+import { useClient, useUser } from '@revolt/client';
+import { modalController } from '@revolt/modal';
+import { Route, useParams, useSmartParams } from '@revolt/routing';
+import { state } from '@revolt/state';
+import { HomeSidebar, ServerList, ServerSidebar } from '@revolt/ui';
+import type { Server as ServerI } from 'revolt.js';
+import { Channel } from 'revolt.js';
+import type { Component } from 'solid-js';
+import type { JSX } from 'solid-js';
+import { createMemo, Match, Show, Switch } from 'solid-js';
 
 /**
  * Left-most channel navigation sidebar
@@ -17,14 +17,14 @@ export const Sidebar = (props: {
   /**
    * Menu generator TODO FIXME: remove
    */
-  menuGenerator: (t: ServerI | Channel) => JSX.Directives["floating"];
+  menuGenerator: (t: ServerI | Channel) => JSX.Directives['floating'];
 }) => {
   const user = useUser();
   const client = useClient();
   const params = useParams<{ server: string }>();
 
   return (
-    <div style={{ display: "flex", "flex-shrink": 0 }}>
+    <div style={{ display: 'flex', 'flex-shrink': 0 }}>
       <ServerList
         orderedServers={state.ordering.orderedServers}
         setServerOrder={state.ordering.setServerOrder}
@@ -36,7 +36,7 @@ export const Sidebar = (props: {
         selectedServer={() => params.server}
         onCreateOrJoinServer={() =>
           modalController.push({
-            type: "create_or_join_server",
+            type: 'create_or_join_server',
             client: client(),
           })
         }
@@ -66,7 +66,7 @@ const Home: Component = () => {
       openSavedNotes={(navigate) => {
         // Check whether the saved messages channel exists already
         const channelId = [...client()!.channels.values()].find(
-          (channel) => channel.type === "SavedMessages"
+          (channel) => channel.type === 'SavedMessages'
         )?.id;
 
         if (navigate) {
@@ -84,7 +84,7 @@ const Home: Component = () => {
         // Otherwise return channel ID if available
         return channelId;
       }}
-      __tempDisplayFriends={() => state.experiments.isEnabled("friends")}
+      __tempDisplayFriends={() => state.experiments.isEnabled('friends')}
     />
   );
 };
@@ -107,7 +107,7 @@ const Server: Component = () => {
    */
   function openServerInfo() {
     modalController.push({
-      type: "server_info",
+      type: 'server_info',
       server: server(),
     });
   }
@@ -117,8 +117,8 @@ const Server: Component = () => {
    */
   function openServerSettings() {
     modalController.push({
-      type: "settings",
-      config: "server",
+      type: 'settings',
+      config: 'server',
       context: server(),
     });
   }
diff --git a/packages/client/src/interface/channels/ChannelHeader.tsx b/packages/client/src/interface/channels/ChannelHeader.tsx
index 376404683..3ce634bd1 100644
--- a/packages/client/src/interface/channels/ChannelHeader.tsx
+++ b/packages/client/src/interface/channels/ChannelHeader.tsx
@@ -1,30 +1,28 @@
-import {
-  BiRegularAt,
-  BiRegularHash,
-  BiSolidCog,
-  BiSolidGroup,
-  BiSolidNotepad,
-} from "solid-icons/bi";
-import { Match, Show, Switch } from "solid-js";
-
-import { Channel } from "revolt.js";
-
-import { useTranslation } from "@revolt/i18n";
-import { TextWithEmoji } from "@revolt/markdown";
-import { modalController } from "@revolt/modal";
-import { state } from "@revolt/state";
-import { LAYOUT_SECTIONS } from "@revolt/state/stores/Layout";
+import { useTranslation } from '@revolt/i18n';
+import { TextWithEmoji } from '@revolt/markdown';
+import { modalController } from '@revolt/modal';
+import { state } from '@revolt/state';
+import { LAYOUT_SECTIONS } from '@revolt/state/stores/Layout';
 import {
   Button,
   NonBreakingText,
   OverflowingText,
   Spacer,
+  styled,
   Typography,
   UserStatus,
-  styled,
-} from "@revolt/ui";
+} from '@revolt/ui';
+import type { Channel } from 'revolt.js';
+import {
+  BiRegularAt,
+  BiRegularHash,
+  BiSolidCog,
+  BiSolidGroup,
+  BiSolidNotepad,
+} from 'solid-icons/bi';
+import { Match, Show, Switch } from 'solid-js';
 
-import { HeaderIcon } from "../common/CommonHeader";
+import { HeaderIcon } from '../common/CommonHeader';
 
 interface Props {
   /**
@@ -44,7 +42,7 @@ export function ChannelHeader(props: Props) {
    */
   function openChannelInfo() {
     modalController.push({
-      type: "channel_info",
+      type: 'channel_info',
       channel: props.channel,
     });
   }
@@ -54,8 +52,8 @@ export function ChannelHeader(props: Props) {
    */
   function openChannelSettings() {
     modalController.push({
-      type: "settings",
-      config: "channel",
+      type: 'settings',
+      config: 'channel',
       context: props.channel,
     });
   }
@@ -65,9 +63,9 @@ export function ChannelHeader(props: Props) {
       <Switch>
         <Match
           when={
-            props.channel.type === "TextChannel" ||
-            props.channel.type === "VoiceChannel" ||
-            props.channel.type === "Group"
+            props.channel.type === 'TextChannel' ||
+            props.channel.type === 'VoiceChannel' ||
+            props.channel.type === 'Group'
           }
         >
           <HeaderIcon>
@@ -80,27 +78,27 @@ export function ChannelHeader(props: Props) {
             <Divider />
             <DescriptionLink onClick={openChannelInfo}>
               <OverflowingText>
-                <Typography variant="channel-topic">
+                <Typography variant='channel-topic'>
                   <TextWithEmoji
-                    content={props.channel.description?.split("\n").shift()}
+                    content={props.channel.description?.split('\n').shift()}
                   />
                 </Typography>
               </OverflowingText>
             </DescriptionLink>
           </Show>
         </Match>
-        <Match when={props.channel.type === "DirectMessage"}>
+        <Match when={props.channel.type === 'DirectMessage'}>
           <HeaderIcon>
             <BiRegularAt size={24} />
           </HeaderIcon>
           <TextWithEmoji content={props.channel.recipient?.username} />
-          <UserStatus status={props.channel.recipient?.presence} size="8px" />
+          <UserStatus status={props.channel.recipient?.presence} size='8px' />
         </Match>
-        <Match when={props.channel.type === "SavedMessages"}>
+        <Match when={props.channel.type === 'SavedMessages'}>
           <HeaderIcon>
             <BiSolidNotepad size={24} />
           </HeaderIcon>
-          {t("app.navigation.tabs.saved")}
+          {t('app.navigation.tabs.saved')}
         </Match>
       </Switch>
 
@@ -108,18 +106,18 @@ export function ChannelHeader(props: Props) {
 
       <Show
         when={
-          props.channel.type === "Group" ||
-          props.channel.orPermission("ManageChannel", "ManagePermissions")
+          props.channel.type === 'Group' ||
+          props.channel.orPermission('ManageChannel', 'ManagePermissions')
         }
       >
-        <Button variant="plain" size="fluid" onPress={openChannelSettings}>
+        <Button variant='plain' size='fluid' onPress={openChannelSettings}>
           <BiSolidCog size={24} />
         </Button>
       </Show>
 
       <Button
-        variant="plain"
-        size="fluid"
+        variant='plain'
+        size='fluid'
         onPress={() =>
           state.layout.toggleSectionState(LAYOUT_SECTIONS.MEMBER_SIDEBAR, true)
         }
@@ -133,7 +131,7 @@ export function ChannelHeader(props: Props) {
 /**
  * Vertical divider between name and topic
  */
-const Divider = styled("div", "Divider")`
+const Divider = styled('div', 'Divider')`
   height: 20px;
   margin: 0px 5px;
   padding-left: 1px;
diff --git a/packages/client/src/interface/channels/ChannelPage.tsx b/packages/client/src/interface/channels/ChannelPage.tsx
index cadad84c0..c2f978999 100644
--- a/packages/client/src/interface/channels/ChannelPage.tsx
+++ b/packages/client/src/interface/channels/ChannelPage.tsx
@@ -1,18 +1,17 @@
-import { Component, Match, Switch, createMemo } from "solid-js";
+import { useClient } from '@revolt/client';
+import { TextWithEmoji } from '@revolt/markdown';
+import { Navigate, useParams } from '@revolt/routing';
+import { Header, styled, Typography } from '@revolt/ui';
+import type { Channel } from 'revolt.js';
+import type { Component } from 'solid-js';
+import { createMemo, Match, Switch } from 'solid-js';
 
-import { Channel } from "revolt.js";
-
-import { useClient } from "@revolt/client";
-import { TextWithEmoji } from "@revolt/markdown";
-import { Navigate, useParams } from "@revolt/routing";
-import { Header, Typography, styled } from "@revolt/ui";
-
-import { TextChannel } from "./text/TextChannel";
+import { TextChannel } from './text/TextChannel';
 
 /**
  * Channel layout
  */
-const Base = styled("div")`
+const Base = styled('div')`
   min-width: 0;
   flex-grow: 1;
   display: flex;
@@ -24,11 +23,11 @@ export interface ChannelPageProps {
   channel: Channel;
 }
 
-const TEXT_CHANNEL_TYPES: Channel["type"][] = [
-  "TextChannel",
-  "DirectMessage",
-  "Group",
-  "SavedMessages",
+const TEXT_CHANNEL_TYPES: Channel['type'][] = [
+  'TextChannel',
+  'DirectMessage',
+  'Group',
+  'SavedMessages',
 ];
 
 /**
@@ -41,18 +40,18 @@ export const ChannelPage: Component = () => {
 
   return (
     <Base>
-      <Switch fallback="Unknown channel type!">
+      <Switch fallback='Unknown channel type!'>
         <Match when={!channel()}>
-          <Navigate href={"../.."} />
+          <Navigate href={'../..'} />
         </Match>
         <Match when={TEXT_CHANNEL_TYPES.includes(channel()!.type)}>
           <TextChannel channel={channel()} />
         </Match>
-        <Match when={channel()!.type === "VoiceChannel"}>
-          <Header placement="primary">
+        <Match when={channel()!.type === 'VoiceChannel'}>
+          <Header placement='primary'>
             <TextWithEmoji content={channel().name!} />
           </Header>
-          <Typography variant="legacy-modal-title">
+          <Typography variant='legacy-modal-title'>
             Legacy voice channels are not supported!
           </Typography>
         </Match>
diff --git a/packages/client/src/interface/channels/text/Composition.tsx b/packages/client/src/interface/channels/text/Composition.tsx
index f62828548..ac88cf4ea 100644
--- a/packages/client/src/interface/channels/text/Composition.tsx
+++ b/packages/client/src/interface/channels/text/Composition.tsx
@@ -1,18 +1,8 @@
-import {
-  BiRegularPlus,
-  BiSolidFileGif,
-  BiSolidHappyBeaming,
-  BiSolidSend,
-} from "solid-icons/bi";
-import { For, Match, Show, Switch, onCleanup, onMount } from "solid-js";
-
-import { API, Channel } from "revolt.js";
-
-import { useClient } from "@revolt/client";
-import { debounce } from "@revolt/common";
-import { useTranslation } from "@revolt/i18n";
-import { modalController } from "@revolt/modal";
-import { state } from "@revolt/state";
+import { useClient } from '@revolt/client';
+import { debounce } from '@revolt/common';
+import { useTranslation } from '@revolt/i18n';
+import { modalController } from '@revolt/modal';
+import { state } from '@revolt/state';
 import {
   Button,
   CompositionPicker,
@@ -22,7 +12,16 @@ import {
   InlineIcon,
   MessageBox,
   MessageReplyPreview,
-} from "@revolt/ui";
+} from '@revolt/ui';
+import type { Channel } from 'revolt.js';
+import { API } from 'revolt.js';
+import {
+  BiRegularPlus,
+  BiSolidFileGif,
+  BiSolidHappyBeaming,
+  BiSolidSend,
+} from 'solid-icons/bi';
+import { For, Match, onCleanup, onMount, Show, Switch } from 'solid-js';
 
 interface Props {
   /**
@@ -39,7 +38,7 @@ interface Props {
 /**
  * Tests for code block delimiters (``` at start of line)
  */
-const RE_CODE_DELIMITER = new RegExp("^```", "gm");
+const RE_CODE_DELIMITER = new RegExp('^```', 'gm');
 
 /**
  * Message composition engine
@@ -70,13 +69,13 @@ export function MessageComposition(props: Props) {
    * Send typing packet
    */
   function startTyping() {
-    if (typeof isTyping === "number" && +new Date() < isTyping) return;
+    if (typeof isTyping === 'number' && +new Date() < isTyping) return;
 
     const ws = client()!.events;
     if (ws.state() === 2) {
       isTyping = +new Date() + 2500;
       ws.send({
-        type: "BeginTyping",
+        type: 'BeginTyping',
         channel: props.channel.id,
       });
     }
@@ -91,7 +90,7 @@ export function MessageComposition(props: Props) {
       if (ws.state() === 2) {
         isTyping = undefined;
         ws.send({
-          type: "EndTyping",
+          type: 'EndTyping',
           channel: props.channel.id,
         });
       }
@@ -110,7 +109,7 @@ export function MessageComposition(props: Props) {
   async function sendMessage(useContent?: unknown) {
     props.onMessageSend?.();
 
-    if (typeof useContent === "string") {
+    if (typeof useContent === 'string') {
       return props.channel.sendMessage(useContent);
     }
 
@@ -131,7 +130,7 @@ export function MessageComposition(props: Props) {
    * @returns Whether we are in a code block
    */
   function isInCodeBlock(cursor: number): boolean {
-    const contentBeforeCursor = (draft().content ?? "").substring(0, cursor);
+    const contentBeforeCursor = (draft().content ?? '').substring(0, cursor);
 
     let delimiterCount = 0;
     for (const _delimiter of contentBeforeCursor.matchAll(RE_CODE_DELIMITER)) {
@@ -152,24 +151,24 @@ export function MessageComposition(props: Props) {
     const insideCodeBlock = isInCodeBlock(event.currentTarget.selectionStart);
     const usingBracketIndent =
       (event.ctrlKey || event.metaKey) &&
-      (event.key === "[" || event.key === "]");
+      (event.key === '[' || event.key === ']');
 
     if (
-      (event.key === "Tab" || usingBracketIndent) &&
+      (event.key === 'Tab' || usingBracketIndent) &&
       !event.isComposing &&
       insideCodeBlock
     ) {
       // Handle code block indentation.
       event.preventDefault();
 
-      const indent = "  "; // 2 spaces
+      const indent = '  '; // 2 spaces
 
       const selectStart = event.currentTarget.selectionStart;
       const selectEnd = event.currentTarget.selectionEnd;
       let selectionStartColumn = 0;
       let selectionEndColumn = 0;
 
-      const lines = (draft().content ?? "").split("\n");
+      const lines = (draft().content ?? '').split('\n');
       const selectLines = [];
 
       // Get indexes of selected lines
@@ -194,7 +193,7 @@ export function MessageComposition(props: Props) {
         lineIndex += currentLine.length + 1; // add 1 to account for missing newline char
       }
 
-      if ((event.shiftKey && event.key === "Tab") || event.key === "[") {
+      if ((event.shiftKey && event.key === 'Tab') || event.key === '[') {
         const whitespaceRegex = new RegExp(`(?<=^ *) {1,${indent.length}}`);
 
         // Used to ensure selection remains the same after indentation changes
@@ -215,7 +214,7 @@ export function MessageComposition(props: Props) {
           }
         }
 
-        setContent(lines.join("\n"));
+        setContent(lines.join('\n'));
 
         // Update selection positions.
         event.currentTarget.selectionStart =
@@ -229,7 +228,7 @@ export function MessageComposition(props: Props) {
         for (const selectedLineIndex of selectLines) {
           const currentLine = lines[selectedLineIndex];
 
-          if (selectStart === selectEnd && event.key === "Tab") {
+          if (selectStart === selectEnd && event.key === 'Tab') {
             // Insert spacing at current position instead of line start
             const beforeIndent = currentLine.slice(0, selectionStartColumn);
             const afterIndent = currentLine.slice(selectionEndColumn);
@@ -243,7 +242,7 @@ export function MessageComposition(props: Props) {
           indentsAdded++;
         }
 
-        setContent(lines.join("\n"));
+        setContent(lines.join('\n'));
 
         // Update selection positions.
         event.currentTarget.selectionStart = selectStart + indent.length;
@@ -253,7 +252,7 @@ export function MessageComposition(props: Props) {
     }
 
     if (
-      event.key === "Enter" &&
+      event.key === 'Enter' &&
       !event.shiftKey &&
       !event.isComposing &&
       !insideCodeBlock /*&& props.ref*/
@@ -271,7 +270,7 @@ export function MessageComposition(props: Props) {
    * @param event Keyboard Event
    */
   function onKeyDown(event: KeyboardEvent) {
-    if (event.key === "Escape") {
+    if (event.key === 'Escape') {
       if (state.draft.popFromDraft(props.channel.id)) {
         event.preventDefault();
       }
@@ -281,15 +280,15 @@ export function MessageComposition(props: Props) {
       // Don't take focus from modals
       !modalController.isOpen() &&
       // Only focus if pasting to allow copying of text elsewhere
-      (!(event.ctrlKey || event.metaKey) || event.key.toLowerCase() === "v")
+      (!(event.ctrlKey || event.metaKey) || event.key.toLowerCase() === 'v')
     ) {
       ref?.focus();
     }
   }
 
   // Bind onKeyDown to the document
-  onMount(() => document.addEventListener("keydown", onKeyDown));
-  onCleanup(() => document.removeEventListener("keydown", onKeyDown));
+  onMount(() => document.addEventListener('keydown', onKeyDown));
+  onCleanup(() => document.removeEventListener('keydown', onKeyDown));
 
   /**
    * Handle files being added to the draft.
@@ -298,7 +297,7 @@ export function MessageComposition(props: Props) {
   function onFiles(files: File[]) {
     for (const file of files) {
       if (file.size > 20_000_000) {
-        alert("file too large");
+        alert('file too large');
       }
     }
 
@@ -315,13 +314,13 @@ export function MessageComposition(props: Props) {
    * Add a file to the message
    */
   function addFile() {
-    const input = document.createElement("input");
-    input.accept = "*";
-    input.type = "file";
+    const input = document.createElement('input');
+    input.accept = '*';
+    input.type = 'file';
     input.multiple = true;
-    input.style.display = "none";
+    input.style.display = 'none';
 
-    input.addEventListener("change", async (e) => {
+    input.addEventListener('change', async (e) => {
       // Get all attached files
       const files = (e.currentTarget as HTMLInputElement)?.files;
 
@@ -386,18 +385,18 @@ export function MessageComposition(props: Props) {
       </For>
       <MessageBox
         ref={ref}
-        content={draft()?.content ?? ""}
+        content={draft()?.content ?? ''}
         setContent={setContent}
         actionsStart={
-          <Switch fallback={<InlineIcon size="short" />}>
+          <Switch fallback={<InlineIcon size='short' />}>
             <Match
               when={
-                props.channel.havePermission("UploadFiles") &&
-                state.experiments.isEnabled("file_uploads")
+                props.channel.havePermission('UploadFiles') &&
+                state.experiments.isEnabled('file_uploads')
               }
             >
-              <InlineIcon size="wide">
-                <Button variant="plain" size="fluid" onPress={addFile}>
+              <InlineIcon size='wide'>
+                <Button variant='plain' size='fluid' onPress={addFile}>
                   <BiRegularPlus size={24} />
                 </Button>
               </InlineIcon>
@@ -408,22 +407,22 @@ export function MessageComposition(props: Props) {
           <CompositionPicker sendGIFMessage={sendMessage}>
             {(triggerProps) => (
               <>
-                <Show when={state.experiments.isEnabled("gif_picker")}>
-                  <InlineIcon size="normal">
+                <Show when={state.experiments.isEnabled('gif_picker')}>
+                  <InlineIcon size='normal'>
                     <Button
-                      variant="plain"
-                      size="fluid"
+                      variant='plain'
+                      size='fluid'
                       onPress={triggerProps.onClickGif}
                     >
                       <BiSolidFileGif size={24} />
                     </Button>
                   </InlineIcon>
                 </Show>
-                <Show when={state.experiments.isEnabled("emoji_picker")}>
-                  <InlineIcon size="normal">
+                <Show when={state.experiments.isEnabled('emoji_picker')}>
+                  <InlineIcon size='normal'>
                     <Button
-                      variant="plain"
-                      size="fluid"
+                      variant='plain'
+                      size='fluid'
                       onPress={triggerProps.onClickEmoji}
                     >
                       <BiSolidHappyBeaming size={24} />
@@ -431,10 +430,10 @@ export function MessageComposition(props: Props) {
                   </InlineIcon>
                 </Show>
                 <Show
-                  when={state.settings.getValue("appearance:show_send_button")}
+                  when={state.settings.getValue('appearance:show_send_button')}
                 >
-                  <InlineIcon size="normal">
-                    <Button variant="plain" size="fluid" onPress={sendMessage}>
+                  <InlineIcon size='normal'>
+                    <Button variant='plain' size='fluid' onPress={sendMessage}>
                       <BiSolidSend size={24} />
                     </Button>
                   </InlineIcon>
@@ -446,17 +445,17 @@ export function MessageComposition(props: Props) {
           </CompositionPicker>
         }
         placeholder={
-          props.channel.type === "SavedMessages"
-            ? t("app.main.channel.message_saved")
-            : props.channel.type === "DirectMessage"
-            ? t("app.main.channel.message_who", {
-                person: props.channel.recipient?.username as string,
-              })
-            : t("app.main.channel.message_where", {
-                channel_name: props.channel.name as string,
-              })
+          props.channel.type === 'SavedMessages'
+            ? t('app.main.channel.message_saved')
+            : props.channel.type === 'DirectMessage'
+              ? t('app.main.channel.message_who', {
+                  person: props.channel.recipient?.username as string,
+                })
+              : t('app.main.channel.message_where', {
+                  channel_name: props.channel.name as string,
+                })
         }
-        sendingAllowed={props.channel.havePermission("SendMessage")}
+        sendingAllowed={props.channel.havePermission('SendMessage')}
         autoCompleteConfig={{
           onKeyDown: onKeyDownMessageBox,
           client: client(),
@@ -467,9 +466,9 @@ export function MessageComposition(props: Props) {
                 ),
                 channels: props.channel.server.channels,
               }
-            : props.channel.type === "Group"
-            ? { users: props.channel.recipients, channels: [] }
-            : { channels: [] },
+            : props.channel.type === 'Group'
+              ? { users: props.channel.recipients, channels: [] }
+              : { channels: [] },
         }}
         updateDraftSelection={(start, end) =>
           state.draft.setSelection(props.channel.id, start, end)
diff --git a/packages/client/src/interface/channels/text/MemberSidebar.tsx b/packages/client/src/interface/channels/text/MemberSidebar.tsx
index 79a0324ce..034d0e059 100644
--- a/packages/client/src/interface/channels/text/MemberSidebar.tsx
+++ b/packages/client/src/interface/channels/text/MemberSidebar.tsx
@@ -1,27 +1,25 @@
-import { For, Match, Show, Switch, createMemo, onMount } from "solid-js";
-
-import { VirtualContainer } from "@minht11/solid-virtual-container";
-import { Channel, ServerMember, User } from "revolt.js";
-import { styled } from "styled-system/jsx";
-
-import { floatingUserMenus } from "@revolt/app/menus/UserContextMenu";
-import { useClient } from "@revolt/client";
-import { useTranslation } from "@revolt/i18n";
-import { TextWithEmoji } from "@revolt/markdown";
-import { userInformation } from "@revolt/markdown/users";
+import { VirtualContainer } from '@minht11/solid-virtual-container';
+import { floatingUserMenus } from '@revolt/app/menus/UserContextMenu';
+import { useClient } from '@revolt/client';
+import { useTranslation } from '@revolt/i18n';
+import { TextWithEmoji } from '@revolt/markdown';
+import { userInformation } from '@revolt/markdown/users';
 import {
   Avatar,
   Deferred,
   MenuButton,
   OverflowingText,
   Row,
+  styled as styledLegacy,
   Tooltip,
   Typography,
+  Username,
   UserStatus,
   UserStatusGraphic,
-  Username,
-  styled as styledLegacy,
-} from "@revolt/ui";
+} from '@revolt/ui';
+import type { Channel, ServerMember, User } from 'revolt.js';
+import { createMemo, Match, onMount, Show, Switch } from 'solid-js';
+import { styled } from 'styled-system/jsx';
 
 interface Props {
   /**
@@ -36,10 +34,10 @@ interface Props {
 export function MemberSidebar(props: Props) {
   return (
     <Switch>
-      <Match when={props.channel.type === "Group"}>
+      <Match when={props.channel.type === 'Group'}>
         <GroupMemberSidebar channel={props.channel} />
       </Match>
-      <Match when={props.channel.type === "TextChannel"}>
+      <Match when={props.channel.type === 'TextChannel'}>
         <ServerMemberSidebar channel={props.channel} />
       </Match>
     </Switch>
@@ -49,7 +47,7 @@ export function MemberSidebar(props: Props) {
 /**
  * Servers to not fetch all members for
  */
-const IGNORE_ALL = ["01F7ZSBSFHQ8TA81725KQCSDDP", "01F80118K1F2EYD9XAMCPQ0BCT"];
+const IGNORE_ALL = ['01F7ZSBSFHQ8TA81725KQCSDDP', '01F80118K1F2EYD9XAMCPQ0BCT'];
 
 /**
  * Server Member Sidebar
@@ -82,7 +80,7 @@ export function ServerMemberSidebar(props: Props) {
     const [members] = stage1();
     if (props.channel.potentiallyRestrictedChannel) {
       return members.filter((member) =>
-        member.hasPermission(props.channel, "ViewChannel")
+        member.hasPermission(props.channel, 'ViewChannel')
       );
     } else {
       return members;
@@ -99,7 +97,7 @@ export function ServerMemberSidebar(props: Props) {
 
     for (const member of members) {
       if (!member.user?.online) {
-        byRole["offline"].push(member);
+        byRole['offline'].push(member);
         continue;
       }
 
@@ -116,7 +114,7 @@ export function ServerMemberSidebar(props: Props) {
         if (assigned) continue;
       }
 
-      byRole["default"].push(member);
+      byRole['default'].push(member);
     }
 
     return [
@@ -126,17 +124,17 @@ export function ServerMemberSidebar(props: Props) {
       })),
       {
         role: {
-          id: "default",
-          name: "Online",
+          id: 'default',
+          name: 'Online',
         },
-        members: byRole["default"],
+        members: byRole['default'],
       },
       {
         role: {
-          id: "offline",
-          name: "Offline",
+          id: 'offline',
+          name: 'Offline',
         },
-        members: byRole["offline"],
+        members: byRole['offline'],
       },
     ].filter((entry) => entry.members.length);
   });
@@ -150,7 +148,7 @@ export function ServerMemberSidebar(props: Props) {
       members: [...entry.members].sort(
         (a, b) =>
           (a.nickname ?? a.user?.displayName)?.localeCompare(
-            b.nickname ?? b.user?.displayName ?? ""
+            b.nickname ?? b.user?.displayName ?? ''
           ) || 0
       ),
     }));
@@ -210,15 +208,15 @@ export function ServerMemberSidebar(props: Props) {
     <Base
       ref={scrollTargetElement}
       use:scrollable={{
-        direction: "y",
+        direction: 'y',
         showOnHover: true,
       }}
     >
       <Container>
-        <MemberTitle bottomMargin="yes">
-          <Typography variant="category">
+        <MemberTitle bottomMargin='yes'>
+          <Typography variant='category'>
             <Row align>
-              <UserStatus size="0.7em" status="Online" />
+              <UserStatus size='0.7em' status='Online' />
               {
                 client().serverMembers.filter(
                   (member) =>
@@ -226,7 +224,7 @@ export function ServerMemberSidebar(props: Props) {
                       member.user?.online) ||
                     false
                 ).length
-              }{" "}
+              }{' '}
               members online
             </Row>
           </Typography>
@@ -242,14 +240,14 @@ export function ServerMemberSidebar(props: Props) {
               <div
                 style={{
                   ...item.style,
-                  width: "100%",
+                  width: '100%',
                 }}
               >
                 <Switch
                   fallback={
                     <CategoryTitle>
-                      <Typography variant="category">
-                        {(item.item as { name: string }).name} {"–"}{" "}
+                      <Typography variant='category'>
+                        {(item.item as { name: string }).name} {'–'}{' '}
                         {(item.item as { count: number }).count}
                       </Typography>
                     </CategoryTitle>
@@ -280,13 +278,13 @@ export function GroupMemberSidebar(props: Props) {
     <Base
       ref={scrollTargetElement}
       use:scrollable={{
-        direction: "y",
+        direction: 'y',
         showOnHover: true,
       }}
     >
       <Container>
         <MemberTitle>
-          <Typography variant="category">
+          <Typography variant='category'>
             <Row align>{props.channel.recipientIds.size} members</Row>
           </Typography>
         </MemberTitle>
@@ -303,7 +301,7 @@ export function GroupMemberSidebar(props: Props) {
               <div
                 style={{
                   ...item.style,
-                  width: "100%",
+                  width: '100%',
                 }}
               >
                 <Member user={item.item} />
@@ -322,20 +320,20 @@ export function GroupMemberSidebar(props: Props) {
 const Base = styledLegacy.div`
   flex-shrink: 0;
 
-  width: ${(props) => props.theme!.layout.width["channel-sidebar"]};
-  margin: ${(props) => (props.theme!.gap.md + " ").repeat(3)}0;
+  width: ${(props) => props.theme!.layout.width['channel-sidebar']};
+  margin: ${(props) => (props.theme!.gap.md + ' ').repeat(3)}0;
   margin-top: calc(48px + 2 * ${(props) => props.theme!.gap.md});
   border-radius: ${(props) => props.theme!.borderRadius.lg};
 
-  color: ${({ theme }) => theme!.colours["sidebar-channels-foreground"]};
-  background: ${({ theme }) => theme!.colours["sidebar-channels-background"]};
+  color: ${({ theme }) => theme!.colours['sidebar-channels-foreground']};
+  background: ${({ theme }) => theme!.colours['sidebar-channels-background']};
 `;
 
 /**
  * Container styles
  */
 const Container = styledLegacy.div`
-  width: ${(props) => props.theme!.layout.width["channel-sidebar"]};
+  width: ${(props) => props.theme!.layout.width['channel-sidebar']};
 `;
 
 /**
@@ -348,16 +346,16 @@ const CategoryTitle = styledLegacy.div`
 /**
  * Member title
  */
-const MemberTitle = styled("div", {
+const MemberTitle = styled('div', {
   base: {
-    marginTop: "12px",
-    marginLeft: "14px",
+    marginTop: '12px',
+    marginLeft: '14px',
   },
   variants: {
     bottomMargin: {
       no: {},
       yes: {
-        marginBottom: "-12px",
+        marginBottom: '-12px',
       },
     },
   },
@@ -366,18 +364,19 @@ const MemberTitle = styled("div", {
 /**
  * Styles required to correctly display name and status
  */
-const NameStatusStack = styled("div", {
+const NameStatusStack = styled('div', {
   base: {
-    height: "100%",
+    height: '100%',
 
-    display: "flex",
-    flexDirection: "column",
-    justifyContent: "center",
+    display: 'flex',
+    flexDirection: 'column',
+    justifyContent: 'center',
   },
 });
 
 /**
  * Member
+ * TODO: Type discrimination correctly.
  */
 function Member(props: { user?: User; member?: ServerMember }) {
   const t = useTranslation();
@@ -393,7 +392,7 @@ function Member(props: { user?: User; member?: ServerMember }) {
    */
   const status = () =>
     (props.user ?? props.member?.user)?.statusMessage((presence) =>
-      t(`app.status.${presence.toLowerCase()}`)
+      t(`app.status.${presence.toLowerCase() as Lowercase<typeof presence>}`)
     );
 
   return (
@@ -404,15 +403,15 @@ function Member(props: { user?: User; member?: ServerMember }) {
       )}
     >
       <MenuButton
-        size="normal"
+        size='normal'
         attention={
-          (props.user ?? props.member?.user)?.online ? "active" : "muted"
+          (props.user ?? props.member?.user)?.online ? 'active' : 'muted'
         }
         icon={
           <Avatar
             src={user().avatar}
             size={32}
-            holepunch="bottom-right"
+            holepunch='bottom-right'
             overlay={
               <UserStatusGraphic
                 status={(props.user ?? props.member?.user)?.presence}
@@ -428,11 +427,11 @@ function Member(props: { user?: User; member?: ServerMember }) {
           <Show when={status()}>
             <Tooltip
               content={() => <TextWithEmoji content={status()!} />}
-              placement="top-start"
+              placement='top-start'
               aria={status()!}
             >
               <OverflowingText>
-                <Typography variant="status">
+                <Typography variant='status'>
                   <TextWithEmoji content={status()!} />
                 </Typography>
               </OverflowingText>
diff --git a/packages/client/src/interface/channels/text/TextChannel.tsx b/packages/client/src/interface/channels/text/TextChannel.tsx
index b3863d1a4..fb74454c9 100644
--- a/packages/client/src/interface/channels/text/TextChannel.tsx
+++ b/packages/client/src/interface/channels/text/TextChannel.tsx
@@ -1,23 +1,10 @@
-import {
-  For,
-  Show,
-  createEffect,
-  createSignal,
-  on,
-  onCleanup,
-  onMount,
-} from "solid-js";
-
-import { Message as MessageInterface } from "revolt.js";
-import { decodeTime, ulid } from "ulid";
-
-import { DraftMessages, Message, Messages } from "@revolt/app";
-import { useClient, useUser } from "@revolt/client";
-import { KeybindAction } from "@revolt/keybinds";
-import { userInformation } from "@revolt/markdown/users";
-import { useNavigate, useSmartParams } from "@revolt/routing";
-import { state } from "@revolt/state";
-import { LAYOUT_SECTIONS } from "@revolt/state/stores/Layout";
+import { DraftMessages, Message, Messages } from '@revolt/app';
+import { useClient, useUser } from '@revolt/client';
+import { KeybindAction } from '@revolt/keybinds';
+import { userInformation } from '@revolt/markdown/users';
+import { useNavigate, useSmartParams } from '@revolt/routing';
+import { state } from '@revolt/state';
+import { LAYOUT_SECTIONS } from '@revolt/state/stores/Layout';
 import {
   Avatar,
   BelowFloatingHeader,
@@ -25,17 +12,27 @@ import {
   MessageContainer,
   MessageReply,
   NewMessages,
+  styled,
   TypingIndicator,
   Username,
-  styled,
-} from "@revolt/ui";
-import { useKeybindActions } from "@revolt/ui/components/context/Keybinds";
-
-import { ChannelHeader } from "../ChannelHeader";
-import { ChannelPageProps } from "../ChannelPage";
+} from '@revolt/ui';
+import { useKeybindActions } from '@revolt/ui/components/context/Keybinds';
+import { Message as MessageInterface } from 'revolt.js';
+import {
+  createEffect,
+  createSignal,
+  For,
+  on,
+  onCleanup,
+  onMount,
+  Show,
+} from 'solid-js';
+import { decodeTime, ulid } from 'ulid';
 
-import { MessageComposition } from "./Composition";
-import { MemberSidebar } from "./MemberSidebar";
+import { ChannelHeader } from '../ChannelHeader';
+import type { ChannelPageProps } from '../ChannelPage';
+import { MessageComposition } from './Composition';
+import { MemberSidebar } from './MemberSidebar';
 
 /**
  * Channel component
@@ -122,7 +119,7 @@ export function TextChannel(props: ChannelPageProps) {
 
   return (
     <>
-      <HeaderWithTransparency placement="primary">
+      <HeaderWithTransparency placement='primary'>
         <ChannelHeader channel={props.channel} />
       </HeaderWithTransparency>
       <Content>
@@ -142,7 +139,7 @@ export function TextChannel(props: ChannelPageProps) {
             lastReadId={lastId}
             pendingMessages={<DraftMessages channel={props.channel} />}
             highlightedMessageId={highlightMessageId}
-            clearHighlightedMessage={() => navigate(".")}
+            clearHighlightedMessage={() => navigate('.')}
             atEndRef={(ref) => (atEndRef = ref)}
             jumpToBottomRef={(ref) => (jumpToBottomRef = ref)}
           />
diff --git a/packages/client/src/interface/common/CommonHeader.tsx b/packages/client/src/interface/common/CommonHeader.tsx
index fe8739274..c33a3e5b1 100644
--- a/packages/client/src/interface/common/CommonHeader.tsx
+++ b/packages/client/src/interface/common/CommonHeader.tsx
@@ -1,7 +1,6 @@
-import { BiRegularChevronLeft } from "solid-icons/bi";
-import { JSX } from "solid-js";
-
-import { Row } from "@revolt/ui";
+import { Row } from '@revolt/ui';
+import { BiRegularChevronLeft } from 'solid-icons/bi';
+import type { JSX } from 'solid-js';
 
 /**
  * Wrapper for header icons which adds the chevron on the
@@ -10,7 +9,7 @@ import { Row } from "@revolt/ui";
  */
 export function HeaderIcon(props: { children: JSX.Element }) {
   return (
-    <Row gap="none" align>
+    <Row gap='none' align>
       <BiRegularChevronLeft size={20} />
       {props.children}
     </Row>
diff --git a/packages/client/src/sentry.ts b/packages/client/src/sentry.ts
index 9edd2224c..c8d1b5591 100644
--- a/packages/client/src/sentry.ts
+++ b/packages/client/src/sentry.ts
@@ -1,5 +1,5 @@
-import * as Sentry from "@sentry/browser";
-import { BrowserTracing } from "@sentry/tracing";
+import * as Sentry from '@sentry/browser';
+import { BrowserTracing } from '@sentry/tracing';
 
 if (import.meta.env.PROD && import.meta.env.VITE_SENTRY_DSN) {
   Sentry.init({
@@ -7,7 +7,7 @@ if (import.meta.env.PROD && import.meta.env.VITE_SENTRY_DSN) {
     integrations: [
       new BrowserTracing({
         // Set `tracePropagationTargets` to control for which URLs distributed tracing should be enabled
-        tracePropagationTargets: ["localhost", /^https:\/\/revolt\.chat\/api/],
+        tracePropagationTargets: ['localhost', /^https:\/\/revolt\.chat\/api/],
       }),
     ],
 
diff --git a/packages/client/src/sw.ts b/packages/client/src/sw.ts
index 378cee49d..0683ed07b 100644
--- a/packages/client/src/sw.ts
+++ b/packages/client/src/sw.ts
@@ -1,11 +1,10 @@
-// eslint-disable-next-line
 /// <reference lib="webworker" />
-import { cleanupOutdatedCaches, precacheAndRoute } from "workbox-precaching";
+import { cleanupOutdatedCaches, precacheAndRoute } from 'workbox-precaching';
 
 declare let self: ServiceWorkerGlobalScope;
 
-self.addEventListener("message", (event) => {
-  if (event.data && event.data.type === "SKIP_WAITING") self.skipWaiting();
+self.addEventListener('message', (event) => {
+  if (event.data && event.data.type === 'SKIP_WAITING') self.skipWaiting();
 });
 
 cleanupOutdatedCaches();
@@ -18,12 +17,12 @@ const locale_keys = ["af","am","ar-dz","ar-kw","ar-ly","ar-ma","ar-sa","ar-tn","
 precacheAndRoute(
   self.__WB_MANIFEST.filter((entry) => {
     try {
-      const url = typeof entry === "string" ? entry : entry.url;
-      if (url.includes("-legacy")) return false;
+      const url = typeof entry === 'string' ? entry : entry.url;
+      if (url.includes('-legacy')) return false;
 
-      const fn = url.split("/").pop();
+      const fn = url.split('/').pop();
       if (fn) {
-        if (fn.endsWith("css") && !isNaN(parseInt(fn.substring(0, 3)))) {
+        if (fn.endsWith('css') && !isNaN(parseInt(fn.substring(0, 3)))) {
           return false;
         }
 
diff --git a/packages/client/test/index.tsx b/packages/client/test/index.tsx
index fd64b8843..c364ade52 100644
--- a/packages/client/test/index.tsx
+++ b/packages/client/test/index.tsx
@@ -1,10 +1,8 @@
-import type { JSX } from "solid-js";
-
-import { HashRouter } from "@solidjs/router";
-import { render } from "@solidjs/testing-library";
-
-import i18n, { I18nContext } from "@revolt/i18n";
-import { Masks, ThemeProvider, darkTheme } from "@revolt/ui";
+import i18n, { I18nContext } from '@revolt/i18n';
+import { darkTheme, Masks, ThemeProvider } from '@revolt/ui';
+import { HashRouter } from '@solidjs/router';
+import { render } from '@solidjs/testing-library';
+import type { JSX } from 'solid-js';
 
 /**
  * Inject Context above children
diff --git a/packages/client/vite.config.ts b/packages/client/vite.config.ts
index 1231f5bd5..36985a342 100644
--- a/packages/client/vite.config.ts
+++ b/packages/client/vite.config.ts
@@ -1,16 +1,16 @@
-import devtools from "@solid-devtools/transform";
-import { readdirSync } from "node:fs";
-import { resolve } from "node:path";
-import { defineConfig } from "vite";
-import Inspect from "vite-plugin-inspect";
-import { VitePWA } from "vite-plugin-pwa";
-import solidPlugin from "vite-plugin-solid";
-// @ts-expect-error
-import solidSvg from "vite-plugin-solid-svg";
+import { readdirSync } from 'node:fs';
+import { resolve } from 'node:path';
 
-import codegenPlugin from "./codegen.plugin";
+import devtools from 'solid-devtools/vite';
+import { defineConfig } from 'vite';
+import Inspect from 'vite-plugin-inspect';
+import { VitePWA } from 'vite-plugin-pwa';
+import solidPlugin from 'vite-plugin-solid';
+import solidSvg from 'vite-plugin-solid-svg';
 
-const base = process.env.BASE_PATH ?? "/";
+import codegenPlugin from './codegen.plugin';
+
+const base = process.env.BASE_PATH ?? '/';
 
 export default defineConfig({
   base,
@@ -23,42 +23,42 @@ export default defineConfig({
       defaultAsComponent: false,
     }),
     VitePWA({
-      srcDir: "src",
-      filename: "sw.ts",
-      strategies: "injectManifest",
+      srcDir: 'src',
+      filename: 'sw.ts',
+      strategies: 'injectManifest',
       manifest: {
-        name: "Revolt",
-        short_name: "Revolt",
-        description: "User-first open source chat platform.",
-        categories: ["communication", "chat", "messaging"],
-        start_url: "/pwa",
-        orientation: "portrait",
-        display_override: ["window-controls-overlay"],
-        display: "standalone",
-        background_color: "#101823",
-        theme_color: "#101823",
+        name: 'Revolt',
+        short_name: 'Revolt',
+        description: 'User-first open source chat platform.',
+        categories: ['communication', 'chat', 'messaging'],
+        start_url: '/pwa',
+        orientation: 'portrait',
+        display_override: ['window-controls-overlay'],
+        display: 'standalone',
+        background_color: '#101823',
+        theme_color: '#101823',
         icons: [
           {
             src: `${base}assets/icons/android-chrome-192x192.png`,
-            type: "image/png",
-            sizes: "192x192",
+            type: 'image/png',
+            sizes: '192x192',
           },
           {
             src: `${base}assets/icons/android-chrome-512x512.png`,
-            type: "image/png",
-            sizes: "512x512",
+            type: 'image/png',
+            sizes: '512x512',
           },
           {
             src: `${base}assets/icons/monochrome.svg`,
-            type: "image/svg+xml",
-            sizes: "48x48 72x72 96x96 128x128 256x256",
-            purpose: "monochrome",
+            type: 'image/svg+xml',
+            sizes: '48x48 72x72 96x96 128x128 256x256',
+            purpose: 'monochrome',
           },
           {
             src: `${base}assets/icons/masking-512x512.png`,
-            type: "image/png",
-            sizes: "512x512",
-            purpose: "maskable",
+            type: 'image/png',
+            sizes: '512x512',
+            purpose: 'maskable',
           },
         ],
         // TODO: take advantage of shortcuts
@@ -66,18 +66,21 @@ export default defineConfig({
     }),
   ],
   build: {
-    target: "esnext",
+    target: 'esnext',
+    rollupOptions: {
+      external: ['hast'],
+    },
   },
   optimizeDeps: {
-    exclude: ["solid-styled-components"],
+    exclude: ['solid-styled-components', 'hast'],
   },
   resolve: {
     alias: {
-      "styled-system": resolve(__dirname, "styled-system"),
-      ...readdirSync(resolve(__dirname, "components")).reduce(
+      'styled-system': resolve(__dirname, 'styled-system'),
+      ...readdirSync(resolve(__dirname, 'components')).reduce(
         (p, f) => ({
           ...p,
-          [`@revolt/${f}`]: resolve(__dirname, "components", f),
+          [`@revolt/${f}`]: resolve(__dirname, 'components', f),
         }),
         {}
       ),
diff --git a/packages/client/vitest.config.ts b/packages/client/vitest.config.ts
index 00c37e812..4eb73587b 100644
--- a/packages/client/vitest.config.ts
+++ b/packages/client/vitest.config.ts
@@ -1,20 +1,20 @@
-import { resolve } from "node:path";
-import { defineConfig, mergeConfig } from "vite";
-import solidPlugin from "vite-plugin-solid";
+import { resolve } from 'node:path';
 
-import viteConfig from "./vite.config";
+import { defineConfig, mergeConfig } from 'vite';
+
+import viteConfig from './vite.config';
 
 export default mergeConfig(
   viteConfig,
   defineConfig({
     test: {
       globals: true,
-      environment: "jsdom",
-      setupFiles: ["node_modules/@testing-library/jest-dom/dist/index.js"],
+      environment: 'jsdom',
+      setupFiles: ['node_modules/@testing-library/jest-dom/dist/index.js'],
       testTransformMode: {
-        web: ["/.[jt]sx?$/"],
+        web: ['/.[jt]sx?$/'],
       },
-      pool: "forks",
+      pool: 'forks',
       poolOptions: {
         forks: {
           isolate: false,
@@ -23,23 +23,23 @@ export default mergeConfig(
       deps: {
         optimizer: {
           web: {
-            exclude: ["solid-js"],
+            exclude: ['solid-js'],
           },
         },
       },
       server: {
         deps: {
-          inline: ["solid-icons", "@solid-aria/focus"],
+          inline: ['solid-icons', '@solid-aria/focus'],
         },
       },
       coverage: {
-        reporter: ["text", "json", "html"],
+        reporter: ['text', 'json', 'html'],
       },
     },
     resolve: {
-      conditions: ["development", "browser"],
+      conditions: ['development', 'browser'],
       alias: {
-        "@test": resolve(__dirname, "test"),
+        '@test': resolve(__dirname, 'test'),
       },
     },
   })
diff --git a/packages/desktop/package.json b/packages/desktop/package.json
index d96836f34..84de50a6b 100644
--- a/packages/desktop/package.json
+++ b/packages/desktop/package.json
@@ -6,6 +6,6 @@
     "tauri": "tauri"
   },
   "devDependencies": {
-    "@tauri-apps/cli": "^1.2.3"
+    "@tauri-apps/cli": "^2.0.2"
   }
 }
\ No newline at end of file
diff --git a/packages/desktop/src-tauri/Cargo.lock b/packages/desktop/src-tauri/Cargo.lock
index 1233467d7..63e5198f8 100644
--- a/packages/desktop/src-tauri/Cargo.lock
+++ b/packages/desktop/src-tauri/Cargo.lock
@@ -3,16 +3,25 @@
 version = 3
 
 [[package]]
-name = "adler"
-version = "1.0.2"
+name = "addr2line"
+version = "0.24.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler2"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
 
 [[package]]
 name = "aho-corasick"
-version = "0.7.20"
+version = "1.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
 dependencies = [
  "memchr",
 ]
@@ -32,53 +41,82 @@ dependencies = [
  "alloc-no-stdlib",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "anyhow"
-version = "1.0.70"
+version = "1.0.89"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4"
+checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6"
 
 [[package]]
 name = "atk"
-version = "0.15.1"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd"
+checksum = "b4af014b17dd80e8af9fa689b2d4a211ddba6eb583c1622f35d0cb543f6b17e4"
 dependencies = [
  "atk-sys",
- "bitflags",
  "glib",
  "libc",
 ]
 
 [[package]]
 name = "atk-sys"
-version = "0.15.1"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6"
+checksum = "251e0b7d90e33e0ba930891a505a9a35ece37b2dd37a14f3ffc306c13b980009"
 dependencies = [
  "glib-sys",
  "gobject-sys",
  "libc",
- "system-deps 6.0.4",
+ "system-deps",
 ]
 
 [[package]]
 name = "autocfg"
-version = "1.1.0"
+version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
+
+[[package]]
+name = "backtrace"
+version = "0.3.74"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
+dependencies = [
+ "addr2line",
+ "cfg-if",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+ "windows-targets 0.52.6",
+]
 
 [[package]]
 name = "base64"
-version = "0.13.1"
+version = "0.21.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
 
 [[package]]
 name = "base64"
-version = "0.21.0"
+version = "0.22.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
 
 [[package]]
 name = "bitflags"
@@ -86,6 +124,15 @@ version = "1.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
+[[package]]
+name = "bitflags"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
+dependencies = [
+ "serde",
+]
+
 [[package]]
 name = "block"
 version = "0.1.6"
@@ -101,11 +148,20 @@ dependencies = [
  "generic-array",
 ]
 
+[[package]]
+name = "block2"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f"
+dependencies = [
+ "objc2",
+]
+
 [[package]]
 name = "brotli"
-version = "3.3.4"
+version = "6.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68"
+checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b"
 dependencies = [
  "alloc-no-stdlib",
  "alloc-stdlib",
@@ -114,81 +170,116 @@ dependencies = [
 
 [[package]]
 name = "brotli-decompressor"
-version = "2.3.4"
+version = "4.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744"
+checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362"
 dependencies = [
  "alloc-no-stdlib",
  "alloc-stdlib",
 ]
 
 [[package]]
-name = "bstr"
-version = "1.4.0"
+name = "bumpalo"
+version = "3.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09"
-dependencies = [
- "memchr",
- "serde",
-]
+checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
 
 [[package]]
 name = "bytemuck"
-version = "1.13.1"
+version = "1.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea"
+checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae"
 
 [[package]]
 name = "byteorder"
-version = "1.4.3"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
 
 [[package]]
 name = "bytes"
-version = "1.4.0"
+version = "1.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
+checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3"
+dependencies = [
+ "serde",
+]
 
 [[package]]
 name = "cairo-rs"
-version = "0.15.12"
+version = "0.18.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc"
+checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2"
 dependencies = [
- "bitflags",
+ "bitflags 2.6.0",
  "cairo-sys-rs",
  "glib",
  "libc",
+ "once_cell",
  "thiserror",
 ]
 
 [[package]]
 name = "cairo-sys-rs"
-version = "0.15.1"
+version = "0.18.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8"
+checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51"
 dependencies = [
  "glib-sys",
  "libc",
- "system-deps 6.0.4",
+ "system-deps",
+]
+
+[[package]]
+name = "camino"
+version = "1.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "cargo-platform"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "cargo_metadata"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037"
+dependencies = [
+ "camino",
+ "cargo-platform",
+ "semver",
+ "serde",
+ "serde_json",
+ "thiserror",
 ]
 
 [[package]]
 name = "cargo_toml"
-version = "0.13.3"
+version = "0.17.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "497049e9477329f8f6a559972ee42e117487d01d1e8c2cc9f836ea6fa23a9e1a"
+checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719"
 dependencies = [
  "serde",
- "toml 0.5.11",
+ "toml 0.8.2",
 ]
 
 [[package]]
 name = "cc"
-version = "1.0.79"
+version = "1.1.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1"
+dependencies = [
+ "shlex",
+]
 
 [[package]]
 name = "cesu8"
@@ -198,49 +289,77 @@ checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
 
 [[package]]
 name = "cfb"
-version = "0.6.1"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74f89d248799e3f15f91b70917f65381062a01bb8e222700ea0e5a7ff9785f9c"
+checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f"
 dependencies = [
  "byteorder",
- "uuid 0.8.2",
+ "fnv",
+ "uuid",
 ]
 
 [[package]]
 name = "cfg-expr"
-version = "0.9.1"
+version = "0.15.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7"
+checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02"
 dependencies = [
  "smallvec",
+ "target-lexicon",
 ]
 
 [[package]]
-name = "cfg-expr"
-version = "0.14.0"
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "cfg_aliases"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
+
+[[package]]
+name = "chrono"
+version = "0.4.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a35b255461940a32985c627ce82900867c61db1659764d3675ea81963f72a4c6"
+checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
 dependencies = [
- "smallvec",
+ "android-tzdata",
+ "iana-time-zone",
+ "num-traits",
+ "serde",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
-name = "cfg-if"
-version = "1.0.0"
+name = "cocoa"
+version = "0.25.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c"
+dependencies = [
+ "bitflags 1.3.2",
+ "block",
+ "cocoa-foundation 0.1.2",
+ "core-foundation 0.9.4",
+ "core-graphics 0.23.2",
+ "foreign-types",
+ "libc",
+ "objc",
+]
 
 [[package]]
 name = "cocoa"
-version = "0.24.1"
+version = "0.26.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a"
+checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2"
 dependencies = [
- "bitflags",
+ "bitflags 2.6.0",
  "block",
- "cocoa-foundation",
- "core-foundation",
- "core-graphics",
+ "cocoa-foundation 0.2.0",
+ "core-foundation 0.10.0",
+ "core-graphics 0.24.0",
  "foreign-types",
  "libc",
  "objc",
@@ -248,30 +367,37 @@ dependencies = [
 
 [[package]]
 name = "cocoa-foundation"
-version = "0.1.1"
+version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6"
+checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "block",
- "core-foundation",
- "core-graphics-types",
- "foreign-types",
+ "core-foundation 0.9.4",
+ "core-graphics-types 0.1.3",
  "libc",
  "objc",
 ]
 
 [[package]]
-name = "color_quant"
-version = "1.1.0"
+name = "cocoa-foundation"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
+checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d"
+dependencies = [
+ "bitflags 2.6.0",
+ "block",
+ "core-foundation 0.10.0",
+ "core-graphics-types 0.2.0",
+ "libc",
+ "objc",
+]
 
 [[package]]
 name = "combine"
-version = "4.6.6"
+version = "4.6.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4"
+checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
 dependencies = [
  "bytes",
  "memchr",
@@ -285,9 +411,19 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
 
 [[package]]
 name = "core-foundation"
-version = "0.9.3"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63"
 dependencies = [
  "core-foundation-sys",
  "libc",
@@ -295,71 +431,90 @@ dependencies = [
 
 [[package]]
 name = "core-foundation-sys"
-version = "0.8.3"
+version = "0.8.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
 
 [[package]]
 name = "core-graphics"
-version = "0.22.3"
+version = "0.23.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb"
+checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081"
 dependencies = [
- "bitflags",
- "core-foundation",
- "core-graphics-types",
+ "bitflags 1.3.2",
+ "core-foundation 0.9.4",
+ "core-graphics-types 0.1.3",
  "foreign-types",
  "libc",
 ]
 
 [[package]]
-name = "core-graphics-types"
-version = "0.1.1"
+name = "core-graphics"
+version = "0.24.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b"
+checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1"
 dependencies = [
- "bitflags",
- "core-foundation",
+ "bitflags 2.6.0",
+ "core-foundation 0.10.0",
+ "core-graphics-types 0.2.0",
  "foreign-types",
  "libc",
 ]
 
+[[package]]
+name = "core-graphics-types"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation 0.9.4",
+ "libc",
+]
+
+[[package]]
+name = "core-graphics-types"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb"
+dependencies = [
+ "bitflags 2.6.0",
+ "core-foundation 0.10.0",
+ "libc",
+]
+
 [[package]]
 name = "cpufeatures"
-version = "0.2.6"
+version = "0.2.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181"
+checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0"
 dependencies = [
  "libc",
 ]
 
 [[package]]
 name = "crc32fast"
-version = "1.3.2"
+version = "1.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
 dependencies = [
  "cfg-if",
 ]
 
 [[package]]
 name = "crossbeam-channel"
-version = "0.5.7"
+version = "0.5.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c"
+checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2"
 dependencies = [
- "cfg-if",
  "crossbeam-utils",
 ]
 
 [[package]]
 name = "crossbeam-utils"
-version = "0.8.15"
+version = "0.8.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
-dependencies = [
- "cfg-if",
-]
+checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
 
 [[package]]
 name = "crypto-common"
@@ -390,29 +545,29 @@ dependencies = [
 
 [[package]]
 name = "cssparser-macros"
-version = "0.6.0"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e"
+checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
 dependencies = [
  "quote",
- "syn 1.0.109",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "ctor"
-version = "0.1.26"
+version = "0.2.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096"
+checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f"
 dependencies = [
  "quote",
- "syn 1.0.109",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "darling"
-version = "0.13.4"
+version = "0.20.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c"
+checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989"
 dependencies = [
  "darling_core",
  "darling_macro",
@@ -420,71 +575,81 @@ dependencies = [
 
 [[package]]
 name = "darling_core"
-version = "0.13.4"
+version = "0.20.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610"
+checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5"
 dependencies = [
  "fnv",
  "ident_case",
  "proc-macro2",
  "quote",
  "strsim",
- "syn 1.0.109",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "darling_macro"
-version = "0.13.4"
+version = "0.20.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835"
+checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
 dependencies = [
  "darling_core",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.79",
+]
+
+[[package]]
+name = "deranged"
+version = "0.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
+dependencies = [
+ "powerfmt",
+ "serde",
 ]
 
 [[package]]
 name = "derive_more"
-version = "0.99.17"
+version = "0.99.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
+checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce"
 dependencies = [
  "convert_case",
  "proc-macro2",
  "quote",
  "rustc_version",
- "syn 1.0.109",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "digest"
-version = "0.10.6"
+version = "0.10.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
 dependencies = [
  "block-buffer",
  "crypto-common",
 ]
 
 [[package]]
-name = "dirs-next"
-version = "2.0.0"
+name = "dirs"
+version = "5.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
+checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
 dependencies = [
- "cfg-if",
- "dirs-sys-next",
+ "dirs-sys",
 ]
 
 [[package]]
-name = "dirs-sys-next"
-version = "0.1.2"
+name = "dirs-sys"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
+checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"
 dependencies = [
  "libc",
+ "option-ext",
  "redox_users",
- "winapi",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -493,26 +658,78 @@ version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
 
+[[package]]
+name = "dlopen2"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6"
+dependencies = [
+ "dlopen2_derive",
+ "libc",
+ "once_cell",
+ "winapi",
+]
+
+[[package]]
+name = "dlopen2_derive"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
+]
+
+[[package]]
+name = "dpi"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53"
+dependencies = [
+ "serde",
+]
+
 [[package]]
 name = "dtoa"
-version = "0.4.8"
+version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
+checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653"
 
 [[package]]
 name = "dtoa-short"
-version = "0.3.3"
+version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6"
+checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87"
 dependencies = [
  "dtoa",
 ]
 
 [[package]]
 name = "dunce"
-version = "1.0.3"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
+
+[[package]]
+name = "dyn-clone"
+version = "1.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125"
+
+[[package]]
+name = "embed-resource"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c"
+checksum = "f4e24052d7be71f0efb50c201557f6fe7d237cfd5a64fd5bcd7fd8fe32dbbffa"
+dependencies = [
+ "cc",
+ "memchr",
+ "rustc_version",
+ "toml 0.8.2",
+ "vswhom",
+ "winreg",
+]
 
 [[package]]
 name = "embed_plist"
@@ -522,73 +739,65 @@ checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
 
 [[package]]
 name = "encoding_rs"
-version = "0.8.32"
+version = "0.8.34"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394"
+checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59"
 dependencies = [
  "cfg-if",
 ]
 
 [[package]]
-name = "errno"
-version = "0.3.0"
+name = "equivalent"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0"
-dependencies = [
- "errno-dragonfly",
- "libc",
- "windows-sys 0.45.0",
-]
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
 [[package]]
-name = "errno-dragonfly"
-version = "0.1.2"
+name = "erased-serde"
+version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d"
 dependencies = [
- "cc",
- "libc",
+ "serde",
+ "typeid",
 ]
 
 [[package]]
-name = "fastrand"
-version = "1.9.0"
+name = "fdeflate"
+version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab"
 dependencies = [
- "instant",
+ "simd-adler32",
 ]
 
 [[package]]
 name = "field-offset"
-version = "0.3.5"
+version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3cf3a800ff6e860c863ca6d4b16fd999db8b752819c1606884047b73e468535"
+checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f"
 dependencies = [
  "memoffset",
  "rustc_version",
 ]
 
 [[package]]
-name = "filetime"
-version = "0.2.20"
+name = "flate2"
+version = "1.0.34"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412"
+checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0"
 dependencies = [
- "cfg-if",
- "libc",
- "redox_syscall 0.2.16",
- "windows-sys 0.45.0",
+ "crc32fast",
+ "miniz_oxide",
 ]
 
 [[package]]
-name = "flate2"
-version = "1.0.25"
+name = "fluent-uri"
+version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841"
+checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d"
 dependencies = [
- "crc32fast",
- "miniz_oxide",
+ "bitflags 1.3.2",
 ]
 
 [[package]]
@@ -599,24 +808,36 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
 
 [[package]]
 name = "foreign-types"
-version = "0.3.2"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
 dependencies = [
+ "foreign-types-macros",
  "foreign-types-shared",
 ]
 
+[[package]]
+name = "foreign-types-macros"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
+]
+
 [[package]]
 name = "foreign-types-shared"
-version = "0.1.1"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
 
 [[package]]
 name = "form_urlencoded"
-version = "1.1.0"
+version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
+checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
 dependencies = [
  "percent-encoding",
 ]
@@ -633,24 +854,24 @@ dependencies = [
 
 [[package]]
 name = "futures-channel"
-version = "0.3.28"
+version = "0.3.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
+checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
 dependencies = [
  "futures-core",
 ]
 
 [[package]]
 name = "futures-core"
-version = "0.3.28"
+version = "0.3.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
+checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
 
 [[package]]
 name = "futures-executor"
-version = "0.3.28"
+version = "0.3.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
+checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
 dependencies = [
  "futures-core",
  "futures-task",
@@ -659,36 +880,45 @@ dependencies = [
 
 [[package]]
 name = "futures-io"
-version = "0.3.28"
+version = "0.3.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
+checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
 
 [[package]]
 name = "futures-macro"
-version = "0.3.28"
+version = "0.3.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
+checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.12",
+ "syn 2.0.79",
 ]
 
+[[package]]
+name = "futures-sink"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
+
 [[package]]
 name = "futures-task"
-version = "0.3.28"
+version = "0.3.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
+checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
 
 [[package]]
 name = "futures-util"
-version = "0.3.28"
+version = "0.3.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
+checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
 dependencies = [
  "futures-core",
+ "futures-io",
  "futures-macro",
+ "futures-sink",
  "futures-task",
+ "memchr",
  "pin-project-lite",
  "pin-utils",
  "slab",
@@ -705,11 +935,10 @@ dependencies = [
 
 [[package]]
 name = "gdk"
-version = "0.15.4"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8"
+checksum = "f5ba081bdef3b75ebcdbfc953699ed2d7417d6bd853347a42a37d76406a33646"
 dependencies = [
- "bitflags",
  "cairo-rs",
  "gdk-pixbuf",
  "gdk-sys",
@@ -721,35 +950,35 @@ dependencies = [
 
 [[package]]
 name = "gdk-pixbuf"
-version = "0.15.11"
+version = "0.18.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a"
+checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec"
 dependencies = [
- "bitflags",
  "gdk-pixbuf-sys",
  "gio",
  "glib",
  "libc",
+ "once_cell",
 ]
 
 [[package]]
 name = "gdk-pixbuf-sys"
-version = "0.15.10"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7"
+checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7"
 dependencies = [
  "gio-sys",
  "glib-sys",
  "gobject-sys",
  "libc",
- "system-deps 6.0.4",
+ "system-deps",
 ]
 
 [[package]]
 name = "gdk-sys"
-version = "0.15.1"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88"
+checksum = "31ff856cb3386dae1703a920f803abafcc580e9b5f711ca62ed1620c25b51ff2"
 dependencies = [
  "cairo-sys-rs",
  "gdk-pixbuf-sys",
@@ -759,33 +988,48 @@ dependencies = [
  "libc",
  "pango-sys",
  "pkg-config",
- "system-deps 6.0.4",
+ "system-deps",
 ]
 
 [[package]]
-name = "gdkx11-sys"
-version = "0.15.1"
+name = "gdkwayland-sys"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178"
+checksum = "a90fbf5c033c65d93792192a49a8efb5bb1e640c419682a58bb96f5ae77f3d4a"
 dependencies = [
  "gdk-sys",
  "glib-sys",
+ "gobject-sys",
+ "libc",
+ "pkg-config",
+ "system-deps",
+]
+
+[[package]]
+name = "gdkx11"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db2ea8a4909d530f79921290389cbd7c34cb9d623bfe970eaae65ca5f9cd9cce"
+dependencies = [
+ "gdk",
+ "gdkx11-sys",
+ "gio",
+ "glib",
  "libc",
- "system-deps 6.0.4",
  "x11",
 ]
 
 [[package]]
-name = "generator"
-version = "0.7.3"
+name = "gdkx11-sys"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33a20a288a94683f5f4da0adecdbe095c94a77c295e514cc6484e9394dd8376e"
+checksum = "fee8f00f4ee46cad2939b8990f5c70c94ff882c3028f3cc5abf950fa4ab53043"
 dependencies = [
- "cc",
+ "gdk-sys",
+ "glib-sys",
  "libc",
- "log",
- "rustversion",
- "windows 0.44.0",
+ "system-deps",
+ "x11",
 ]
 
 [[package]]
@@ -811,60 +1055,71 @@ dependencies = [
 
 [[package]]
 name = "getrandom"
-version = "0.2.8"
+version = "0.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
 dependencies = [
  "cfg-if",
  "libc",
  "wasi 0.11.0+wasi-snapshot-preview1",
 ]
 
+[[package]]
+name = "gimli"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
+
 [[package]]
 name = "gio"
-version = "0.15.12"
+version = "0.18.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b"
+checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73"
 dependencies = [
- "bitflags",
  "futures-channel",
  "futures-core",
  "futures-io",
+ "futures-util",
  "gio-sys",
  "glib",
  "libc",
  "once_cell",
+ "pin-project-lite",
+ "smallvec",
  "thiserror",
 ]
 
 [[package]]
 name = "gio-sys"
-version = "0.15.10"
+version = "0.18.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d"
+checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2"
 dependencies = [
  "glib-sys",
  "gobject-sys",
  "libc",
- "system-deps 6.0.4",
+ "system-deps",
  "winapi",
 ]
 
 [[package]]
 name = "glib"
-version = "0.15.12"
+version = "0.18.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d"
+checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5"
 dependencies = [
- "bitflags",
+ "bitflags 2.6.0",
  "futures-channel",
  "futures-core",
  "futures-executor",
  "futures-task",
+ "futures-util",
+ "gio-sys",
  "glib-macros",
  "glib-sys",
  "gobject-sys",
  "libc",
+ "memchr",
  "once_cell",
  "smallvec",
  "thiserror",
@@ -872,27 +1127,26 @@ dependencies = [
 
 [[package]]
 name = "glib-macros"
-version = "0.15.13"
+version = "0.18.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a"
+checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc"
 dependencies = [
- "anyhow",
  "heck 0.4.1",
- "proc-macro-crate",
+ "proc-macro-crate 2.0.2",
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "glib-sys"
-version = "0.15.10"
+version = "0.18.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4"
+checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898"
 dependencies = [
  "libc",
- "system-deps 6.0.4",
+ "system-deps",
 ]
 
 [[package]]
@@ -901,38 +1155,24 @@ version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
 
-[[package]]
-name = "globset"
-version = "0.4.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc"
-dependencies = [
- "aho-corasick",
- "bstr",
- "fnv",
- "log",
- "regex",
-]
-
 [[package]]
 name = "gobject-sys"
-version = "0.15.10"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a"
+checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44"
 dependencies = [
  "glib-sys",
  "libc",
- "system-deps 6.0.4",
+ "system-deps",
 ]
 
 [[package]]
 name = "gtk"
-version = "0.15.5"
+version = "0.18.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0"
+checksum = "93c4f5e0e20b60e10631a5f06da7fe3dda744b05ad0ea71fee2f47adf865890c"
 dependencies = [
  "atk",
- "bitflags",
  "cairo-rs",
  "field-offset",
  "futures-channel",
@@ -943,16 +1183,15 @@ dependencies = [
  "gtk-sys",
  "gtk3-macros",
  "libc",
- "once_cell",
  "pango",
  "pkg-config",
 ]
 
 [[package]]
 name = "gtk-sys"
-version = "0.15.3"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84"
+checksum = "771437bf1de2c1c0b496c11505bdf748e26066bbe942dfc8f614c9460f6d7722"
 dependencies = [
  "atk-sys",
  "cairo-sys-rs",
@@ -963,21 +1202,20 @@ dependencies = [
  "gobject-sys",
  "libc",
  "pango-sys",
- "system-deps 6.0.4",
+ "system-deps",
 ]
 
 [[package]]
 name = "gtk3-macros"
-version = "0.15.6"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d"
+checksum = "c6063efb63db582968fb7df72e1ae68aa6360dcfb0a75143f34fc7d616bad75e"
 dependencies = [
- "anyhow",
- "proc-macro-crate",
+ "proc-macro-crate 1.3.1",
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -987,13 +1225,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
 
 [[package]]
-name = "heck"
-version = "0.3.3"
+name = "hashbrown"
+version = "0.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
-dependencies = [
- "unicode-segmentation",
-]
+checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb"
 
 [[package]]
 name = "heck"
@@ -1002,25 +1237,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
 
 [[package]]
-name = "hermit-abi"
-version = "0.2.6"
+name = "heck"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
-dependencies = [
- "libc",
-]
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
 
 [[package]]
 name = "hermit-abi"
-version = "0.3.1"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
 
 [[package]]
 name = "html5ever"
-version = "0.25.2"
+version = "0.26.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148"
+checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7"
 dependencies = [
  "log",
  "mac",
@@ -1032,76 +1270,129 @@ dependencies = [
 
 [[package]]
 name = "http"
-version = "0.2.9"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258"
 dependencies = [
  "bytes",
  "fnv",
- "itoa 1.0.6",
+ "itoa 1.0.11",
 ]
 
 [[package]]
-name = "http-range"
-version = "0.1.5"
+name = "http-body"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573"
+checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
+dependencies = [
+ "bytes",
+ "http",
+]
 
 [[package]]
-name = "ico"
-version = "0.2.0"
+name = "http-body-util"
+version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "031530fe562d8c8d71c0635013d6d155bbfe8ba0aa4b4d2d24ce8af6b71047bd"
+checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
 dependencies = [
- "byteorder",
- "png",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "pin-project-lite",
 ]
 
 [[package]]
-name = "ident_case"
-version = "1.0.1"
+name = "httparse"
+version = "1.9.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946"
 
 [[package]]
-name = "idna"
-version = "0.3.0"
+name = "hyper"
+version = "1.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
+checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05"
 dependencies = [
- "unicode-bidi",
- "unicode-normalization",
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http",
+ "http-body",
+ "httparse",
+ "itoa 1.0.11",
+ "pin-project-lite",
+ "smallvec",
+ "tokio",
+ "want",
 ]
 
 [[package]]
-name = "ignore"
-version = "0.4.18"
+name = "hyper-util"
+version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d"
+checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b"
 dependencies = [
- "crossbeam-utils",
- "globset",
- "lazy_static",
- "log",
- "memchr",
- "regex",
- "same-file",
- "thread_local",
- "walkdir",
- "winapi-util",
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
 ]
 
 [[package]]
-name = "image"
-version = "0.24.6"
+name = "iana-time-zone"
+version = "0.1.61"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core 0.52.0",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "ico"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae"
 dependencies = [
- "bytemuck",
  "byteorder",
- "color_quant",
- "num-rational",
- "num-traits",
+ "png",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "idna"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
 ]
 
 [[package]]
@@ -1111,36 +1402,62 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
 dependencies = [
  "autocfg",
- "hashbrown",
+ "hashbrown 0.12.3",
+ "serde",
+]
+
+[[package]]
+name = "indexmap"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.15.0",
+ "serde",
 ]
 
 [[package]]
 name = "infer"
-version = "0.7.0"
+version = "0.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20b2b533137b9cad970793453d4f921c2e91312a6d88b1085c07bc15fc51bb3b"
+checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847"
 dependencies = [
  "cfb",
 ]
 
 [[package]]
 name = "instant"
-version = "0.1.12"
+version = "0.1.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
 dependencies = [
  "cfg-if",
 ]
 
 [[package]]
-name = "io-lifetimes"
-version = "1.0.9"
+name = "ipnet"
+version = "2.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708"
+
+[[package]]
+name = "is-docker"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb"
+checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3"
 dependencies = [
- "hermit-abi 0.3.1",
- "libc",
- "windows-sys 0.45.0",
+ "once_cell",
+]
+
+[[package]]
+name = "is-wsl"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5"
+dependencies = [
+ "is-docker",
+ "once_cell",
 ]
 
 [[package]]
@@ -1151,45 +1468,47 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
 
 [[package]]
 name = "itoa"
-version = "1.0.6"
+version = "1.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
 
 [[package]]
 name = "javascriptcore-rs"
-version = "0.16.0"
+version = "1.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c"
+checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "glib",
  "javascriptcore-rs-sys",
 ]
 
 [[package]]
 name = "javascriptcore-rs-sys"
-version = "0.4.0"
+version = "1.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c"
+checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124"
 dependencies = [
  "glib-sys",
  "gobject-sys",
  "libc",
- "system-deps 5.0.0",
+ "system-deps",
 ]
 
 [[package]]
 name = "jni"
-version = "0.20.0"
+version = "0.21.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c"
+checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
 dependencies = [
  "cesu8",
+ "cfg-if",
  "combine",
  "jni-sys",
  "log",
  "thiserror",
  "walkdir",
+ "windows-sys 0.45.0",
 ]
 
 [[package]]
@@ -1198,40 +1517,73 @@ version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
 
+[[package]]
+name = "js-sys"
+version = "0.3.70"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a"
+dependencies = [
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json-patch"
-version = "0.2.7"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc"
+dependencies = [
+ "jsonptr",
+ "serde",
+ "serde_json",
+ "thiserror",
+]
+
+[[package]]
+name = "jsonptr"
+version = "0.4.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb3fa5a61630976fc4c353c70297f2e93f1930e3ccee574d59d618ccbd5154ce"
+checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627"
 dependencies = [
+ "fluent-uri",
  "serde",
  "serde_json",
- "treediff",
 ]
 
 [[package]]
-name = "kuchiki"
-version = "0.8.1"
+name = "keyboard-types"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a"
+dependencies = [
+ "bitflags 2.6.0",
+ "serde",
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "kuchikiki"
+version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358"
+checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8"
 dependencies = [
  "cssparser",
  "html5ever",
+ "indexmap 1.9.3",
  "matches",
  "selectors",
 ]
 
 [[package]]
 name = "lazy_static"
-version = "1.4.0"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
 
 [[package]]
 name = "libappindicator"
-version = "0.7.1"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db2d3cb96d092b4824cb306c9e544c856a4cb6210c1081945187f7f1924b47e8"
+checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a"
 dependencies = [
  "glib",
  "gtk",
@@ -1242,9 +1594,9 @@ dependencies = [
 
 [[package]]
 name = "libappindicator-sys"
-version = "0.7.3"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1b3b6681973cea8cc3bce7391e6d7d5502720b80a581c9a95c9cbaf592826aa"
+checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf"
 dependencies = [
  "gtk-sys",
  "libloading",
@@ -1253,9 +1605,9 @@ dependencies = [
 
 [[package]]
 name = "libc"
-version = "0.2.140"
+version = "0.2.159"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c"
+checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5"
 
 [[package]]
 name = "libloading"
@@ -1268,25 +1620,20 @@ dependencies = [
 ]
 
 [[package]]
-name = "line-wrap"
-version = "0.1.1"
+name = "libredox"
+version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
+checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
 dependencies = [
- "safemem",
+ "bitflags 2.6.0",
+ "libc",
 ]
 
-[[package]]
-name = "linux-raw-sys"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f"
-
 [[package]]
 name = "lock_api"
-version = "0.4.9"
+version = "0.4.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
+checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
 dependencies = [
  "autocfg",
  "scopeguard",
@@ -1294,27 +1641,9 @@ dependencies = [
 
 [[package]]
 name = "log"
-version = "0.4.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "loom"
-version = "0.5.6"
+version = "0.4.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5"
-dependencies = [
- "cfg-if",
- "generator",
- "scoped-tls",
- "serde",
- "serde_json",
- "tracing",
- "tracing-subscriber",
-]
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
 
 [[package]]
 name = "mac"
@@ -1333,27 +1662,18 @@ dependencies = [
 
 [[package]]
 name = "markup5ever"
-version = "0.10.1"
+version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd"
+checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016"
 dependencies = [
  "log",
- "phf 0.8.0",
- "phf_codegen",
+ "phf 0.10.1",
+ "phf_codegen 0.10.0",
  "string_cache",
  "string_cache_codegen",
  "tendril",
 ]
 
-[[package]]
-name = "matchers"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
-dependencies = [
- "regex-automata",
-]
-
 [[package]]
 name = "matches"
 version = "0.1.10"
@@ -1362,61 +1682,102 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
 
 [[package]]
 name = "memchr"
-version = "2.5.0"
+version = "2.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
 
 [[package]]
 name = "memoffset"
-version = "0.8.0"
+version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
 dependencies = [
  "autocfg",
 ]
 
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
 [[package]]
 name = "miniz_oxide"
-version = "0.6.2"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
+checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
 dependencies = [
- "adler",
+ "adler2",
+ "simd-adler32",
 ]
 
 [[package]]
-name = "ndk"
-version = "0.6.0"
+name = "mio"
+version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4"
+checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
 dependencies = [
- "bitflags",
- "jni-sys",
- "ndk-sys",
- "num_enum",
- "thiserror",
+ "hermit-abi",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
-name = "ndk-context"
+name = "muda"
+version = "0.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8123dfd4996055ac9b15a60ad263b44b01e539007523ad7a4a533a3d93b0591"
+dependencies = [
+ "crossbeam-channel",
+ "dpi",
+ "gtk",
+ "keyboard-types",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "once_cell",
+ "png",
+ "serde",
+ "thiserror",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "ndk"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4"
+dependencies = [
+ "bitflags 2.6.0",
+ "jni-sys",
+ "log",
+ "ndk-sys",
+ "num_enum",
+ "raw-window-handle 0.6.2",
+ "thiserror",
+]
+
+[[package]]
+name = "ndk-context"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
 
 [[package]]
 name = "ndk-sys"
-version = "0.3.0"
+version = "0.6.0+11769913"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97"
+checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873"
 dependencies = [
  "jni-sys",
 ]
 
 [[package]]
 name = "new_debug_unreachable"
-version = "1.0.4"
+version = "1.0.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
+checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
 
 [[package]]
 name = "nodrop"
@@ -1425,84 +1786,148 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
 
 [[package]]
-name = "nu-ansi-term"
-version = "0.46.0"
+name = "num-conv"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
+
+[[package]]
+name = "num-traits"
+version = "0.2.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_enum"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179"
 dependencies = [
- "overload",
- "winapi",
+ "num_enum_derive",
 ]
 
 [[package]]
-name = "num-integer"
-version = "0.1.45"
+name = "num_enum_derive"
+version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
 dependencies = [
- "autocfg",
- "num-traits",
+ "proc-macro-crate 1.3.1",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
 ]
 
 [[package]]
-name = "num-rational"
-version = "0.4.1"
+name = "objc"
+version = "0.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
+checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
 dependencies = [
- "autocfg",
- "num-integer",
- "num-traits",
+ "malloc_buf",
+ "objc_exception",
 ]
 
 [[package]]
-name = "num-traits"
-version = "0.2.15"
+name = "objc-sys"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
+
+[[package]]
+name = "objc2"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804"
 dependencies = [
- "autocfg",
+ "objc-sys",
+ "objc2-encode",
 ]
 
 [[package]]
-name = "num_cpus"
-version = "1.15.0"
+name = "objc2-app-kit"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
+checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff"
 dependencies = [
- "hermit-abi 0.2.6",
+ "bitflags 2.6.0",
+ "block2",
  "libc",
+ "objc2",
+ "objc2-core-data",
+ "objc2-core-image",
+ "objc2-foundation",
+ "objc2-quartz-core",
 ]
 
 [[package]]
-name = "num_enum"
-version = "0.5.11"
+name = "objc2-core-data"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9"
+checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef"
 dependencies = [
- "num_enum_derive",
+ "bitflags 2.6.0",
+ "block2",
+ "objc2",
+ "objc2-foundation",
 ]
 
 [[package]]
-name = "num_enum_derive"
-version = "0.5.11"
+name = "objc2-core-image"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799"
+checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80"
 dependencies = [
- "proc-macro-crate",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
+ "block2",
+ "objc2",
+ "objc2-foundation",
+ "objc2-metal",
 ]
 
 [[package]]
-name = "objc"
-version = "0.2.7"
+name = "objc2-encode"
+version = "4.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
+checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8"
+
+[[package]]
+name = "objc2-foundation"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"
 dependencies = [
- "malloc_buf",
- "objc_exception",
+ "bitflags 2.6.0",
+ "block2",
+ "libc",
+ "objc2",
+]
+
+[[package]]
+name = "objc2-metal"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"
+dependencies = [
+ "bitflags 2.6.0",
+ "block2",
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-quartz-core"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"
+dependencies = [
+ "bitflags 2.6.0",
+ "block2",
+ "objc2",
+ "objc2-foundation",
+ "objc2-metal",
 ]
 
 [[package]]
@@ -1523,35 +1948,55 @@ dependencies = [
  "objc",
 ]
 
+[[package]]
+name = "object"
+version = "0.36.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e"
+dependencies = [
+ "memchr",
+]
+
 [[package]]
 name = "once_cell"
-version = "1.17.1"
+version = "1.20.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
+checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
 
 [[package]]
 name = "open"
-version = "3.2.0"
+version = "5.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8"
+checksum = "61a877bf6abd716642a53ef1b89fb498923a4afca5c754f9050b4d081c05c4b3"
 dependencies = [
+ "is-wsl",
+ "libc",
  "pathdiff",
- "windows-sys 0.42.0",
 ]
 
 [[package]]
-name = "overload"
-version = "0.1.1"
+name = "option-ext"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
+
+[[package]]
+name = "os_pipe"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982"
+dependencies = [
+ "libc",
+ "windows-sys 0.59.0",
+]
 
 [[package]]
 name = "pango"
-version = "0.15.10"
+version = "0.18.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f"
+checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4"
 dependencies = [
- "bitflags",
+ "gio",
  "glib",
  "libc",
  "once_cell",
@@ -1560,21 +2005,21 @@ dependencies = [
 
 [[package]]
 name = "pango-sys"
-version = "0.15.10"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa"
+checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5"
 dependencies = [
  "glib-sys",
  "gobject-sys",
  "libc",
- "system-deps 6.0.4",
+ "system-deps",
 ]
 
 [[package]]
 name = "parking_lot"
-version = "0.12.1"
+version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
 dependencies = [
  "lock_api",
  "parking_lot_core",
@@ -1582,23 +2027,17 @@ dependencies = [
 
 [[package]]
 name = "parking_lot_core"
-version = "0.9.7"
+version = "0.9.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
+checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
 dependencies = [
  "cfg-if",
  "libc",
- "redox_syscall 0.2.16",
+ "redox_syscall",
  "smallvec",
- "windows-sys 0.45.0",
+ "windows-targets 0.52.6",
 ]
 
-[[package]]
-name = "paste"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79"
-
 [[package]]
 name = "pathdiff"
 version = "0.2.1"
@@ -1607,9 +2046,9 @@ checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd"
 
 [[package]]
 name = "percent-encoding"
-version = "2.2.0"
+version = "2.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
 
 [[package]]
 name = "phf"
@@ -1628,9 +2067,17 @@ version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
 dependencies = [
- "phf_macros 0.10.0",
  "phf_shared 0.10.0",
- "proc-macro-hack",
+]
+
+[[package]]
+name = "phf"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
+dependencies = [
+ "phf_macros 0.11.2",
+ "phf_shared 0.11.2",
 ]
 
 [[package]]
@@ -1643,6 +2090,16 @@ dependencies = [
  "phf_shared 0.8.0",
 ]
 
+[[package]]
+name = "phf_codegen"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd"
+dependencies = [
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
+]
+
 [[package]]
 name = "phf_generator"
 version = "0.8.0"
@@ -1663,6 +2120,16 @@ dependencies = [
  "rand 0.8.5",
 ]
 
+[[package]]
+name = "phf_generator"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
+dependencies = [
+ "phf_shared 0.11.2",
+ "rand 0.8.5",
+]
+
 [[package]]
 name = "phf_macros"
 version = "0.8.0"
@@ -1679,16 +2146,15 @@ dependencies = [
 
 [[package]]
 name = "phf_macros"
-version = "0.10.0"
+version = "0.11.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0"
+checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b"
 dependencies = [
- "phf_generator 0.10.0",
- "phf_shared 0.10.0",
- "proc-macro-hack",
+ "phf_generator 0.11.2",
+ "phf_shared 0.11.2",
  "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -1709,11 +2175,20 @@ dependencies = [
  "siphasher",
 ]
 
+[[package]]
+name = "phf_shared"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
+dependencies = [
+ "siphasher",
+]
+
 [[package]]
 name = "pin-project-lite"
-version = "0.2.9"
+version = "0.2.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
 
 [[package]]
 name = "pin-utils"
@@ -1723,19 +2198,18 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
 
 [[package]]
 name = "pkg-config"
-version = "0.3.26"
+version = "0.3.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
+checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
 
 [[package]]
 name = "plist"
-version = "1.4.3"
+version = "1.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9bd9647b268a3d3e14ff09c23201133a62589c658db02bb7388c7246aafe0590"
+checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016"
 dependencies = [
- "base64 0.21.0",
- "indexmap",
- "line-wrap",
+ "base64 0.22.1",
+ "indexmap 2.6.0",
  "quick-xml",
  "serde",
  "time",
@@ -1743,21 +2217,31 @@ dependencies = [
 
 [[package]]
 name = "png"
-version = "0.17.7"
+version = "0.17.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638"
+checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "crc32fast",
+ "fdeflate",
  "flate2",
  "miniz_oxide",
 ]
 
+[[package]]
+name = "powerfmt"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+
 [[package]]
 name = "ppv-lite86"
-version = "0.2.17"
+version = "0.2.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
+dependencies = [
+ "zerocopy",
+]
 
 [[package]]
 name = "precomputed-hash"
@@ -1772,7 +2256,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
 dependencies = [
  "once_cell",
- "toml_edit",
+ "toml_edit 0.19.15",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24"
+dependencies = [
+ "toml_datetime",
+ "toml_edit 0.20.2",
 ]
 
 [[package]]
@@ -1807,27 +2301,27 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.54"
+version = "1.0.87"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e472a104799c74b514a57226160104aa483546de37e839ec50e3c2e41dd87534"
+checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "quick-xml"
-version = "0.28.1"
+version = "0.32.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5c1a97b1bc42b1d550bfb48d4262153fe400a12bab1511821736f7eac76d7e2"
+checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
 name = "quote"
-version = "1.0.26"
+version = "1.0.37"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
+checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
 dependencies = [
  "proc-macro2",
 ]
@@ -1892,7 +2386,7 @@ version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
 dependencies = [
- "getrandom 0.2.8",
+ "getrandom 0.2.15",
 ]
 
 [[package]]
@@ -1915,64 +2409,101 @@ dependencies = [
 
 [[package]]
 name = "raw-window-handle"
-version = "0.5.1"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f851a03551ceefd30132e447f07f96cb7011d6b658374f3aed847333adb5559"
+checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9"
 
 [[package]]
-name = "redox_syscall"
-version = "0.2.16"
+name = "raw-window-handle"
+version = "0.6.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
-dependencies = [
- "bitflags",
-]
+checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
 
 [[package]]
 name = "redox_syscall"
-version = "0.3.5"
+version = "0.5.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f"
 dependencies = [
- "bitflags",
+ "bitflags 2.6.0",
 ]
 
 [[package]]
 name = "redox_users"
-version = "0.4.3"
+version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
+checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
 dependencies = [
- "getrandom 0.2.8",
- "redox_syscall 0.2.16",
+ "getrandom 0.2.15",
+ "libredox",
  "thiserror",
 ]
 
 [[package]]
 name = "regex"
-version = "1.7.3"
+version = "1.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d"
+checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8"
 dependencies = [
  "aho-corasick",
  "memchr",
+ "regex-automata",
  "regex-syntax",
 ]
 
 [[package]]
 name = "regex-automata"
-version = "0.1.10"
+version = "0.4.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
 dependencies = [
+ "aho-corasick",
+ "memchr",
  "regex-syntax",
 ]
 
 [[package]]
 name = "regex-syntax"
-version = "0.6.29"
+version = "0.8.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
+
+[[package]]
+name = "reqwest"
+version = "0.12.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b"
+dependencies = [
+ "base64 0.22.1",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-body-util",
+ "hyper",
+ "hyper-util",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "sync_wrapper",
+ "tokio",
+ "tokio-util",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "wasm-streams",
+ "web-sys",
+ "windows-registry",
+]
 
 [[package]]
 name = "revolt"
@@ -1982,49 +2513,30 @@ dependencies = [
  "serde_json",
  "tauri",
  "tauri-build",
+ "tauri-plugin-shell",
  "window-shadows",
 ]
 
 [[package]]
-name = "rustc_version"
-version = "0.4.0"
+name = "rustc-demangle"
+version = "0.1.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
-dependencies = [
- "semver",
-]
+checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
 
 [[package]]
-name = "rustix"
-version = "0.37.5"
+name = "rustc_version"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e78cc525325c06b4a7ff02db283472f3c042b7ff0c391f96c6d5ac6f4f91b75"
+checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
 dependencies = [
- "bitflags",
- "errno",
- "io-lifetimes",
- "libc",
- "linux-raw-sys",
- "windows-sys 0.45.0",
+ "semver",
 ]
 
-[[package]]
-name = "rustversion"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06"
-
 [[package]]
 name = "ryu"
-version = "1.0.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
-
-[[package]]
-name = "safemem"
-version = "0.3.3"
+version = "1.0.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
 
 [[package]]
 name = "same-file"
@@ -2036,16 +2548,37 @@ dependencies = [
 ]
 
 [[package]]
-name = "scoped-tls"
-version = "1.0.1"
+name = "schemars"
+version = "0.8.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92"
+dependencies = [
+ "dyn-clone",
+ "indexmap 1.9.3",
+ "schemars_derive",
+ "serde",
+ "serde_json",
+ "url",
+ "uuid",
+]
+
+[[package]]
+name = "schemars_derive"
+version = "0.8.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
+checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "serde_derive_internals",
+ "syn 2.0.79",
+]
 
 [[package]]
 name = "scopeguard"
-version = "1.1.0"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
 
 [[package]]
 name = "selectors"
@@ -2053,14 +2586,14 @@ version = "0.22.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "cssparser",
  "derive_more",
  "fxhash",
  "log",
  "matches",
  "phf 0.8.0",
- "phf_codegen",
+ "phf_codegen 0.8.0",
  "precomputed-hash",
  "servo_arc",
  "smallvec",
@@ -2069,84 +2602,127 @@ dependencies = [
 
 [[package]]
 name = "semver"
-version = "1.0.17"
+version = "1.0.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed"
+checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "serde"
-version = "1.0.159"
+version = "1.0.210"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065"
+checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a"
 dependencies = [
  "serde_derive",
 ]
 
+[[package]]
+name = "serde-untagged"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2676ba99bd82f75cae5cbd2c8eda6fa0b8760f18978ea840e980dd5567b5c5b6"
+dependencies = [
+ "erased-serde",
+ "serde",
+ "typeid",
+]
+
 [[package]]
 name = "serde_derive"
-version = "1.0.159"
+version = "1.0.210"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
+]
+
+[[package]]
+name = "serde_derive_internals"
+version = "0.29.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585"
+checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.12",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "serde_json"
-version = "1.0.95"
+version = "1.0.128"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744"
+checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8"
 dependencies = [
- "itoa 1.0.6",
+ "itoa 1.0.11",
+ "memchr",
  "ryu",
  "serde",
 ]
 
 [[package]]
 name = "serde_repr"
-version = "0.1.12"
+version = "0.1.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab"
+checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.12",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "serde_spanned"
-version = "0.6.1"
+version = "0.6.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4"
+checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
 dependencies = [
  "serde",
 ]
 
 [[package]]
-name = "serde_with"
-version = "1.14.0"
+name = "serde_urlencoded"
+version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
 dependencies = [
+ "form_urlencoded",
+ "itoa 1.0.11",
+ "ryu",
  "serde",
- "serde_with_macros",
+]
+
+[[package]]
+name = "serde_with"
+version = "3.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817"
+dependencies = [
+ "base64 0.22.1",
+ "chrono",
+ "hex",
+ "indexmap 1.9.3",
+ "indexmap 2.6.0",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "serde_with_macros",
+ "time",
 ]
 
 [[package]]
 name = "serde_with_macros"
-version = "1.5.2"
+version = "3.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082"
+checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d"
 dependencies = [
  "darling",
  "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.79",
 ]
 
 [[package]]
@@ -2183,9 +2759,9 @@ dependencies = [
 
 [[package]]
 name = "sha2"
-version = "0.10.6"
+version = "0.10.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
+checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
 dependencies = [
  "cfg-if",
  "cpufeatures",
@@ -2193,61 +2769,104 @@ dependencies = [
 ]
 
 [[package]]
-name = "sharded-slab"
-version = "0.1.4"
+name = "shared_child"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
+checksum = "09fa9338aed9a1df411814a5b2252f7cd206c55ae9bf2fa763f8de84603aa60c"
 dependencies = [
- "lazy_static",
+ "libc",
+ "windows-sys 0.59.0",
 ]
 
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+[[package]]
+name = "simd-adler32"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
+
 [[package]]
 name = "siphasher"
-version = "0.3.10"
+version = "0.3.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de"
+checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
 
 [[package]]
 name = "slab"
-version = "0.4.8"
+version = "0.4.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
 dependencies = [
  "autocfg",
 ]
 
 [[package]]
 name = "smallvec"
-version = "1.10.0"
+version = "1.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
 
 [[package]]
-name = "soup2"
-version = "0.2.1"
+name = "socket2"
+version = "0.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
+dependencies = [
+ "libc",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "softbuffer"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08"
+dependencies = [
+ "bytemuck",
+ "cfg_aliases",
+ "core-graphics 0.24.0",
+ "foreign-types",
+ "js-sys",
+ "log",
+ "objc2",
+ "objc2-foundation",
+ "objc2-quartz-core",
+ "raw-window-handle 0.6.2",
+ "redox_syscall",
+ "wasm-bindgen",
+ "web-sys",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "soup3"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0"
+checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f"
 dependencies = [
- "bitflags",
+ "futures-channel",
  "gio",
  "glib",
  "libc",
- "once_cell",
- "soup2-sys",
+ "soup3-sys",
 ]
 
 [[package]]
-name = "soup2-sys"
-version = "0.2.0"
+name = "soup3-sys"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf"
+checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27"
 dependencies = [
- "bitflags",
  "gio-sys",
  "glib-sys",
  "gobject-sys",
  "libc",
- "system-deps 5.0.0",
+ "system-deps",
 ]
 
 [[package]]
@@ -2256,15 +2875,6 @@ version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
 
-[[package]]
-name = "state"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b"
-dependencies = [
- "loom",
-]
-
 [[package]]
 name = "string_cache"
 version = "0.8.7"
@@ -2293,9 +2903,20 @@ dependencies = [
 
 [[package]]
 name = "strsim"
-version = "0.10.0"
+version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+
+[[package]]
+name = "swift-rs"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7"
+dependencies = [
+ "base64 0.21.7",
+ "serde",
+ "serde_json",
+]
 
 [[package]]
 name = "syn"
@@ -2310,9 +2931,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "2.0.12"
+version = "2.0.79"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79d9531f94112cfc3e4c8f5f02cb2b58f72c97b7efd85f70203cc6d8efda5927"
+checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2320,59 +2941,47 @@ dependencies = [
 ]
 
 [[package]]
-name = "system-deps"
-version = "5.0.0"
+name = "sync_wrapper"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e"
+checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
 dependencies = [
- "cfg-expr 0.9.1",
- "heck 0.3.3",
- "pkg-config",
- "toml 0.5.11",
- "version-compare 0.0.11",
+ "futures-core",
 ]
 
 [[package]]
 name = "system-deps"
-version = "6.0.4"
+version = "6.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "555fc8147af6256f3931a36bb83ad0023240ce9cf2b319dec8236fd1f220b05f"
+checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349"
 dependencies = [
- "cfg-expr 0.14.0",
- "heck 0.4.1",
+ "cfg-expr",
+ "heck 0.5.0",
  "pkg-config",
- "toml 0.7.3",
- "version-compare 0.1.1",
+ "toml 0.8.2",
+ "version-compare",
 ]
 
 [[package]]
 name = "tao"
-version = "0.15.8"
+version = "0.30.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac8e6399427c8494f9849b58694754d7cc741293348a6836b6c8d2c5aa82d8e6"
+checksum = "a0dbbebe82d02044dfa481adca1550d6dd7bd16e086bc34fa0fbecceb5a63751"
 dependencies = [
- "bitflags",
- "cairo-rs",
- "cc",
- "cocoa",
- "core-foundation",
- "core-graphics",
+ "bitflags 2.6.0",
+ "cocoa 0.26.0",
+ "core-foundation 0.10.0",
+ "core-graphics 0.24.0",
  "crossbeam-channel",
- "dirs-next",
  "dispatch",
- "gdk",
- "gdk-pixbuf",
- "gdk-sys",
+ "dlopen2",
+ "dpi",
+ "gdkwayland-sys",
  "gdkx11-sys",
- "gio",
- "glib",
- "glib-sys",
  "gtk",
- "image",
  "instant",
  "jni",
  "lazy_static",
- "libappindicator",
  "libc",
  "log",
  "ndk",
@@ -2381,99 +2990,113 @@ dependencies = [
  "objc",
  "once_cell",
  "parking_lot",
- "paste",
- "png",
- "raw-window-handle",
+ "raw-window-handle 0.6.2",
  "scopeguard",
- "serde",
+ "tao-macros",
  "unicode-segmentation",
- "uuid 1.3.0",
- "windows 0.39.0",
- "windows-implement",
+ "url",
+ "windows",
+ "windows-core 0.58.0",
+ "windows-version",
  "x11-dl",
 ]
 
 [[package]]
-name = "tar"
-version = "0.4.38"
+name = "tao-macros"
+version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6"
+checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd"
 dependencies = [
- "filetime",
- "libc",
- "xattr",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
 ]
 
+[[package]]
+name = "target-lexicon"
+version = "0.12.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
+
 [[package]]
 name = "tauri"
-version = "1.2.4"
+version = "2.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe7e0f1d535e7cbbbab43c82be4fc992b84f9156c16c160955617e0260ebc449"
+checksum = "5920aad0804ea5e86808d4b6e8753d3bcbae7efc8f4e41a4da00b45427559868"
 dependencies = [
  "anyhow",
- "cocoa",
- "dirs-next",
+ "bytes",
+ "dirs",
+ "dunce",
  "embed_plist",
- "encoding_rs",
- "flate2",
  "futures-util",
- "glib",
+ "getrandom 0.2.15",
  "glob",
  "gtk",
- "heck 0.4.1",
+ "heck 0.5.0",
  "http",
- "ignore",
- "objc",
- "once_cell",
- "open",
+ "jni",
+ "libc",
+ "log",
+ "mime",
+ "muda",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
  "percent-encoding",
- "rand 0.8.5",
- "raw-window-handle",
- "regex",
- "semver",
+ "plist",
+ "raw-window-handle 0.6.2",
+ "reqwest",
  "serde",
  "serde_json",
  "serde_repr",
  "serialize-to-javascript",
- "state",
- "tar",
+ "swift-rs",
+ "tauri-build",
  "tauri-macros",
  "tauri-runtime",
  "tauri-runtime-wry",
  "tauri-utils",
- "tempfile",
  "thiserror",
  "tokio",
+ "tray-icon",
  "url",
- "uuid 1.3.0",
+ "urlpattern",
  "webkit2gtk",
  "webview2-com",
- "windows 0.39.0",
+ "window-vibrancy",
+ "windows",
 ]
 
 [[package]]
 name = "tauri-build"
-version = "1.2.1"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8807c85d656b2b93927c19fe5a5f1f1f348f96c2de8b90763b3c2d561511f9b4"
+checksum = "935f9b3c49b22b3e2e485a57f46d61cd1ae07b1cbb2ba87387a387caf2d8c4e7"
 dependencies = [
  "anyhow",
  "cargo_toml",
- "heck 0.4.1",
+ "dirs",
+ "glob",
+ "heck 0.5.0",
  "json-patch",
+ "schemars",
  "semver",
+ "serde",
  "serde_json",
  "tauri-utils",
- "winres",
+ "tauri-winres",
+ "toml 0.8.2",
+ "walkdir",
 ]
 
 [[package]]
 name = "tauri-codegen"
-version = "1.2.1"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14388d484b6b1b5dc0f6a7d6cc6433b3b230bec85eaa576adcdf3f9fafa49251"
+checksum = "95d7443dd4f0b597704b6a14b964ee2ed16e99928d8e6292ae9825f09fbcd30e"
 dependencies = [
- "base64 0.13.1",
+ "base64 0.22.1",
  "brotli",
  "ico",
  "json-patch",
@@ -2481,111 +3104,160 @@ dependencies = [
  "png",
  "proc-macro2",
  "quote",
- "regex",
  "semver",
  "serde",
  "serde_json",
  "sha2",
+ "syn 2.0.79",
  "tauri-utils",
  "thiserror",
  "time",
- "uuid 1.3.0",
+ "url",
+ "uuid",
  "walkdir",
 ]
 
 [[package]]
 name = "tauri-macros"
-version = "1.2.1"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "069319e5ecbe653a799b94b0690d9f9bf5d00f7b1d3989aa331c524d4e354075"
+checksum = "4d2c0963ccfc3f5194415f2cce7acc975942a8797fbabfb0aa1ed6f59326ae7f"
 dependencies = [
- "heck 0.4.1",
+ "heck 0.5.0",
  "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.79",
  "tauri-codegen",
  "tauri-utils",
 ]
 
+[[package]]
+name = "tauri-plugin"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2e6660a409963e4d57b9bfab4addd141eeff41bd3a7fb14e13004a832cf7ef6"
+dependencies = [
+ "anyhow",
+ "glob",
+ "plist",
+ "schemars",
+ "serde",
+ "serde_json",
+ "tauri-utils",
+ "toml 0.8.2",
+ "walkdir",
+]
+
+[[package]]
+name = "tauri-plugin-shell"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "371fb9aca2823990a2d0db7970573be5fdf07881fcaa2b835b29631feb84aec1"
+dependencies = [
+ "encoding_rs",
+ "log",
+ "open",
+ "os_pipe",
+ "regex",
+ "schemars",
+ "serde",
+ "serde_json",
+ "shared_child",
+ "tauri",
+ "tauri-plugin",
+ "thiserror",
+ "tokio",
+]
+
 [[package]]
 name = "tauri-runtime"
-version = "0.12.1"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c507d954d08ac8705d235bc70ec6975b9054fb95ff7823af72dbb04186596f3b"
+checksum = "af12ad1af974b274ef1d32a94e6eba27a312b429ef28fcb98abc710df7f9151d"
 dependencies = [
+ "dpi",
  "gtk",
  "http",
- "http-range",
- "rand 0.8.5",
- "raw-window-handle",
+ "jni",
+ "raw-window-handle 0.6.2",
  "serde",
  "serde_json",
  "tauri-utils",
  "thiserror",
- "uuid 1.3.0",
- "webview2-com",
- "windows 0.39.0",
+ "url",
+ "windows",
 ]
 
 [[package]]
 name = "tauri-runtime-wry"
-version = "0.12.2"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36b1c5764a41a13176a4599b5b7bd0881bea7d94dfe45e1e755f789b98317e30"
+checksum = "e45e88aa0b11b302d836e6ea3e507a6359044c4a8bc86b865ba99868c695753d"
 dependencies = [
- "cocoa",
  "gtk",
+ "http",
+ "jni",
+ "log",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
  "percent-encoding",
- "rand 0.8.5",
- "raw-window-handle",
+ "raw-window-handle 0.6.2",
+ "softbuffer",
+ "tao",
  "tauri-runtime",
  "tauri-utils",
- "uuid 1.3.0",
+ "url",
  "webkit2gtk",
  "webview2-com",
- "windows 0.39.0",
+ "windows",
  "wry",
 ]
 
 [[package]]
 name = "tauri-utils"
-version = "1.2.1"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5abbc109a6eb45127956ffcc26ef0e875d160150ac16cfa45d26a6b2871686f1"
+checksum = "c38b0230d6880cf6dd07b6d7dd7789a0869f98ac12146e0d18d1c1049215a045"
 dependencies = [
  "brotli",
+ "cargo_metadata",
  "ctor",
+ "dunce",
  "glob",
- "heck 0.4.1",
  "html5ever",
  "infer",
  "json-patch",
- "kuchiki",
+ "kuchikiki",
+ "log",
  "memchr",
- "phf 0.10.1",
+ "phf 0.11.2",
  "proc-macro2",
  "quote",
+ "regex",
+ "schemars",
  "semver",
  "serde",
+ "serde-untagged",
  "serde_json",
  "serde_with",
+ "swift-rs",
  "thiserror",
+ "toml 0.8.2",
  "url",
+ "urlpattern",
+ "uuid",
  "walkdir",
- "windows 0.39.0",
 ]
 
 [[package]]
-name = "tempfile"
-version = "3.5.0"
+name = "tauri-winres"
+version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998"
+checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb"
 dependencies = [
- "cfg-if",
- "fastrand",
- "redox_syscall 0.3.5",
- "rustix",
- "windows-sys 0.45.0",
+ "embed-resource",
+ "toml 0.7.8",
 ]
 
 [[package]]
@@ -2607,41 +3279,34 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
 
 [[package]]
 name = "thiserror"
-version = "1.0.40"
+version = "1.0.64"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
+checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.40"
+version = "1.0.64"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
+checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.12",
-]
-
-[[package]]
-name = "thread_local"
-version = "1.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
-dependencies = [
- "cfg-if",
- "once_cell",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "time"
-version = "0.3.20"
+version = "0.3.36"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890"
+checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
 dependencies = [
- "itoa 1.0.6",
+ "deranged",
+ "itoa 1.0.11",
+ "num-conv",
+ "powerfmt",
  "serde",
  "time-core",
  "time-macros",
@@ -2649,24 +3314,25 @@ dependencies = [
 
 [[package]]
 name = "time-core"
-version = "0.1.0"
+version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd"
+checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
 
 [[package]]
 name = "time-macros"
-version = "0.2.8"
+version = "0.2.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36"
+checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf"
 dependencies = [
+ "num-conv",
  "time-core",
 ]
 
 [[package]]
 name = "tinyvec"
-version = "1.6.0"
+version = "1.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
 dependencies = [
  "tinyvec_macros",
 ]
@@ -2679,54 +3345,72 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "tokio"
-version = "1.27.0"
+version = "1.40.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001"
+checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998"
 dependencies = [
- "autocfg",
+ "backtrace",
  "bytes",
- "num_cpus",
+ "libc",
+ "mio",
  "pin-project-lite",
- "windows-sys 0.45.0",
+ "socket2",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
 ]
 
 [[package]]
 name = "toml"
-version = "0.5.11"
+version = "0.7.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257"
 dependencies = [
  "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit 0.19.15",
 ]
 
 [[package]]
 name = "toml"
-version = "0.7.3"
+version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21"
+checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d"
 dependencies = [
  "serde",
  "serde_spanned",
  "toml_datetime",
- "toml_edit",
+ "toml_edit 0.20.2",
 ]
 
 [[package]]
 name = "toml_datetime"
-version = "0.6.1"
+version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622"
+checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "toml_edit"
-version = "0.19.8"
+version = "0.19.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13"
+checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
 dependencies = [
- "indexmap",
+ "indexmap 2.6.0",
  "serde",
  "serde_spanned",
  "toml_datetime",
@@ -2734,114 +3418,155 @@ dependencies = [
 ]
 
 [[package]]
-name = "tracing"
-version = "0.1.37"
+name = "toml_edit"
+version = "0.20.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338"
 dependencies = [
- "cfg-if",
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
+ "indexmap 2.6.0",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "winnow",
 ]
 
 [[package]]
-name = "tracing-attributes"
-version = "0.1.23"
+name = "tower-service"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
+
+[[package]]
+name = "tracing"
+version = "0.1.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
+checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
 dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
+ "pin-project-lite",
+ "tracing-core",
 ]
 
 [[package]]
 name = "tracing-core"
-version = "0.1.30"
+version = "0.1.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
+checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
 dependencies = [
  "once_cell",
- "valuable",
 ]
 
 [[package]]
-name = "tracing-log"
-version = "0.1.3"
+name = "tray-icon"
+version = "0.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
+checksum = "533fc2d4105e0e3d96ce1c71f2d308c9fbbe2ef9c587cab63dd627ab5bde218f"
 dependencies = [
- "lazy_static",
- "log",
- "tracing-core",
+ "core-graphics 0.24.0",
+ "crossbeam-channel",
+ "dirs",
+ "libappindicator",
+ "muda",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "once_cell",
+ "png",
+ "serde",
+ "thiserror",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
-name = "tracing-subscriber"
-version = "0.3.16"
+name = "try-lock"
+version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
+checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+
+[[package]]
+name = "typeid"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e"
+
+[[package]]
+name = "typenum"
+version = "1.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+
+[[package]]
+name = "unic-char-property"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221"
 dependencies = [
- "matchers",
- "nu-ansi-term",
- "once_cell",
- "regex",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-log",
+ "unic-char-range",
 ]
 
 [[package]]
-name = "treediff"
-version = "3.0.2"
+name = "unic-char-range"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "761e8d5ad7ce14bb82b7e61ccc0ca961005a275a060b9644a2431aa11553c2ff"
+checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc"
+
+[[package]]
+name = "unic-common"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc"
+
+[[package]]
+name = "unic-ucd-ident"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987"
 dependencies = [
- "serde_json",
+ "unic-char-property",
+ "unic-char-range",
+ "unic-ucd-version",
 ]
 
 [[package]]
-name = "typenum"
-version = "1.16.0"
+name = "unic-ucd-version"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4"
+dependencies = [
+ "unic-common",
+]
 
 [[package]]
 name = "unicode-bidi"
-version = "0.3.13"
+version = "0.3.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893"
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.8"
+version = "1.0.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
+checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
 
 [[package]]
 name = "unicode-normalization"
-version = "0.1.22"
+version = "0.1.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956"
 dependencies = [
  "tinyvec",
 ]
 
 [[package]]
 name = "unicode-segmentation"
-version = "1.10.1"
+version = "1.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
 
 [[package]]
 name = "url"
-version = "2.3.1"
+version = "2.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
+checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
 dependencies = [
  "form_urlencoded",
  "idna",
@@ -2850,60 +3575,84 @@ dependencies = [
 ]
 
 [[package]]
-name = "utf-8"
-version = "0.7.6"
+name = "urlpattern"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d"
+dependencies = [
+ "regex",
+ "serde",
+ "unic-ucd-ident",
+ "url",
+]
 
 [[package]]
-name = "uuid"
-version = "0.8.2"
+name = "utf-8"
+version = "0.7.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
 
 [[package]]
 name = "uuid"
-version = "1.3.0"
+version = "1.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79"
+checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314"
 dependencies = [
- "getrandom 0.2.8",
+ "getrandom 0.2.15",
+ "serde",
 ]
 
 [[package]]
-name = "valuable"
-version = "0.1.0"
+name = "version-compare"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b"
 
 [[package]]
-name = "version-compare"
-version = "0.0.11"
+name = "version_check"
+version = "0.9.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
 
 [[package]]
-name = "version-compare"
-version = "0.1.1"
+name = "vswhom"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29"
+checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b"
+dependencies = [
+ "libc",
+ "vswhom-sys",
+]
 
 [[package]]
-name = "version_check"
-version = "0.9.4"
+name = "vswhom-sys"
+version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18"
+dependencies = [
+ "cc",
+ "libc",
+]
 
 [[package]]
 name = "walkdir"
-version = "2.3.3"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
 dependencies = [
  "same-file",
  "winapi-util",
 ]
 
+[[package]]
+name = "want"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+dependencies = [
+ "try-lock",
+]
+
 [[package]]
 name = "wasi"
 version = "0.9.0+wasi-snapshot-preview1"
@@ -2916,13 +3665,103 @@ version = "0.11.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484"
+
+[[package]]
+name = "wasm-streams"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd"
+dependencies = [
+ "futures-util",
+ "js-sys",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.70"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "webkit2gtk"
-version = "0.18.2"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370"
+checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "cairo-rs",
  "gdk",
  "gdk-sys",
@@ -2936,20 +3775,18 @@ dependencies = [
  "javascriptcore-rs",
  "libc",
  "once_cell",
- "soup2",
+ "soup3",
  "webkit2gtk-sys",
 ]
 
 [[package]]
 name = "webkit2gtk-sys"
-version = "0.18.0"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3"
+checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c"
 dependencies = [
- "atk-sys",
- "bitflags",
+ "bitflags 1.3.2",
  "cairo-sys-rs",
- "gdk-pixbuf-sys",
  "gdk-sys",
  "gio-sys",
  "glib-sys",
@@ -2957,48 +3794,45 @@ dependencies = [
  "gtk-sys",
  "javascriptcore-rs-sys",
  "libc",
- "pango-sys",
  "pkg-config",
- "soup2-sys",
- "system-deps 6.0.4",
+ "soup3-sys",
+ "system-deps",
 ]
 
 [[package]]
 name = "webview2-com"
-version = "0.19.1"
+version = "0.33.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178"
+checksum = "6f61ff3d9d0ee4efcb461b14eb3acfda2702d10dc329f339303fc3e57215ae2c"
 dependencies = [
  "webview2-com-macros",
  "webview2-com-sys",
- "windows 0.39.0",
+ "windows",
+ "windows-core 0.58.0",
  "windows-implement",
+ "windows-interface",
 ]
 
 [[package]]
 name = "webview2-com-macros"
-version = "0.6.0"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac"
+checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 1.0.109",
+ "syn 2.0.79",
 ]
 
 [[package]]
 name = "webview2-com-sys"
-version = "0.19.0"
+version = "0.33.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7"
+checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886"
 dependencies = [
- "regex",
- "serde",
- "serde_json",
  "thiserror",
- "windows 0.39.0",
- "windows-bindgen",
- "windows-metadata",
+ "windows",
+ "windows-core 0.58.0",
 ]
 
 [[package]]
@@ -3019,11 +3853,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 
 [[package]]
 name = "winapi-util"
-version = "0.1.5"
+version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
 dependencies = [
- "winapi",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -3034,78 +3868,112 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
 [[package]]
 name = "window-shadows"
-version = "0.2.1"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29d30320647cfc3dc45554c8ad825b84831def81f967a2f7589931328ff9b16d"
+checksum = "67ff424735b1ac21293b0492b069394b0a189c8a463fb015a16dea7c2e221c08"
 dependencies = [
- "cocoa",
+ "cocoa 0.25.0",
  "objc",
- "raw-window-handle",
- "windows-sys 0.42.0",
+ "raw-window-handle 0.5.2",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
-name = "windows"
-version = "0.39.0"
+name = "window-vibrancy"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a"
+checksum = "3ea403deff7b51fff19e261330f71608ff2cdef5721d72b64180bb95be7c4150"
 dependencies = [
- "windows-implement",
- "windows_aarch64_msvc 0.39.0",
- "windows_i686_gnu 0.39.0",
- "windows_i686_msvc 0.39.0",
- "windows_x86_64_gnu 0.39.0",
- "windows_x86_64_msvc 0.39.0",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "raw-window-handle 0.6.2",
+ "windows-sys 0.59.0",
+ "windows-version",
 ]
 
 [[package]]
 name = "windows"
-version = "0.44.0"
+version = "0.58.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b"
+checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6"
 dependencies = [
- "windows-targets",
+ "windows-core 0.58.0",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
-name = "windows-bindgen"
-version = "0.39.0"
+name = "windows-core"
+version = "0.52.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
 dependencies = [
- "windows-metadata",
- "windows-tokens",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.58.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99"
+dependencies = [
+ "windows-implement",
+ "windows-interface",
+ "windows-result",
+ "windows-strings",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
 name = "windows-implement"
-version = "0.39.0"
+version = "0.58.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7"
+checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
 dependencies = [
- "syn 1.0.109",
- "windows-tokens",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
 ]
 
 [[package]]
-name = "windows-metadata"
-version = "0.39.0"
+name = "windows-interface"
+version = "0.58.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278"
+checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
+]
 
 [[package]]
-name = "windows-sys"
-version = "0.42.0"
+name = "windows-registry"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0"
 dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc 0.42.2",
- "windows_i686_gnu 0.42.2",
- "windows_i686_msvc 0.42.2",
- "windows_x86_64_gnu 0.42.2",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc 0.42.2",
+ "windows-result",
+ "windows-strings",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
+dependencies = [
+ "windows-result",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -3114,7 +3982,34 @@ version = "0.45.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
 dependencies = [
- "windows-targets",
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -3123,20 +4018,54 @@ version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
 dependencies = [
- "windows_aarch64_gnullvm",
+ "windows_aarch64_gnullvm 0.42.2",
  "windows_aarch64_msvc 0.42.2",
  "windows_i686_gnu 0.42.2",
  "windows_i686_msvc 0.42.2",
  "windows_x86_64_gnu 0.42.2",
- "windows_x86_64_gnullvm",
+ "windows_x86_64_gnullvm 0.42.2",
  "windows_x86_64_msvc 0.42.2",
 ]
 
 [[package]]
-name = "windows-tokens"
-version = "0.39.0"
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
+]
+
+[[package]]
+name = "windows-version"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515"
+dependencies = [
+ "windows-targets 0.52.6",
+]
 
 [[package]]
 name = "windows_aarch64_gnullvm"
@@ -3145,10 +4074,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
 
 [[package]]
-name = "windows_aarch64_msvc"
-version = "0.39.0"
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
 
 [[package]]
 name = "windows_aarch64_msvc"
@@ -3157,10 +4092,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
 
 [[package]]
-name = "windows_i686_gnu"
-version = "0.39.0"
+name = "windows_aarch64_msvc"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
 
 [[package]]
 name = "windows_i686_gnu"
@@ -3169,10 +4110,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
 
 [[package]]
-name = "windows_i686_msvc"
-version = "0.39.0"
+name = "windows_i686_gnu"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
 
 [[package]]
 name = "windows_i686_msvc"
@@ -3181,10 +4134,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
 
 [[package]]
-name = "windows_x86_64_gnu"
-version = "0.39.0"
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
 
 [[package]]
 name = "windows_x86_64_gnu"
@@ -3192,6 +4151,18 @@ version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
 
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
 [[package]]
 name = "windows_x86_64_gnullvm"
 version = "0.42.2"
@@ -3199,10 +4170,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
 
 [[package]]
-name = "windows_x86_64_msvc"
-version = "0.39.0"
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
 
 [[package]]
 name = "windows_x86_64_msvc"
@@ -3210,60 +4187,75 @@ version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
 
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
-version = "0.4.1"
+version = "0.5.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28"
+checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
-name = "winres"
-version = "0.1.12"
+name = "winreg"
+version = "0.52.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c"
+checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5"
 dependencies = [
- "toml 0.5.11",
+ "cfg-if",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "wry"
-version = "0.23.4"
+version = "0.44.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c1ad8e2424f554cc5bdebe8aa374ef5b433feff817aebabca0389961fc7ef98"
+checksum = "440600584cfbd8b0d28eace95c1f2c253db05dae43780b79380aa1e868f04c73"
 dependencies = [
- "base64 0.13.1",
+ "base64 0.22.1",
  "block",
- "cocoa",
- "core-graphics",
+ "cocoa 0.26.0",
+ "core-graphics 0.24.0",
  "crossbeam-channel",
+ "dpi",
  "dunce",
- "gdk",
- "gio",
- "glib",
+ "gdkx11",
  "gtk",
  "html5ever",
  "http",
- "kuchiki",
+ "javascriptcore-rs",
+ "jni",
+ "kuchikiki",
  "libc",
- "log",
+ "ndk",
  "objc",
  "objc_id",
  "once_cell",
- "serde",
- "serde_json",
+ "percent-encoding",
+ "raw-window-handle 0.6.2",
  "sha2",
- "soup2",
- "tao",
+ "soup3",
+ "tao-macros",
  "thiserror",
- "url",
  "webkit2gtk",
  "webkit2gtk-sys",
  "webview2-com",
- "windows 0.39.0",
- "windows-implement",
+ "windows",
+ "windows-core 0.58.0",
+ "windows-version",
+ "x11-dl",
 ]
 
 [[package]]
@@ -3288,10 +4280,22 @@ dependencies = [
 ]
 
 [[package]]
-name = "xattr"
-version = "0.2.3"
+name = "zerocopy"
+version = "0.7.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc"
+checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
 dependencies = [
- "libc",
+ "byteorder",
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.7.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.79",
 ]
diff --git a/packages/desktop/src-tauri/Cargo.toml b/packages/desktop/src-tauri/Cargo.toml
index 45031eb90..71b92a484 100644
--- a/packages/desktop/src-tauri/Cargo.toml
+++ b/packages/desktop/src-tauri/Cargo.toml
@@ -10,13 +10,14 @@ edition = "2021"
 rust-version = "1.59"
 
 [build-dependencies]
-tauri-build = { version = "1.2.1", features = [] }
+tauri-build = { version = "2", features = [] }
 
 [dependencies]
 serde_json = "1.0"
 serde = { version = "1.0", features = ["derive"] }
-tauri = { version = "1.2.4", features = ["shell-open", "system-tray", "window-close", "window-hide", "window-maximize", "window-minimize", "window-show", "window-start-dragging", "window-unmaximize", "window-unminimize"] }
-window-shadows = "0.2.1"
+tauri = { version = "2", features = ["tray-icon"] }
+window-shadows = "0.2.2"
+tauri-plugin-shell = "2"
 
 [features]
 # by default Tauri runs in production mode
diff --git a/packages/desktop/src-tauri/build.rs b/packages/desktop/src-tauri/build.rs
index 795b9b7c8..d860e1e6a 100644
--- a/packages/desktop/src-tauri/build.rs
+++ b/packages/desktop/src-tauri/build.rs
@@ -1,3 +1,3 @@
 fn main() {
-  tauri_build::build()
+    tauri_build::build()
 }
diff --git a/packages/desktop/src-tauri/capabilities/migrated.json b/packages/desktop/src-tauri/capabilities/migrated.json
new file mode 100644
index 000000000..2cead9e10
--- /dev/null
+++ b/packages/desktop/src-tauri/capabilities/migrated.json
@@ -0,0 +1,21 @@
+{
+  "identifier": "migrated",
+  "description": "permissions that were migrated from v1",
+  "local": true,
+  "windows": [
+    "main"
+  ],
+  "permissions": [
+    "core:default",
+    "core:window:allow-maximize",
+    "core:window:allow-unmaximize",
+    "core:window:allow-minimize",
+    "core:window:allow-unminimize",
+    "core:window:allow-show",
+    "core:window:allow-hide",
+    "core:window:allow-close",
+    "core:window:allow-start-dragging",
+    "shell:allow-open",
+    "shell:default"
+  ]
+}
\ No newline at end of file
diff --git a/packages/desktop/src-tauri/gen/schemas/acl-manifests.json b/packages/desktop/src-tauri/gen/schemas/acl-manifests.json
new file mode 100644
index 000000000..bce39ff6b
--- /dev/null
+++ b/packages/desktop/src-tauri/gen/schemas/acl-manifests.json
@@ -0,0 +1 @@
+{"core":{"default_permission":{"identifier":"default","description":"Default core plugins set which includes:\n- 'core:path:default'\n- 'core:event:default'\n- 'core:window:default'\n- 'core:webview:default'\n- 'core:app:default'\n- 'core:image:default'\n- 'core:resources:default'\n- 'core:menu:default'\n- 'core:tray:default'\n","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"shell":{"default_permission":{"identifier":"default","description":"This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n","permissions":["allow-open"]},"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-spawn":{"identifier":"allow-spawn","description":"Enables the spawn command without any pre-configured scope.","commands":{"allow":["spawn"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-spawn":{"identifier":"deny-spawn","description":"Denies the spawn command without any pre-configured scope.","commands":{"allow":[],"deny":["spawn"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"cmd":{"description":"The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"}},"required":["cmd","name"],"type":"object"},{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"sidecar":{"description":"If this command is a sidecar command.","type":"boolean"}},"required":["name","sidecar"],"type":"object"}],"definitions":{"ShellScopeEntryAllowedArg":{"anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"additionalProperties":false,"description":"A variable that is set while calling the command from the webview API.","properties":{"raw":{"default":false,"description":"Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.","type":"boolean"},"validator":{"description":"[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: <https://docs.rs/regex/latest/regex/#syntax>","type":"string"}},"required":["validator"],"type":"object"}],"description":"A command argument allowed to be executed by the webview API."},"ShellScopeEntryAllowedArgs":{"anyOf":[{"description":"Use a simple boolean to allow all or disable all arguments to this command configuration.","type":"boolean"},{"description":"A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.","items":{"$ref":"#/definitions/ShellScopeEntryAllowedArg"},"type":"array"}],"description":"A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration."}},"description":"Shell scope entry.","title":"ShellScopeEntry"}}}
\ No newline at end of file
diff --git a/packages/desktop/src-tauri/gen/schemas/capabilities.json b/packages/desktop/src-tauri/gen/schemas/capabilities.json
new file mode 100644
index 000000000..f9089c501
--- /dev/null
+++ b/packages/desktop/src-tauri/gen/schemas/capabilities.json
@@ -0,0 +1 @@
+{"migrated":{"identifier":"migrated","description":"permissions that were migrated from v1","local":true,"windows":["main"],"permissions":["core:default","core:window:allow-maximize","core:window:allow-unmaximize","core:window:allow-minimize","core:window:allow-unminimize","core:window:allow-show","core:window:allow-hide","core:window:allow-close","core:window:allow-start-dragging","shell:allow-open","shell:default"]}}
\ No newline at end of file
diff --git a/packages/desktop/src-tauri/gen/schemas/desktop-schema.json b/packages/desktop/src-tauri/gen/schemas/desktop-schema.json
new file mode 100644
index 000000000..ed816e6cc
--- /dev/null
+++ b/packages/desktop/src-tauri/gen/schemas/desktop-schema.json
@@ -0,0 +1,2054 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "title": "CapabilityFile",
+  "description": "Capability formats accepted in a capability file.",
+  "anyOf": [
+    {
+      "description": "A single capability.",
+      "allOf": [
+        {
+          "$ref": "#/definitions/Capability"
+        }
+      ]
+    },
+    {
+      "description": "A list of capabilities.",
+      "type": "array",
+      "items": {
+        "$ref": "#/definitions/Capability"
+      }
+    },
+    {
+      "description": "A list of capabilities.",
+      "type": "object",
+      "required": [
+        "capabilities"
+      ],
+      "properties": {
+        "capabilities": {
+          "description": "The list of capabilities.",
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Capability"
+          }
+        }
+      }
+    }
+  ],
+  "definitions": {
+    "Capability": {
+      "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows fine grained access to the Tauri core, application, or plugin commands. If a window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, \"platforms\": [\"macOS\",\"windows\"] } ```",
+      "type": "object",
+      "required": [
+        "identifier",
+        "permissions"
+      ],
+      "properties": {
+        "identifier": {
+          "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`",
+          "type": "string"
+        },
+        "description": {
+          "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.",
+          "default": "",
+          "type": "string"
+        },
+        "remote": {
+          "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```",
+          "anyOf": [
+            {
+              "$ref": "#/definitions/CapabilityRemote"
+            },
+            {
+              "type": "null"
+            }
+          ]
+        },
+        "local": {
+          "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.",
+          "default": true,
+          "type": "boolean"
+        },
+        "windows": {
+          "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nOn multiwebview windows, prefer [`Self::webviews`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "webviews": {
+          "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThis is only required when using on multiwebview contexts, by default all child webviews of a window that matches [`Self::windows`] are linked.\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "permissions": {
+          "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ```",
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/PermissionEntry"
+          },
+          "uniqueItems": true
+        },
+        "platforms": {
+          "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`",
+          "type": [
+            "array",
+            "null"
+          ],
+          "items": {
+            "$ref": "#/definitions/Target"
+          }
+        }
+      }
+    },
+    "CapabilityRemote": {
+      "description": "Configuration for remote URLs that are associated with the capability.",
+      "type": "object",
+      "required": [
+        "urls"
+      ],
+      "properties": {
+        "urls": {
+          "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "PermissionEntry": {
+      "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.",
+      "anyOf": [
+        {
+          "description": "Reference a permission or permission set by identifier.",
+          "allOf": [
+            {
+              "$ref": "#/definitions/Identifier"
+            }
+          ]
+        },
+        {
+          "description": "Reference a permission or permission set by identifier and extends its scope.",
+          "type": "object",
+          "allOf": [
+            {
+              "if": {
+                "properties": {
+                  "identifier": {
+                    "anyOf": [
+                      {
+                        "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n",
+                        "type": "string",
+                        "const": "shell:default"
+                      },
+                      {
+                        "description": "Enables the execute command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:allow-execute"
+                      },
+                      {
+                        "description": "Enables the kill command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:allow-kill"
+                      },
+                      {
+                        "description": "Enables the open command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:allow-open"
+                      },
+                      {
+                        "description": "Enables the spawn command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:allow-spawn"
+                      },
+                      {
+                        "description": "Enables the stdin_write command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:allow-stdin-write"
+                      },
+                      {
+                        "description": "Denies the execute command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:deny-execute"
+                      },
+                      {
+                        "description": "Denies the kill command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:deny-kill"
+                      },
+                      {
+                        "description": "Denies the open command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:deny-open"
+                      },
+                      {
+                        "description": "Denies the spawn command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:deny-spawn"
+                      },
+                      {
+                        "description": "Denies the stdin_write command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:deny-stdin-write"
+                      }
+                    ]
+                  }
+                }
+              },
+              "then": {
+                "properties": {
+                  "allow": {
+                    "items": {
+                      "title": "ShellScopeEntry",
+                      "description": "Shell scope entry.",
+                      "anyOf": [
+                        {
+                          "type": "object",
+                          "required": [
+                            "cmd",
+                            "name"
+                          ],
+                          "properties": {
+                            "args": {
+                              "description": "The allowed arguments for the command execution.",
+                              "allOf": [
+                                {
+                                  "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+                                }
+                              ]
+                            },
+                            "cmd": {
+                              "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.",
+                              "type": "string"
+                            },
+                            "name": {
+                              "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+                              "type": "string"
+                            }
+                          },
+                          "additionalProperties": false
+                        },
+                        {
+                          "type": "object",
+                          "required": [
+                            "name",
+                            "sidecar"
+                          ],
+                          "properties": {
+                            "args": {
+                              "description": "The allowed arguments for the command execution.",
+                              "allOf": [
+                                {
+                                  "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+                                }
+                              ]
+                            },
+                            "name": {
+                              "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+                              "type": "string"
+                            },
+                            "sidecar": {
+                              "description": "If this command is a sidecar command.",
+                              "type": "boolean"
+                            }
+                          },
+                          "additionalProperties": false
+                        }
+                      ]
+                    }
+                  },
+                  "deny": {
+                    "items": {
+                      "title": "ShellScopeEntry",
+                      "description": "Shell scope entry.",
+                      "anyOf": [
+                        {
+                          "type": "object",
+                          "required": [
+                            "cmd",
+                            "name"
+                          ],
+                          "properties": {
+                            "args": {
+                              "description": "The allowed arguments for the command execution.",
+                              "allOf": [
+                                {
+                                  "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+                                }
+                              ]
+                            },
+                            "cmd": {
+                              "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.",
+                              "type": "string"
+                            },
+                            "name": {
+                              "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+                              "type": "string"
+                            }
+                          },
+                          "additionalProperties": false
+                        },
+                        {
+                          "type": "object",
+                          "required": [
+                            "name",
+                            "sidecar"
+                          ],
+                          "properties": {
+                            "args": {
+                              "description": "The allowed arguments for the command execution.",
+                              "allOf": [
+                                {
+                                  "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+                                }
+                              ]
+                            },
+                            "name": {
+                              "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+                              "type": "string"
+                            },
+                            "sidecar": {
+                              "description": "If this command is a sidecar command.",
+                              "type": "boolean"
+                            }
+                          },
+                          "additionalProperties": false
+                        }
+                      ]
+                    }
+                  }
+                }
+              },
+              "properties": {
+                "identifier": {
+                  "description": "Identifier of the permission or permission set.",
+                  "allOf": [
+                    {
+                      "$ref": "#/definitions/Identifier"
+                    }
+                  ]
+                }
+              }
+            },
+            {
+              "properties": {
+                "identifier": {
+                  "description": "Identifier of the permission or permission set.",
+                  "allOf": [
+                    {
+                      "$ref": "#/definitions/Identifier"
+                    }
+                  ]
+                },
+                "allow": {
+                  "description": "Data that defines what is allowed by the scope.",
+                  "type": [
+                    "array",
+                    "null"
+                  ],
+                  "items": {
+                    "$ref": "#/definitions/Value"
+                  }
+                },
+                "deny": {
+                  "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.",
+                  "type": [
+                    "array",
+                    "null"
+                  ],
+                  "items": {
+                    "$ref": "#/definitions/Value"
+                  }
+                }
+              }
+            }
+          ],
+          "required": [
+            "identifier"
+          ]
+        }
+      ]
+    },
+    "Identifier": {
+      "description": "Permission identifier",
+      "oneOf": [
+        {
+          "description": "Default core plugins set which includes:\n- 'core:path:default'\n- 'core:event:default'\n- 'core:window:default'\n- 'core:webview:default'\n- 'core:app:default'\n- 'core:image:default'\n- 'core:resources:default'\n- 'core:menu:default'\n- 'core:tray:default'\n",
+          "type": "string",
+          "const": "core:default"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:app:default"
+        },
+        {
+          "description": "Enables the app_hide command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:allow-app-hide"
+        },
+        {
+          "description": "Enables the app_show command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:allow-app-show"
+        },
+        {
+          "description": "Enables the default_window_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:allow-default-window-icon"
+        },
+        {
+          "description": "Enables the name command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:allow-name"
+        },
+        {
+          "description": "Enables the set_app_theme command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:allow-set-app-theme"
+        },
+        {
+          "description": "Enables the tauri_version command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:allow-tauri-version"
+        },
+        {
+          "description": "Enables the version command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:allow-version"
+        },
+        {
+          "description": "Denies the app_hide command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:deny-app-hide"
+        },
+        {
+          "description": "Denies the app_show command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:deny-app-show"
+        },
+        {
+          "description": "Denies the default_window_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:deny-default-window-icon"
+        },
+        {
+          "description": "Denies the name command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:deny-name"
+        },
+        {
+          "description": "Denies the set_app_theme command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:deny-set-app-theme"
+        },
+        {
+          "description": "Denies the tauri_version command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:deny-tauri-version"
+        },
+        {
+          "description": "Denies the version command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:deny-version"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:event:default"
+        },
+        {
+          "description": "Enables the emit command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:allow-emit"
+        },
+        {
+          "description": "Enables the emit_to command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:allow-emit-to"
+        },
+        {
+          "description": "Enables the listen command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:allow-listen"
+        },
+        {
+          "description": "Enables the unlisten command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:allow-unlisten"
+        },
+        {
+          "description": "Denies the emit command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:deny-emit"
+        },
+        {
+          "description": "Denies the emit_to command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:deny-emit-to"
+        },
+        {
+          "description": "Denies the listen command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:deny-listen"
+        },
+        {
+          "description": "Denies the unlisten command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:deny-unlisten"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:image:default"
+        },
+        {
+          "description": "Enables the from_bytes command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:allow-from-bytes"
+        },
+        {
+          "description": "Enables the from_path command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:allow-from-path"
+        },
+        {
+          "description": "Enables the new command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:allow-new"
+        },
+        {
+          "description": "Enables the rgba command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:allow-rgba"
+        },
+        {
+          "description": "Enables the size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:allow-size"
+        },
+        {
+          "description": "Denies the from_bytes command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:deny-from-bytes"
+        },
+        {
+          "description": "Denies the from_path command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:deny-from-path"
+        },
+        {
+          "description": "Denies the new command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:deny-new"
+        },
+        {
+          "description": "Denies the rgba command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:deny-rgba"
+        },
+        {
+          "description": "Denies the size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:deny-size"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:menu:default"
+        },
+        {
+          "description": "Enables the append command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-append"
+        },
+        {
+          "description": "Enables the create_default command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-create-default"
+        },
+        {
+          "description": "Enables the get command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-get"
+        },
+        {
+          "description": "Enables the insert command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-insert"
+        },
+        {
+          "description": "Enables the is_checked command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-is-checked"
+        },
+        {
+          "description": "Enables the is_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-is-enabled"
+        },
+        {
+          "description": "Enables the items command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-items"
+        },
+        {
+          "description": "Enables the new command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-new"
+        },
+        {
+          "description": "Enables the popup command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-popup"
+        },
+        {
+          "description": "Enables the prepend command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-prepend"
+        },
+        {
+          "description": "Enables the remove command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-remove"
+        },
+        {
+          "description": "Enables the remove_at command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-remove-at"
+        },
+        {
+          "description": "Enables the set_accelerator command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-accelerator"
+        },
+        {
+          "description": "Enables the set_as_app_menu command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-as-app-menu"
+        },
+        {
+          "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-as-help-menu-for-nsapp"
+        },
+        {
+          "description": "Enables the set_as_window_menu command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-as-window-menu"
+        },
+        {
+          "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-as-windows-menu-for-nsapp"
+        },
+        {
+          "description": "Enables the set_checked command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-checked"
+        },
+        {
+          "description": "Enables the set_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-enabled"
+        },
+        {
+          "description": "Enables the set_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-icon"
+        },
+        {
+          "description": "Enables the set_text command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-text"
+        },
+        {
+          "description": "Enables the text command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-text"
+        },
+        {
+          "description": "Denies the append command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-append"
+        },
+        {
+          "description": "Denies the create_default command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-create-default"
+        },
+        {
+          "description": "Denies the get command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-get"
+        },
+        {
+          "description": "Denies the insert command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-insert"
+        },
+        {
+          "description": "Denies the is_checked command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-is-checked"
+        },
+        {
+          "description": "Denies the is_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-is-enabled"
+        },
+        {
+          "description": "Denies the items command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-items"
+        },
+        {
+          "description": "Denies the new command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-new"
+        },
+        {
+          "description": "Denies the popup command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-popup"
+        },
+        {
+          "description": "Denies the prepend command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-prepend"
+        },
+        {
+          "description": "Denies the remove command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-remove"
+        },
+        {
+          "description": "Denies the remove_at command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-remove-at"
+        },
+        {
+          "description": "Denies the set_accelerator command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-accelerator"
+        },
+        {
+          "description": "Denies the set_as_app_menu command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-as-app-menu"
+        },
+        {
+          "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-as-help-menu-for-nsapp"
+        },
+        {
+          "description": "Denies the set_as_window_menu command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-as-window-menu"
+        },
+        {
+          "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-as-windows-menu-for-nsapp"
+        },
+        {
+          "description": "Denies the set_checked command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-checked"
+        },
+        {
+          "description": "Denies the set_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-enabled"
+        },
+        {
+          "description": "Denies the set_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-icon"
+        },
+        {
+          "description": "Denies the set_text command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-text"
+        },
+        {
+          "description": "Denies the text command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-text"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:path:default"
+        },
+        {
+          "description": "Enables the basename command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-basename"
+        },
+        {
+          "description": "Enables the dirname command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-dirname"
+        },
+        {
+          "description": "Enables the extname command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-extname"
+        },
+        {
+          "description": "Enables the is_absolute command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-is-absolute"
+        },
+        {
+          "description": "Enables the join command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-join"
+        },
+        {
+          "description": "Enables the normalize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-normalize"
+        },
+        {
+          "description": "Enables the resolve command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-resolve"
+        },
+        {
+          "description": "Enables the resolve_directory command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-resolve-directory"
+        },
+        {
+          "description": "Denies the basename command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-basename"
+        },
+        {
+          "description": "Denies the dirname command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-dirname"
+        },
+        {
+          "description": "Denies the extname command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-extname"
+        },
+        {
+          "description": "Denies the is_absolute command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-is-absolute"
+        },
+        {
+          "description": "Denies the join command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-join"
+        },
+        {
+          "description": "Denies the normalize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-normalize"
+        },
+        {
+          "description": "Denies the resolve command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-resolve"
+        },
+        {
+          "description": "Denies the resolve_directory command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-resolve-directory"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:resources:default"
+        },
+        {
+          "description": "Enables the close command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:resources:allow-close"
+        },
+        {
+          "description": "Denies the close command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:resources:deny-close"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:tray:default"
+        },
+        {
+          "description": "Enables the get_by_id command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-get-by-id"
+        },
+        {
+          "description": "Enables the new command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-new"
+        },
+        {
+          "description": "Enables the remove_by_id command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-remove-by-id"
+        },
+        {
+          "description": "Enables the set_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-icon"
+        },
+        {
+          "description": "Enables the set_icon_as_template command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-icon-as-template"
+        },
+        {
+          "description": "Enables the set_menu command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-menu"
+        },
+        {
+          "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-show-menu-on-left-click"
+        },
+        {
+          "description": "Enables the set_temp_dir_path command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-temp-dir-path"
+        },
+        {
+          "description": "Enables the set_title command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-title"
+        },
+        {
+          "description": "Enables the set_tooltip command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-tooltip"
+        },
+        {
+          "description": "Enables the set_visible command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-visible"
+        },
+        {
+          "description": "Denies the get_by_id command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-get-by-id"
+        },
+        {
+          "description": "Denies the new command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-new"
+        },
+        {
+          "description": "Denies the remove_by_id command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-remove-by-id"
+        },
+        {
+          "description": "Denies the set_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-icon"
+        },
+        {
+          "description": "Denies the set_icon_as_template command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-icon-as-template"
+        },
+        {
+          "description": "Denies the set_menu command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-menu"
+        },
+        {
+          "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-show-menu-on-left-click"
+        },
+        {
+          "description": "Denies the set_temp_dir_path command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-temp-dir-path"
+        },
+        {
+          "description": "Denies the set_title command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-title"
+        },
+        {
+          "description": "Denies the set_tooltip command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-tooltip"
+        },
+        {
+          "description": "Denies the set_visible command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-visible"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:webview:default"
+        },
+        {
+          "description": "Enables the clear_all_browsing_data command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-clear-all-browsing-data"
+        },
+        {
+          "description": "Enables the create_webview command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-create-webview"
+        },
+        {
+          "description": "Enables the create_webview_window command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-create-webview-window"
+        },
+        {
+          "description": "Enables the get_all_webviews command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-get-all-webviews"
+        },
+        {
+          "description": "Enables the internal_toggle_devtools command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-internal-toggle-devtools"
+        },
+        {
+          "description": "Enables the print command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-print"
+        },
+        {
+          "description": "Enables the reparent command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-reparent"
+        },
+        {
+          "description": "Enables the set_webview_focus command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-set-webview-focus"
+        },
+        {
+          "description": "Enables the set_webview_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-set-webview-position"
+        },
+        {
+          "description": "Enables the set_webview_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-set-webview-size"
+        },
+        {
+          "description": "Enables the set_webview_zoom command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-set-webview-zoom"
+        },
+        {
+          "description": "Enables the webview_close command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-webview-close"
+        },
+        {
+          "description": "Enables the webview_hide command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-webview-hide"
+        },
+        {
+          "description": "Enables the webview_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-webview-position"
+        },
+        {
+          "description": "Enables the webview_show command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-webview-show"
+        },
+        {
+          "description": "Enables the webview_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-webview-size"
+        },
+        {
+          "description": "Denies the clear_all_browsing_data command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-clear-all-browsing-data"
+        },
+        {
+          "description": "Denies the create_webview command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-create-webview"
+        },
+        {
+          "description": "Denies the create_webview_window command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-create-webview-window"
+        },
+        {
+          "description": "Denies the get_all_webviews command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-get-all-webviews"
+        },
+        {
+          "description": "Denies the internal_toggle_devtools command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-internal-toggle-devtools"
+        },
+        {
+          "description": "Denies the print command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-print"
+        },
+        {
+          "description": "Denies the reparent command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-reparent"
+        },
+        {
+          "description": "Denies the set_webview_focus command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-set-webview-focus"
+        },
+        {
+          "description": "Denies the set_webview_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-set-webview-position"
+        },
+        {
+          "description": "Denies the set_webview_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-set-webview-size"
+        },
+        {
+          "description": "Denies the set_webview_zoom command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-set-webview-zoom"
+        },
+        {
+          "description": "Denies the webview_close command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-webview-close"
+        },
+        {
+          "description": "Denies the webview_hide command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-webview-hide"
+        },
+        {
+          "description": "Denies the webview_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-webview-position"
+        },
+        {
+          "description": "Denies the webview_show command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-webview-show"
+        },
+        {
+          "description": "Denies the webview_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-webview-size"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:window:default"
+        },
+        {
+          "description": "Enables the available_monitors command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-available-monitors"
+        },
+        {
+          "description": "Enables the center command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-center"
+        },
+        {
+          "description": "Enables the close command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-close"
+        },
+        {
+          "description": "Enables the create command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-create"
+        },
+        {
+          "description": "Enables the current_monitor command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-current-monitor"
+        },
+        {
+          "description": "Enables the cursor_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-cursor-position"
+        },
+        {
+          "description": "Enables the destroy command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-destroy"
+        },
+        {
+          "description": "Enables the get_all_windows command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-get-all-windows"
+        },
+        {
+          "description": "Enables the hide command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-hide"
+        },
+        {
+          "description": "Enables the inner_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-inner-position"
+        },
+        {
+          "description": "Enables the inner_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-inner-size"
+        },
+        {
+          "description": "Enables the internal_toggle_maximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-internal-toggle-maximize"
+        },
+        {
+          "description": "Enables the is_closable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-closable"
+        },
+        {
+          "description": "Enables the is_decorated command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-decorated"
+        },
+        {
+          "description": "Enables the is_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-enabled"
+        },
+        {
+          "description": "Enables the is_focused command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-focused"
+        },
+        {
+          "description": "Enables the is_fullscreen command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-fullscreen"
+        },
+        {
+          "description": "Enables the is_maximizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-maximizable"
+        },
+        {
+          "description": "Enables the is_maximized command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-maximized"
+        },
+        {
+          "description": "Enables the is_minimizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-minimizable"
+        },
+        {
+          "description": "Enables the is_minimized command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-minimized"
+        },
+        {
+          "description": "Enables the is_resizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-resizable"
+        },
+        {
+          "description": "Enables the is_visible command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-visible"
+        },
+        {
+          "description": "Enables the maximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-maximize"
+        },
+        {
+          "description": "Enables the minimize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-minimize"
+        },
+        {
+          "description": "Enables the monitor_from_point command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-monitor-from-point"
+        },
+        {
+          "description": "Enables the outer_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-outer-position"
+        },
+        {
+          "description": "Enables the outer_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-outer-size"
+        },
+        {
+          "description": "Enables the primary_monitor command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-primary-monitor"
+        },
+        {
+          "description": "Enables the request_user_attention command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-request-user-attention"
+        },
+        {
+          "description": "Enables the scale_factor command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-scale-factor"
+        },
+        {
+          "description": "Enables the set_always_on_bottom command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-always-on-bottom"
+        },
+        {
+          "description": "Enables the set_always_on_top command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-always-on-top"
+        },
+        {
+          "description": "Enables the set_closable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-closable"
+        },
+        {
+          "description": "Enables the set_content_protected command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-content-protected"
+        },
+        {
+          "description": "Enables the set_cursor_grab command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-cursor-grab"
+        },
+        {
+          "description": "Enables the set_cursor_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-cursor-icon"
+        },
+        {
+          "description": "Enables the set_cursor_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-cursor-position"
+        },
+        {
+          "description": "Enables the set_cursor_visible command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-cursor-visible"
+        },
+        {
+          "description": "Enables the set_decorations command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-decorations"
+        },
+        {
+          "description": "Enables the set_effects command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-effects"
+        },
+        {
+          "description": "Enables the set_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-enabled"
+        },
+        {
+          "description": "Enables the set_focus command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-focus"
+        },
+        {
+          "description": "Enables the set_fullscreen command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-fullscreen"
+        },
+        {
+          "description": "Enables the set_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-icon"
+        },
+        {
+          "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-ignore-cursor-events"
+        },
+        {
+          "description": "Enables the set_max_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-max-size"
+        },
+        {
+          "description": "Enables the set_maximizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-maximizable"
+        },
+        {
+          "description": "Enables the set_min_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-min-size"
+        },
+        {
+          "description": "Enables the set_minimizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-minimizable"
+        },
+        {
+          "description": "Enables the set_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-position"
+        },
+        {
+          "description": "Enables the set_progress_bar command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-progress-bar"
+        },
+        {
+          "description": "Enables the set_resizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-resizable"
+        },
+        {
+          "description": "Enables the set_shadow command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-shadow"
+        },
+        {
+          "description": "Enables the set_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-size"
+        },
+        {
+          "description": "Enables the set_size_constraints command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-size-constraints"
+        },
+        {
+          "description": "Enables the set_skip_taskbar command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-skip-taskbar"
+        },
+        {
+          "description": "Enables the set_theme command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-theme"
+        },
+        {
+          "description": "Enables the set_title command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-title"
+        },
+        {
+          "description": "Enables the set_title_bar_style command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-title-bar-style"
+        },
+        {
+          "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-visible-on-all-workspaces"
+        },
+        {
+          "description": "Enables the show command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-show"
+        },
+        {
+          "description": "Enables the start_dragging command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-start-dragging"
+        },
+        {
+          "description": "Enables the start_resize_dragging command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-start-resize-dragging"
+        },
+        {
+          "description": "Enables the theme command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-theme"
+        },
+        {
+          "description": "Enables the title command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-title"
+        },
+        {
+          "description": "Enables the toggle_maximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-toggle-maximize"
+        },
+        {
+          "description": "Enables the unmaximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-unmaximize"
+        },
+        {
+          "description": "Enables the unminimize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-unminimize"
+        },
+        {
+          "description": "Denies the available_monitors command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-available-monitors"
+        },
+        {
+          "description": "Denies the center command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-center"
+        },
+        {
+          "description": "Denies the close command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-close"
+        },
+        {
+          "description": "Denies the create command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-create"
+        },
+        {
+          "description": "Denies the current_monitor command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-current-monitor"
+        },
+        {
+          "description": "Denies the cursor_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-cursor-position"
+        },
+        {
+          "description": "Denies the destroy command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-destroy"
+        },
+        {
+          "description": "Denies the get_all_windows command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-get-all-windows"
+        },
+        {
+          "description": "Denies the hide command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-hide"
+        },
+        {
+          "description": "Denies the inner_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-inner-position"
+        },
+        {
+          "description": "Denies the inner_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-inner-size"
+        },
+        {
+          "description": "Denies the internal_toggle_maximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-internal-toggle-maximize"
+        },
+        {
+          "description": "Denies the is_closable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-closable"
+        },
+        {
+          "description": "Denies the is_decorated command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-decorated"
+        },
+        {
+          "description": "Denies the is_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-enabled"
+        },
+        {
+          "description": "Denies the is_focused command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-focused"
+        },
+        {
+          "description": "Denies the is_fullscreen command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-fullscreen"
+        },
+        {
+          "description": "Denies the is_maximizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-maximizable"
+        },
+        {
+          "description": "Denies the is_maximized command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-maximized"
+        },
+        {
+          "description": "Denies the is_minimizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-minimizable"
+        },
+        {
+          "description": "Denies the is_minimized command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-minimized"
+        },
+        {
+          "description": "Denies the is_resizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-resizable"
+        },
+        {
+          "description": "Denies the is_visible command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-visible"
+        },
+        {
+          "description": "Denies the maximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-maximize"
+        },
+        {
+          "description": "Denies the minimize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-minimize"
+        },
+        {
+          "description": "Denies the monitor_from_point command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-monitor-from-point"
+        },
+        {
+          "description": "Denies the outer_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-outer-position"
+        },
+        {
+          "description": "Denies the outer_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-outer-size"
+        },
+        {
+          "description": "Denies the primary_monitor command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-primary-monitor"
+        },
+        {
+          "description": "Denies the request_user_attention command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-request-user-attention"
+        },
+        {
+          "description": "Denies the scale_factor command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-scale-factor"
+        },
+        {
+          "description": "Denies the set_always_on_bottom command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-always-on-bottom"
+        },
+        {
+          "description": "Denies the set_always_on_top command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-always-on-top"
+        },
+        {
+          "description": "Denies the set_closable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-closable"
+        },
+        {
+          "description": "Denies the set_content_protected command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-content-protected"
+        },
+        {
+          "description": "Denies the set_cursor_grab command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-cursor-grab"
+        },
+        {
+          "description": "Denies the set_cursor_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-cursor-icon"
+        },
+        {
+          "description": "Denies the set_cursor_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-cursor-position"
+        },
+        {
+          "description": "Denies the set_cursor_visible command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-cursor-visible"
+        },
+        {
+          "description": "Denies the set_decorations command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-decorations"
+        },
+        {
+          "description": "Denies the set_effects command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-effects"
+        },
+        {
+          "description": "Denies the set_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-enabled"
+        },
+        {
+          "description": "Denies the set_focus command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-focus"
+        },
+        {
+          "description": "Denies the set_fullscreen command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-fullscreen"
+        },
+        {
+          "description": "Denies the set_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-icon"
+        },
+        {
+          "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-ignore-cursor-events"
+        },
+        {
+          "description": "Denies the set_max_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-max-size"
+        },
+        {
+          "description": "Denies the set_maximizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-maximizable"
+        },
+        {
+          "description": "Denies the set_min_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-min-size"
+        },
+        {
+          "description": "Denies the set_minimizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-minimizable"
+        },
+        {
+          "description": "Denies the set_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-position"
+        },
+        {
+          "description": "Denies the set_progress_bar command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-progress-bar"
+        },
+        {
+          "description": "Denies the set_resizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-resizable"
+        },
+        {
+          "description": "Denies the set_shadow command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-shadow"
+        },
+        {
+          "description": "Denies the set_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-size"
+        },
+        {
+          "description": "Denies the set_size_constraints command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-size-constraints"
+        },
+        {
+          "description": "Denies the set_skip_taskbar command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-skip-taskbar"
+        },
+        {
+          "description": "Denies the set_theme command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-theme"
+        },
+        {
+          "description": "Denies the set_title command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-title"
+        },
+        {
+          "description": "Denies the set_title_bar_style command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-title-bar-style"
+        },
+        {
+          "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-visible-on-all-workspaces"
+        },
+        {
+          "description": "Denies the show command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-show"
+        },
+        {
+          "description": "Denies the start_dragging command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-start-dragging"
+        },
+        {
+          "description": "Denies the start_resize_dragging command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-start-resize-dragging"
+        },
+        {
+          "description": "Denies the theme command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-theme"
+        },
+        {
+          "description": "Denies the title command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-title"
+        },
+        {
+          "description": "Denies the toggle_maximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-toggle-maximize"
+        },
+        {
+          "description": "Denies the unmaximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-unmaximize"
+        },
+        {
+          "description": "Denies the unminimize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-unminimize"
+        },
+        {
+          "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n",
+          "type": "string",
+          "const": "shell:default"
+        },
+        {
+          "description": "Enables the execute command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:allow-execute"
+        },
+        {
+          "description": "Enables the kill command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:allow-kill"
+        },
+        {
+          "description": "Enables the open command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:allow-open"
+        },
+        {
+          "description": "Enables the spawn command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:allow-spawn"
+        },
+        {
+          "description": "Enables the stdin_write command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:allow-stdin-write"
+        },
+        {
+          "description": "Denies the execute command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:deny-execute"
+        },
+        {
+          "description": "Denies the kill command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:deny-kill"
+        },
+        {
+          "description": "Denies the open command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:deny-open"
+        },
+        {
+          "description": "Denies the spawn command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:deny-spawn"
+        },
+        {
+          "description": "Denies the stdin_write command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:deny-stdin-write"
+        }
+      ]
+    },
+    "Value": {
+      "description": "All supported ACL values.",
+      "anyOf": [
+        {
+          "description": "Represents a null JSON value.",
+          "type": "null"
+        },
+        {
+          "description": "Represents a [`bool`].",
+          "type": "boolean"
+        },
+        {
+          "description": "Represents a valid ACL [`Number`].",
+          "allOf": [
+            {
+              "$ref": "#/definitions/Number"
+            }
+          ]
+        },
+        {
+          "description": "Represents a [`String`].",
+          "type": "string"
+        },
+        {
+          "description": "Represents a list of other [`Value`]s.",
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Value"
+          }
+        },
+        {
+          "description": "Represents a map of [`String`] keys to [`Value`]s.",
+          "type": "object",
+          "additionalProperties": {
+            "$ref": "#/definitions/Value"
+          }
+        }
+      ]
+    },
+    "Number": {
+      "description": "A valid ACL number.",
+      "anyOf": [
+        {
+          "description": "Represents an [`i64`].",
+          "type": "integer",
+          "format": "int64"
+        },
+        {
+          "description": "Represents a [`f64`].",
+          "type": "number",
+          "format": "double"
+        }
+      ]
+    },
+    "Target": {
+      "description": "Platform target.",
+      "oneOf": [
+        {
+          "description": "MacOS.",
+          "type": "string",
+          "enum": [
+            "macOS"
+          ]
+        },
+        {
+          "description": "Windows.",
+          "type": "string",
+          "enum": [
+            "windows"
+          ]
+        },
+        {
+          "description": "Linux.",
+          "type": "string",
+          "enum": [
+            "linux"
+          ]
+        },
+        {
+          "description": "Android.",
+          "type": "string",
+          "enum": [
+            "android"
+          ]
+        },
+        {
+          "description": "iOS.",
+          "type": "string",
+          "enum": [
+            "iOS"
+          ]
+        }
+      ]
+    },
+    "ShellScopeEntryAllowedArg": {
+      "description": "A command argument allowed to be executed by the webview API.",
+      "anyOf": [
+        {
+          "description": "A non-configurable argument that is passed to the command in the order it was specified.",
+          "type": "string"
+        },
+        {
+          "description": "A variable that is set while calling the command from the webview API.",
+          "type": "object",
+          "required": [
+            "validator"
+          ],
+          "properties": {
+            "raw": {
+              "description": "Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.",
+              "default": false,
+              "type": "boolean"
+            },
+            "validator": {
+              "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: <https://docs.rs/regex/latest/regex/#syntax>",
+              "type": "string"
+            }
+          },
+          "additionalProperties": false
+        }
+      ]
+    },
+    "ShellScopeEntryAllowedArgs": {
+      "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.",
+      "anyOf": [
+        {
+          "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.",
+          "type": "boolean"
+        },
+        {
+          "description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.",
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/ShellScopeEntryAllowedArg"
+          }
+        }
+      ]
+    }
+  }
+}
\ No newline at end of file
diff --git a/packages/desktop/src-tauri/gen/schemas/macOS-schema.json b/packages/desktop/src-tauri/gen/schemas/macOS-schema.json
new file mode 100644
index 000000000..ed816e6cc
--- /dev/null
+++ b/packages/desktop/src-tauri/gen/schemas/macOS-schema.json
@@ -0,0 +1,2054 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "title": "CapabilityFile",
+  "description": "Capability formats accepted in a capability file.",
+  "anyOf": [
+    {
+      "description": "A single capability.",
+      "allOf": [
+        {
+          "$ref": "#/definitions/Capability"
+        }
+      ]
+    },
+    {
+      "description": "A list of capabilities.",
+      "type": "array",
+      "items": {
+        "$ref": "#/definitions/Capability"
+      }
+    },
+    {
+      "description": "A list of capabilities.",
+      "type": "object",
+      "required": [
+        "capabilities"
+      ],
+      "properties": {
+        "capabilities": {
+          "description": "The list of capabilities.",
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Capability"
+          }
+        }
+      }
+    }
+  ],
+  "definitions": {
+    "Capability": {
+      "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows fine grained access to the Tauri core, application, or plugin commands. If a window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, \"platforms\": [\"macOS\",\"windows\"] } ```",
+      "type": "object",
+      "required": [
+        "identifier",
+        "permissions"
+      ],
+      "properties": {
+        "identifier": {
+          "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`",
+          "type": "string"
+        },
+        "description": {
+          "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.",
+          "default": "",
+          "type": "string"
+        },
+        "remote": {
+          "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```",
+          "anyOf": [
+            {
+              "$ref": "#/definitions/CapabilityRemote"
+            },
+            {
+              "type": "null"
+            }
+          ]
+        },
+        "local": {
+          "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.",
+          "default": true,
+          "type": "boolean"
+        },
+        "windows": {
+          "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nOn multiwebview windows, prefer [`Self::webviews`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "webviews": {
+          "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThis is only required when using on multiwebview contexts, by default all child webviews of a window that matches [`Self::windows`] are linked.\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "permissions": {
+          "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ```",
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/PermissionEntry"
+          },
+          "uniqueItems": true
+        },
+        "platforms": {
+          "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`",
+          "type": [
+            "array",
+            "null"
+          ],
+          "items": {
+            "$ref": "#/definitions/Target"
+          }
+        }
+      }
+    },
+    "CapabilityRemote": {
+      "description": "Configuration for remote URLs that are associated with the capability.",
+      "type": "object",
+      "required": [
+        "urls"
+      ],
+      "properties": {
+        "urls": {
+          "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "PermissionEntry": {
+      "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.",
+      "anyOf": [
+        {
+          "description": "Reference a permission or permission set by identifier.",
+          "allOf": [
+            {
+              "$ref": "#/definitions/Identifier"
+            }
+          ]
+        },
+        {
+          "description": "Reference a permission or permission set by identifier and extends its scope.",
+          "type": "object",
+          "allOf": [
+            {
+              "if": {
+                "properties": {
+                  "identifier": {
+                    "anyOf": [
+                      {
+                        "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n",
+                        "type": "string",
+                        "const": "shell:default"
+                      },
+                      {
+                        "description": "Enables the execute command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:allow-execute"
+                      },
+                      {
+                        "description": "Enables the kill command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:allow-kill"
+                      },
+                      {
+                        "description": "Enables the open command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:allow-open"
+                      },
+                      {
+                        "description": "Enables the spawn command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:allow-spawn"
+                      },
+                      {
+                        "description": "Enables the stdin_write command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:allow-stdin-write"
+                      },
+                      {
+                        "description": "Denies the execute command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:deny-execute"
+                      },
+                      {
+                        "description": "Denies the kill command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:deny-kill"
+                      },
+                      {
+                        "description": "Denies the open command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:deny-open"
+                      },
+                      {
+                        "description": "Denies the spawn command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:deny-spawn"
+                      },
+                      {
+                        "description": "Denies the stdin_write command without any pre-configured scope.",
+                        "type": "string",
+                        "const": "shell:deny-stdin-write"
+                      }
+                    ]
+                  }
+                }
+              },
+              "then": {
+                "properties": {
+                  "allow": {
+                    "items": {
+                      "title": "ShellScopeEntry",
+                      "description": "Shell scope entry.",
+                      "anyOf": [
+                        {
+                          "type": "object",
+                          "required": [
+                            "cmd",
+                            "name"
+                          ],
+                          "properties": {
+                            "args": {
+                              "description": "The allowed arguments for the command execution.",
+                              "allOf": [
+                                {
+                                  "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+                                }
+                              ]
+                            },
+                            "cmd": {
+                              "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.",
+                              "type": "string"
+                            },
+                            "name": {
+                              "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+                              "type": "string"
+                            }
+                          },
+                          "additionalProperties": false
+                        },
+                        {
+                          "type": "object",
+                          "required": [
+                            "name",
+                            "sidecar"
+                          ],
+                          "properties": {
+                            "args": {
+                              "description": "The allowed arguments for the command execution.",
+                              "allOf": [
+                                {
+                                  "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+                                }
+                              ]
+                            },
+                            "name": {
+                              "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+                              "type": "string"
+                            },
+                            "sidecar": {
+                              "description": "If this command is a sidecar command.",
+                              "type": "boolean"
+                            }
+                          },
+                          "additionalProperties": false
+                        }
+                      ]
+                    }
+                  },
+                  "deny": {
+                    "items": {
+                      "title": "ShellScopeEntry",
+                      "description": "Shell scope entry.",
+                      "anyOf": [
+                        {
+                          "type": "object",
+                          "required": [
+                            "cmd",
+                            "name"
+                          ],
+                          "properties": {
+                            "args": {
+                              "description": "The allowed arguments for the command execution.",
+                              "allOf": [
+                                {
+                                  "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+                                }
+                              ]
+                            },
+                            "cmd": {
+                              "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.",
+                              "type": "string"
+                            },
+                            "name": {
+                              "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+                              "type": "string"
+                            }
+                          },
+                          "additionalProperties": false
+                        },
+                        {
+                          "type": "object",
+                          "required": [
+                            "name",
+                            "sidecar"
+                          ],
+                          "properties": {
+                            "args": {
+                              "description": "The allowed arguments for the command execution.",
+                              "allOf": [
+                                {
+                                  "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+                                }
+                              ]
+                            },
+                            "name": {
+                              "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+                              "type": "string"
+                            },
+                            "sidecar": {
+                              "description": "If this command is a sidecar command.",
+                              "type": "boolean"
+                            }
+                          },
+                          "additionalProperties": false
+                        }
+                      ]
+                    }
+                  }
+                }
+              },
+              "properties": {
+                "identifier": {
+                  "description": "Identifier of the permission or permission set.",
+                  "allOf": [
+                    {
+                      "$ref": "#/definitions/Identifier"
+                    }
+                  ]
+                }
+              }
+            },
+            {
+              "properties": {
+                "identifier": {
+                  "description": "Identifier of the permission or permission set.",
+                  "allOf": [
+                    {
+                      "$ref": "#/definitions/Identifier"
+                    }
+                  ]
+                },
+                "allow": {
+                  "description": "Data that defines what is allowed by the scope.",
+                  "type": [
+                    "array",
+                    "null"
+                  ],
+                  "items": {
+                    "$ref": "#/definitions/Value"
+                  }
+                },
+                "deny": {
+                  "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.",
+                  "type": [
+                    "array",
+                    "null"
+                  ],
+                  "items": {
+                    "$ref": "#/definitions/Value"
+                  }
+                }
+              }
+            }
+          ],
+          "required": [
+            "identifier"
+          ]
+        }
+      ]
+    },
+    "Identifier": {
+      "description": "Permission identifier",
+      "oneOf": [
+        {
+          "description": "Default core plugins set which includes:\n- 'core:path:default'\n- 'core:event:default'\n- 'core:window:default'\n- 'core:webview:default'\n- 'core:app:default'\n- 'core:image:default'\n- 'core:resources:default'\n- 'core:menu:default'\n- 'core:tray:default'\n",
+          "type": "string",
+          "const": "core:default"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:app:default"
+        },
+        {
+          "description": "Enables the app_hide command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:allow-app-hide"
+        },
+        {
+          "description": "Enables the app_show command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:allow-app-show"
+        },
+        {
+          "description": "Enables the default_window_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:allow-default-window-icon"
+        },
+        {
+          "description": "Enables the name command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:allow-name"
+        },
+        {
+          "description": "Enables the set_app_theme command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:allow-set-app-theme"
+        },
+        {
+          "description": "Enables the tauri_version command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:allow-tauri-version"
+        },
+        {
+          "description": "Enables the version command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:allow-version"
+        },
+        {
+          "description": "Denies the app_hide command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:deny-app-hide"
+        },
+        {
+          "description": "Denies the app_show command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:deny-app-show"
+        },
+        {
+          "description": "Denies the default_window_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:deny-default-window-icon"
+        },
+        {
+          "description": "Denies the name command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:deny-name"
+        },
+        {
+          "description": "Denies the set_app_theme command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:deny-set-app-theme"
+        },
+        {
+          "description": "Denies the tauri_version command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:deny-tauri-version"
+        },
+        {
+          "description": "Denies the version command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:app:deny-version"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:event:default"
+        },
+        {
+          "description": "Enables the emit command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:allow-emit"
+        },
+        {
+          "description": "Enables the emit_to command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:allow-emit-to"
+        },
+        {
+          "description": "Enables the listen command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:allow-listen"
+        },
+        {
+          "description": "Enables the unlisten command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:allow-unlisten"
+        },
+        {
+          "description": "Denies the emit command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:deny-emit"
+        },
+        {
+          "description": "Denies the emit_to command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:deny-emit-to"
+        },
+        {
+          "description": "Denies the listen command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:deny-listen"
+        },
+        {
+          "description": "Denies the unlisten command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:event:deny-unlisten"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:image:default"
+        },
+        {
+          "description": "Enables the from_bytes command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:allow-from-bytes"
+        },
+        {
+          "description": "Enables the from_path command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:allow-from-path"
+        },
+        {
+          "description": "Enables the new command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:allow-new"
+        },
+        {
+          "description": "Enables the rgba command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:allow-rgba"
+        },
+        {
+          "description": "Enables the size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:allow-size"
+        },
+        {
+          "description": "Denies the from_bytes command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:deny-from-bytes"
+        },
+        {
+          "description": "Denies the from_path command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:deny-from-path"
+        },
+        {
+          "description": "Denies the new command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:deny-new"
+        },
+        {
+          "description": "Denies the rgba command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:deny-rgba"
+        },
+        {
+          "description": "Denies the size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:image:deny-size"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:menu:default"
+        },
+        {
+          "description": "Enables the append command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-append"
+        },
+        {
+          "description": "Enables the create_default command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-create-default"
+        },
+        {
+          "description": "Enables the get command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-get"
+        },
+        {
+          "description": "Enables the insert command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-insert"
+        },
+        {
+          "description": "Enables the is_checked command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-is-checked"
+        },
+        {
+          "description": "Enables the is_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-is-enabled"
+        },
+        {
+          "description": "Enables the items command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-items"
+        },
+        {
+          "description": "Enables the new command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-new"
+        },
+        {
+          "description": "Enables the popup command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-popup"
+        },
+        {
+          "description": "Enables the prepend command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-prepend"
+        },
+        {
+          "description": "Enables the remove command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-remove"
+        },
+        {
+          "description": "Enables the remove_at command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-remove-at"
+        },
+        {
+          "description": "Enables the set_accelerator command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-accelerator"
+        },
+        {
+          "description": "Enables the set_as_app_menu command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-as-app-menu"
+        },
+        {
+          "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-as-help-menu-for-nsapp"
+        },
+        {
+          "description": "Enables the set_as_window_menu command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-as-window-menu"
+        },
+        {
+          "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-as-windows-menu-for-nsapp"
+        },
+        {
+          "description": "Enables the set_checked command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-checked"
+        },
+        {
+          "description": "Enables the set_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-enabled"
+        },
+        {
+          "description": "Enables the set_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-icon"
+        },
+        {
+          "description": "Enables the set_text command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-set-text"
+        },
+        {
+          "description": "Enables the text command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:allow-text"
+        },
+        {
+          "description": "Denies the append command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-append"
+        },
+        {
+          "description": "Denies the create_default command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-create-default"
+        },
+        {
+          "description": "Denies the get command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-get"
+        },
+        {
+          "description": "Denies the insert command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-insert"
+        },
+        {
+          "description": "Denies the is_checked command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-is-checked"
+        },
+        {
+          "description": "Denies the is_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-is-enabled"
+        },
+        {
+          "description": "Denies the items command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-items"
+        },
+        {
+          "description": "Denies the new command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-new"
+        },
+        {
+          "description": "Denies the popup command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-popup"
+        },
+        {
+          "description": "Denies the prepend command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-prepend"
+        },
+        {
+          "description": "Denies the remove command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-remove"
+        },
+        {
+          "description": "Denies the remove_at command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-remove-at"
+        },
+        {
+          "description": "Denies the set_accelerator command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-accelerator"
+        },
+        {
+          "description": "Denies the set_as_app_menu command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-as-app-menu"
+        },
+        {
+          "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-as-help-menu-for-nsapp"
+        },
+        {
+          "description": "Denies the set_as_window_menu command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-as-window-menu"
+        },
+        {
+          "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-as-windows-menu-for-nsapp"
+        },
+        {
+          "description": "Denies the set_checked command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-checked"
+        },
+        {
+          "description": "Denies the set_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-enabled"
+        },
+        {
+          "description": "Denies the set_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-icon"
+        },
+        {
+          "description": "Denies the set_text command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-set-text"
+        },
+        {
+          "description": "Denies the text command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:menu:deny-text"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:path:default"
+        },
+        {
+          "description": "Enables the basename command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-basename"
+        },
+        {
+          "description": "Enables the dirname command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-dirname"
+        },
+        {
+          "description": "Enables the extname command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-extname"
+        },
+        {
+          "description": "Enables the is_absolute command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-is-absolute"
+        },
+        {
+          "description": "Enables the join command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-join"
+        },
+        {
+          "description": "Enables the normalize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-normalize"
+        },
+        {
+          "description": "Enables the resolve command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-resolve"
+        },
+        {
+          "description": "Enables the resolve_directory command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:allow-resolve-directory"
+        },
+        {
+          "description": "Denies the basename command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-basename"
+        },
+        {
+          "description": "Denies the dirname command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-dirname"
+        },
+        {
+          "description": "Denies the extname command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-extname"
+        },
+        {
+          "description": "Denies the is_absolute command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-is-absolute"
+        },
+        {
+          "description": "Denies the join command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-join"
+        },
+        {
+          "description": "Denies the normalize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-normalize"
+        },
+        {
+          "description": "Denies the resolve command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-resolve"
+        },
+        {
+          "description": "Denies the resolve_directory command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:path:deny-resolve-directory"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:resources:default"
+        },
+        {
+          "description": "Enables the close command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:resources:allow-close"
+        },
+        {
+          "description": "Denies the close command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:resources:deny-close"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:tray:default"
+        },
+        {
+          "description": "Enables the get_by_id command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-get-by-id"
+        },
+        {
+          "description": "Enables the new command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-new"
+        },
+        {
+          "description": "Enables the remove_by_id command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-remove-by-id"
+        },
+        {
+          "description": "Enables the set_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-icon"
+        },
+        {
+          "description": "Enables the set_icon_as_template command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-icon-as-template"
+        },
+        {
+          "description": "Enables the set_menu command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-menu"
+        },
+        {
+          "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-show-menu-on-left-click"
+        },
+        {
+          "description": "Enables the set_temp_dir_path command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-temp-dir-path"
+        },
+        {
+          "description": "Enables the set_title command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-title"
+        },
+        {
+          "description": "Enables the set_tooltip command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-tooltip"
+        },
+        {
+          "description": "Enables the set_visible command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:allow-set-visible"
+        },
+        {
+          "description": "Denies the get_by_id command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-get-by-id"
+        },
+        {
+          "description": "Denies the new command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-new"
+        },
+        {
+          "description": "Denies the remove_by_id command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-remove-by-id"
+        },
+        {
+          "description": "Denies the set_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-icon"
+        },
+        {
+          "description": "Denies the set_icon_as_template command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-icon-as-template"
+        },
+        {
+          "description": "Denies the set_menu command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-menu"
+        },
+        {
+          "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-show-menu-on-left-click"
+        },
+        {
+          "description": "Denies the set_temp_dir_path command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-temp-dir-path"
+        },
+        {
+          "description": "Denies the set_title command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-title"
+        },
+        {
+          "description": "Denies the set_tooltip command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-tooltip"
+        },
+        {
+          "description": "Denies the set_visible command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:tray:deny-set-visible"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:webview:default"
+        },
+        {
+          "description": "Enables the clear_all_browsing_data command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-clear-all-browsing-data"
+        },
+        {
+          "description": "Enables the create_webview command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-create-webview"
+        },
+        {
+          "description": "Enables the create_webview_window command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-create-webview-window"
+        },
+        {
+          "description": "Enables the get_all_webviews command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-get-all-webviews"
+        },
+        {
+          "description": "Enables the internal_toggle_devtools command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-internal-toggle-devtools"
+        },
+        {
+          "description": "Enables the print command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-print"
+        },
+        {
+          "description": "Enables the reparent command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-reparent"
+        },
+        {
+          "description": "Enables the set_webview_focus command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-set-webview-focus"
+        },
+        {
+          "description": "Enables the set_webview_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-set-webview-position"
+        },
+        {
+          "description": "Enables the set_webview_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-set-webview-size"
+        },
+        {
+          "description": "Enables the set_webview_zoom command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-set-webview-zoom"
+        },
+        {
+          "description": "Enables the webview_close command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-webview-close"
+        },
+        {
+          "description": "Enables the webview_hide command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-webview-hide"
+        },
+        {
+          "description": "Enables the webview_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-webview-position"
+        },
+        {
+          "description": "Enables the webview_show command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-webview-show"
+        },
+        {
+          "description": "Enables the webview_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:allow-webview-size"
+        },
+        {
+          "description": "Denies the clear_all_browsing_data command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-clear-all-browsing-data"
+        },
+        {
+          "description": "Denies the create_webview command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-create-webview"
+        },
+        {
+          "description": "Denies the create_webview_window command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-create-webview-window"
+        },
+        {
+          "description": "Denies the get_all_webviews command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-get-all-webviews"
+        },
+        {
+          "description": "Denies the internal_toggle_devtools command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-internal-toggle-devtools"
+        },
+        {
+          "description": "Denies the print command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-print"
+        },
+        {
+          "description": "Denies the reparent command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-reparent"
+        },
+        {
+          "description": "Denies the set_webview_focus command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-set-webview-focus"
+        },
+        {
+          "description": "Denies the set_webview_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-set-webview-position"
+        },
+        {
+          "description": "Denies the set_webview_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-set-webview-size"
+        },
+        {
+          "description": "Denies the set_webview_zoom command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-set-webview-zoom"
+        },
+        {
+          "description": "Denies the webview_close command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-webview-close"
+        },
+        {
+          "description": "Denies the webview_hide command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-webview-hide"
+        },
+        {
+          "description": "Denies the webview_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-webview-position"
+        },
+        {
+          "description": "Denies the webview_show command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-webview-show"
+        },
+        {
+          "description": "Denies the webview_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:webview:deny-webview-size"
+        },
+        {
+          "description": "Default permissions for the plugin.",
+          "type": "string",
+          "const": "core:window:default"
+        },
+        {
+          "description": "Enables the available_monitors command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-available-monitors"
+        },
+        {
+          "description": "Enables the center command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-center"
+        },
+        {
+          "description": "Enables the close command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-close"
+        },
+        {
+          "description": "Enables the create command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-create"
+        },
+        {
+          "description": "Enables the current_monitor command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-current-monitor"
+        },
+        {
+          "description": "Enables the cursor_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-cursor-position"
+        },
+        {
+          "description": "Enables the destroy command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-destroy"
+        },
+        {
+          "description": "Enables the get_all_windows command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-get-all-windows"
+        },
+        {
+          "description": "Enables the hide command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-hide"
+        },
+        {
+          "description": "Enables the inner_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-inner-position"
+        },
+        {
+          "description": "Enables the inner_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-inner-size"
+        },
+        {
+          "description": "Enables the internal_toggle_maximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-internal-toggle-maximize"
+        },
+        {
+          "description": "Enables the is_closable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-closable"
+        },
+        {
+          "description": "Enables the is_decorated command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-decorated"
+        },
+        {
+          "description": "Enables the is_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-enabled"
+        },
+        {
+          "description": "Enables the is_focused command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-focused"
+        },
+        {
+          "description": "Enables the is_fullscreen command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-fullscreen"
+        },
+        {
+          "description": "Enables the is_maximizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-maximizable"
+        },
+        {
+          "description": "Enables the is_maximized command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-maximized"
+        },
+        {
+          "description": "Enables the is_minimizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-minimizable"
+        },
+        {
+          "description": "Enables the is_minimized command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-minimized"
+        },
+        {
+          "description": "Enables the is_resizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-resizable"
+        },
+        {
+          "description": "Enables the is_visible command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-is-visible"
+        },
+        {
+          "description": "Enables the maximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-maximize"
+        },
+        {
+          "description": "Enables the minimize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-minimize"
+        },
+        {
+          "description": "Enables the monitor_from_point command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-monitor-from-point"
+        },
+        {
+          "description": "Enables the outer_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-outer-position"
+        },
+        {
+          "description": "Enables the outer_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-outer-size"
+        },
+        {
+          "description": "Enables the primary_monitor command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-primary-monitor"
+        },
+        {
+          "description": "Enables the request_user_attention command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-request-user-attention"
+        },
+        {
+          "description": "Enables the scale_factor command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-scale-factor"
+        },
+        {
+          "description": "Enables the set_always_on_bottom command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-always-on-bottom"
+        },
+        {
+          "description": "Enables the set_always_on_top command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-always-on-top"
+        },
+        {
+          "description": "Enables the set_closable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-closable"
+        },
+        {
+          "description": "Enables the set_content_protected command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-content-protected"
+        },
+        {
+          "description": "Enables the set_cursor_grab command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-cursor-grab"
+        },
+        {
+          "description": "Enables the set_cursor_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-cursor-icon"
+        },
+        {
+          "description": "Enables the set_cursor_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-cursor-position"
+        },
+        {
+          "description": "Enables the set_cursor_visible command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-cursor-visible"
+        },
+        {
+          "description": "Enables the set_decorations command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-decorations"
+        },
+        {
+          "description": "Enables the set_effects command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-effects"
+        },
+        {
+          "description": "Enables the set_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-enabled"
+        },
+        {
+          "description": "Enables the set_focus command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-focus"
+        },
+        {
+          "description": "Enables the set_fullscreen command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-fullscreen"
+        },
+        {
+          "description": "Enables the set_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-icon"
+        },
+        {
+          "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-ignore-cursor-events"
+        },
+        {
+          "description": "Enables the set_max_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-max-size"
+        },
+        {
+          "description": "Enables the set_maximizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-maximizable"
+        },
+        {
+          "description": "Enables the set_min_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-min-size"
+        },
+        {
+          "description": "Enables the set_minimizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-minimizable"
+        },
+        {
+          "description": "Enables the set_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-position"
+        },
+        {
+          "description": "Enables the set_progress_bar command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-progress-bar"
+        },
+        {
+          "description": "Enables the set_resizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-resizable"
+        },
+        {
+          "description": "Enables the set_shadow command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-shadow"
+        },
+        {
+          "description": "Enables the set_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-size"
+        },
+        {
+          "description": "Enables the set_size_constraints command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-size-constraints"
+        },
+        {
+          "description": "Enables the set_skip_taskbar command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-skip-taskbar"
+        },
+        {
+          "description": "Enables the set_theme command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-theme"
+        },
+        {
+          "description": "Enables the set_title command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-title"
+        },
+        {
+          "description": "Enables the set_title_bar_style command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-title-bar-style"
+        },
+        {
+          "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-set-visible-on-all-workspaces"
+        },
+        {
+          "description": "Enables the show command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-show"
+        },
+        {
+          "description": "Enables the start_dragging command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-start-dragging"
+        },
+        {
+          "description": "Enables the start_resize_dragging command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-start-resize-dragging"
+        },
+        {
+          "description": "Enables the theme command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-theme"
+        },
+        {
+          "description": "Enables the title command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-title"
+        },
+        {
+          "description": "Enables the toggle_maximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-toggle-maximize"
+        },
+        {
+          "description": "Enables the unmaximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-unmaximize"
+        },
+        {
+          "description": "Enables the unminimize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:allow-unminimize"
+        },
+        {
+          "description": "Denies the available_monitors command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-available-monitors"
+        },
+        {
+          "description": "Denies the center command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-center"
+        },
+        {
+          "description": "Denies the close command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-close"
+        },
+        {
+          "description": "Denies the create command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-create"
+        },
+        {
+          "description": "Denies the current_monitor command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-current-monitor"
+        },
+        {
+          "description": "Denies the cursor_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-cursor-position"
+        },
+        {
+          "description": "Denies the destroy command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-destroy"
+        },
+        {
+          "description": "Denies the get_all_windows command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-get-all-windows"
+        },
+        {
+          "description": "Denies the hide command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-hide"
+        },
+        {
+          "description": "Denies the inner_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-inner-position"
+        },
+        {
+          "description": "Denies the inner_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-inner-size"
+        },
+        {
+          "description": "Denies the internal_toggle_maximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-internal-toggle-maximize"
+        },
+        {
+          "description": "Denies the is_closable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-closable"
+        },
+        {
+          "description": "Denies the is_decorated command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-decorated"
+        },
+        {
+          "description": "Denies the is_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-enabled"
+        },
+        {
+          "description": "Denies the is_focused command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-focused"
+        },
+        {
+          "description": "Denies the is_fullscreen command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-fullscreen"
+        },
+        {
+          "description": "Denies the is_maximizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-maximizable"
+        },
+        {
+          "description": "Denies the is_maximized command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-maximized"
+        },
+        {
+          "description": "Denies the is_minimizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-minimizable"
+        },
+        {
+          "description": "Denies the is_minimized command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-minimized"
+        },
+        {
+          "description": "Denies the is_resizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-resizable"
+        },
+        {
+          "description": "Denies the is_visible command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-is-visible"
+        },
+        {
+          "description": "Denies the maximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-maximize"
+        },
+        {
+          "description": "Denies the minimize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-minimize"
+        },
+        {
+          "description": "Denies the monitor_from_point command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-monitor-from-point"
+        },
+        {
+          "description": "Denies the outer_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-outer-position"
+        },
+        {
+          "description": "Denies the outer_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-outer-size"
+        },
+        {
+          "description": "Denies the primary_monitor command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-primary-monitor"
+        },
+        {
+          "description": "Denies the request_user_attention command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-request-user-attention"
+        },
+        {
+          "description": "Denies the scale_factor command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-scale-factor"
+        },
+        {
+          "description": "Denies the set_always_on_bottom command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-always-on-bottom"
+        },
+        {
+          "description": "Denies the set_always_on_top command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-always-on-top"
+        },
+        {
+          "description": "Denies the set_closable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-closable"
+        },
+        {
+          "description": "Denies the set_content_protected command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-content-protected"
+        },
+        {
+          "description": "Denies the set_cursor_grab command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-cursor-grab"
+        },
+        {
+          "description": "Denies the set_cursor_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-cursor-icon"
+        },
+        {
+          "description": "Denies the set_cursor_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-cursor-position"
+        },
+        {
+          "description": "Denies the set_cursor_visible command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-cursor-visible"
+        },
+        {
+          "description": "Denies the set_decorations command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-decorations"
+        },
+        {
+          "description": "Denies the set_effects command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-effects"
+        },
+        {
+          "description": "Denies the set_enabled command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-enabled"
+        },
+        {
+          "description": "Denies the set_focus command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-focus"
+        },
+        {
+          "description": "Denies the set_fullscreen command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-fullscreen"
+        },
+        {
+          "description": "Denies the set_icon command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-icon"
+        },
+        {
+          "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-ignore-cursor-events"
+        },
+        {
+          "description": "Denies the set_max_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-max-size"
+        },
+        {
+          "description": "Denies the set_maximizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-maximizable"
+        },
+        {
+          "description": "Denies the set_min_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-min-size"
+        },
+        {
+          "description": "Denies the set_minimizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-minimizable"
+        },
+        {
+          "description": "Denies the set_position command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-position"
+        },
+        {
+          "description": "Denies the set_progress_bar command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-progress-bar"
+        },
+        {
+          "description": "Denies the set_resizable command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-resizable"
+        },
+        {
+          "description": "Denies the set_shadow command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-shadow"
+        },
+        {
+          "description": "Denies the set_size command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-size"
+        },
+        {
+          "description": "Denies the set_size_constraints command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-size-constraints"
+        },
+        {
+          "description": "Denies the set_skip_taskbar command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-skip-taskbar"
+        },
+        {
+          "description": "Denies the set_theme command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-theme"
+        },
+        {
+          "description": "Denies the set_title command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-title"
+        },
+        {
+          "description": "Denies the set_title_bar_style command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-title-bar-style"
+        },
+        {
+          "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-set-visible-on-all-workspaces"
+        },
+        {
+          "description": "Denies the show command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-show"
+        },
+        {
+          "description": "Denies the start_dragging command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-start-dragging"
+        },
+        {
+          "description": "Denies the start_resize_dragging command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-start-resize-dragging"
+        },
+        {
+          "description": "Denies the theme command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-theme"
+        },
+        {
+          "description": "Denies the title command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-title"
+        },
+        {
+          "description": "Denies the toggle_maximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-toggle-maximize"
+        },
+        {
+          "description": "Denies the unmaximize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-unmaximize"
+        },
+        {
+          "description": "Denies the unminimize command without any pre-configured scope.",
+          "type": "string",
+          "const": "core:window:deny-unminimize"
+        },
+        {
+          "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n",
+          "type": "string",
+          "const": "shell:default"
+        },
+        {
+          "description": "Enables the execute command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:allow-execute"
+        },
+        {
+          "description": "Enables the kill command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:allow-kill"
+        },
+        {
+          "description": "Enables the open command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:allow-open"
+        },
+        {
+          "description": "Enables the spawn command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:allow-spawn"
+        },
+        {
+          "description": "Enables the stdin_write command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:allow-stdin-write"
+        },
+        {
+          "description": "Denies the execute command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:deny-execute"
+        },
+        {
+          "description": "Denies the kill command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:deny-kill"
+        },
+        {
+          "description": "Denies the open command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:deny-open"
+        },
+        {
+          "description": "Denies the spawn command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:deny-spawn"
+        },
+        {
+          "description": "Denies the stdin_write command without any pre-configured scope.",
+          "type": "string",
+          "const": "shell:deny-stdin-write"
+        }
+      ]
+    },
+    "Value": {
+      "description": "All supported ACL values.",
+      "anyOf": [
+        {
+          "description": "Represents a null JSON value.",
+          "type": "null"
+        },
+        {
+          "description": "Represents a [`bool`].",
+          "type": "boolean"
+        },
+        {
+          "description": "Represents a valid ACL [`Number`].",
+          "allOf": [
+            {
+              "$ref": "#/definitions/Number"
+            }
+          ]
+        },
+        {
+          "description": "Represents a [`String`].",
+          "type": "string"
+        },
+        {
+          "description": "Represents a list of other [`Value`]s.",
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/Value"
+          }
+        },
+        {
+          "description": "Represents a map of [`String`] keys to [`Value`]s.",
+          "type": "object",
+          "additionalProperties": {
+            "$ref": "#/definitions/Value"
+          }
+        }
+      ]
+    },
+    "Number": {
+      "description": "A valid ACL number.",
+      "anyOf": [
+        {
+          "description": "Represents an [`i64`].",
+          "type": "integer",
+          "format": "int64"
+        },
+        {
+          "description": "Represents a [`f64`].",
+          "type": "number",
+          "format": "double"
+        }
+      ]
+    },
+    "Target": {
+      "description": "Platform target.",
+      "oneOf": [
+        {
+          "description": "MacOS.",
+          "type": "string",
+          "enum": [
+            "macOS"
+          ]
+        },
+        {
+          "description": "Windows.",
+          "type": "string",
+          "enum": [
+            "windows"
+          ]
+        },
+        {
+          "description": "Linux.",
+          "type": "string",
+          "enum": [
+            "linux"
+          ]
+        },
+        {
+          "description": "Android.",
+          "type": "string",
+          "enum": [
+            "android"
+          ]
+        },
+        {
+          "description": "iOS.",
+          "type": "string",
+          "enum": [
+            "iOS"
+          ]
+        }
+      ]
+    },
+    "ShellScopeEntryAllowedArg": {
+      "description": "A command argument allowed to be executed by the webview API.",
+      "anyOf": [
+        {
+          "description": "A non-configurable argument that is passed to the command in the order it was specified.",
+          "type": "string"
+        },
+        {
+          "description": "A variable that is set while calling the command from the webview API.",
+          "type": "object",
+          "required": [
+            "validator"
+          ],
+          "properties": {
+            "raw": {
+              "description": "Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.",
+              "default": false,
+              "type": "boolean"
+            },
+            "validator": {
+              "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: <https://docs.rs/regex/latest/regex/#syntax>",
+              "type": "string"
+            }
+          },
+          "additionalProperties": false
+        }
+      ]
+    },
+    "ShellScopeEntryAllowedArgs": {
+      "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.",
+      "anyOf": [
+        {
+          "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.",
+          "type": "boolean"
+        },
+        {
+          "description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.",
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/ShellScopeEntryAllowedArg"
+          }
+        }
+      ]
+    }
+  }
+}
\ No newline at end of file
diff --git a/packages/desktop/src-tauri/src/main.rs b/packages/desktop/src-tauri/src/main.rs
index fb02db30a..dcdebb741 100644
--- a/packages/desktop/src-tauri/src/main.rs
+++ b/packages/desktop/src-tauri/src/main.rs
@@ -1,74 +1,78 @@
 #![cfg_attr(
-  all(not(debug_assertions), target_os = "windows"),
-  windows_subsystem = "windows"
+    all(not(debug_assertions), target_os = "windows"),
+    windows_subsystem = "windows"
 )]
 
 use tauri::{
-    CustomMenuItem,
-    Manager,
-    SystemTray,
-    SystemTrayEvent,
-    SystemTrayMenu,
-    SystemTrayMenuItem,
+  menu::{Menu, MenuItem, MenuEvent},
+  tray::{TrayIconBuilder, TrayIconEvent, MouseButton},
+  Manager
 };
 
 fn main() {
-  let tray_menu = SystemTrayMenu::new()
-    .add_item(CustomMenuItem::new("title".to_string(), "Revolt").disabled())
-    .add_native_item(SystemTrayMenuItem::Separator)
-    .add_item(CustomMenuItem::new("open".to_string(), "Open Revolt"))
-    .add_item(CustomMenuItem::new("hide".to_string(), "Hide Revolt"))
-    .add_item(CustomMenuItem::new("quit".to_string(), "Quit Revolt"));
-
-  let system_tray = SystemTray::new().with_menu(tray_menu);
-
-  tauri::Builder::default()
-    .on_window_event(|event| match event.event() {
+    tauri::Builder::default()
+    .plugin(tauri_plugin_shell::init())
+    .on_window_event(|window, event| match event {
       tauri::WindowEvent::CloseRequested { api, .. } => {
-        event.window().hide().unwrap();
+        window.hide().unwrap();
         api.prevent_close();
       }
       _ => {}
     })
     .setup(| app | {
+      let title = MenuItem::with_id(app, "title", "Revolt", false, None::<&str>)?;
+      let open = MenuItem::with_id(app, "open", "Open Revolt", true, None::<&str>)?;
+      let hide = MenuItem::with_id(app, "hide", "Hide Revolt", true, None::<&str>)?;
+      let quit = MenuItem::with_id(app, "quit", "Quit Revolt", true, None::<&str>)?;
+
+      let menu = Menu::with_items(app, &[
+        &title,
+        &open,
+        &hide,
+        &quit
+      ])?;
+
+      let tray = TrayIconBuilder::new()
+          .icon(app.default_window_icon().unwrap().clone())
+          .menu(&menu)
+          .on_tray_icon_event(|tray, event| match event {
+            TrayIconEvent::Click {
+              button: MouseButton::Left,
+              ..
+            } => {
+              let app = tray.app_handle();
+              let window = app.get_webview_window("main").unwrap();
+
+              if window.set_focus().is_err() {
+                println!("[on_system_tray_event][:LeftClick] error when trying to set main window focus.");
+              }
+            },
+            _ => {}
+          })
+          .on_menu_event(|app, event| match event.id.as_ref() {
+            "open" => {
+              let window = app.get_webview_window("main").unwrap();
+              window.show().unwrap();
+              window.set_focus().unwrap();
+            }
+            "hide" => {
+              let window = app.get_webview_window("main").unwrap();
+              window.hide().unwrap();
+            }
+            "quit" => {
+              std::process::exit(0);
+            }
+            _ => {}
+          })
+          .build(app)?;
+
       if cfg!(any(windows, target_os = "macos")) {
-        use window_shadows::set_shadow;
-        let window = app.get_window("main").unwrap();
-        set_shadow(&window, true).unwrap_or_default();
+        let window = app.get_webview_window("main").unwrap();
+        window.set_shadow(true)?;
       }
 
       Ok(())
     })
-    .system_tray(system_tray)
-    .on_system_tray_event(|app, event| match event {
-      SystemTrayEvent::LeftClick {
-        position: _,
-        size: _,
-        ..
-      } => {
-        let window = app.get_window("main").unwrap();
-        
-        if window.set_focus().is_err() {
-          println!("[on_system_tray_event][:LeftClick] error when trying to set main window focus.");
-        }
-      }
-      SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() {
-        "open" => {
-          let window = app.get_window("main").unwrap();
-          window.show().unwrap();
-          window.set_focus().unwrap();
-        }
-        "hide" => {
-          let window = app.get_window("main").unwrap();
-          window.hide().unwrap();
-        }
-        "quit" => {
-          std::process::exit(0);
-        }
-        _ => {}
-      },
-      _ => {}
-    })
     .run(tauri::generate_context!())
     .expect("error while running tauri application");
 }
diff --git a/packages/desktop/src-tauri/tauri.conf.json b/packages/desktop/src-tauri/tauri.conf.json
index 26407b5de..c3b8dbf8d 100644
--- a/packages/desktop/src-tauri/tauri.conf.json
+++ b/packages/desktop/src-tauri/tauri.conf.json
@@ -2,72 +2,50 @@
   "$schema": "../node_modules/@tauri-apps/cli/schema.json",
   "build": {
     "beforeDevCommand": "pnpm --filter client dev --port 6173",
-    "devPath": "http://localhost:6173",
-    "distDir": "../handoff",
-    "withGlobalTauri": false
+    "frontendDist": "../handoff",
+    "devUrl": "http://localhost:6173"
   },
-  "package": {
-    "productName": "Revolt",
-    "version": "0.1.0"
-  },
-  "tauri": {
-    "allowlist": {
-      "all": false,
-      "shell": {
-        "all": false,
-        "open": true
-      },
-      "window": {
-        "all": false,
-        "close": true,
-        "hide": true,
-        "show": true,
-        "maximize": true,
-        "minimize": true,
-        "unmaximize": true,
-        "unminimize": true,
-        "startDragging": true
-      }
+  "bundle": {
+    "active": true,
+    "category": "SocialNetworking",
+    "copyright": "",
+    "targets": "all",
+    "externalBin": [],
+    "icon": [
+      "../../client/assets/icons/favicon-16x16.png",
+      "../../client/assets/icons/android-chrome-512x512.png",
+      "../../client/assets/icons/icon.icns",
+      "../../client/assets/logo_round.png",
+      "../../client/assets/icons/icon.ico"
+    ],
+    "windows": {
+      "certificateThumbprint": null,
+      "digestAlgorithm": "sha256",
+      "timestampUrl": ""
+    },
+    "longDescription": "User-first, privacy focused chat platform.",
+    "macOS": {
+      "entitlements": null,
+      "exceptionDomain": "",
+      "frameworks": [],
+      "providerShortName": null,
+      "signingIdentity": null
     },
-    "bundle": {
-      "active": true,
-      "category": "SocialNetworking",
-      "copyright": "",
+    "resources": [],
+    "shortDescription": "User-first, privacy focused chat platform.",
+    "linux": {
       "deb": {
         "depends": []
-      },
-      "externalBin": [],
-      "icon": [
-        "../../client/assets/icons/favicon-16x16.png",
-        "../../client/assets/icons/android-chrome-512x512.png",
-        "../../client/assets/icons/icon.icns",
-        "../../client/assets/logo_round.png",
-        "../../client/assets/icons/icon.ico"
-      ],
-      "identifier": "chat.revolt.app",
-      "longDescription": "User-first, privacy focused chat platform.",
-      "macOS": {
-        "entitlements": null,
-        "exceptionDomain": "",
-        "frameworks": [],
-        "providerShortName": null,
-        "signingIdentity": null
-      },
-      "resources": [],
-      "shortDescription": "User-first, privacy focused chat platform.",
-      "targets": "all",
-      "windows": {
-        "certificateThumbprint": null,
-        "digestAlgorithm": "sha256",
-        "timestampUrl": ""
       }
-    },
-    "security": {
-      "csp": null
-    },
-    "updater": {
-      "active": false
-    },
+    }
+  },
+  "productName": "Revolt",
+  "mainBinaryName": "Revolt",
+  "version": "0.1.0",
+  "identifier": "chat.revolt.app",
+  "plugins": {},
+  "app": {
+    "withGlobalTauri": false,
     "windows": [
       {
         "fullscreen": false,
@@ -84,7 +62,10 @@
         "minHeight": 500
       }
     ],
-    "systemTray": {
+    "security": {
+      "csp": null
+    },
+    "trayIcon": {
       "iconPath": "../../client/assets/icons/tray/trayIcon.png",
       "iconAsTemplate": true,
       "title": "Revolt"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 82c96dabc..d4c9fa3ee 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,4 +1,4 @@
-lockfileVersion: '6.1'
+lockfileVersion: '9.0'
 
 settings:
   autoInstallPeers: true
@@ -6,70 +6,98 @@ settings:
 
 importers:
 
-  .: {}
+  .:
+    devDependencies:
+      '@eslint/js':
+        specifier: ^9.12.0
+        version: 9.12.0
+      '@types/node':
+        specifier: ^22.7.5
+        version: 22.7.5
+      '@typescript-eslint/parser':
+        specifier: ^8.8.1
+        version: 8.8.1(eslint@9.12.0)(typescript@5.6.3)
+      eslint:
+        specifier: ^9.12.0
+        version: 9.12.0
+      eslint-config-prettier:
+        specifier: ^8.10.0
+        version: 8.10.0(eslint@9.12.0)
+      eslint-plugin-prettier:
+        specifier: ^5.2.1
+        version: 5.2.1(eslint-config-prettier@8.10.0(eslint@9.12.0))(eslint@9.12.0)(prettier@3.3.3)
+      eslint-plugin-promise:
+        specifier: ^7.1.0
+        version: 7.1.0(eslint@9.12.0)
+      eslint-plugin-simple-import-sort:
+        specifier: ^12.1.1
+        version: 12.1.1(eslint@9.12.0)
+      eslint-plugin-solid:
+        specifier: ^0.14.3
+        version: 0.14.3(eslint@9.12.0)(typescript@5.6.3)
+      prettier:
+        specifier: ^3.3.3
+        version: 3.3.3
+      prettier-config-standard:
+        specifier: ^7.0.0
+        version: 7.0.0(prettier@3.3.3)
+      typescript-eslint:
+        specifier: ^8.8.1
+        version: 8.8.1(eslint@9.12.0)(typescript@5.6.3)
 
   packages/client:
     dependencies:
       '@floating-ui/dom':
-        specifier: ^1.6.3
-        version: 1.6.3
+        specifier: ^1.6.11
+        version: 1.6.11
       '@fontsource/inter':
-        specifier: ^5.0.17
-        version: 5.0.17
+        specifier: ^5.1.0
+        version: 5.1.0
       '@fontsource/jetbrains-mono':
-        specifier: ^5.0.19
-        version: 5.0.19
+        specifier: ^5.1.1
+        version: 5.1.1
       '@fontsource/open-sans':
-        specifier: ^5.0.27
-        version: 5.0.27
+        specifier: ^5.1.0
+        version: 5.1.0
       '@material-design-icons/svg':
         specifier: ^0.14.13
         version: 0.14.13
       '@material/material-color-utilities':
-        specifier: ^0.2.7
-        version: 0.2.7
+        specifier: ^0.3.0
+        version: 0.3.0
       '@minht11/solid-virtual-container':
         specifier: ^0.2.1
-        version: 0.2.1(solid-js@1.8.15)
-      '@motionone/solid':
-        specifier: ^10.16.4
-        version: 10.16.4(solid-js@1.8.15)
+        version: 0.2.1(solid-js@1.9.2)
       '@sentry/browser':
-        specifier: ^7.107.0
-        version: 7.107.0
+        specifier: ^8.33.1
+        version: 8.33.1
       '@sentry/tracing':
-        specifier: ^7.107.0
-        version: 7.107.0
+        specifier: ^7.114.0
+        version: 7.114.0
       '@solid-aria/button':
         specifier: ^0.1.3
-        version: 0.1.3(solid-js@1.8.15)
-      '@solid-devtools/debugger':
-        specifier: ^0.23.3
-        version: 0.23.3(solid-js@1.8.15)
-      '@solid-devtools/overlay':
-        specifier: ^0.29.3
-        version: 0.29.3(solid-js@1.8.15)
+        version: 0.1.3(solid-js@1.9.2)
       '@solid-primitives/i18n':
-        specifier: ^1.1.1
-        version: 1.1.1(solid-js@1.8.15)
+        specifier: ^2.1.1
+        version: 2.1.1(solid-js@1.9.2)
       '@solid-primitives/keyed':
         specifier: ^1.2.2
-        version: 1.2.2(solid-js@1.8.15)
+        version: 1.2.2(solid-js@1.9.2)
       '@solid-primitives/map':
-        specifier: ^0.4.11
-        version: 0.4.11(solid-js@1.8.15)
+        specifier: ^0.4.13
+        version: 0.4.13(solid-js@1.9.2)
       '@solidjs/router':
-        specifier: ^0.13.0
-        version: 0.13.0(solid-js@1.8.15)
+        specifier: ^0.14.7
+        version: 0.14.7(solid-js@1.9.2)
       '@tanstack/solid-query':
-        specifier: ^5.48.0
-        version: 5.48.0(solid-js@1.8.15)
+        specifier: ^5.59.0
+        version: 5.59.0(solid-js@1.9.2)
       '@tauri-apps/api':
-        specifier: ^1.5.3
-        version: 1.5.3
+        specifier: ^2.0.2
+        version: 2.0.2
       '@thisbeyond/solid-dnd':
         specifier: ^0.7.5
-        version: 0.7.5(solid-js@1.8.15)
+        version: 0.7.5(solid-js@1.9.2)
       color-rgba:
         specifier: ^3.0.0
         version: 3.0.0
@@ -77,26 +105,23 @@ importers:
         specifier: ^2.0.3
         version: 2.0.3
       dayjs:
-        specifier: ^1.11.10
-        version: 1.11.10
+        specifier: ^1.11.13
+        version: 1.11.13
       detect-browser:
         specifier: ^5.3.0
         version: 5.3.0
       emoji-regex:
-        specifier: ^10.3.0
-        version: 10.3.0
+        specifier: ^10.4.0
+        version: 10.4.0
       fast-deep-equal:
         specifier: ^3.1.3
         version: 3.1.3
-      hast:
-        specifier: ^1.0.0
-        version: 1.0.0
       json-stringify-deterministic:
         specifier: ^1.0.12
         version: 1.0.12
       katex:
-        specifier: ^0.16.9
-        version: 0.16.9
+        specifier: ^0.16.11
+        version: 0.16.11
       localforage:
         specifier: ^1.10.0
         version: 1.10.0
@@ -107,20 +132,20 @@ importers:
         specifier: ^4.5.0
         version: 4.5.0
       mdast-util-to-hast:
-        specifier: ^12.2.4
-        version: 12.3.0
+        specifier: ^13.2.0
+        version: 13.2.0
       property-information:
-        specifier: ^6.2.0
-        version: 6.4.1
+        specifier: ^6.5.0
+        version: 6.5.0
       rehype-highlight:
         specifier: ^7.0.0
         version: 7.0.0
       rehype-katex:
-        specifier: ^7.0.0
-        version: 7.0.0
+        specifier: ^7.0.1
+        version: 7.0.1
       rehype-prism:
         specifier: ^2.3.2
-        version: 2.3.2(unified@11.0.4)
+        version: 2.3.2(unified@11.0.5)
       remark-breaks:
         specifier: ^4.0.0
         version: 4.0.0
@@ -134,90 +159,87 @@ importers:
         specifier: ^11.0.0
         version: 11.0.0
       remark-rehype:
-        specifier: ^11.1.0
-        version: 11.1.0
+        specifier: ^11.1.1
+        version: 11.1.1
       revolt.js:
         specifier: workspace:^
         version: link:../revolt.js
       shiki:
-        specifier: ^1.9.0
-        version: 1.9.0
+        specifier: ^1.22.0
+        version: 1.22.0
       solid-dnd-directive:
         specifier: ^0.2.0
-        version: 0.2.0(solid-js@1.8.15)
+        version: 0.2.0(solid-js@1.9.2)
       solid-floating-ui:
         specifier: ^0.3.1
-        version: 0.3.1(@floating-ui/dom@1.6.3)(solid-js@1.8.15)
+        version: 0.3.1(@floating-ui/dom@1.6.11)(solid-js@1.9.2)
       solid-hcaptcha:
         specifier: ^0.4.0
-        version: 0.4.0(solid-js@1.8.15)
+        version: 0.4.0(solid-js@1.9.2)
       solid-icons:
         specifier: ^1.1.0
-        version: 1.1.0(solid-js@1.8.15)
+        version: 1.1.0(solid-js@1.9.2)
       solid-js:
-        specifier: ^1.8.15
-        version: 1.8.15
+        specifier: ^1.9.2
+        version: 1.9.2
       solid-qr-code:
         specifier: ^0.1.11
-        version: 0.1.11(solid-js@1.8.15)
+        version: 0.1.11(solid-js@1.9.2)
       solid-styled-components:
-        specifier: workspace:^0.28.5
+        specifier: workspace:^
         version: link:../solid-styled-components
       space-separated-tokens:
         specifier: ^2.0.2
         version: 2.0.2
       style-to-object:
-        specifier: ^0.4.4
-        version: 0.4.4
+        specifier: ^1.0.8
+        version: 1.0.8
       ulid:
         specifier: ^2.3.0
         version: 2.3.0
       unified:
-        specifier: ^11.0.4
-        version: 11.0.4
+        specifier: ^11.0.5
+        version: 11.0.5
       unist-util-visit:
         specifier: ^5.0.0
         version: 5.0.0
       vfile:
-        specifier: ^6.0.1
-        version: 6.0.1
+        specifier: ^6.0.3
+        version: 6.0.3
       workbox-precaching:
-        specifier: ^7.0.0
-        version: 7.0.0
+        specifier: ^7.1.0
+        version: 7.1.0
     devDependencies:
       '@chromatic-com/storybook':
-        specifier: ^1.5.0
-        version: 1.5.0(react@18.3.1)
+        specifier: ^2.0.2
+        version: 2.0.2(react@18.3.1)
       '@pandacss/dev':
-        specifier: ^0.35.0
-        version: 0.35.0(jsdom@24.0.0)(typescript@5.4.2)
-      '@solid-devtools/transform':
-        specifier: ^0.10.4
-        version: 0.10.4(solid-js@1.8.15)(vite@5.1.6)
+        specifier: ^0.46.1
+        version: 0.46.1(jsdom@25.0.1)(typescript@5.6.3)
       '@solidjs/testing-library':
-        specifier: ^0.8.6
-        version: 0.8.6(@solidjs/router@0.13.0)(solid-js@1.8.15)
+        specifier: ^0.8.10
+        version: 0.8.10(@solidjs/router@0.14.7(solid-js@1.9.2))(solid-js@1.9.2)
       '@storybook/addon-essentials':
-        specifier: 8.2.0-alpha.5
-        version: 8.2.0-alpha.5(@types/react@18.3.3)(prettier@3.2.5)(react-dom@18.3.1)(react@18.3.1)
+        specifier: 8.3.5
+        version: 8.3.5(storybook@8.3.5)
       '@storybook/addon-interactions':
-        specifier: 8.2.0-alpha.5
-        version: 8.2.0-alpha.5(vitest@1.4.0)
+        specifier: 8.3.5
+        version: 8.3.5(storybook@8.3.5)
       '@storybook/addon-links':
-        specifier: 8.2.0-alpha.5
-        version: 8.2.0-alpha.5(react@18.3.1)
+        specifier: 8.3.5
+        version: 8.3.5(react@18.3.1)(storybook@8.3.5)
       '@storybook/blocks':
-        specifier: 8.2.0-alpha.5
-        version: 8.2.0-alpha.5(@types/react@18.3.3)(prettier@3.2.5)(react-dom@18.3.1)(react@18.3.1)
+        specifier: 8.3.5
+        version: 8.3.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)
       '@storybook/html':
-        specifier: ^8.1.6
-        version: 8.1.6(prettier@3.2.5)
+        specifier: ^8.3.5
+        version: 8.3.5(storybook@8.3.5)
       '@storybook/testing-library':
         specifier: ^0.2.2
         version: 0.2.2
       '@testing-library/jest-dom':
-        specifier: ^6.4.2
-        version: 6.4.2(vitest@1.4.0)
+        specifier: ^6.5.0
+        version: 6.5.0
       '@types/hast':
         specifier: ^3.0.4
         version: 3.0.4
@@ -228,53 +250,59 @@ importers:
         specifier: ^4.5.8
         version: 4.5.8
       '@types/unist':
-        specifier: ^3.0.2
-        version: 3.0.2
+        specifier: ^3.0.3
+        version: 3.0.3
       '@vitest/coverage-v8':
-        specifier: ^1.6.0
-        version: 1.6.0(vitest@1.4.0)
+        specifier: ^2.1.2
+        version: 2.1.2(vitest@2.1.2(@types/node@22.7.5)(jsdom@25.0.1)(lightningcss@1.27.0)(terser@5.34.1))
       babel-plugin-codegen:
         specifier: ^4.1.5
         version: 4.1.5
       jsdom:
-        specifier: ^24.0.0
-        version: 24.0.0
+        specifier: ^25.0.1
+        version: 25.0.1
       lnk:
         specifier: ^1.1.0
         version: 1.1.0
       rehype-stringify:
-        specifier: ^10.0.0
-        version: 10.0.0
+        specifier: ^10.0.1
+        version: 10.0.1
+      solid-devtools:
+        specifier: ^0.30.1
+        version: 0.30.1(solid-js@1.9.2)(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1))
+      solid-motionone:
+        specifier: ^1.0.2
+        version: 1.0.2(solid-js@1.9.2)
       storybook:
-        specifier: 8.2.0-alpha.5
-        version: 8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1)
+        specifier: 8.3.5
+        version: 8.3.5
       storybook-solidjs:
-        specifier: ^1.0.0-beta.2
-        version: 1.0.0-beta.2(babel-preset-solid@1.8.15)(solid-js@1.8.15)
+        specifier: 1.0.0-beta.2
+        version: 1.0.0-beta.2(babel-preset-solid@1.9.2(@babel/core@7.25.7))(solid-js@1.9.2)
       storybook-solidjs-vite:
-        specifier: ^1.0.0-beta.2
-        version: 1.0.0-beta.2(prettier@3.2.5)(typescript@5.4.2)(vite@5.1.6)
+        specifier: 1.0.0-beta.2
+        version: 1.0.0-beta.2(storybook@8.3.5)(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1))
       typescript:
-        specifier: ^5.4.2
-        version: 5.4.2
+        specifier: ^5.6.3
+        version: 5.6.3
       vite:
-        specifier: ^5.1.6
-        version: 5.1.6
+        specifier: ^5.4.8
+        version: 5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)
       vite-plugin-inspect:
-        specifier: ^0.8.3
-        version: 0.8.3(rollup@2.79.1)(vite@5.1.6)
+        specifier: ^0.8.7
+        version: 0.8.7(rollup@2.79.2)(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1))
       vite-plugin-pwa:
-        specifier: ^0.19.4
-        version: 0.19.4(vite@5.1.6)(workbox-build@7.0.0)(workbox-window@7.0.0)
+        specifier: ^0.20.5
+        version: 0.20.5(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.1.0)
       vite-plugin-solid:
         specifier: ^2.10.2
-        version: 2.10.2(@testing-library/jest-dom@6.4.2)(solid-js@1.8.15)(vite@5.1.6)
+        version: 2.10.2(@testing-library/jest-dom@6.5.0)(solid-js@1.9.2)(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1))
       vite-plugin-solid-svg:
-        specifier: ^0.8.0
-        version: 0.8.0(solid-js@1.8.15)(vite@5.1.6)
+        specifier: ^0.8.1
+        version: 0.8.1(solid-js@1.9.2)(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1))
       vitest:
-        specifier: ^1.4.0
-        version: 1.4.0(jsdom@24.0.0)
+        specifier: ^2.1.2
+        version: 2.1.2(@types/node@22.7.5)(jsdom@25.0.1)(lightningcss@1.27.0)(terser@5.34.1)
 
   packages/client/components/i18n/locales/scripts:
     dependencies:
@@ -286,11 +314,11 @@ importers:
         version: 2.1.0
       typescript:
         specifier: ^5.1.6
-        version: 5.4.2
+        version: 5.6.3
     devDependencies:
       '@types/node':
         specifier: ^20.3.3
-        version: 20.3.3
+        version: 20.16.11
       dotenv:
         specifier: ^16.3.1
         version: 16.4.5
@@ -298,87 +326,87 @@ importers:
   packages/desktop:
     devDependencies:
       '@tauri-apps/cli':
-        specifier: ^1.2.3
-        version: 1.2.3
+        specifier: ^2.0.2
+        version: 2.0.2
 
   packages/revolt.js:
     dependencies:
       '@solid-primitives/map':
         specifier: ^0.4.11
-        version: 0.4.11(solid-js@1.8.15)
+        version: 0.4.13(solid-js@1.9.2)
       '@solid-primitives/set':
         specifier: ^0.4.11
-        version: 0.4.11(solid-js@1.8.15)
+        version: 0.4.12(solid-js@1.9.2)
       eventemitter3:
         specifier: ^5.0.1
         version: 5.0.1
       isomorphic-ws:
         specifier: ^5.0.0
-        version: 5.0.0(ws@8.16.0)
+        version: 5.0.0(ws@8.18.0)
       long:
         specifier: ^5.2.3
         version: 5.2.3
       revolt-api:
-        specifier: 0.7.13
-        version: 0.7.13
+        specifier: 0.7.16
+        version: 0.7.16
       solid-js:
         specifier: ^1.8.15
-        version: 1.8.15
+        version: 1.9.2
       ulid:
         specifier: ^2.3.0
         version: 2.3.0
       ws:
         specifier: ^8.16.0
-        version: 8.16.0
+        version: 8.18.0
     devDependencies:
       '@mxssfd/typedoc-theme':
         specifier: ^1.1.3
-        version: 1.1.3(typedoc@0.25.1)
+        version: 1.1.7(typedoc@0.25.13(typescript@5.6.3))
       '@trivago/prettier-plugin-sort-imports':
         specifier: ^4.3.0
-        version: 4.3.0(prettier@2.8.8)
+        version: 4.3.0(@vue/compiler-sfc@3.5.11)(prettier@2.8.8)
       '@types/node':
         specifier: ^18.19.24
-        version: 18.19.24
+        version: 18.19.55
       '@types/ws':
         specifier: ^8.5.10
-        version: 8.5.10
+        version: 8.5.12
       '@typescript-eslint/eslint-plugin':
         specifier: ^5.62.0
-        version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.2)
+        version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)
       '@typescript-eslint/parser':
         specifier: ^5.62.0
-        version: 5.62.0(eslint@8.57.0)(typescript@5.4.2)
+        version: 5.62.0(eslint@8.57.1)(typescript@5.6.3)
       dotenv:
         specifier: ^16.4.5
         version: 16.4.5
       eslint:
         specifier: ^8.57.0
-        version: 8.57.0
+        version: 8.57.1
       eslint-config-prettier:
         specifier: ^8.10.0
-        version: 8.10.0(eslint@8.57.0)
+        version: 8.10.0(eslint@8.57.1)
       eslint-plugin-solid:
         specifier: ^0.12.1
-        version: 0.12.1(eslint@8.57.0)(typescript@5.4.2)
+        version: 0.12.1(eslint@8.57.1)(typescript@5.6.3)
       eslint-plugin-spellcheck:
         specifier: ^0.0.20
-        version: 0.0.20(eslint@8.57.0)
+        version: 0.0.20(eslint@8.57.1)
       prettier:
         specifier: ^2.8.8
         version: 2.8.8
       tsc-watch:
         specifier: ^6.0.4
-        version: 6.0.4(typescript@5.4.2)
+        version: 6.2.0(typescript@5.6.3)
       typed-emitter:
         specifier: ^2.1.0
         version: 2.1.0
       typedoc:
         specifier: ^0.25.1
-        version: 0.25.1(typescript@5.4.2)
+        version: 0.25.13(typescript@5.6.3)
       typescript:
         specifier: ^5.4.2
-        version: 5.4.2
+        version: 5.6.3
 
   packages/revolt.js/lib/esm: {}
 
@@ -389,7815 +417,9980 @@ importers:
         version: 3.1.3
       goober:
         specifier: ^2.1.14
-        version: 2.1.14(csstype@3.1.3)
+        version: 2.1.15(csstype@3.1.3)
     devDependencies:
       '@babel/preset-typescript':
         specifier: 7.16.7
-        version: 7.16.7(@babel/core@7.24.7)
+        version: 7.16.7(@babel/core@7.25.7)
       '@types/jest':
         specifier: ^27.5.2
         version: 27.5.2
       babel-preset-solid:
         specifier: ^1.8.15
-        version: 1.8.15(@babel/core@7.24.7)
+        version: 1.9.2(@babel/core@7.25.7)
       jest:
         specifier: ^27.5.1
         version: 27.5.1
       solid-jest:
         specifier: ^0.2.0
-        version: 0.2.0(@babel/core@7.24.7)(babel-preset-solid@1.8.15)
+        version: 0.2.0(@babel/core@7.25.7)(babel-preset-solid@1.9.2(@babel/core@7.25.7))
       solid-js:
         specifier: ^1.8.15
-        version: 1.8.15
+        version: 1.9.2
       typescript:
         specifier: ^4.9.5
         version: 4.9.5
 
 packages:
 
-  /@aashutoshrathi/word-wrap@1.2.6:
-    resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /@adobe/css-tools@4.3.3:
-    resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==}
-    dev: true
+  '@adobe/css-tools@4.4.0':
+    resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==}
 
-  /@ampproject/remapping@2.3.0:
+  '@ampproject/remapping@2.3.0':
     resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
     engines: {node: '>=6.0.0'}
-    dependencies:
-      '@jridgewell/gen-mapping': 0.3.5
-      '@jridgewell/trace-mapping': 0.3.25
-    dev: true
 
-  /@antfu/utils@0.7.7:
-    resolution: {integrity: sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==}
-    dev: true
+  '@antfu/utils@0.7.10':
+    resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
 
-  /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0):
+  '@apideck/better-ajv-errors@0.3.6':
     resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==}
     engines: {node: '>=10'}
     peerDependencies:
       ajv: '>=8'
-    dependencies:
-      ajv: 8.12.0
-      json-schema: 0.4.0
-      jsonpointer: 5.0.1
-      leven: 3.1.0
-    dev: true
 
-  /@aw-web-design/x-default-browser@1.4.126:
-    resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==}
-    hasBin: true
-    dependencies:
-      default-browser-id: 3.0.0
-    dev: true
-
-  /@babel/code-frame@7.23.5:
-    resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/highlight': 7.24.7
-      chalk: 2.4.2
-    dev: true
-
-  /@babel/code-frame@7.24.7:
-    resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
+  '@babel/code-frame@7.25.7':
+    resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/highlight': 7.24.7
-      picocolors: 1.0.0
-    dev: true
 
-  /@babel/compat-data@7.21.0:
-    resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==}
+  '@babel/compat-data@7.25.7':
+    resolution: {integrity: sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==}
     engines: {node: '>=6.9.0'}
-    dev: true
 
-  /@babel/compat-data@7.23.5:
-    resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==}
+  '@babel/core@7.25.7':
+    resolution: {integrity: sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==}
     engines: {node: '>=6.9.0'}
-    dev: true
 
-  /@babel/compat-data@7.24.7:
-    resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==}
+  '@babel/generator@7.17.7':
+    resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==}
     engines: {node: '>=6.9.0'}
-    dev: true
 
-  /@babel/core@7.24.0:
-    resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==}
+  '@babel/generator@7.25.7':
+    resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@ampproject/remapping': 2.3.0
-      '@babel/code-frame': 7.23.5
-      '@babel/generator': 7.23.6
-      '@babel/helper-compilation-targets': 7.23.6
-      '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0)
-      '@babel/helpers': 7.24.0
-      '@babel/parser': 7.24.0
-      '@babel/template': 7.24.0
-      '@babel/traverse': 7.24.0
-      '@babel/types': 7.24.0
-      convert-source-map: 2.0.0
-      debug: 4.3.4
-      gensync: 1.0.0-beta.2
-      json5: 2.2.3
-      semver: 6.3.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /@babel/core@7.24.7:
-    resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==}
+  '@babel/helper-annotate-as-pure@7.25.7':
+    resolution: {integrity: sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@ampproject/remapping': 2.3.0
-      '@babel/code-frame': 7.24.7
-      '@babel/generator': 7.24.7
-      '@babel/helper-compilation-targets': 7.24.7
-      '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
-      '@babel/helpers': 7.24.7
-      '@babel/parser': 7.24.7
-      '@babel/template': 7.24.7
-      '@babel/traverse': 7.24.7
-      '@babel/types': 7.24.7
-      convert-source-map: 2.0.0
-      debug: 4.3.4
-      gensync: 1.0.0-beta.2
-      json5: 2.2.3
-      semver: 6.3.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /@babel/generator@7.17.7:
-    resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==}
+  '@babel/helper-builder-binary-assignment-operator-visitor@7.25.7':
+    resolution: {integrity: sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-      jsesc: 2.5.2
-      source-map: 0.5.7
-    dev: true
 
-  /@babel/generator@7.23.6:
-    resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==}
+  '@babel/helper-compilation-targets@7.25.7':
+    resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-      '@jridgewell/gen-mapping': 0.3.5
-      '@jridgewell/trace-mapping': 0.3.25
-      jsesc: 2.5.2
-    dev: true
 
-  /@babel/generator@7.24.7:
-    resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==}
+  '@babel/helper-create-class-features-plugin@7.25.7':
+    resolution: {integrity: sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-      '@jridgewell/gen-mapping': 0.3.5
-      '@jridgewell/trace-mapping': 0.3.25
-      jsesc: 2.5.2
-    dev: true
+    peerDependencies:
+      '@babel/core': ^7.0.0
 
-  /@babel/helper-annotate-as-pure@7.22.5:
-    resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==}
+  '@babel/helper-create-regexp-features-plugin@7.25.7':
+    resolution: {integrity: sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
+    peerDependencies:
+      '@babel/core': ^7.0.0
 
-  /@babel/helper-annotate-as-pure@7.24.7:
-    resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
+  '@babel/helper-define-polyfill-provider@0.6.2':
+    resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==}
+    peerDependencies:
+      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
 
-  /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9:
-    resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==}
+  '@babel/helper-environment-visitor@7.24.7':
+    resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-explode-assignable-expression': 7.18.6
-      '@babel/types': 7.24.7
-    dev: true
 
-  /@babel/helper-builder-binary-assignment-operator-visitor@7.24.7:
-    resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==}
+  '@babel/helper-function-name@7.24.7':
+    resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/traverse': 7.24.7
-      '@babel/types': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /@babel/helper-compilation-targets@7.20.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==}
+  '@babel/helper-hoist-variables@7.24.7':
+    resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==}
     engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/compat-data': 7.23.5
-      '@babel/core': 7.24.7
-      '@babel/helper-validator-option': 7.24.7
-      browserslist: 4.23.0
-      lru-cache: 5.1.1
-      semver: 6.3.1
-    dev: true
 
-  /@babel/helper-compilation-targets@7.23.6:
-    resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==}
+  '@babel/helper-member-expression-to-functions@7.25.7':
+    resolution: {integrity: sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/compat-data': 7.23.5
-      '@babel/helper-validator-option': 7.23.5
-      browserslist: 4.23.0
-      lru-cache: 5.1.1
-      semver: 6.3.1
-    dev: true
 
-  /@babel/helper-compilation-targets@7.24.7:
-    resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==}
+  '@babel/helper-module-imports@7.18.6':
+    resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/compat-data': 7.24.7
-      '@babel/helper-validator-option': 7.24.7
-      browserslist: 4.23.0
-      lru-cache: 5.1.1
-      semver: 6.3.1
-    dev: true
 
-  /@babel/helper-create-class-features-plugin@7.19.0(@babel/core@7.24.7):
-    resolution: {integrity: sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==}
+  '@babel/helper-module-imports@7.25.7':
+    resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==}
     engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-annotate-as-pure': 7.22.5
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-function-name': 7.24.7
-      '@babel/helper-member-expression-to-functions': 7.18.9
-      '@babel/helper-optimise-call-expression': 7.18.6
-      '@babel/helper-replace-supers': 7.19.1
-      '@babel/helper-split-export-declaration': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.7):
-    resolution: {integrity: sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==}
+  '@babel/helper-module-transforms@7.25.7':
+    resolution: {integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-annotate-as-pure': 7.24.7
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-function-name': 7.24.7
-      '@babel/helper-member-expression-to-functions': 7.24.7
-      '@babel/helper-optimise-call-expression': 7.24.7
-      '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
-      '@babel/helper-split-export-declaration': 7.24.7
-      semver: 6.3.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /@babel/helper-create-class-features-plugin@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==}
+  '@babel/helper-optimise-call-expression@7.25.7':
+    resolution: {integrity: sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==}
     engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-annotate-as-pure': 7.24.7
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-function-name': 7.24.7
-      '@babel/helper-member-expression-to-functions': 7.24.7
-      '@babel/helper-optimise-call-expression': 7.24.7
-      '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
-      '@babel/helper-split-export-declaration': 7.24.7
-      semver: 6.3.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /@babel/helper-create-regexp-features-plugin@7.19.0(@babel/core@7.24.7):
-    resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==}
+  '@babel/helper-plugin-utils@7.25.7':
+    resolution: {integrity: sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==}
     engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-annotate-as-pure': 7.24.7
-      regexpu-core: 5.2.2
-    dev: true
 
-  /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.7):
-    resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==}
+  '@babel/helper-remap-async-to-generator@7.25.7':
+    resolution: {integrity: sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-annotate-as-pure': 7.24.7
-      regexpu-core: 5.3.2
-      semver: 6.3.1
-    dev: true
 
-  /@babel/helper-create-regexp-features-plugin@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==}
+  '@babel/helper-replace-supers@7.25.7':
+    resolution: {integrity: sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-annotate-as-pure': 7.24.7
-      regexpu-core: 5.3.2
-      semver: 6.3.1
-    dev: true
-
-  /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.24.7):
-    resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==}
-    peerDependencies:
-      '@babel/core': ^7.4.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-compilation-targets': 7.23.6
-      '@babel/helper-plugin-utils': 7.24.7
-      debug: 4.3.4
-      lodash.debounce: 4.0.8
-      resolve: 1.22.8
-      semver: 6.3.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.7):
-    resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==}
-    peerDependencies:
-      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-compilation-targets': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      debug: 4.3.4
-      lodash.debounce: 4.0.8
-      resolve: 1.22.8
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.7):
-    resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==}
-    peerDependencies:
-      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-compilation-targets': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      debug: 4.3.4
-      lodash.debounce: 4.0.8
-      resolve: 1.22.8
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/helper-environment-visitor@7.22.20:
-    resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
-    engines: {node: '>=6.9.0'}
-    dev: true
 
-  /@babel/helper-environment-visitor@7.24.7:
-    resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==}
+  '@babel/helper-simple-access@7.25.7':
+    resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
 
-  /@babel/helper-explode-assignable-expression@7.18.6:
-    resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==}
+  '@babel/helper-skip-transparent-expression-wrappers@7.25.7':
+    resolution: {integrity: sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
 
-  /@babel/helper-function-name@7.23.0:
-    resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
+  '@babel/helper-split-export-declaration@7.24.7':
+    resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/template': 7.24.7
-      '@babel/types': 7.24.7
-    dev: true
 
-  /@babel/helper-function-name@7.24.7:
-    resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==}
+  '@babel/helper-string-parser@7.25.7':
+    resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/template': 7.24.7
-      '@babel/types': 7.24.7
-    dev: true
 
-  /@babel/helper-hoist-variables@7.22.5:
-    resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
+  '@babel/helper-validator-identifier@7.25.7':
+    resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
 
-  /@babel/helper-hoist-variables@7.24.7:
-    resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==}
+  '@babel/helper-validator-option@7.25.7':
+    resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
 
-  /@babel/helper-member-expression-to-functions@7.18.9:
-    resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==}
+  '@babel/helper-wrap-function@7.25.7':
+    resolution: {integrity: sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
 
-  /@babel/helper-member-expression-to-functions@7.24.7:
-    resolution: {integrity: sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==}
+  '@babel/helpers@7.25.7':
+    resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/traverse': 7.24.7
-      '@babel/types': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /@babel/helper-module-imports@7.18.6:
-    resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
+  '@babel/highlight@7.25.7':
+    resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
 
-  /@babel/helper-module-imports@7.22.15:
-    resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
+  '@babel/parser@7.25.7':
+    resolution: {integrity: sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
 
-  /@babel/helper-module-imports@7.24.7:
-    resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==}
+  '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.7':
+    resolution: {integrity: sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/traverse': 7.24.7
-      '@babel/types': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+    peerDependencies:
+      '@babel/core': ^7.0.0
 
-  /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0):
-    resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==}
+  '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.7':
+    resolution: {integrity: sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-module-imports': 7.22.15
-      '@babel/helper-simple-access': 7.22.5
-      '@babel/helper-split-export-declaration': 7.24.7
-      '@babel/helper-validator-identifier': 7.24.7
-    dev: true
 
-  /@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==}
+  '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.7':
+    resolution: {integrity: sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-module-imports': 7.24.7
-      '@babel/helper-simple-access': 7.24.7
-      '@babel/helper-split-export-declaration': 7.24.7
-      '@babel/helper-validator-identifier': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /@babel/helper-optimise-call-expression@7.18.6:
-    resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==}
+  '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.7':
+    resolution: {integrity: sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
+    peerDependencies:
+      '@babel/core': ^7.13.0
 
-  /@babel/helper-optimise-call-expression@7.24.7:
-    resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==}
+  '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.7':
+    resolution: {integrity: sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
+    peerDependencies:
+      '@babel/core': ^7.0.0
 
-  /@babel/helper-plugin-utils@7.19.0:
-    resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==}
+  '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2':
+    resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
     engines: {node: '>=6.9.0'}
-    dev: true
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
 
-  /@babel/helper-plugin-utils@7.20.2:
-    resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==}
-    engines: {node: '>=6.9.0'}
-    dev: true
+  '@babel/plugin-syntax-async-generators@7.8.4':
+    resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
 
-  /@babel/helper-plugin-utils@7.24.0:
-    resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==}
-    engines: {node: '>=6.9.0'}
-    dev: true
+  '@babel/plugin-syntax-bigint@7.8.3':
+    resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
 
-  /@babel/helper-plugin-utils@7.24.7:
-    resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==}
-    engines: {node: '>=6.9.0'}
-    dev: true
+  '@babel/plugin-syntax-class-properties@7.12.13':
+    resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
 
-  /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.24.7):
-    resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==}
+  '@babel/plugin-syntax-class-static-block@7.14.5':
+    resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-annotate-as-pure': 7.24.7
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-wrap-function': 7.19.0
-      '@babel/types': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      '@babel/core': ^7.0.0-0
 
-  /@babel/helper-remap-async-to-generator@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==}
-    engines: {node: '>=6.9.0'}
+  '@babel/plugin-syntax-dynamic-import@7.8.3':
+    resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
     peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-annotate-as-pure': 7.24.7
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-wrap-function': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      '@babel/core': ^7.0.0-0
 
-  /@babel/helper-replace-supers@7.19.1:
-    resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-member-expression-to-functions': 7.24.7
-      '@babel/helper-optimise-call-expression': 7.24.7
-      '@babel/traverse': 7.24.7
-      '@babel/types': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  '@babel/plugin-syntax-export-namespace-from@7.8.3':
+    resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
 
-  /@babel/helper-replace-supers@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==}
+  '@babel/plugin-syntax-import-assertions@7.25.7':
+    resolution: {integrity: sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-member-expression-to-functions': 7.24.7
-      '@babel/helper-optimise-call-expression': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      '@babel/core': ^7.0.0-0
 
-  /@babel/helper-simple-access@7.22.5:
-    resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
+  '@babel/plugin-syntax-import-attributes@7.25.7':
+    resolution: {integrity: sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==}
     engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
 
-  /@babel/helper-simple-access@7.24.7:
-    resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/traverse': 7.24.7
-      '@babel/types': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  '@babel/plugin-syntax-import-meta@7.10.4':
+    resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
 
-  /@babel/helper-skip-transparent-expression-wrappers@7.20.0:
-    resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
+  '@babel/plugin-syntax-json-strings@7.8.3':
+    resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
 
-  /@babel/helper-skip-transparent-expression-wrappers@7.24.7:
-    resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/traverse': 7.24.7
-      '@babel/types': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/helper-split-export-declaration@7.22.6:
-    resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
-
-  /@babel/helper-split-export-declaration@7.24.7:
-    resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
-
-  /@babel/helper-string-parser@7.23.4:
-    resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /@babel/helper-string-parser@7.24.7:
-    resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /@babel/helper-validator-identifier@7.22.20:
-    resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /@babel/helper-validator-identifier@7.24.7:
-    resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /@babel/helper-validator-option@7.18.6:
-    resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /@babel/helper-validator-option@7.21.0:
-    resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /@babel/helper-validator-option@7.23.5:
-    resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /@babel/helper-validator-option@7.24.7:
-    resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /@babel/helper-wrap-function@7.19.0:
-    resolution: {integrity: sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-function-name': 7.24.7
-      '@babel/template': 7.24.7
-      '@babel/traverse': 7.24.7
-      '@babel/types': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/helper-wrap-function@7.24.7:
-    resolution: {integrity: sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-function-name': 7.24.7
-      '@babel/template': 7.24.7
-      '@babel/traverse': 7.24.7
-      '@babel/types': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/helpers@7.24.0:
-    resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/template': 7.24.7
-      '@babel/traverse': 7.24.7
-      '@babel/types': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/helpers@7.24.7:
-    resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/template': 7.24.7
-      '@babel/types': 7.24.7
-    dev: true
-
-  /@babel/highlight@7.24.7:
-    resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-validator-identifier': 7.24.7
-      chalk: 2.4.2
-      js-tokens: 4.0.0
-      picocolors: 1.0.0
-    dev: true
-
-  /@babel/parser@7.21.3:
-    resolution: {integrity: sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==}
-    engines: {node: '>=6.0.0'}
-    hasBin: true
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
-
-  /@babel/parser@7.24.0:
-    resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==}
-    engines: {node: '>=6.0.0'}
-    hasBin: true
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
-
-  /@babel/parser@7.24.7:
-    resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==}
-    engines: {node: '>=6.0.0'}
-    hasBin: true
-    dependencies:
-      '@babel/types': 7.24.7
-    dev: true
-
-  /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
-
-  /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==}
+  '@babel/plugin-syntax-jsx@7.25.7':
+    resolution: {integrity: sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+      '@babel/core': ^7.0.0-0
 
-  /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==}
-    engines: {node: '>=6.9.0'}
+  '@babel/plugin-syntax-logical-assignment-operators@7.10.4':
+    resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
     peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+      '@babel/core': ^7.0.0-0
 
-  /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.18.9(@babel/core@7.24.7):
-    resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==}
-    engines: {node: '>=6.9.0'}
+  '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3':
+    resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
     peerDependencies:
-      '@babel/core': ^7.13.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-skip-transparent-expression-wrappers': 7.20.0
-      '@babel/plugin-proposal-optional-chaining': 7.18.9(@babel/core@7.24.7)
-    dev: true
+      '@babel/core': ^7.0.0-0
 
-  /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==}
-    engines: {node: '>=6.9.0'}
+  '@babel/plugin-syntax-numeric-separator@7.10.4':
+    resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
     peerDependencies:
-      '@babel/core': ^7.13.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
-      '@babel/plugin-transform-optional-chaining': 7.24.7(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      '@babel/core': ^7.0.0-0
 
-  /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==}
-    engines: {node: '>=6.9.0'}
+  '@babel/plugin-syntax-object-rest-spread@7.8.3':
+    resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
     peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+      '@babel/core': ^7.0.0-0
 
-  /@babel/plugin-proposal-async-generator-functions@7.20.1(@babel/core@7.24.7):
-    resolution: {integrity: sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==}
-    engines: {node: '>=6.9.0'}
+  '@babel/plugin-syntax-optional-catch-binding@7.8.3':
+    resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.24.7)
-      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==}
-    engines: {node: '>=6.9.0'}
+  '@babel/plugin-syntax-optional-chaining@7.8.3':
+    resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /@babel/plugin-proposal-class-static-block@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==}
+  '@babel/plugin-syntax-private-property-in-object@7.14.5':
+    resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
-      '@babel/core': ^7.12.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      '@babel/core': ^7.0.0-0
 
-  /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==}
+  '@babel/plugin-syntax-top-level-await@7.14.5':
+    resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7)
-    dev: true
 
-  /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.24.7):
-    resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==}
+  '@babel/plugin-syntax-typescript@7.25.7':
+    resolution: {integrity: sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7)
-    dev: true
 
-  /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==}
+  '@babel/plugin-syntax-unicode-sets-regex@7.18.6':
+    resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7)
-    dev: true
+      '@babel/core': ^7.0.0
 
-  /@babel/plugin-proposal-logical-assignment-operators@7.18.9(@babel/core@7.24.7):
-    resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==}
+  '@babel/plugin-transform-arrow-functions@7.25.7':
+    resolution: {integrity: sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7)
-    dev: true
 
-  /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==}
+  '@babel/plugin-transform-async-generator-functions@7.25.7':
+    resolution: {integrity: sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7)
-    dev: true
 
-  /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==}
+  '@babel/plugin-transform-async-to-generator@7.25.7':
+    resolution: {integrity: sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7)
-    dev: true
 
-  /@babel/plugin-proposal-object-rest-spread@7.20.2(@babel/core@7.24.7):
-    resolution: {integrity: sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==}
+  '@babel/plugin-transform-block-scoped-functions@7.25.7':
+    resolution: {integrity: sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/compat-data': 7.23.5
-      '@babel/core': 7.24.7
-      '@babel/helper-compilation-targets': 7.23.6
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-transform-parameters': 7.20.3(@babel/core@7.24.7)
-    dev: true
 
-  /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==}
+  '@babel/plugin-transform-block-scoping@7.25.7':
+    resolution: {integrity: sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7)
-    dev: true
 
-  /@babel/plugin-proposal-optional-chaining@7.18.9(@babel/core@7.24.7):
-    resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==}
+  '@babel/plugin-transform-class-properties@7.25.7':
+    resolution: {integrity: sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-skip-transparent-expression-wrappers': 7.20.0
-      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7)
-    dev: true
 
-  /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==}
+  '@babel/plugin-transform-class-static-block@7.25.7':
+    resolution: {integrity: sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      '@babel/core': ^7.12.0
 
-  /@babel/plugin-proposal-private-property-in-object@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==}
+  '@babel/plugin-transform-classes@7.25.7':
+    resolution: {integrity: sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-annotate-as-pure': 7.22.5
-      '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7):
-    resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
+  '@babel/plugin-transform-computed-properties@7.25.7':
+    resolution: {integrity: sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-    dev: true
 
-  /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==}
-    engines: {node: '>=4'}
+  '@babel/plugin-transform-destructuring@7.25.7':
+    resolution: {integrity: sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.0):
-    resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+  '@babel/plugin-transform-dotall-regex@7.25.7':
+    resolution: {integrity: sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7):
-    resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+  '@babel/plugin-transform-duplicate-keys@7.25.7':
+    resolution: {integrity: sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.0):
-    resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+  '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.7':
+    resolution: {integrity: sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+      '@babel/core': ^7.0.0
 
-  /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7):
-    resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+  '@babel/plugin-transform-dynamic-import@7.25.7':
+    resolution: {integrity: sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0):
-    resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+  '@babel/plugin-transform-exponentiation-operator@7.25.7':
+    resolution: {integrity: sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7):
-    resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+  '@babel/plugin-transform-export-namespace-from@7.25.7':
+    resolution: {integrity: sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.7):
-    resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+  '@babel/plugin-transform-for-of@7.25.7':
+    resolution: {integrity: sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.7):
-    resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
+  '@babel/plugin-transform-function-name@7.25.7':
+    resolution: {integrity: sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.7):
-    resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
+  '@babel/plugin-transform-json-strings@7.25.7':
+    resolution: {integrity: sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-flow@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==}
+  '@babel/plugin-transform-literals@7.25.7':
+    resolution: {integrity: sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.24.7):
-    resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==}
+  '@babel/plugin-transform-logical-assignment-operators@7.25.7':
+    resolution: {integrity: sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==}
+  '@babel/plugin-transform-member-expression-literals@7.25.7':
+    resolution: {integrity: sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==}
+  '@babel/plugin-transform-modules-amd@7.25.7':
+    resolution: {integrity: sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.0):
-    resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+  '@babel/plugin-transform-modules-commonjs@7.25.7':
+    resolution: {integrity: sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7):
-    resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+  '@babel/plugin-transform-modules-systemjs@7.25.7':
+    resolution: {integrity: sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.0):
-    resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+  '@babel/plugin-transform-modules-umd@7.25.7':
+    resolution: {integrity: sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7):
-    resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+  '@babel/plugin-transform-named-capturing-groups-regex@7.25.7':
+    resolution: {integrity: sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+      '@babel/core': ^7.0.0
 
-  /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.24.0):
-    resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==}
+  '@babel/plugin-transform-new-target@7.25.7':
+    resolution: {integrity: sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==}
+  '@babel/plugin-transform-nullish-coalescing-operator@7.25.7':
+    resolution: {integrity: sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==}
+  '@babel/plugin-transform-numeric-separator@7.25.7':
+    resolution: {integrity: sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.0):
-    resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+  '@babel/plugin-transform-object-rest-spread@7.25.7':
+    resolution: {integrity: sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7):
-    resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+  '@babel/plugin-transform-object-super@7.25.7':
+    resolution: {integrity: sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.0):
-    resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+  '@babel/plugin-transform-optional-catch-binding@7.25.7':
+    resolution: {integrity: sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7):
-    resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+  '@babel/plugin-transform-optional-chaining@7.25.7':
+    resolution: {integrity: sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.0):
-    resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+  '@babel/plugin-transform-parameters@7.25.7':
+    resolution: {integrity: sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7):
-    resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+  '@babel/plugin-transform-private-methods@7.25.7':
+    resolution: {integrity: sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.0):
-    resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+  '@babel/plugin-transform-private-property-in-object@7.25.7':
+    resolution: {integrity: sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7):
-    resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+  '@babel/plugin-transform-property-literals@7.25.7':
+    resolution: {integrity: sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.0):
-    resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+  '@babel/plugin-transform-regenerator@7.25.7':
+    resolution: {integrity: sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7):
-    resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+  '@babel/plugin-transform-reserved-words@7.25.7':
+    resolution: {integrity: sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.0):
-    resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+  '@babel/plugin-transform-shorthand-properties@7.25.7':
+    resolution: {integrity: sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7):
-    resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+  '@babel/plugin-transform-spread@7.25.7':
+    resolution: {integrity: sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.7):
-    resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
+  '@babel/plugin-transform-sticky-regex@7.25.7':
+    resolution: {integrity: sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.0):
-    resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+  '@babel/plugin-transform-template-literals@7.25.7':
+    resolution: {integrity: sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7):
-    resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+  '@babel/plugin-transform-typeof-symbol@7.25.7':
+    resolution: {integrity: sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.24.7):
-    resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==}
+  '@babel/plugin-transform-typescript@7.25.7':
+    resolution: {integrity: sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.0):
-    resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==}
+  '@babel/plugin-transform-unicode-escapes@7.25.7':
+    resolution: {integrity: sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.0
-    dev: true
 
-  /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.0):
-    resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==}
+  '@babel/plugin-transform-unicode-property-regex@7.25.7':
+    resolution: {integrity: sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==}
+  '@babel/plugin-transform-unicode-regex@7.25.7':
+    resolution: {integrity: sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
+  '@babel/plugin-transform-unicode-sets-regex@7.25.7':
+    resolution: {integrity: sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-transform-arrow-functions@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==}
+  '@babel/preset-env@7.25.7':
+    resolution: {integrity: sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==}
-    engines: {node: '>=6.9.0'}
+  '@babel/preset-modules@0.1.6-no-external-plugins':
+    resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==}
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+      '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
 
-  /@babel/plugin-transform-async-generator-functions@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==}
+  '@babel/preset-typescript@7.16.7':
+    resolution: {integrity: sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==}
     engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-remap-async-to-generator': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /@babel/plugin-transform-async-to-generator@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==}
+  '@babel/runtime@7.25.7':
+    resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==}
     engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-module-imports': 7.22.15
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==}
+  '@babel/template@7.25.7':
+    resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==}
     engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-module-imports': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-remap-async-to-generator': 7.24.7(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==}
+  '@babel/traverse@7.23.2':
+    resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==}
     engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==}
+  '@babel/traverse@7.25.7':
+    resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==}
     engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-transform-block-scoping@7.20.2(@babel/core@7.24.7):
-    resolution: {integrity: sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==}
+  '@babel/types@7.17.0':
+    resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==}
     engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-transform-block-scoping@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==}
+  '@babel/types@7.25.7':
+    resolution: {integrity: sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==}
     engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
 
-  /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.24.7):
-    resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  '@bcoe/v8-coverage@0.2.3':
+    resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
 
-  /@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  '@chromatic-com/storybook@2.0.2':
+    resolution: {integrity: sha512-7bPIliISedeIpnVKbzktysFYW5n56bN91kxuOj1XXKixmjbUHRUMvcXd4K2liN6MiR5ZqJtmtcPsZ6CebbGlEA==}
+    engines: {node: '>=16.0.0', yarn: '>=1.22.18'}
 
-  /@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.12.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  '@clack/core@0.3.4':
+    resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==}
 
-  /@babel/plugin-transform-classes@7.20.2(@babel/core@7.24.7):
-    resolution: {integrity: sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-annotate-as-pure': 7.22.5
-      '@babel/helper-compilation-targets': 7.23.6
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-function-name': 7.24.7
-      '@babel/helper-optimise-call-expression': 7.18.6
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-replace-supers': 7.19.1
-      '@babel/helper-split-export-declaration': 7.24.7
-      globals: 11.12.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  '@clack/prompts@0.7.0':
+    resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==}
+    bundledDependencies:
+      - is-unicode-supported
 
-  /@babel/plugin-transform-classes@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==}
-    engines: {node: '>=6.9.0'}
+  '@csstools/postcss-cascade-layers@4.0.6':
+    resolution: {integrity: sha512-Xt00qGAQyqAODFiFEJNkTpSUz5VfYqnDLECdlA/Vv17nl/OIV5QfTRHGAXrBGG5YcJyHpJ+GF9gF/RZvOQz4oA==}
+    engines: {node: ^14 || ^16 || >=18}
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-annotate-as-pure': 7.24.7
-      '@babel/helper-compilation-targets': 7.24.7
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-function-name': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-split-export-declaration': 7.24.7
-      globals: 11.12.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      postcss: ^8.4
 
-  /@babel/plugin-transform-computed-properties@7.18.9(@babel/core@7.24.7):
-    resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==}
-    engines: {node: '>=6.9.0'}
+  '@csstools/selector-specificity@3.1.1':
+    resolution: {integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==}
+    engines: {node: ^14 || ^16 || >=18}
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+      postcss-selector-parser: ^6.0.13
 
-  /@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/template': 7.24.7
-    dev: true
+  '@esbuild/aix-ppc64@0.20.2':
+    resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [aix]
 
-  /@babel/plugin-transform-destructuring@7.20.2(@babel/core@7.24.7):
-    resolution: {integrity: sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  '@esbuild/aix-ppc64@0.21.5':
+    resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [aix]
 
-  /@babel/plugin-transform-destructuring@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  '@esbuild/aix-ppc64@0.23.1':
+    resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [aix]
 
-  /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  '@esbuild/android-arm64@0.20.2':
+    resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
 
-  /@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  '@esbuild/android-arm64@0.21.5':
+    resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
 
-  /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.24.7):
-    resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  '@esbuild/android-arm64@0.23.1':
+    resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [android]
 
-  /@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  '@esbuild/android-arm@0.20.2':
+    resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
 
-  /@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7)
-    dev: true
+  '@esbuild/android-arm@0.21.5':
+    resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
 
-  /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  '@esbuild/android-arm@0.23.1':
+    resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [android]
 
-  /@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  '@esbuild/android-x64@0.20.2':
+    resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
 
-  /@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7)
-    dev: true
+  '@esbuild/android-x64@0.21.5':
+    resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
 
-  /@babel/plugin-transform-flow-strip-types@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.24.7)
-    dev: true
+  '@esbuild/android-x64@0.23.1':
+    resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [android]
 
-  /@babel/plugin-transform-for-of@7.18.8(@babel/core@7.24.7):
-    resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  '@esbuild/darwin-arm64@0.20.2':
+    resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
 
-  /@babel/plugin-transform-for-of@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  '@esbuild/darwin-arm64@0.21.5':
+    resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
 
-  /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.24.7):
-    resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-compilation-targets': 7.23.6
-      '@babel/helper-function-name': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  '@esbuild/darwin-arm64@0.23.1':
+    resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [darwin]
 
-  /@babel/plugin-transform-function-name@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-compilation-targets': 7.24.7
-      '@babel/helper-function-name': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  '@esbuild/darwin-x64@0.20.2':
+    resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
 
-  /@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7)
-    dev: true
+  '@esbuild/darwin-x64@0.21.5':
+    resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
 
-  /@babel/plugin-transform-literals@7.18.9(@babel/core@7.24.7):
-    resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  '@esbuild/darwin-x64@0.23.1':
+    resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [darwin]
 
-  /@babel/plugin-transform-literals@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  '@esbuild/freebsd-arm64@0.20.2':
+    resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
 
-  /@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7)
-    dev: true
+  '@esbuild/freebsd-arm64@0.21.5':
+    resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
 
-  /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  '@esbuild/freebsd-arm64@0.23.1':
+    resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [freebsd]
 
-  /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  '@esbuild/freebsd-x64@0.20.2':
+    resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
 
-  /@babel/plugin-transform-modules-amd@7.19.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  '@esbuild/freebsd-x64@0.21.5':
+    resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
 
-  /@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  '@esbuild/freebsd-x64@0.23.1':
+    resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [freebsd]
 
-  /@babel/plugin-transform-modules-commonjs@7.19.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-simple-access': 7.22.5
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  '@esbuild/linux-arm64@0.20.2':
+    resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@esbuild/linux-arm64@0.21.5':
+    resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@esbuild/linux-arm64@0.23.1':
+    resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@esbuild/linux-arm@0.20.2':
+    resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+
+  '@esbuild/linux-arm@0.21.5':
+    resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+
+  '@esbuild/linux-arm@0.23.1':
+    resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [linux]
+
+  '@esbuild/linux-ia32@0.20.2':
+    resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+
+  '@esbuild/linux-ia32@0.21.5':
+    resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+
+  '@esbuild/linux-ia32@0.23.1':
+    resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [linux]
+
+  '@esbuild/linux-loong64@0.20.2':
+    resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+
+  '@esbuild/linux-loong64@0.21.5':
+    resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+
+  '@esbuild/linux-loong64@0.23.1':
+    resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==}
+    engines: {node: '>=18'}
+    cpu: [loong64]
+    os: [linux]
+
+  '@esbuild/linux-mips64el@0.20.2':
+    resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+
+  '@esbuild/linux-mips64el@0.21.5':
+    resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+
+  '@esbuild/linux-mips64el@0.23.1':
+    resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==}
+    engines: {node: '>=18'}
+    cpu: [mips64el]
+    os: [linux]
+
+  '@esbuild/linux-ppc64@0.20.2':
+    resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@esbuild/linux-ppc64@0.21.5':
+    resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@esbuild/linux-ppc64@0.23.1':
+    resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@esbuild/linux-riscv64@0.20.2':
+    resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@esbuild/linux-riscv64@0.21.5':
+    resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@esbuild/linux-riscv64@0.23.1':
+    resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==}
+    engines: {node: '>=18'}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@esbuild/linux-s390x@0.20.2':
+    resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+
+  '@esbuild/linux-s390x@0.21.5':
+    resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+
+  '@esbuild/linux-s390x@0.23.1':
+    resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==}
+    engines: {node: '>=18'}
+    cpu: [s390x]
+    os: [linux]
+
+  '@esbuild/linux-x64@0.20.2':
+    resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+
+  '@esbuild/linux-x64@0.21.5':
+    resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+
+  '@esbuild/linux-x64@0.23.1':
+    resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [linux]
+
+  '@esbuild/netbsd-x64@0.20.2':
+    resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+
+  '@esbuild/netbsd-x64@0.21.5':
+    resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+
+  '@esbuild/netbsd-x64@0.23.1':
+    resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [netbsd]
+
+  '@esbuild/openbsd-arm64@0.23.1':
+    resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [openbsd]
+
+  '@esbuild/openbsd-x64@0.20.2':
+    resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+
+  '@esbuild/openbsd-x64@0.21.5':
+    resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+
+  '@esbuild/openbsd-x64@0.23.1':
+    resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [openbsd]
+
+  '@esbuild/sunos-x64@0.20.2':
+    resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+
+  '@esbuild/sunos-x64@0.21.5':
+    resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+
+  '@esbuild/sunos-x64@0.23.1':
+    resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [sunos]
+
+  '@esbuild/win32-arm64@0.20.2':
+    resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@esbuild/win32-arm64@0.21.5':
+    resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@esbuild/win32-arm64@0.23.1':
+    resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@esbuild/win32-ia32@0.20.2':
+    resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@esbuild/win32-ia32@0.21.5':
+    resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@esbuild/win32-ia32@0.23.1':
+    resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@esbuild/win32-x64@0.20.2':
+    resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+
+  '@esbuild/win32-x64@0.21.5':
+    resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+
+  '@esbuild/win32-x64@0.23.1':
+    resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [win32]
+
+  '@eslint-community/eslint-utils@4.4.0':
+    resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+  '@eslint-community/regexpp@4.11.1':
+    resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==}
+    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+  '@eslint/config-array@0.18.0':
+    resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/core@0.6.0':
+    resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/eslintrc@2.1.4':
+    resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  '@eslint/eslintrc@3.1.0':
+    resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/js@8.57.1':
+    resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  '@eslint/js@9.12.0':
+    resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/object-schema@2.1.4':
+    resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/plugin-kit@0.2.0':
+    resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@floating-ui/core@1.6.8':
+    resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==}
+
+  '@floating-ui/dom@1.6.11':
+    resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==}
+
+  '@floating-ui/utils@0.2.8':
+    resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
+
+  '@fontsource/inter@5.1.0':
+    resolution: {integrity: sha512-zKZR3kf1G0noIes1frLfOHP5EXVVm0M7sV/l9f/AaYf+M/DId35FO4LkigWjqWYjTJZGgplhdv4cB+ssvCqr5A==}
+
+  '@fontsource/jetbrains-mono@5.1.1':
+    resolution: {integrity: sha512-5rwvmdQQpXev4LlBX1P+7h2dguu6iwW/9Npjde4+DEq+HgpVJI/7QY8DI1NVVFdvLtXZNP+vO2L/5BQED6FUhA==}
+
+  '@fontsource/open-sans@5.1.0':
+    resolution: {integrity: sha512-g+mjF8gWUDwck9DrRCkhmFeEj7fskjtKZJKAQguVzSg93lc6ThakTHMRgs0dZfe5qBbktrV839tDrb4bIDyZSA==}
+
+  '@hcaptcha/types@1.0.4':
+    resolution: {integrity: sha512-4CBrdr9DFC7sYZPRvLol82UVZVne8B2skBGfMDUqPC6q9vzHMwv/cNxXW44EIa6DaFDr+EWNSnKJpHxWr7Q42Q==}
+
+  '@humanfs/core@0.19.0':
+    resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==}
+    engines: {node: '>=18.18.0'}
+
+  '@humanfs/node@0.16.5':
+    resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==}
+    engines: {node: '>=18.18.0'}
+
+  '@humanwhocodes/config-array@0.13.0':
+    resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==}
+    engines: {node: '>=10.10.0'}
+    deprecated: Use @eslint/config-array instead
+
+  '@humanwhocodes/module-importer@1.0.1':
+    resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+    engines: {node: '>=12.22'}
+
+  '@humanwhocodes/object-schema@2.0.3':
+    resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
+    deprecated: Use @eslint/object-schema instead
+
+  '@humanwhocodes/retry@0.3.1':
+    resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
+    engines: {node: '>=18.18'}
+
+  '@isaacs/cliui@8.0.2':
+    resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+    engines: {node: '>=12'}
+
+  '@istanbuljs/load-nyc-config@1.1.0':
+    resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
+    engines: {node: '>=8'}
+
+  '@istanbuljs/schema@0.1.3':
+    resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+    engines: {node: '>=8'}
+
+  '@jest/console@27.5.1':
+    resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/core@27.5.1':
+    resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+
+  '@jest/environment@27.5.1':
+    resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/fake-timers@27.5.1':
+    resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/globals@27.5.1':
+    resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/reporters@27.5.1':
+    resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+
+  '@jest/schemas@29.6.3':
+    resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  '@jest/source-map@27.5.1':
+    resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/test-result@27.5.1':
+    resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/test-sequencer@27.5.1':
+    resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/transform@27.5.1':
+    resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jest/types@27.5.1':
+    resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  '@jridgewell/gen-mapping@0.3.5':
+    resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/resolve-uri@3.1.2':
+    resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/set-array@1.2.1':
+    resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/source-map@0.3.6':
+    resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
+
+  '@jridgewell/sourcemap-codec@1.5.0':
+    resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+  '@jridgewell/trace-mapping@0.3.25':
+    resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+  '@material-design-icons/svg@0.14.13':
+    resolution: {integrity: sha512-nCExGZOtoLoFeeqShEOM4XA9DkkLzLlQdk/ZxHxps0//dz6e1Lw3fvQbZ2X/+0Dz2O+udiEukfZ4Nd4KpHg8aA==}
+
+  '@material/material-color-utilities@0.3.0':
+    resolution: {integrity: sha512-ztmtTd6xwnuh2/xu+Vb01btgV8SQWYCaK56CkRK8gEkWe5TuDyBcYJ0wgkMRn+2VcE9KUmhvkz+N9GHrqw/C0g==}
+
+  '@mdx-js/react@3.0.1':
+    resolution: {integrity: sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==}
+    peerDependencies:
+      '@types/react': '>=16'
+      react: '>=16'
+
+  '@minht11/solid-virtual-container@0.2.1':
+    resolution: {integrity: sha512-HvQWx1uE5NWwx9WsN4waFtmyOjhZKMA/3vBf+j3zGsRfi556LCUk4oOmqZcOvIB5nEpHezvuZ8oUlwxigdO3Xg==}
+    peerDependencies:
+      solid-js: '>= 1.0.0'
+
+  '@motionone/animation@10.18.0':
+    resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==}
+
+  '@motionone/dom@10.18.0':
+    resolution: {integrity: sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==}
+
+  '@motionone/easing@10.18.0':
+    resolution: {integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==}
+
+  '@motionone/generators@10.18.0':
+    resolution: {integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==}
+
+  '@motionone/types@10.17.1':
+    resolution: {integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==}
+
+  '@motionone/utils@10.18.0':
+    resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==}
+
+  '@mxssfd/typedoc-theme@1.1.7':
+    resolution: {integrity: sha512-dj4p0TjIoudD8j1u+Kf+KzcEc+je3IB/B1oohWcVJmMRfbw5uZYX6qOGHzfUzAPiU1pYe2u5Vo1IPqgLo58taA==}
+    engines: {node: '>= 14'}
+    peerDependencies:
+      typedoc: ^0.26.7
+
+  '@nodelib/fs.scandir@2.1.5':
+    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.stat@2.0.5':
+    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.walk@1.2.8':
+    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+    engines: {node: '>= 8'}
+
+  '@nothing-but/utils@0.12.1':
+    resolution: {integrity: sha512-1qZU1Q5El0IjE7JT/ucvJNzdr2hL3W8Rm27xNf1p6gb3Nw8pGnZmxp6/GEW9h+I1k1cICxXNq25hBwknTQ7yhg==}
+
+  '@octokit/app@13.1.8':
+    resolution: {integrity: sha512-bCncePMguVyFpdBbnceFKfmPOuUD94T189GuQ0l00ZcQ+mX4hyPqnaWJlsXE2HSdA71eV7p8GPDZ+ErplTkzow==}
+    engines: {node: '>= 14'}
+
+  '@octokit/auth-app@4.0.13':
+    resolution: {integrity: sha512-NBQkmR/Zsc+8fWcVIFrwDgNXS7f4XDrkd9LHdi9DPQw1NdGHLviLzRO2ZBwTtepnwHXW5VTrVU9eFGijMUqllg==}
+    engines: {node: '>= 14'}
+
+  '@octokit/auth-oauth-app@5.0.6':
+    resolution: {integrity: sha512-SxyfIBfeFcWd9Z/m1xa4LENTQ3l1y6Nrg31k2Dcb1jS5ov7pmwMJZ6OGX8q3K9slRgVpeAjNA1ipOAMHkieqyw==}
+    engines: {node: '>= 14'}
+
+  '@octokit/auth-oauth-device@4.0.5':
+    resolution: {integrity: sha512-XyhoWRTzf2ZX0aZ52a6Ew5S5VBAfwwx1QnC2Np6Et3MWQpZjlREIcbcvVZtkNuXp6Z9EeiSLSDUqm3C+aMEHzQ==}
+    engines: {node: '>= 14'}
+
+  '@octokit/auth-oauth-user@2.1.2':
+    resolution: {integrity: sha512-kkRqNmFe7s5GQcojE3nSlF+AzYPpPv7kvP/xYEnE57584pixaFBH8Vovt+w5Y3E4zWUEOxjdLItmBTFAWECPAg==}
+    engines: {node: '>= 14'}
+
+  '@octokit/auth-token@3.0.4':
+    resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==}
+    engines: {node: '>= 14'}
+
+  '@octokit/auth-unauthenticated@3.0.5':
+    resolution: {integrity: sha512-yH2GPFcjrTvDWPwJWWCh0tPPtTL5SMgivgKPA+6v/XmYN6hGQkAto8JtZibSKOpf8ipmeYhLNWQ2UgW0GYILCw==}
+    engines: {node: '>= 14'}
+
+  '@octokit/core@4.2.4':
+    resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==}
+    engines: {node: '>= 14'}
+
+  '@octokit/endpoint@7.0.6':
+    resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==}
+    engines: {node: '>= 14'}
+
+  '@octokit/graphql@5.0.6':
+    resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==}
+    engines: {node: '>= 14'}
+
+  '@octokit/oauth-app@4.2.4':
+    resolution: {integrity: sha512-iuOVFrmm5ZKNavRtYu5bZTtmlKLc5uVgpqTfMEqYYf2OkieV6VdxKZAb5qLVdEPL8LU2lMWcGpavPBV835cgoA==}
+    engines: {node: '>= 14'}
+
+  '@octokit/oauth-authorization-url@5.0.0':
+    resolution: {integrity: sha512-y1WhN+ERDZTh0qZ4SR+zotgsQUE1ysKnvBt1hvDRB2WRzYtVKQjn97HEPzoehh66Fj9LwNdlZh+p6TJatT0zzg==}
+    engines: {node: '>= 14'}
+
+  '@octokit/oauth-methods@2.0.6':
+    resolution: {integrity: sha512-l9Uml2iGN2aTWLZcm8hV+neBiFXAQ9+3sKiQe/sgumHlL6HDg0AQ8/l16xX/5jJvfxueqTW5CWbzd0MjnlfHZw==}
+    engines: {node: '>= 14'}
+
+  '@octokit/openapi-types@18.1.1':
+    resolution: {integrity: sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==}
+
+  '@octokit/plugin-paginate-rest@6.1.2':
+    resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==}
+    engines: {node: '>= 14'}
+    peerDependencies:
+      '@octokit/core': '>=4'
+
+  '@octokit/plugin-rest-endpoint-methods@7.2.3':
+    resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==}
+    engines: {node: '>= 14'}
+    peerDependencies:
+      '@octokit/core': '>=3'
+
+  '@octokit/plugin-retry@4.1.6':
+    resolution: {integrity: sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==}
+    engines: {node: '>= 14'}
+    peerDependencies:
+      '@octokit/core': '>=3'
+
+  '@octokit/plugin-throttling@5.2.3':
+    resolution: {integrity: sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==}
+    engines: {node: '>= 14'}
+    peerDependencies:
+      '@octokit/core': ^4.0.0
+
+  '@octokit/request-error@3.0.3':
+    resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==}
+    engines: {node: '>= 14'}
+
+  '@octokit/request@6.2.8':
+    resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==}
+    engines: {node: '>= 14'}
+
+  '@octokit/tsconfig@1.0.2':
+    resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==}
+
+  '@octokit/types@10.0.0':
+    resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==}
+
+  '@octokit/types@9.3.2':
+    resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==}
+
+  '@octokit/webhooks-methods@3.0.3':
+    resolution: {integrity: sha512-2vM+DCNTJ5vL62O5LagMru6XnYhV4fJslK+5YUkTa6rWlW2S+Tqs1lF9Wr9OGqHfVwpBj3TeztWfVON/eUoW1Q==}
+    engines: {node: '>= 14'}
+
+  '@octokit/webhooks-types@6.11.0':
+    resolution: {integrity: sha512-AanzbulOHljrku1NGfafxdpTCfw2ENaWzH01N2vqQM+cUFbk868Cgh0xylz0JIM9BoKbfI++bdD6EYX0Q/UTEw==}
+
+  '@octokit/webhooks@10.9.2':
+    resolution: {integrity: sha512-hFVF/szz4l/Y/GQdKxNmQjUke0XJXK986p+ucIlubTGVPVtVtup5G1jarQfvCMBs9Fvlf9dvH8K83E4lefmofQ==}
+    engines: {node: '>= 14'}
+
+  '@pandacss/config@0.46.1':
+    resolution: {integrity: sha512-kcyA2RapzEK86bW1SnV99Wg1pzB2Vb/bN4eIvsJUbreIWefLQmZ0b6I6iwtWXuCy69ZVSngbkecVqqVO614xMQ==}
+
+  '@pandacss/core@0.46.1':
+    resolution: {integrity: sha512-efDr8TZudyVrxEpxniuDsy5tAXBsa7qyOiGPJ+BqR76GLvtfeJaNrKryFSoUbihZpbkfuvtbg0jOHSvFNWFQrQ==}
+
+  '@pandacss/dev@0.46.1':
+    resolution: {integrity: sha512-zZ72oNFXQcFhZ8bKO/e6gmbk4vI294pRIQwD0o/CCRK8zAcjbkkgfqZBMKykYKHNXoAwDnBQBIjuWqVvsWagyw==}
+    hasBin: true
+
+  '@pandacss/extractor@0.46.1':
+    resolution: {integrity: sha512-YwZjt/x37NDBgJY3UNfzD7KJFrJKXnbYgE3+uZAYu47xD/eO6foHtlQM4pkJlTObvodIyiylQvv3bXhY0KznuA==}
+
+  '@pandacss/generator@0.46.1':
+    resolution: {integrity: sha512-Af/sHBwXIbkG6mnqCTFjKJMFZcqOgvgZ3Zl31ksiSY3hY59jFidfgmV8oseMPrLBhFIFdcViQdXA9Sr9HCxdjQ==}
+
+  '@pandacss/is-valid-prop@0.46.1':
+    resolution: {integrity: sha512-YSIfUw5YdQ/+uErxdwSXFVBGQPl2A58E+qt+AdsfbtYslEA5BpgBdptMliLmO2NF+jLKoN91M6IO24/lH+mUBQ==}
+
+  '@pandacss/logger@0.46.1':
+    resolution: {integrity: sha512-5XU7g1uv84a5EeA5QkAcCy25kS61yqM/Y6tBPJkG0/Yn9LNlJXn9zdh8I1GNLHDAWn2QdXFyLDt8T0Xk6/EgLw==}
+
+  '@pandacss/node@0.46.1':
+    resolution: {integrity: sha512-vkw6PAENndthIQ7b4jOogpbF1jsJb5BKqICjesArJhYbdm9VivfrpWcxRkYgJF3lGUu8V6+fOwXwvDrkpLvokA==}
+
+  '@pandacss/parser@0.46.1':
+    resolution: {integrity: sha512-cNHXMTYTeSg6eQlLDQUypKb/TMDkDSl49XaXEekhD+o4HlMrwy9KTqqZB/Il+L3rvICMGXUjv+dAKRjDOcAhcA==}
+
+  '@pandacss/postcss@0.46.1':
+    resolution: {integrity: sha512-GKG9Lm9ywn4dKgN04PIFo6FSCaEQubFhIK5KfIBG7aY+OglzVXSDWdO19zwV2lDjrdd48hyw54ERjFc0LNIU+w==}
+
+  '@pandacss/preset-base@0.46.1':
+    resolution: {integrity: sha512-lWMVDujyAqTaCAa0OM0HsE//eIaGWFpT6x0hIzSoWlgwDTy584AObyxIDu97HN1irfCpBJqty2TNYs02C9Cb/g==}
+
+  '@pandacss/preset-panda@0.46.1':
+    resolution: {integrity: sha512-ljPL6dU7eG/GDflOVEqz+PFRO/FMbOGoV993bh+t9c/UiJ0mw0R5HGUUotBS1KB30wH4qMC5NROK+9IgxwvR3Q==}
+
+  '@pandacss/shared@0.46.1':
+    resolution: {integrity: sha512-mpeivvQTaAc/xJygWKFoWqJZ2GW3ggZXCj0Uc6+L8iqjbUVSAekqjhfgGfFNJKvwm0BgU+gbmxjCWJykKfGW9A==}
+
+  '@pandacss/token-dictionary@0.46.1':
+    resolution: {integrity: sha512-94WIuy0HnzqN2f8jm8iT5iFDFlwNIsMFMuHZVxALD8RBLAB6ZhQPcKT8qdGlM+IyYK9ysGU2LF5zBR58NDIbGQ==}
+
+  '@pandacss/types@0.46.1':
+    resolution: {integrity: sha512-hExBBB/QwKxf0MT8/67zNePm27996ALlEaef7z/9Fzhhh2yX5UGmDHTAQCe8T0XyWpIky8v/YekZ8YMANlvxtw==}
+
+  '@pkgjs/parseargs@0.11.0':
+    resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+    engines: {node: '>=14'}
+
+  '@pkgr/core@0.1.1':
+    resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
+    engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+
+  '@polka/url@1.0.0-next.28':
+    resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
+
+  '@rollup/plugin-babel@5.3.1':
+    resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==}
+    engines: {node: '>= 10.0.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+      '@types/babel__core': ^7.1.9
+      rollup: ^1.20.0||^2.0.0
+    peerDependenciesMeta:
+      '@types/babel__core':
+        optional: true
+
+  '@rollup/plugin-node-resolve@15.3.0':
+    resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      rollup: ^2.78.0||^3.0.0||^4.0.0
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+
+  '@rollup/plugin-replace@2.4.2':
+    resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==}
+    peerDependencies:
+      rollup: ^1.20.0 || ^2.0.0
+
+  '@rollup/plugin-terser@0.4.4':
+    resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      rollup: ^2.0.0||^3.0.0||^4.0.0
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+
+  '@rollup/pluginutils@3.1.0':
+    resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==}
+    engines: {node: '>= 8.0.0'}
+    peerDependencies:
+      rollup: ^1.20.0||^2.0.0
+
+  '@rollup/pluginutils@5.1.2':
+    resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+
+  '@rollup/rollup-android-arm-eabi@4.24.0':
+    resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==}
+    cpu: [arm]
+    os: [android]
+
+  '@rollup/rollup-android-arm64@4.24.0':
+    resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==}
+    cpu: [arm64]
+    os: [android]
+
+  '@rollup/rollup-darwin-arm64@4.24.0':
+    resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@rollup/rollup-darwin-x64@4.24.0':
+    resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@rollup/rollup-linux-arm-gnueabihf@4.24.0':
+    resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==}
+    cpu: [arm]
+    os: [linux]
+
+  '@rollup/rollup-linux-arm-musleabihf@4.24.0':
+    resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==}
+    cpu: [arm]
+    os: [linux]
+
+  '@rollup/rollup-linux-arm64-gnu@4.24.0':
+    resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@rollup/rollup-linux-arm64-musl@4.24.0':
+    resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@rollup/rollup-linux-powerpc64le-gnu@4.24.0':
+    resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@rollup/rollup-linux-riscv64-gnu@4.24.0':
+    resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@rollup/rollup-linux-s390x-gnu@4.24.0':
+    resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==}
+    cpu: [s390x]
+    os: [linux]
+
+  '@rollup/rollup-linux-x64-gnu@4.24.0':
+    resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==}
+    cpu: [x64]
+    os: [linux]
+
+  '@rollup/rollup-linux-x64-musl@4.24.0':
+    resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==}
+    cpu: [x64]
+    os: [linux]
+
+  '@rollup/rollup-win32-arm64-msvc@4.24.0':
+    resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@rollup/rollup-win32-ia32-msvc@4.24.0':
+    resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==}
+    cpu: [ia32]
+    os: [win32]
+
+  '@rollup/rollup-win32-x64-msvc@4.24.0':
+    resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==}
+    cpu: [x64]
+    os: [win32]
+
+  '@sentry-internal/browser-utils@8.33.1':
+    resolution: {integrity: sha512-TW6/r+Gl5jiXv54iK1xZ3mlVgTS/jaBp4vcQ0xGMdgiQ3WchEPcFSeYovL+YHT3tSud0GZqVtDQCz+5i76puqA==}
+    engines: {node: '>=14.18'}
+
+  '@sentry-internal/feedback@8.33.1':
+    resolution: {integrity: sha512-qauMRTm3qDaLqZ3ibI03cj4gLF40y0ij65nj+cns6iWxGCtPrO8tjvXFWuQsE7Aye9dGMnBgmv7uN+NTUtC3RA==}
+    engines: {node: '>=14.18'}
+
+  '@sentry-internal/replay-canvas@8.33.1':
+    resolution: {integrity: sha512-nsxTFTPCT10Ty/v6+AiST3+yotGP1sUb8xqfKB9fPnS1hZHFryp0NnEls7xFjBsBbZPU1GpFkzrk/E6JFzixDQ==}
+    engines: {node: '>=14.18'}
+
+  '@sentry-internal/replay@8.33.1':
+    resolution: {integrity: sha512-fm4coIOjmanU29NOVN9MyaP4fUCOYytbtFqVSKRFNZQ/xAgNeySiBIbUd6IjujMmnOk9bY0WEUMcdm3Uotjdog==}
+    engines: {node: '>=14.18'}
+
+  '@sentry-internal/tracing@7.114.0':
+    resolution: {integrity: sha512-dOuvfJN7G+3YqLlUY4HIjyWHaRP8vbOgF+OsE5w2l7ZEn1rMAaUbPntAR8AF9GBA6j2zWNoSo8e7GjbJxVofSg==}
+    engines: {node: '>=8'}
+
+  '@sentry/browser@8.33.1':
+    resolution: {integrity: sha512-c6zI/igexkLwZuGk+u8Rj26ChjxGgkhe6ZbKFsXCYaKAp5ep5X7HQRkkqgbxApiqlC0LduHdd/ymzh139JLg8w==}
+    engines: {node: '>=14.18'}
+
+  '@sentry/core@7.114.0':
+    resolution: {integrity: sha512-YnanVlmulkjgZiVZ9BfY9k6I082n+C+LbZo52MTvx3FY6RE5iyiPMpaOh67oXEZRWcYQEGm+bKruRxLVP6RlbA==}
+    engines: {node: '>=8'}
+
+  '@sentry/core@8.33.1':
+    resolution: {integrity: sha512-3SS41suXLFzxL3OQvTMZ6q92ZapELVq2l2SoWlZopcamWhog2Ru0dp2vkunq97kFHb2TzKRTlFH4+4gbT8SJug==}
+    engines: {node: '>=14.18'}
+
+  '@sentry/tracing@7.114.0':
+    resolution: {integrity: sha512-eldEYGADReZ4jWdN5u35yxLUSTOvjsiZAYd4KBEpf+Ii65n7g/kYOKAjNl7tHbrEG1EsMW4nDPWStUMk1w+tfg==}
+    engines: {node: '>=8'}
+
+  '@sentry/types@7.114.0':
+    resolution: {integrity: sha512-tsqkkyL3eJtptmPtT0m9W/bPLkU7ILY7nvwpi1hahA5jrM7ppoU0IMaQWAgTD+U3rzFH40IdXNBFb8Gnqcva4w==}
+    engines: {node: '>=8'}
+
+  '@sentry/types@8.33.1':
+    resolution: {integrity: sha512-GjoAMvwtpIemoF/IiwZ7A60g4nQv3qwzR21GvJqDVUoKD0e8pv9OLX+HyXoUat4wEDGSuDUcUyUKD2G+od73QA==}
+    engines: {node: '>=14.18'}
+
+  '@sentry/utils@7.114.0':
+    resolution: {integrity: sha512-319N90McVpupQ6vws4+tfCy/03AdtsU0MurIE4+W5cubHME08HtiEWlfacvAxX+yuKFhvdsO4K4BB/dj54ideg==}
+    engines: {node: '>=8'}
+
+  '@sentry/utils@8.33.1':
+    resolution: {integrity: sha512-uzuYpiiJuFY3N4WNHMBWUQX5oNv2t/TbG0OHRp3Rr7yeu+HSfD542TIp9/gMZ+G0Cxd8AmVO3wkKIFbk0TL4Qg==}
+    engines: {node: '>=14.18'}
+
+  '@shikijs/core@1.22.0':
+    resolution: {integrity: sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==}
+
+  '@shikijs/engine-javascript@1.22.0':
+    resolution: {integrity: sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==}
+
+  '@shikijs/engine-oniguruma@1.22.0':
+    resolution: {integrity: sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==}
+
+  '@shikijs/types@1.22.0':
+    resolution: {integrity: sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==}
+
+  '@shikijs/vscode-textmate@9.3.0':
+    resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==}
+
+  '@sinclair/typebox@0.27.8':
+    resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+
+  '@sinonjs/commons@1.8.6':
+    resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==}
+
+  '@sinonjs/fake-timers@8.1.0':
+    resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==}
+
+  '@solid-aria/button@0.1.3':
+    resolution: {integrity: sha512-gN7/d5YkHAbQPhzBVbNNp9grf9w+mxFRulbmeXjp61hFNLOJRDcdMPCri5MmfUJ8D2BwefcyHvCGTCc62Ua23A==}
+    peerDependencies:
+      solid-js: ^1.4.4
+
+  '@solid-aria/focus@0.1.4':
+    resolution: {integrity: sha512-yX/BbN97s7ascNJu0yB+p1bx48U0NOOWw7+TYlGcAfFGc2HMNpIxG5OdhWGUoz8D9Tp5ELEgWgN3d4dAf7Hk9Q==}
+    peerDependencies:
+      solid-js: ^1.4.4
+
+  '@solid-aria/interactions@0.1.4':
+    resolution: {integrity: sha512-gVJWJTX51mZfURoak39mxCo/vUQl8UInctJBlT2nIc3VQrTPL4ekOV6czrvTffpduoWgXeuf61+Dabc7b920lQ==}
+    peerDependencies:
+      solid-js: ^1.4.4
+
+  '@solid-aria/toggle@0.1.3':
+    resolution: {integrity: sha512-ZVRhY+Te8XBFFcumuu2J92LBntlmV6ss/6fNkDfhvr4LV42VB1goRZvPJk8rqakyR3JkQBTnQuxt7idrqqaxgA==}
+    peerDependencies:
+      solid-js: ^1.4.4
+
+  '@solid-aria/types@0.1.4':
+    resolution: {integrity: sha512-CxVXiZPE+nfD7wr7+6xtY3IrCTyAfL3zW4tH4NtsxlqBoz10tLFRCsTqeyl6OWMDhwABIaSdeHPKXVnKsKErcQ==}
+    peerDependencies:
+      solid-js: ^1.4.4
+
+  '@solid-aria/utils@0.2.1':
+    resolution: {integrity: sha512-zZgPpdg7azQUKE2jDUnCmzopN8CFdeKKcFTIv9ICrc0afS1qUR8ScywWBF/AwNBgGYhneBr7xEOwAHxe+zUcHQ==}
+    peerDependencies:
+      solid-js: ^1.4.4
+
+  '@solid-devtools/debugger@0.23.4':
+    resolution: {integrity: sha512-EfTB1Eo313wztQYGJ4Ec/wE70Ay2d603VCXfT3RlyqO5QfLrQGRHX5NXC07hJpQTJJJ3tbNgzO7+ZKo76MM5uA==}
+    peerDependencies:
+      solid-js: ^1.8.0
+
+  '@solid-devtools/shared@0.13.2':
+    resolution: {integrity: sha512-Y4uaC4EfTVwBR537MZwfaY/eiWAh+hW4mbtnwNuUw/LFmitHSkQhNQTUlLQv/S0chtwrYWQBxvXos1dC7e8R9g==}
+    peerDependencies:
+      solid-js: ^1.8.0
+
+  '@solid-primitives/bounds@0.0.118':
+    resolution: {integrity: sha512-Qj42w8LlnhJ3r/t+t0c0vrdwIvvQMPgjEFGmLiwREaA85ojLbgL9lSBq2tKvljeLCvRVkgj10KEUf+vc99VCIg==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/cursor@0.0.112':
+    resolution: {integrity: sha512-TAtU7qD7ipSLSXHnq8FhhosAPVX+dnOCb/ITcGcLlj8e/C9YKcxDhgBHJ3R/d1xDRb5/vO/szJtEz6fnQD311Q==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/event-bus@1.0.11':
+    resolution: {integrity: sha512-bSwVA4aI2aNHomSbEroUnisMSyDDXJbrw4U8kFEvrcYdlLrJX5i6QeCFx+vj/zdQQw62KAllrEIyWP8KMpPVnQ==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/event-listener@2.3.3':
+    resolution: {integrity: sha512-DAJbl+F0wrFW2xmcV8dKMBhk9QLVLuBSW+TR4JmIfTaObxd13PuL7nqaXnaYKDWOYa6otB00qcCUIGbuIhSUgQ==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/i18n@2.1.1':
+    resolution: {integrity: sha512-1p9B8hveu+gzFRWfXcRtdzzEdr7gw3c8uLXm+2bU33JHgiI8kYJsWvG128sE6vU1ZtYGPrGq980Jd6hxYupyZQ==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/keyboard@1.2.8':
+    resolution: {integrity: sha512-pJtcbkjozS6L1xvTht9rPpyPpX55nAkfBzbFWdf3y0Suwh6qClTibvvObzKOf7uzQ+8aZRDH4LsoGmbTKXtJjQ==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/keyed@1.2.2':
+    resolution: {integrity: sha512-oBziY40JK4XmJ57XGkFl8j0GtEarSu0hhjdkUQgqL/U0QQE3TZrRo9uhgH7I6VGJKBKG7SAraTPE6S5lVLM1ow==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/map@0.4.13':
+    resolution: {integrity: sha512-B1zyFbsiTQvqPr+cuPCXO72sRuczG9Swncqk5P74NCGw1VE8qa/Ry9GlfI1e/VdeQYHjan+XkbE3rO2GW/qKew==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/media@2.2.9':
+    resolution: {integrity: sha512-QUmU62D4/d9YWx/4Dvr/UZasIkIpqNXz7wosA5GLmesRW9XlPa3G5M6uOmTw73SByHNTCw0D6x8bSdtvvLgzvQ==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/platform@0.0.100':
+    resolution: {integrity: sha512-TMGeDtjA8b7xlUQGq3QhdR8SSa49bvqhFJ0iD+iy4fsnEHr9xA5hIDyBX/ntmz70SbOVyz+z9IdXwBnqurr4bQ==}
+    peerDependencies:
+      solid-js: ^1.4.0
+
+  '@solid-primitives/platform@0.1.2':
+    resolution: {integrity: sha512-sSxcZfuUrtxcwV0vdjmGnZQcflACzMfLriVeIIWXKp8hzaS3Or3tO6EFQkTd3L8T5dTq+kTtLvPscXIpL0Wzdg==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/props@2.2.2':
+    resolution: {integrity: sha512-vjRRoi/z3S2ylIJKCs+mN07oxDmt2S9gPCbTqkEx8jYHnvzocpt34UQdglLoSklTE6jI37JhW3g/Cs8Qr/peHg==}
+    peerDependencies:
+      solid-js: ^1.3.0
+
+  '@solid-primitives/props@3.1.11':
+    resolution: {integrity: sha512-jZAKWwvDRHjiydIumDgMj68qviIbowQ1ci7nkEAgzgvanNkhKSQV8iPgR2jMk1uv7S2ZqXYHslVQTgJel/TEyg==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/refs@1.0.8':
+    resolution: {integrity: sha512-+jIsWG8/nYvhaCoG2Vg6CJOLgTmPKFbaCrNQKWfChalgUf9WrVxWw0CdJb3yX15n5lUcQ0jBo6qYtuVVmBLpBw==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/resize-observer@2.0.26':
+    resolution: {integrity: sha512-KbPhwal6ML9OHeUTZszBbt6PYSMj89d4wVCLxlvDYL4U0+p+xlCEaqz6v9dkCwm/0Lb+Wed7W5T1dQZCP3JUUw==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/rootless@1.4.5':
+    resolution: {integrity: sha512-GFJE9GC3ojx0aUKqAUZmQPyU8fOVMtnVNrkdk2yS4kd17WqVSpXpoTmo9CnOwA+PG7FTzdIkogvfLQSLs4lrww==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/scheduled@1.4.3':
+    resolution: {integrity: sha512-HfWN5w7b7FEc6VPLBKnnE302h90jsLMuR28Fcf7neRGGf8jBj6wm6/UFQ00VlKexHFMR6KQ2u4VBh5a1ZcqM8g==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/script-loader@2.2.0':
+    resolution: {integrity: sha512-PlQEcdpvhtWUsceDp1Miyn49v74QNx/Xv7bpdqVTL6GvvQNuXF0qtpDrOZ+jZvOQiHLlnzNWrBk6YdWwenqcnw==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/set@0.4.12':
+    resolution: {integrity: sha512-p0CTabELYGK0oHDpET0f0p9CZtOqPocPDlZxL5MFSke0ewUByNVfNssK6aOECwvvYWL/rinFOUneOC/KLAXmwA==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/static-store@0.0.5':
+    resolution: {integrity: sha512-ssQ+s/wrlFAEE4Zw8GV499yBfvWx7SMm+ZVc11wvao4T5xg9VfXCL9Oa+x4h+vPMvSV/Knv5LrsLiUa+wlJUXQ==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/static-store@0.0.8':
+    resolution: {integrity: sha512-ZecE4BqY0oBk0YG00nzaAWO5Mjcny8Fc06CdbXadH9T9lzq/9GefqcSe/5AtdXqjvY/DtJ5C6CkcjPZO0o/eqg==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/styles@0.0.111':
+    resolution: {integrity: sha512-1mBxOGAPXmfD5oYCvqjKBDN7SuNjz2qz7RdH7KtsuNLQh6lpuSKadtHnLvru0Y8Vz1InqTJisBIy/6P5kyDmPw==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/transition-group@1.0.5':
+    resolution: {integrity: sha512-G3FuqvL13kQ55WzWPX2ewiXdZ/1iboiX53195sq7bbkDbXqP6TYKiadwEdsaDogW5rPnPYAym3+xnsNplQJRKQ==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/trigger@1.1.0':
+    resolution: {integrity: sha512-00BbAiXV66WwjHuKZc3wr0+GLb9C24mMUmi3JdTpNFgHBbrQGrIHubmZDg36c5/7wH+E0GQtOOanwQS063PO+A==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solid-primitives/utils@2.2.1':
+    resolution: {integrity: sha512-vaBO3MGOpjzitbSAVuJkYZnzNPRl6sRrw2do390DEBbfeqMfPpW4fAEb5/tI4b5T13V1xAY+giHoxqvVg2SRhQ==}
+    peerDependencies:
+      solid-js: ^1.4.1
+
+  '@solid-primitives/utils@3.1.0':
+    resolution: {integrity: sha512-/rerChcwgFtHEgVCCBY7BXGHh7a83HcIAzR8QhXJ789geIVbBs2YxHF4UUZlG7ec00NKSfvO3+sQquN/xKQLMw==}
+    peerDependencies:
+      solid-js: ^1.5.0
+
+  '@solid-primitives/utils@6.2.3':
+    resolution: {integrity: sha512-CqAwKb2T5Vi72+rhebSsqNZ9o67buYRdEJrIFzRXz3U59QqezuuxPsyzTSVCacwS5Pf109VRsgCJQoxKRoECZQ==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
+  '@solidjs/router@0.14.7':
+    resolution: {integrity: sha512-agLf8AUz5XnW6+F64a4Iq+QQQobI5zGHQ/gUYd/WHSwcbnFpavbsiwRLob3YhWMXVX3sQyn4ekUN+uchMCRupw==}
+    peerDependencies:
+      solid-js: ^1.8.6
+
+  '@solidjs/testing-library@0.8.10':
+    resolution: {integrity: sha512-qdeuIerwyq7oQTIrrKvV0aL9aFeuwTd86VYD3afdq5HYEwoox1OBTJy4y8A3TFZr8oAR0nujYgCzY/8wgHGfeQ==}
+    engines: {node: '>= 14'}
+    peerDependencies:
+      '@solidjs/router': '>=0.9.0'
+      solid-js: '>=1.0.0'
+    peerDependenciesMeta:
+      '@solidjs/router':
+        optional: true
+
+  '@storybook/addon-actions@8.3.5':
+    resolution: {integrity: sha512-t8D5oo+4XfD+F8091wLa2y/CDd/W2lExCeol5Vm1tp5saO+u6f2/d7iykLhTowWV84Uohi3D073uFeyTAlGebg==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/addon-backgrounds@8.3.5':
+    resolution: {integrity: sha512-IQGjDujuw8+iSqKREdkL8I5E/5CAHZbfOWd4A75PQK2D6qZ0fu/xRwTOQOH4jP6xn/abvfACOdL6A0d5bU90ag==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/addon-controls@8.3.5':
+    resolution: {integrity: sha512-2eCVobUUvY1Rq7sp1U8Mx8t44VXwvi0E+hqyrsqOx5TTSC/FUQ+hNAX6GSYUcFIyQQ1ORpKNlUjAAdjxBv1ZHQ==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/addon-docs@8.3.5':
+    resolution: {integrity: sha512-MOVfo1bY8kXTzbvmWnx3UuSO4WNykFz7Edvb3mxltNyuW7UDRZGuIuSe32ddT/EtLJfurrC9Ja3yBy4KBUGnMA==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/addon-essentials@8.3.5':
+    resolution: {integrity: sha512-hXTtPuN4/IsXjUrkMPAuz1qKAl8DovdXpjQgjQs7jSAVx3kc4BZaGqJ3gaVenKtO8uDchmA92BoQygpkc8eWhw==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/addon-highlight@8.3.5':
+    resolution: {integrity: sha512-ku0epul9aReCR3Gv/emwYnsqg3vgux5OmYMjoDcJC7s+LyfweSzLV/f5t9gSHazikJElh5TehtVkWbC4QfbGSw==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/addon-interactions@8.3.5':
+    resolution: {integrity: sha512-GtTy/A+mG7vDOahQr2avT4dpWtCRiFDSYcWyuQOZm10y8VDDw157HQM+FuhxjV9Owrrohy9F24oBUwRG8H3b5A==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/addon-links@8.3.5':
+    resolution: {integrity: sha512-giRCpn6cfJMYPnVJkojoQDO5ae6098fgY9YgAhwaJej/9dufNcioFdbiyfK1vyzbG6TGeTmJ9ncWCXgWRtzxPQ==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      storybook: ^8.3.5
+    peerDependenciesMeta:
+      react:
+        optional: true
+
+  '@storybook/addon-measure@8.3.5':
+    resolution: {integrity: sha512-6GVehgbHhFIFS69xSfRV+12VK0cnuIAtZdp1J3eUCc2ATrcigqVjTM6wzZz6kBuX6O3dcusr7Wg46KtNliqLqg==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/addon-outline@8.3.5':
+    resolution: {integrity: sha512-dwmK6GzjEnQP9Yo0VnBUQtJkXZlXdfjWyskZ/IlUVc+IFdeeCtIiMyA92oMfHo8eXt0k1g21ZqMaIn7ZltOuHw==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/addon-toolbars@8.3.5':
+    resolution: {integrity: sha512-Ml2gc9q8WbteDvmuAZGgBxt5SqWMXzuTkMjlsA8EB53hlkN1w9esX4s8YtBeNqC3HKoUzcdq8uexSBqU8fDbSA==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/addon-viewport@8.3.5':
+    resolution: {integrity: sha512-FSWydoPiVWFXEittG7O1YgvuaqoU9Vb+qoq9XfP/hvQHHMDcMZvC40JaV8AnJeTXaM7ngIjcn9XDEfGbFfOzXw==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/blocks@8.3.5':
+    resolution: {integrity: sha512-8cHTdTywolTHlgwN8I7YH7saWAIjGzV617AwjhJ95AKlC0VtpO1gAFcAgCqr4DU9eMc+LZuvbnaU/RSvA5eCCQ==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      storybook: ^8.3.5
+    peerDependenciesMeta:
+      react:
+        optional: true
+      react-dom:
+        optional: true
+
+  '@storybook/builder-vite@8.4.0-alpha.6':
+    resolution: {integrity: sha512-7p2eCdDoSLPK145d1dDgaUi8iKGoQhL8wduJJnPToj9WfNExvHdvEc+rucY4xgNepH6gu1IlKdVXYkFeiNwV5Q==}
+    peerDependencies:
+      storybook: ^8.4.0-alpha.6
+      vite: ^4.0.0 || ^5.0.0
+
+  '@storybook/components@8.3.5':
+    resolution: {integrity: sha512-Rq28YogakD3FO4F8KwAtGpo1g3t4V/gfCLqTQ8B6oQUFoxLqegkWk/DlwCzvoJndXuQJfdSyM6+r1JcA4Nql5A==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/core@8.3.5':
+    resolution: {integrity: sha512-GOGfTvdioNa/n+Huwg4u/dsyYyBcM+gEcdxi3B7i5x4yJ3I912KoVshumQAOF2myKSRdI8h8aGWdx7nnjd0+5Q==}
+
+  '@storybook/csf-plugin@8.3.5':
+    resolution: {integrity: sha512-ODVqNXwJt90hG7QW8I9w/XUyOGlr0l7XltmIJgXwB/2cYDvaGu3JV5Ybg7O0fxPV8uXk7JlRuUD8ZYv5Low6pA==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/csf-plugin@8.4.0-alpha.6':
+    resolution: {integrity: sha512-A2CGUc2tz2934EtZY/KkrvhGGlPoIGuaJ96Pwu/LoRxyPxgGBdSJA8p1HqGyfn6d2Ui8w13yjb7tIlRjTIZEBQ==}
+    peerDependencies:
+      storybook: ^8.4.0-alpha.6
+
+  '@storybook/csf@0.1.11':
+    resolution: {integrity: sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==}
+
+  '@storybook/global@5.0.0':
+    resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==}
+
+  '@storybook/html@8.3.5':
+    resolution: {integrity: sha512-lcSL6dhQUL2kEILGZcSnyM5o3zbwAZ6PVFylku7t0UKGwXfSRt9w8JmlSsmB3v8cannexeETDxjNa5nd1frNqA==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/icons@1.2.12':
+    resolution: {integrity: sha512-UxgyK5W3/UV4VrI3dl6ajGfHM4aOqMAkFLWe2KibeQudLf6NJpDrDMSHwZj+3iKC4jFU7dkKbbtH2h/al4sW3Q==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+
+  '@storybook/instrumenter@8.3.5':
+    resolution: {integrity: sha512-NLDXai5y2t1ITgHVK9chyL0rMFZbICCOGcnTbyWhkLbiEWZKPJ8FuB8+g+Ba6zwtCve1A1Cnb4O2LOWy7TgWQw==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/manager-api@8.3.5':
+    resolution: {integrity: sha512-fEQoKKi7h7pzh2z9RfuzatJxubrsfL/CB99fNXQ0wshMSY/7O4ckd18pK4fzG9ErnCtLAO9qsim4N/4eQC+/8Q==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/preview-api@8.3.5':
+    resolution: {integrity: sha512-VPqpudE8pmjTLvdNJoW/2//nqElDgUOmIn3QxbbCmdZTHDg5tFtxuqwdlNfArF0TxvTSBDIulXt/Q6K56TAfTg==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/react-dom-shim@8.3.5':
+    resolution: {integrity: sha512-Hf0UitJ/K0C7ajooooUK/PxOR4ihUWqsC7iCV1Gqth8U37dTeLMbaEO4PBwu0VQ+Ufg0N8BJLWfg7o6G4hrODw==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      storybook: ^8.3.5
+
+  '@storybook/test@8.3.5':
+    resolution: {integrity: sha512-1BXWsUGWk9FiKKelZZ55FDJdeoL8uRBHbjTYBRM2xJLhdNSvGzI4Tb3bkmxPpGn72Ua6AyldhlTxr2BpUFKOHA==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@storybook/testing-library@0.2.2':
+    resolution: {integrity: sha512-L8sXFJUHmrlyU2BsWWZGuAjv39Jl1uAqUHdxmN42JY15M4+XCMjGlArdCCjDe1wpTSW6USYISA9axjZojgtvnw==}
+    deprecated: In Storybook 8, this package functionality has been integrated to a new package called @storybook/test, which uses Vitest APIs for an improved experience. When upgrading to Storybook 8 with 'npx storybook@latest upgrade', you will get prompted and will get an automigration for the new package. Please migrate when you can.
+
+  '@storybook/theming@8.3.5':
+    resolution: {integrity: sha512-9HmDDyC691oqfg4RziIM9ElsS2HITaxmH7n/yeUPtuirkPdAQzqOzhvH/Sa0qOhifzs8VjR+Gd/a/ZQ+S38r7w==}
+    peerDependencies:
+      storybook: ^8.3.5
+
+  '@surma/rollup-plugin-off-main-thread@2.2.3':
+    resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==}
+
+  '@tanstack/query-core@5.59.0':
+    resolution: {integrity: sha512-WGD8uIhX6/deH/tkZqPNcRyAhDUqs729bWKoByYHSogcshXfFbppOdTER5+qY7mFvu8KEFJwT0nxr8RfPTVh0Q==}
+
+  '@tanstack/solid-query@5.59.0':
+    resolution: {integrity: sha512-2yCObsJ9NHpKSKfHJ3R2TRuYbxtU2Hzg8rxlexl3uHm3VIvQQ1KH18/PYdQAR6oXymCl7ls5QZKvTvgJRtX9bg==}
+    peerDependencies:
+      solid-js: ^1.6.0
+
+  '@tauri-apps/api@2.0.2':
+    resolution: {integrity: sha512-3wSwmG+1kr6WrgAFKK5ijkNFPp8TT3FLj3YHUb5EwMO+3FxX4uWlfSWkeeBy+Kc1RsKzugtYLuuya+98Flj+3w==}
+
+  '@tauri-apps/cli-darwin-arm64@2.0.2':
+    resolution: {integrity: sha512-B+/a8Q6wAqmB4A4HVeK0oQP5TdQGKW60ZLOI9O2ktH2HPr9ETr3XkwXPuJ2uAOuGEgtRZHBgFOIgG000vMnKlg==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@tauri-apps/cli-darwin-x64@2.0.2':
+    resolution: {integrity: sha512-kaurhn6XT4gAVCPAQSSHl/CHFxTS0ljc47N7iGTSlYJ03sCWPRZeNuVa/bn6rolz9MA2JfnRnFqB1pUL6jzp9Q==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@tauri-apps/cli-linux-arm-gnueabihf@2.0.2':
+    resolution: {integrity: sha512-bVrofjlacMxmGMcqK18iBW05tsZXOd19/MnqruFFcHSVjvkGGIXHMtUbMXnZNXBPkHDsnfytNtkY9SZGfCFaBA==}
+    engines: {node: '>= 10'}
+    cpu: [arm]
+    os: [linux]
+
+  '@tauri-apps/cli-linux-arm64-gnu@2.0.2':
+    resolution: {integrity: sha512-7XCBn0TTBVQGnV42dXcbHPLg/9W8kJoVzuliIozvNGyRWxfXqDbQYzpI48HUQG3LgHMabcw8+pVZAfGhevLrCA==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@tauri-apps/cli-linux-arm64-musl@2.0.2':
+    resolution: {integrity: sha512-1xi2SreGVlpAL68MCsDUY63rdItUdPZreXIAcOVqvUehcJRYOa1XGSBhrV0YXRgZeh0AtKC19z6PRzcv4rosZA==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@tauri-apps/cli-linux-x64-gnu@2.0.2':
+    resolution: {integrity: sha512-WVjwYzPWFqZVg1fx6KSU5w47Q0VbMyaCp34qs5EcS8EIU0/RnofdzqUoOYqvgGVgNgoz7Pj5dXK2SkS8BHXMmA==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [linux]
+
+  '@tauri-apps/cli-linux-x64-musl@2.0.2':
+    resolution: {integrity: sha512-h5miE2mctgaQNn/BbG9o1pnJcrx+VGBi2A6JFqGu934lFgSV5+s28M8Gc8AF2JgFH4hQV4IuMkeSw8Chu5Dodg==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [linux]
+
+  '@tauri-apps/cli-win32-arm64-msvc@2.0.2':
+    resolution: {integrity: sha512-2b8oO0+dYonahG5PfA/zoq0zlafLclfmXgqoWDZ++UiPtQHJNpNeEQ8GWbSFKGHQ494Jo6jHvazOojGRE1kqAg==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@tauri-apps/cli-win32-ia32-msvc@2.0.2':
+    resolution: {integrity: sha512-axgICLunFi0To3EibdCBgbST5RocsSmtM4c04+CbcX8WQQosJ9ziWlCSrrOTRr+gJERAMSvEyVUS98f6bWMw9A==}
+    engines: {node: '>= 10'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@tauri-apps/cli-win32-x64-msvc@2.0.2':
+    resolution: {integrity: sha512-JR17cM6+DyExZRgpXr2/DdqvcFYi/EKvQt8dI5R1/uQoesWd8jeNnrU7c1FG1Zmw9+pTzDztsNqEKsrNq2sNIg==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [win32]
+
+  '@tauri-apps/cli@2.0.2':
+    resolution: {integrity: sha512-R4ontHZvXORArERAHIidp5zRfZEshZczTiK+poslBv7AGKpQZoMw+E49zns7mOmP64i2Cq9Ci0pJvi4Rm8Okzw==}
+    engines: {node: '>= 10'}
+    hasBin: true
+
+  '@testing-library/dom@10.4.0':
+    resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==}
+    engines: {node: '>=18'}
+
+  '@testing-library/dom@9.3.4':
+    resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==}
+    engines: {node: '>=14'}
+
+  '@testing-library/jest-dom@6.5.0':
+    resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==}
+    engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
+
+  '@testing-library/user-event@14.5.2':
+    resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==}
+    engines: {node: '>=12', npm: '>=6'}
+    peerDependencies:
+      '@testing-library/dom': '>=7.21.4'
+
+  '@thisbeyond/solid-dnd@0.7.5':
+    resolution: {integrity: sha512-DfI5ff+yYGpK9M21LhYwIPlbP2msKxN2ARwuu6GF8tT1GgNVDTI8VCQvH4TJFoVApP9d44izmAcTh/iTCH2UUw==}
+    engines: {node: '>=18.0.0', pnpm: '>=8.6.0'}
+    peerDependencies:
+      solid-js: ^1.5
+
+  '@tootallnate/once@1.1.2':
+    resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==}
+    engines: {node: '>= 6'}
+
+  '@trivago/prettier-plugin-sort-imports@4.3.0':
+    resolution: {integrity: sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==}
+    peerDependencies:
+      '@vue/compiler-sfc': 3.x
+      prettier: 2.x - 3.x
+    peerDependenciesMeta:
+      '@vue/compiler-sfc':
+        optional: true
+
+  '@trysound/sax@0.2.0':
+    resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
+    engines: {node: '>=10.13.0'}
+
+  '@ts-morph/common@0.22.0':
+    resolution: {integrity: sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==}
+
+  '@types/aria-query@5.0.4':
+    resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
+
+  '@types/aws-lambda@8.10.145':
+    resolution: {integrity: sha512-dtByW6WiFk5W5Jfgz1VM+YPA21xMXTuSFoLYIDY0L44jDLLflVPtZkYuu3/YxpGcvjzKFBZLU+GyKjR0HOYtyw==}
+
+  '@types/babel__core@7.20.5':
+    resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+  '@types/babel__generator@7.6.8':
+    resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
+
+  '@types/babel__template@7.4.4':
+    resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+  '@types/babel__traverse@7.20.6':
+    resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
+
+  '@types/body-parser@1.19.5':
+    resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
+
+  '@types/btoa-lite@1.0.2':
+    resolution: {integrity: sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==}
+
+  '@types/connect@3.4.38':
+    resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+
+  '@types/debug@4.1.12':
+    resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
+  '@types/estree@0.0.39':
+    resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==}
+
+  '@types/estree@1.0.6':
+    resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
+  '@types/express-serve-static-core@4.19.6':
+    resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==}
+
+  '@types/express@4.17.21':
+    resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
+
+  '@types/graceful-fs@4.1.9':
+    resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
+
+  '@types/hast@3.0.4':
+    resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+
+  '@types/http-errors@2.0.4':
+    resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
+
+  '@types/istanbul-lib-coverage@2.0.6':
+    resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
+
+  '@types/istanbul-lib-report@3.0.3':
+    resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==}
+
+  '@types/istanbul-reports@3.0.4':
+    resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
+
+  '@types/jest@27.5.2':
+    resolution: {integrity: sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==}
+
+  '@types/json-schema@7.0.15':
+    resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+  '@types/jsonwebtoken@9.0.7':
+    resolution: {integrity: sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==}
+
+  '@types/katex@0.16.7':
+    resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==}
+
+  '@types/lodash.defaultsdeep@4.6.9':
+    resolution: {integrity: sha512-pLtCFK0YkHfGtGLYLNMTbFB5/G5+RsmQCIbbHH8GOAXjv+gDkVilY98kILfe8JH2Kev0OCReYxp1AjxEjP8ixA==}
+
+  '@types/lodash.isequal@4.5.8':
+    resolution: {integrity: sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==}
+
+  '@types/lodash@4.17.10':
+    resolution: {integrity: sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ==}
+
+  '@types/mdast@4.0.4':
+    resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+  '@types/mdx@2.0.13':
+    resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
+
+  '@types/mime@1.3.5':
+    resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
+
+  '@types/ms@0.7.34':
+    resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+
+  '@types/node@17.0.45':
+    resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
+
+  '@types/node@18.19.55':
+    resolution: {integrity: sha512-zzw5Vw52205Zr/nmErSEkN5FLqXPuKX/k5d1D7RKHATGqU7y6YfX9QxZraUzUrFGqH6XzOzG196BC35ltJC4Cw==}
+
+  '@types/node@20.16.11':
+    resolution: {integrity: sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==}
+
+  '@types/node@22.7.5':
+    resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==}
+
+  '@types/parse-json@4.0.2':
+    resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
+
+  '@types/prettier@2.7.3':
+    resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==}
+
+  '@types/prop-types@15.7.13':
+    resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==}
+
+  '@types/qs@6.9.16':
+    resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==}
+
+  '@types/range-parser@1.2.7':
+    resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
+
+  '@types/react@18.3.11':
+    resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==}
+
+  '@types/resolve@1.20.2':
+    resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
+
+  '@types/semver@7.5.8':
+    resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
+
+  '@types/send@0.17.4':
+    resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
+
+  '@types/serve-static@1.15.7':
+    resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==}
+
+  '@types/stack-utils@2.0.3':
+    resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
+
+  '@types/trusted-types@2.0.7':
+    resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
+
+  '@types/unist@3.0.3':
+    resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
+  '@types/uuid@9.0.8':
+    resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==}
+
+  '@types/ws@8.5.12':
+    resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==}
+
+  '@types/yargs-parser@21.0.3':
+    resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
+
+  '@types/yargs@16.0.9':
+    resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==}
+
+  '@typescript-eslint/eslint-plugin@5.62.0':
+    resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      '@typescript-eslint/parser': ^5.0.0
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@typescript-eslint/eslint-plugin@8.8.1':
+    resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@typescript-eslint/parser@5.62.0':
+    resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@typescript-eslint/parser@8.8.1':
+    resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@typescript-eslint/scope-manager@5.62.0':
+    resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  '@typescript-eslint/scope-manager@8.8.1':
+    resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@typescript-eslint/type-utils@5.62.0':
+    resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '*'
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@typescript-eslint/type-utils@8.8.1':
+    resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@typescript-eslint/types@5.62.0':
+    resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  '@typescript-eslint/types@8.8.1':
+    resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@typescript-eslint/typescript-estree@5.62.0':
+    resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@typescript-eslint/typescript-estree@8.8.1':
+    resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@typescript-eslint/utils@5.62.0':
+    resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+  '@typescript-eslint/utils@8.8.1':
+    resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+
+  '@typescript-eslint/visitor-keys@5.62.0':
+    resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  '@typescript-eslint/visitor-keys@8.8.1':
+    resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@ungap/structured-clone@1.2.0':
+    resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+
+  '@vitest/coverage-v8@2.1.2':
+    resolution: {integrity: sha512-b7kHrFrs2urS0cOk5N10lttI8UdJ/yP3nB4JYTREvR5o18cR99yPpK4gK8oQgI42BVv0ILWYUSYB7AXkAUDc0g==}
+    peerDependencies:
+      '@vitest/browser': 2.1.2
+      vitest: 2.1.2
+    peerDependenciesMeta:
+      '@vitest/browser':
+        optional: true
+
+  '@vitest/expect@2.0.5':
+    resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==}
+
+  '@vitest/expect@2.1.2':
+    resolution: {integrity: sha512-FEgtlN8mIUSEAAnlvn7mP8vzaWhEaAEvhSXCqrsijM7K6QqjB11qoRZYEd4AKSCDz8p0/+yH5LzhZ47qt+EyPg==}
+
+  '@vitest/mocker@2.1.2':
+    resolution: {integrity: sha512-ExElkCGMS13JAJy+812fw1aCv2QO/LBK6CyO4WOPAzLTmve50gydOlWhgdBJPx2ztbADUq3JVI0C5U+bShaeEA==}
+    peerDependencies:
+      '@vitest/spy': 2.1.2
+      msw: ^2.3.5
+      vite: ^5.0.0
+    peerDependenciesMeta:
+      msw:
+        optional: true
+      vite:
+        optional: true
+
+  '@vitest/pretty-format@2.0.5':
+    resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==}
+
+  '@vitest/pretty-format@2.1.2':
+    resolution: {integrity: sha512-FIoglbHrSUlOJPDGIrh2bjX1sNars5HbxlcsFKCtKzu4+5lpsRhOCVcuzp0fEhAGHkPZRIXVNzPcpSlkoZ3LuA==}
+
+  '@vitest/runner@2.1.2':
+    resolution: {integrity: sha512-UCsPtvluHO3u7jdoONGjOSil+uON5SSvU9buQh3lP7GgUXHp78guN1wRmZDX4wGK6J10f9NUtP6pO+SFquoMlw==}
+
+  '@vitest/snapshot@2.1.2':
+    resolution: {integrity: sha512-xtAeNsZ++aRIYIUsek7VHzry/9AcxeULlegBvsdLncLmNCR6tR8SRjn8BbDP4naxtccvzTqZ+L1ltZlRCfBZFA==}
+
+  '@vitest/spy@2.0.5':
+    resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==}
+
+  '@vitest/spy@2.1.2':
+    resolution: {integrity: sha512-GSUi5zoy+abNRJwmFhBDC0yRuVUn8WMlQscvnbbXdKLXX9dE59YbfwXxuJ/mth6eeqIzofU8BB5XDo/Ns/qK2A==}
+
+  '@vitest/utils@2.0.5':
+    resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==}
+
+  '@vitest/utils@2.1.2':
+    resolution: {integrity: sha512-zMO2KdYy6mx56btx9JvAqAZ6EyS3g49krMPPrgOp1yxGZiA93HumGk+bZ5jIZtOg5/VBYl5eBmGRQHqq4FG6uQ==}
+
+  '@vue/compiler-core@3.4.19':
+    resolution: {integrity: sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==}
+
+  '@vue/compiler-core@3.5.11':
+    resolution: {integrity: sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg==}
+
+  '@vue/compiler-dom@3.4.19':
+    resolution: {integrity: sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA==}
+
+  '@vue/compiler-dom@3.5.11':
+    resolution: {integrity: sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew==}
+
+  '@vue/compiler-sfc@3.4.19':
+    resolution: {integrity: sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==}
+
+  '@vue/compiler-sfc@3.5.11':
+    resolution: {integrity: sha512-gsbBtT4N9ANXXepprle+X9YLg2htQk1sqH/qGJ/EApl+dgpUBdTv3yP7YlR535uHZY3n6XaR0/bKo0BgwwDniw==}
+
+  '@vue/compiler-ssr@3.4.19':
+    resolution: {integrity: sha512-P0PLKC4+u4OMJ8sinba/5Z/iDT84uMRRlrWzadgLA69opCpI1gG4N55qDSC+dedwq2fJtzmGald05LWR5TFfLw==}
+
+  '@vue/compiler-ssr@3.5.11':
+    resolution: {integrity: sha512-P4+GPjOuC2aFTk1Z4WANvEhyOykcvEd5bIj2KVNGKGfM745LaXGr++5njpdBTzVz5pZifdlR1kpYSJJpIlSePA==}
+
+  '@vue/shared@3.4.19':
+    resolution: {integrity: sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw==}
+
+  '@vue/shared@3.5.11':
+    resolution: {integrity: sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ==}
+
+  abab@2.0.6:
+    resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
+    deprecated: Use your platform's native atob() and btoa() methods instead
+
+  accepts@1.3.8:
+    resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+    engines: {node: '>= 0.6'}
+
+  acorn-globals@6.0.0:
+    resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==}
+
+  acorn-jsx@5.3.2:
+    resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+    peerDependencies:
+      acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+  acorn-walk@7.2.0:
+    resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
+    engines: {node: '>=0.4.0'}
+
+  acorn@7.4.1:
+    resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
+  acorn@8.12.1:
+    resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
+  agent-base@6.0.2:
+    resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
+    engines: {node: '>= 6.0.0'}
+
+  agent-base@7.1.1:
+    resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
+    engines: {node: '>= 14'}
+
+  aggregate-error@3.1.0:
+    resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
+    engines: {node: '>=8'}
+
+  ajv@6.12.6:
+    resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+  ajv@8.17.1:
+    resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
+  ansi-colors@4.1.3:
+    resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
+    engines: {node: '>=6'}
+
+  ansi-escapes@4.3.2:
+    resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+    engines: {node: '>=8'}
+
+  ansi-regex@5.0.1:
+    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+    engines: {node: '>=8'}
+
+  ansi-regex@6.1.0:
+    resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+    engines: {node: '>=12'}
+
+  ansi-sequence-parser@1.1.1:
+    resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==}
+
+  ansi-styles@3.2.1:
+    resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+    engines: {node: '>=4'}
+
+  ansi-styles@4.3.0:
+    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+    engines: {node: '>=8'}
+
+  ansi-styles@5.2.0:
+    resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+    engines: {node: '>=10'}
+
+  ansi-styles@6.2.1:
+    resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+    engines: {node: '>=12'}
+
+  anymatch@3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+
+  argparse@1.0.10:
+    resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
+  argparse@2.0.1:
+    resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+  aria-query@5.1.3:
+    resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
+
+  aria-query@5.3.0:
+    resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+
+  aria-query@5.3.2:
+    resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+    engines: {node: '>= 0.4'}
+
+  array-buffer-byte-length@1.0.1:
+    resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
+    engines: {node: '>= 0.4'}
+
+  array-flatten@1.1.1:
+    resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+
+  array-includes@3.1.8:
+    resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
+    engines: {node: '>= 0.4'}
+
+  array-union@2.1.0:
+    resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+    engines: {node: '>=8'}
+
+  array.prototype.flat@1.3.2:
+    resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
+    engines: {node: '>= 0.4'}
+
+  arraybuffer.prototype.slice@1.0.3:
+    resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
+    engines: {node: '>= 0.4'}
+
+  arrify@1.0.1:
+    resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
+    engines: {node: '>=0.10.0'}
+
+  assertion-error@2.0.1:
+    resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+    engines: {node: '>=12'}
+
+  ast-types@0.16.1:
+    resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==}
+    engines: {node: '>=4'}
+
+  async@3.2.6:
+    resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+
+  asynckit@0.4.0:
+    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+  at-least-node@1.0.0:
+    resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
+    engines: {node: '>= 4.0.0'}
+
+  available-typed-arrays@1.0.7:
+    resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+    engines: {node: '>= 0.4'}
+
+  axios@0.26.1:
+    resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==}
+
+  babel-jest@27.5.1:
+    resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    peerDependencies:
+      '@babel/core': ^7.8.0
+
+  babel-plugin-codegen@4.1.5:
+    resolution: {integrity: sha512-mId3XW/ndFe7kqUdDUPvMhzYC7ST2gC+C20pO2jVVRQqlHrB1KbMpI/mpawX3DKkAmAuAzWVcBFHb5ULRyNl4A==}
+    engines: {node: '>=10', npm: '>=6'}
+
+  babel-plugin-istanbul@6.1.1:
+    resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
+    engines: {node: '>=8'}
+
+  babel-plugin-jest-hoist@27.5.1:
+    resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  babel-plugin-jsx-dom-expressions@0.39.2:
+    resolution: {integrity: sha512-rCkSYFuLl5/XD+BXjZk1XxFAsIBgNe9WZ7xBHjQV1dBliI64kO+EWktAD3b6Bj/SXk+LpVXFyMVydhnI35svWQ==}
+    peerDependencies:
+      '@babel/core': ^7.20.12
+
+  babel-plugin-macros@3.1.0:
+    resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
+    engines: {node: '>=10', npm: '>=6'}
+
+  babel-plugin-polyfill-corejs2@0.4.11:
+    resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==}
+    peerDependencies:
+      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+  babel-plugin-polyfill-corejs3@0.10.6:
+    resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==}
+    peerDependencies:
+      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+  babel-plugin-polyfill-regenerator@0.6.2:
+    resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==}
+    peerDependencies:
+      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+  babel-preset-current-node-syntax@1.1.0:
+    resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  babel-preset-jest@27.5.1:
+    resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  babel-preset-solid@1.9.2:
+    resolution: {integrity: sha512-rWx968GIDghgFStRDQaoqelGspEm9rgPci/yNzNPFlkzMqHaL2yob+t7BbzyqZw5b9/llkzjqUNIOybT9Z9mcg==}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  bail@2.0.2:
+    resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
+  balanced-match@1.0.2:
+    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+  before-after-hook@2.2.3:
+    resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==}
+
+  better-opn@3.0.2:
+    resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==}
+    engines: {node: '>=12.0.0'}
+
+  binary-extensions@2.3.0:
+    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+    engines: {node: '>=8'}
+
+  body-parser@1.20.3:
+    resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
+    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+  boolbase@1.0.0:
+    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+  bottleneck@2.19.5:
+    resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==}
+
+  brace-expansion@1.1.11:
+    resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+  brace-expansion@2.0.1:
+    resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+  braces@3.0.3:
+    resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+    engines: {node: '>=8'}
+
+  browser-assert@1.2.1:
+    resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==}
+
+  browser-process-hrtime@1.0.0:
+    resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==}
+
+  browserslist@4.23.3:
+    resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==}
+    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+    hasBin: true
+
+  browserslist@4.24.0:
+    resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==}
+    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+    hasBin: true
+
+  bser@2.1.1:
+    resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+
+  btoa-lite@1.0.0:
+    resolution: {integrity: sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==}
+
+  buffer-equal-constant-time@1.0.1:
+    resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
+
+  buffer-from@1.1.2:
+    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+  bundle-n-require@1.1.1:
+    resolution: {integrity: sha512-EB2wFjXF106LQLe/CYnKCMCdLeTW47AtcEtUfiqAOgr2a08k0+YgRklur2aLfEYHlhz6baMskZ8L2U92Hh0vyA==}
+
+  bundle-name@4.1.0:
+    resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
+    engines: {node: '>=18'}
+
+  bytes@3.1.2:
+    resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+    engines: {node: '>= 0.8'}
+
+  cac@6.7.14:
+    resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+    engines: {node: '>=8'}
+
+  call-bind@1.0.7:
+    resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+    engines: {node: '>= 0.4'}
+
+  callsites@3.1.0:
+    resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+    engines: {node: '>=6'}
+
+  camelcase@5.3.1:
+    resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+    engines: {node: '>=6'}
+
+  camelcase@6.3.0:
+    resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+    engines: {node: '>=10'}
+
+  caniuse-api@3.0.0:
+    resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==}
+
+  caniuse-lite@1.0.30001667:
+    resolution: {integrity: sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==}
+
+  ccount@2.0.1:
+    resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
+  chai@5.1.1:
+    resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==}
+    engines: {node: '>=12'}
+
+  chalk@2.4.2:
+    resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+    engines: {node: '>=4'}
+
+  chalk@3.0.0:
+    resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
+    engines: {node: '>=8'}
+
+  chalk@4.1.2:
+    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+    engines: {node: '>=10'}
+
+  chalk@5.3.0:
+    resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+    engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+  char-regex@1.0.2:
+    resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
+    engines: {node: '>=10'}
+
+  character-entities-html4@2.1.0:
+    resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+
+  character-entities-legacy@3.0.0:
+    resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+
+  character-entities@2.0.2:
+    resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
+  check-error@2.1.1:
+    resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
+    engines: {node: '>= 16'}
+
+  chokidar@3.6.0:
+    resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+    engines: {node: '>= 8.10.0'}
+
+  chromatic@11.12.0:
+    resolution: {integrity: sha512-7nHjFrGoRcGVNSGUmVdAGfWDN97z74D4Q5da48IAt4CcougEffVr+WWmJYqJ/WUa7by0/Ny5iYyX3FMz40juxw==}
+    hasBin: true
+    peerDependencies:
+      '@chromatic-com/cypress': ^0.*.* || ^1.0.0
+      '@chromatic-com/playwright': ^0.*.* || ^1.0.0
+    peerDependenciesMeta:
+      '@chromatic-com/cypress':
+        optional: true
+      '@chromatic-com/playwright':
+        optional: true
+
+  ci-info@3.9.0:
+    resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+    engines: {node: '>=8'}
+
+  cjs-module-lexer@1.4.1:
+    resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==}
+
+  clean-stack@2.2.0:
+    resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
+    engines: {node: '>=6'}
+
+  cliui@7.0.4:
+    resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+
+  co@4.6.0:
+    resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
+    engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+
+  code-block-writer@12.0.0:
+    resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==}
+
+  collect-v8-coverage@1.0.2:
+    resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==}
+
+  color-convert@1.9.3:
+    resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+
+  color-convert@2.0.1:
+    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+    engines: {node: '>=7.0.0'}
+
+  color-name@1.1.3:
+    resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
+  color-name@1.1.4:
+    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+  color-name@2.0.0:
+    resolution: {integrity: sha512-SbtvAMWvASO5TE2QP07jHBMXKafgdZz8Vrsrn96fiL+O92/FN/PLARzUW5sKt013fjAprK2d2iCn2hk2Xb5oow==}
+    engines: {node: '>=12.20'}
+
+  color-parse@2.0.2:
+    resolution: {integrity: sha512-eCtOz5w5ttWIUcaKLiktF+DxZO1R9KLNY/xhbV6CkhM7sR3GhVghmt6X6yOnzeaM24po+Z9/S1apbXMwA3Iepw==}
+
+  color-rgba@3.0.0:
+    resolution: {integrity: sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==}
+
+  color-space@2.0.1:
+    resolution: {integrity: sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA==}
+
+  combined-stream@1.0.8:
+    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+    engines: {node: '>= 0.8'}
+
+  comma-separated-tokens@2.0.3:
+    resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
+  commander@2.20.3:
+    resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+  commander@7.2.0:
+    resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+    engines: {node: '>= 10'}
+
+  commander@8.3.0:
+    resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
+    engines: {node: '>= 12'}
+
+  common-tags@1.8.2:
+    resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
+    engines: {node: '>=4.0.0'}
+
+  concat-map@0.0.1:
+    resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+  confbox@0.1.8:
+    resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+  content-disposition@0.5.4:
+    resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+    engines: {node: '>= 0.6'}
+
+  content-type@1.0.5:
+    resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+    engines: {node: '>= 0.6'}
+
+  convert-source-map@1.9.0:
+    resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+
+  convert-source-map@2.0.0:
+    resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+  cookie-signature@1.0.6:
+    resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+
+  cookie@0.7.1:
+    resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
+    engines: {node: '>= 0.6'}
+
+  core-js-compat@3.38.1:
+    resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==}
+
+  core-util-is@1.0.3:
+    resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+  cosmiconfig@7.1.0:
+    resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
+    engines: {node: '>=10'}
+
+  cross-spawn@7.0.3:
+    resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+    engines: {node: '>= 8'}
+
+  crosspath@2.0.0:
+    resolution: {integrity: sha512-ju88BYCQ2uvjO2bR+SsgLSTwTSctU+6Vp2ePbKPgSCZyy4MWZxYsT738DlKVRE5utUjobjPRm1MkTYKJxCmpTA==}
+    engines: {node: '>=14.9.0'}
+
+  crypto-random-string@2.0.0:
+    resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
+    engines: {node: '>=8'}
+
+  css-select@5.1.0:
+    resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
+
+  css-selector-parser@3.0.5:
+    resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==}
+
+  css-tree@2.2.1:
+    resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
+    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+  css-tree@2.3.1:
+    resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
+    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+  css-what@6.1.0:
+    resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+    engines: {node: '>= 6'}
+
+  css.escape@1.5.1:
+    resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
+
+  cssesc@3.0.0:
+    resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  cssnano-utils@5.0.0:
+    resolution: {integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.31
+
+  csso@5.0.5:
+    resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
+    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+  cssom@0.3.8:
+    resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==}
+
+  cssom@0.4.4:
+    resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==}
+
+  cssstyle@2.3.0:
+    resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==}
+    engines: {node: '>=8'}
+
+  cssstyle@4.1.0:
+    resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==}
+    engines: {node: '>=18'}
+
+  csstype@3.1.3:
+    resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+  data-urls@2.0.0:
+    resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==}
+    engines: {node: '>=10'}
+
+  data-urls@5.0.0:
+    resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
+    engines: {node: '>=18'}
+
+  data-view-buffer@1.0.1:
+    resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
+    engines: {node: '>= 0.4'}
+
+  data-view-byte-length@1.0.1:
+    resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==}
+    engines: {node: '>= 0.4'}
+
+  data-view-byte-offset@1.0.0:
+    resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
+    engines: {node: '>= 0.4'}
+
+  dayjs@1.11.13:
+    resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
+  debug@2.6.9:
+    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  debug@4.3.7:
+    resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  decimal.js@10.4.3:
+    resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
+
+  decode-named-character-reference@1.0.2:
+    resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
+
+  dedent@0.7.0:
+    resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
+
+  deep-eql@5.0.2:
+    resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
+    engines: {node: '>=6'}
+
+  deep-equal@2.2.3:
+    resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==}
+    engines: {node: '>= 0.4'}
+
+  deep-is@0.1.4:
+    resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+  deepmerge@4.3.1:
+    resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+    engines: {node: '>=0.10.0'}
+
+  default-browser-id@5.0.0:
+    resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==}
+    engines: {node: '>=18'}
+
+  default-browser@5.2.1:
+    resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==}
+    engines: {node: '>=18'}
+
+  define-data-property@1.1.4:
+    resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+    engines: {node: '>= 0.4'}
+
+  define-lazy-prop@2.0.0:
+    resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+    engines: {node: '>=8'}
+
+  define-lazy-prop@3.0.0:
+    resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
+    engines: {node: '>=12'}
+
+  define-properties@1.2.1:
+    resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+    engines: {node: '>= 0.4'}
+
+  delayed-stream@1.0.0:
+    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+    engines: {node: '>=0.4.0'}
+
+  depd@2.0.0:
+    resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+    engines: {node: '>= 0.8'}
+
+  deprecation@2.3.1:
+    resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
+
+  dequal@2.0.3:
+    resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+    engines: {node: '>=6'}
+
+  destroy@1.2.0:
+    resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+  detect-browser@5.3.0:
+    resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==}
+
+  detect-libc@1.0.3:
+    resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
+    engines: {node: '>=0.10'}
+    hasBin: true
+
+  detect-newline@3.1.0:
+    resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
+    engines: {node: '>=8'}
+
+  devlop@1.1.0:
+    resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
+  diff-sequences@27.5.1:
+    resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  diff-sequences@29.6.3:
+    resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  dir-glob@3.0.1:
+    resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+    engines: {node: '>=8'}
+
+  doctrine@3.0.0:
+    resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+    engines: {node: '>=6.0.0'}
+
+  dom-accessibility-api@0.5.16:
+    resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
+
+  dom-accessibility-api@0.6.3:
+    resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
+
+  dom-serializer@2.0.0:
+    resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+  domelementtype@2.3.0:
+    resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+  domexception@2.0.1:
+    resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==}
+    engines: {node: '>=8'}
+    deprecated: Use your platform's native DOMException instead
+
+  domhandler@5.0.3:
+    resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+    engines: {node: '>= 4'}
+
+  domutils@3.1.0:
+    resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
+
+  dotenv@16.4.5:
+    resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==}
+    engines: {node: '>=12'}
+
+  duplexer@0.1.2:
+    resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
+
+  eastasianwidth@0.2.0:
+    resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+  ecdsa-sig-formatter@1.0.11:
+    resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
+
+  ee-first@1.1.1:
+    resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+  ejs@3.1.10:
+    resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==}
+    engines: {node: '>=0.10.0'}
+    hasBin: true
+
+  electron-to-chromium@1.5.33:
+    resolution: {integrity: sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA==}
+
+  emittery@0.8.1:
+    resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==}
+    engines: {node: '>=10'}
+
+  emoji-regex@10.4.0:
+    resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
+
+  emoji-regex@8.0.0:
+    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+  emoji-regex@9.2.2:
+    resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+  encodeurl@1.0.2:
+    resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+    engines: {node: '>= 0.8'}
+
+  encodeurl@2.0.0:
+    resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+    engines: {node: '>= 0.8'}
+
+  enhanced-resolve-jest@1.1.0:
+    resolution: {integrity: sha512-GM7yVsiLIaunYkCqnGRPO4kQbT6hPSgkyOFKTseWboPMjZ2tlpQYh2ttLuE8ORkR72Wb1f9SJBbnPu0AjcTzgg==}
+
+  enhanced-resolve@4.5.0:
+    resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==}
+    engines: {node: '>=6.9.0'}
+
+  entities@4.5.0:
+    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+    engines: {node: '>=0.12'}
+
+  errno@0.1.8:
+    resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
+    hasBin: true
+
+  error-ex@1.3.2:
+    resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+
+  error-stack-parser-es@0.1.5:
+    resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==}
+
+  es-abstract@1.23.3:
+    resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==}
+    engines: {node: '>= 0.4'}
+
+  es-define-property@1.0.0:
+    resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+    engines: {node: '>= 0.4'}
+
+  es-errors@1.3.0:
+    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+    engines: {node: '>= 0.4'}
+
+  es-get-iterator@1.1.3:
+    resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
+
+  es-object-atoms@1.0.0:
+    resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
+    engines: {node: '>= 0.4'}
+
+  es-set-tostringtag@2.0.3:
+    resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
+    engines: {node: '>= 0.4'}
+
+  es-shim-unscopables@1.0.2:
+    resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
+
+  es-to-primitive@1.2.1:
+    resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
+    engines: {node: '>= 0.4'}
+
+  esbuild-register@3.6.0:
+    resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==}
+    peerDependencies:
+      esbuild: '>=0.12 <1'
+
+  esbuild@0.20.2:
+    resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==}
+    engines: {node: '>=12'}
+    hasBin: true
+
+  esbuild@0.21.5:
+    resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
+    engines: {node: '>=12'}
+    hasBin: true
+
+  esbuild@0.23.1:
+    resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==}
+    engines: {node: '>=18'}
+    hasBin: true
+
+  escalade@3.1.2:
+    resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
+    engines: {node: '>=6'}
+
+  escalade@3.2.0:
+    resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+    engines: {node: '>=6'}
+
+  escape-html@1.0.3:
+    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+  escape-string-regexp@1.0.5:
+    resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+    engines: {node: '>=0.8.0'}
+
+  escape-string-regexp@2.0.0:
+    resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
+    engines: {node: '>=8'}
+
+  escape-string-regexp@4.0.0:
+    resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+    engines: {node: '>=10'}
+
+  escape-string-regexp@5.0.0:
+    resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+    engines: {node: '>=12'}
+
+  escodegen@2.1.0:
+    resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
+    engines: {node: '>=6.0'}
+    hasBin: true
+
+  eslint-config-prettier@8.10.0:
+    resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==}
+    hasBin: true
+    peerDependencies:
+      eslint: '>=7.0.0'
+
+  eslint-plugin-prettier@5.2.1:
+    resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    peerDependencies:
+      '@types/eslint': '>=8.0.0'
+      eslint: '>=8.0.0'
+      eslint-config-prettier: '*'
+      prettier: '>=3.0.0'
+    peerDependenciesMeta:
+      '@types/eslint':
+        optional: true
+      eslint-config-prettier:
+        optional: true
+
+  eslint-plugin-promise@7.1.0:
+    resolution: {integrity: sha512-8trNmPxdAy3W620WKDpaS65NlM5yAumod6XeC4LOb+jxlkG4IVcp68c6dXY2ev+uT4U1PtG57YDV6EGAXN0GbQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
+
+  eslint-plugin-simple-import-sort@12.1.1:
+    resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==}
+    peerDependencies:
+      eslint: '>=5.0.0'
+
+  eslint-plugin-solid@0.12.1:
+    resolution: {integrity: sha512-fM0sEg9PcS1mcNbWklwc+W/lOv1/XyEwXf53HmFFy4GOA8E3u41h8JW+hc+Vv1m3kh01umKoTalOTET08zKdAQ==}
+    engines: {node: '>=12.0.0'}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+  eslint-plugin-solid@0.14.3:
+    resolution: {integrity: sha512-eDeyPrijSjVGeyb4oKoyidgLlMDZwAg/YdxiY9QvGXl2kLgpcHvLpgpaGK4KJ8xSsg0ym3B2dPRBAIlT7iUrEQ==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
+
+  eslint-plugin-spellcheck@0.0.20:
+    resolution: {integrity: sha512-GJa6vgzWAYqe0elKADAsiBRrhvqBnKyt7tpFSqlCZJsK2W9+K80oMyHhKolA7vJ13H5RCGs5/KCN+mKUyKoAiA==}
+    peerDependencies:
+      eslint: '>=0.8.0'
+
+  eslint-scope@5.1.1:
+    resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+    engines: {node: '>=8.0.0'}
+
+  eslint-scope@7.2.2:
+    resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  eslint-scope@8.1.0:
+    resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  eslint-visitor-keys@3.4.3:
+    resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  eslint-visitor-keys@4.1.0:
+    resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  eslint@8.57.1:
+    resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
+    hasBin: true
+
+  eslint@9.12.0:
+    resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    hasBin: true
+    peerDependencies:
+      jiti: '*'
+    peerDependenciesMeta:
+      jiti:
+        optional: true
+
+  espree@10.2.0:
+    resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  espree@9.6.1:
+    resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  esprima@4.0.1:
+    resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  esquery@1.6.0:
+    resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+    engines: {node: '>=0.10'}
+
+  esrecurse@4.3.0:
+    resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+    engines: {node: '>=4.0'}
+
+  estraverse@4.3.0:
+    resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+    engines: {node: '>=4.0'}
+
+  estraverse@5.3.0:
+    resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+    engines: {node: '>=4.0'}
+
+  estree-walker@1.0.1:
+    resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==}
+
+  estree-walker@2.0.2:
+    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+  estree-walker@3.0.3:
+    resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+  esutils@2.0.3:
+    resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+    engines: {node: '>=0.10.0'}
+
+  etag@1.8.1:
+    resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+    engines: {node: '>= 0.6'}
+
+  event-stream@3.3.4:
+    resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==}
+
+  eventemitter3@5.0.1:
+    resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
+  execa@5.1.1:
+    resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+    engines: {node: '>=10'}
+
+  exit@0.1.2:
+    resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
+    engines: {node: '>= 0.8.0'}
+
+  expect@27.5.1:
+    resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  express@4.21.1:
+    resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==}
+    engines: {node: '>= 0.10.0'}
+
+  extend@3.0.2:
+    resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+  fast-deep-equal@3.1.3:
+    resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+  fast-diff@1.3.0:
+    resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+
+  fast-glob@3.3.2:
+    resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+    engines: {node: '>=8.6.0'}
+
+  fast-json-stable-stringify@2.1.0:
+    resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+  fast-levenshtein@2.0.6:
+    resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+  fast-uri@3.0.2:
+    resolution: {integrity: sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==}
+
+  fastq@1.17.1:
+    resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+
+  fb-watchman@2.0.2:
+    resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+
+  fdir@6.4.0:
+    resolution: {integrity: sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==}
+    peerDependencies:
+      picomatch: ^3 || ^4
+    peerDependenciesMeta:
+      picomatch:
+        optional: true
+
+  file-entry-cache@6.0.1:
+    resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+
+  file-entry-cache@8.0.0:
+    resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+    engines: {node: '>=16.0.0'}
+
+  file-size@1.0.0:
+    resolution: {integrity: sha512-tLIdonWTpABkU6Axg2yGChYdrOsy4V8xcm0IcyAP8fSsu6jiXLm5pgs083e4sq5fzNRZuAYolUbZyYmPvCKfwQ==}
+
+  filelist@1.0.4:
+    resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
+
+  filesize@10.1.6:
+    resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==}
+    engines: {node: '>= 10.4.0'}
+
+  fill-range@7.1.1:
+    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+    engines: {node: '>=8'}
+
+  finalhandler@1.3.1:
+    resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
+    engines: {node: '>= 0.8'}
+
+  find-up@4.1.0:
+    resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+    engines: {node: '>=8'}
+
+  find-up@5.0.0:
+    resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+    engines: {node: '>=10'}
+
+  flat-cache@3.2.0:
+    resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+
+  flat-cache@4.0.1:
+    resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+    engines: {node: '>=16'}
+
+  flatted@3.3.1:
+    resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
+
+  follow-redirects@1.15.9:
+    resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      debug: '*'
+    peerDependenciesMeta:
+      debug:
+        optional: true
+
+  for-each@0.3.3:
+    resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+
+  foreground-child@3.3.0:
+    resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
+    engines: {node: '>=14'}
+
+  form-data@3.0.1:
+    resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==}
+    engines: {node: '>= 6'}
+
+  form-data@4.0.0:
+    resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
+    engines: {node: '>= 6'}
+
+  forwarded@0.2.0:
+    resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+    engines: {node: '>= 0.6'}
+
+  fresh@0.5.2:
+    resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+    engines: {node: '>= 0.6'}
+
+  from@0.1.7:
+    resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==}
+
+  fromentries@1.3.2:
+    resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==}
+
+  fs-extra@11.2.0:
+    resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
+    engines: {node: '>=14.14'}
+
+  fs-extra@9.1.0:
+    resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
+    engines: {node: '>=10'}
+
+  fs.realpath@1.0.0:
+    resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+  fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+
+  function-bind@1.1.2:
+    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+  function.prototype.name@1.1.6:
+    resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
+    engines: {node: '>= 0.4'}
+
+  functions-have-names@1.2.3:
+    resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+  gensync@1.0.0-beta.2:
+    resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+    engines: {node: '>=6.9.0'}
+
+  get-caller-file@2.0.5:
+    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+    engines: {node: 6.* || 8.* || >= 10.*}
+
+  get-intrinsic@1.2.4:
+    resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+    engines: {node: '>= 0.4'}
+
+  get-own-enumerable-property-symbols@3.0.2:
+    resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==}
+
+  get-package-type@0.1.0:
+    resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
+    engines: {node: '>=8.0.0'}
+
+  get-stream@6.0.1:
+    resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+    engines: {node: '>=10'}
+
+  get-symbol-description@1.0.2:
+    resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
+    engines: {node: '>= 0.4'}
+
+  github-slugger@2.0.0:
+    resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
+
+  glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
+
+  glob-parent@6.0.2:
+    resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+    engines: {node: '>=10.13.0'}
+
+  glob@10.4.5:
+    resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+    hasBin: true
+
+  glob@7.2.3:
+    resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+    deprecated: Glob versions prior to v9 are no longer supported
+
+  globals@11.12.0:
+    resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+    engines: {node: '>=4'}
+
+  globals@13.24.0:
+    resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
+    engines: {node: '>=8'}
+
+  globals@14.0.0:
+    resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+    engines: {node: '>=18'}
+
+  globalthis@1.0.4:
+    resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+    engines: {node: '>= 0.4'}
+
+  globby@11.1.0:
+    resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+    engines: {node: '>=10'}
+
+  goober@2.1.15:
+    resolution: {integrity: sha512-LP0xChUqgLlr5ORa1m4LobVy++/dhP4Kta2gVla9i2pc30XvtpEFrye4JtcD265g1tEFLOjYIQEiTa+9bGGQ/g==}
+    peerDependencies:
+      csstype: ^3.0.10
+
+  gopd@1.0.1:
+    resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+
+  graceful-fs@4.2.11:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+  graphemer@1.4.0:
+    resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+  has-bigints@1.0.2:
+    resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+
+  has-flag@3.0.0:
+    resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+    engines: {node: '>=4'}
+
+  has-flag@4.0.0:
+    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+    engines: {node: '>=8'}
+
+  has-property-descriptors@1.0.2:
+    resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+  has-proto@1.0.3:
+    resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
+    engines: {node: '>= 0.4'}
+
+  has-symbols@1.0.3:
+    resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+    engines: {node: '>= 0.4'}
+
+  has-tostringtag@1.0.2:
+    resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+    engines: {node: '>= 0.4'}
+
+  hasown@2.0.2:
+    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+    engines: {node: '>= 0.4'}
+
+  hast-util-from-dom@5.0.0:
+    resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==}
+
+  hast-util-from-html-isomorphic@2.0.0:
+    resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==}
+
+  hast-util-from-html@2.0.3:
+    resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==}
+
+  hast-util-from-parse5@8.0.1:
+    resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==}
+
+  hast-util-heading-rank@3.0.0:
+    resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==}
+
+  hast-util-is-element@3.0.0:
+    resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
+
+  hast-util-parse-selector@4.0.0:
+    resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
+
+  hast-util-to-html@9.0.3:
+    resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==}
+
+  hast-util-to-string@3.0.1:
+    resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==}
+
+  hast-util-to-text@4.0.2:
+    resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==}
+
+  hast-util-whitespace@3.0.0:
+    resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+
+  hastscript@8.0.0:
+    resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
+
+  hey-listen@1.0.8:
+    resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==}
+
+  highlight.js@11.9.0:
+    resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==}
+    engines: {node: '>=12.0.0'}
+
+  hookable@5.5.3:
+    resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
+
+  html-encoding-sniffer@2.0.1:
+    resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==}
+    engines: {node: '>=10'}
+
+  html-encoding-sniffer@4.0.0:
+    resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
+    engines: {node: '>=18'}
+
+  html-entities@2.3.3:
+    resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==}
+
+  html-escaper@2.0.2:
+    resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+
+  html-tags@3.3.1:
+    resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
+    engines: {node: '>=8'}
+
+  html-void-elements@3.0.0:
+    resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+
+  http-errors@2.0.0:
+    resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+    engines: {node: '>= 0.8'}
+
+  http-proxy-agent@4.0.1:
+    resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==}
+    engines: {node: '>= 6'}
+
+  http-proxy-agent@7.0.2:
+    resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
+    engines: {node: '>= 14'}
+
+  https-proxy-agent@5.0.1:
+    resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
+    engines: {node: '>= 6'}
+
+  https-proxy-agent@7.0.5:
+    resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
+    engines: {node: '>= 14'}
+
+  human-signals@2.1.0:
+    resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+    engines: {node: '>=10.17.0'}
+
+  hunspell-spellchecker@1.0.2:
+    resolution: {integrity: sha512-4DwmFAvlz+ChsqLDsZT2cwBsYNXh+oWboemxXtafwKIyItq52xfR4e4kr017sLAoPaSYVofSOvPUfmOAhXyYvw==}
+    hasBin: true
+
+  iconv-lite@0.4.24:
+    resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+    engines: {node: '>=0.10.0'}
+
+  iconv-lite@0.6.3:
+    resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+    engines: {node: '>=0.10.0'}
+
+  idb@7.1.1:
+    resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==}
+
+  ignore@5.3.2:
+    resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+    engines: {node: '>= 4'}
+
+  immediate@3.0.6:
+    resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
+
+  import-fresh@3.3.0:
+    resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+    engines: {node: '>=6'}
+
+  import-local@3.2.0:
+    resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==}
+    engines: {node: '>=8'}
+    hasBin: true
+
+  imurmurhash@0.1.4:
+    resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+    engines: {node: '>=0.8.19'}
+
+  indent-string@4.0.0:
+    resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+    engines: {node: '>=8'}
+
+  inflight@1.0.6:
+    resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+    deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+  inherits@2.0.4:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+  inline-style-parser@0.1.1:
+    resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
+
+  inline-style-parser@0.2.4:
+    resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==}
+
+  internal-slot@1.0.7:
+    resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
+    engines: {node: '>= 0.4'}
+
+  ipaddr.js@1.9.1:
+    resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+    engines: {node: '>= 0.10'}
+
+  is-absolute-url@4.0.1:
+    resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  is-arguments@1.1.1:
+    resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
+    engines: {node: '>= 0.4'}
+
+  is-array-buffer@3.0.4:
+    resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
+    engines: {node: '>= 0.4'}
+
+  is-arrayish@0.2.1:
+    resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+  is-bigint@1.0.4:
+    resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+
+  is-binary-path@2.1.0:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+
+  is-boolean-object@1.1.2:
+    resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+    engines: {node: '>= 0.4'}
+
+  is-callable@1.2.7:
+    resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+    engines: {node: '>= 0.4'}
+
+  is-core-module@2.15.1:
+    resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
+    engines: {node: '>= 0.4'}
+
+  is-data-view@1.0.1:
+    resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
+    engines: {node: '>= 0.4'}
+
+  is-date-object@1.0.5:
+    resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+    engines: {node: '>= 0.4'}
+
+  is-docker@2.2.1:
+    resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+    engines: {node: '>=8'}
+    hasBin: true
+
+  is-docker@3.0.0:
+    resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    hasBin: true
+
+  is-extglob@2.1.1:
+    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+    engines: {node: '>=0.10.0'}
+
+  is-fullwidth-code-point@3.0.0:
+    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+    engines: {node: '>=8'}
+
+  is-generator-fn@2.1.0:
+    resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
+    engines: {node: '>=6'}
+
+  is-generator-function@1.0.10:
+    resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
+    engines: {node: '>= 0.4'}
+
+  is-glob@4.0.3:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
+
+  is-html@2.0.0:
+    resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==}
+    engines: {node: '>=8'}
+
+  is-inside-container@1.0.0:
+    resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+    engines: {node: '>=14.16'}
+    hasBin: true
+
+  is-map@2.0.3:
+    resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+    engines: {node: '>= 0.4'}
+
+  is-module@1.0.0:
+    resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
+
+  is-negative-zero@2.0.3:
+    resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+    engines: {node: '>= 0.4'}
+
+  is-number-object@1.0.7:
+    resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
+    engines: {node: '>= 0.4'}
+
+  is-number@7.0.0:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+
+  is-obj@1.0.1:
+    resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==}
+    engines: {node: '>=0.10.0'}
+
+  is-path-inside@3.0.3:
+    resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+    engines: {node: '>=8'}
+
+  is-plain-obj@4.1.0:
+    resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+    engines: {node: '>=12'}
+
+  is-plain-object@5.0.0:
+    resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+    engines: {node: '>=0.10.0'}
+
+  is-potential-custom-element-name@1.0.1:
+    resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
+
+  is-regex@1.1.4:
+    resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+    engines: {node: '>= 0.4'}
+
+  is-regexp@1.0.0:
+    resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==}
+    engines: {node: '>=0.10.0'}
+
+  is-set@2.0.3:
+    resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+    engines: {node: '>= 0.4'}
+
+  is-shared-array-buffer@1.0.3:
+    resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
+    engines: {node: '>= 0.4'}
+
+  is-stream@2.0.1:
+    resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+    engines: {node: '>=8'}
+
+  is-string@1.0.7:
+    resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
+    engines: {node: '>= 0.4'}
+
+  is-symbol@1.0.4:
+    resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+    engines: {node: '>= 0.4'}
+
+  is-typed-array@1.1.13:
+    resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
+    engines: {node: '>= 0.4'}
+
+  is-typedarray@1.0.0:
+    resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
+
+  is-weakmap@2.0.2:
+    resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+    engines: {node: '>= 0.4'}
+
+  is-weakref@1.0.2:
+    resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+
+  is-weakset@2.0.3:
+    resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
+    engines: {node: '>= 0.4'}
+
+  is-what@4.1.16:
+    resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==}
+    engines: {node: '>=12.13'}
+
+  is-wsl@2.2.0:
+    resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+    engines: {node: '>=8'}
+
+  is-wsl@3.1.0:
+    resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
+    engines: {node: '>=16'}
+
+  isarray@1.0.0:
+    resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+  isarray@2.0.5:
+    resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+  isexe@2.0.0:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+  isomorphic-ws@5.0.0:
+    resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==}
+    peerDependencies:
+      ws: '*'
+
+  istanbul-lib-coverage@3.2.2:
+    resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
+    engines: {node: '>=8'}
+
+  istanbul-lib-instrument@5.2.1:
+    resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
+    engines: {node: '>=8'}
+
+  istanbul-lib-report@3.0.1:
+    resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
+    engines: {node: '>=10'}
+
+  istanbul-lib-source-maps@4.0.1:
+    resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
+    engines: {node: '>=10'}
+
+  istanbul-lib-source-maps@5.0.6:
+    resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==}
+    engines: {node: '>=10'}
+
+  istanbul-reports@3.1.7:
+    resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
+    engines: {node: '>=8'}
+
+  jackspeak@3.4.3:
+    resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+  jake@10.9.2:
+    resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  javascript-natural-sort@0.7.1:
+    resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==}
+
+  javascript-stringify@2.1.0:
+    resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==}
+
+  jest-changed-files@27.5.1:
+    resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-circus@27.5.1:
+    resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-cli@27.5.1:
+    resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    hasBin: true
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+
+  jest-config@27.5.1:
+    resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    peerDependencies:
+      ts-node: '>=9.0.0'
+    peerDependenciesMeta:
+      ts-node:
+        optional: true
+
+  jest-diff@27.5.1:
+    resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-diff@29.7.0:
+    resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-docblock@27.5.1:
+    resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-each@27.5.1:
+    resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-environment-jsdom@27.5.1:
+    resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-environment-node@27.5.1:
+    resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-get-type@27.5.1:
+    resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-get-type@29.6.3:
+    resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-haste-map@27.5.1:
+    resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-jasmine2@27.5.1:
+    resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-leak-detector@27.5.1:
+    resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-matcher-utils@27.5.1:
+    resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-message-util@27.5.1:
+    resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-mock@27.5.1:
+    resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-pnp-resolver@1.2.3:
+    resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
+    engines: {node: '>=6'}
+    peerDependencies:
+      jest-resolve: '*'
+    peerDependenciesMeta:
+      jest-resolve:
+        optional: true
+
+  jest-regex-util@27.5.1:
+    resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-resolve-dependencies@27.5.1:
+    resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-resolve@27.5.1:
+    resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-runner@27.5.1:
+    resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-runtime@27.5.1:
+    resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-serializer@27.5.1:
+    resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-snapshot@27.5.1:
+    resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-util@27.5.1:
+    resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-validate@27.5.1:
+    resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-watcher@27.5.1:
+    resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  jest-worker@27.5.1:
+    resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
+    engines: {node: '>= 10.13.0'}
+
+  jest@27.5.1:
+    resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    hasBin: true
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+
+  js-tokens@4.0.0:
+    resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+  js-yaml@3.14.1:
+    resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+    hasBin: true
+
+  js-yaml@4.1.0:
+    resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+    hasBin: true
+
+  jsdoc-type-pratt-parser@4.1.0:
+    resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==}
+    engines: {node: '>=12.0.0'}
+
+  jsdom@16.7.0:
+    resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      canvas: ^2.5.0
+    peerDependenciesMeta:
+      canvas:
+        optional: true
+
+  jsdom@25.0.1:
+    resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      canvas: ^2.11.2
+    peerDependenciesMeta:
+      canvas:
+        optional: true
+
+  jsesc@2.5.2:
+    resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  jsesc@3.0.2:
+    resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  json-buffer@3.0.1:
+    resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+  json-parse-even-better-errors@2.3.1:
+    resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+  json-schema-traverse@0.4.1:
+    resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+  json-schema-traverse@1.0.0:
+    resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+  json-schema@0.4.0:
+    resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
+
+  json-stable-stringify-without-jsonify@1.0.1:
+    resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+  json-stringify-deterministic@1.0.12:
+    resolution: {integrity: sha512-q3PN0lbUdv0pmurkBNdJH3pfFvOTL/Zp0lquqpvcjfKzt6Y0j49EPHAmVHCAS4Ceq/Y+PejWTzyiVpoY71+D6g==}
+    engines: {node: '>= 4'}
+
+  json5@2.2.3:
+    resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  jsonc-parser@3.3.1:
+    resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
+
+  jsonfile@6.1.0:
+    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+
+  jsonpointer@5.0.1:
+    resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==}
+    engines: {node: '>=0.10.0'}
+
+  jsonwebtoken@9.0.2:
+    resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==}
+    engines: {node: '>=12', npm: '>=6'}
+
+  jsx-ast-utils@3.3.5:
+    resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
+    engines: {node: '>=4.0'}
+
+  jwa@1.4.1:
+    resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==}
+
+  jws@3.2.2:
+    resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
+
+  katex@0.16.11:
+    resolution: {integrity: sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==}
+    hasBin: true
+
+  kebab-case@1.0.2:
+    resolution: {integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==}
+
+  keyv@4.5.4:
+    resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+  kleur@3.0.3:
+    resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+    engines: {node: '>=6'}
+
+  kleur@4.1.5:
+    resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+    engines: {node: '>=6'}
+
+  known-css-properties@0.24.0:
+    resolution: {integrity: sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA==}
+
+  known-css-properties@0.30.0:
+    resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==}
+
+  leven@3.1.0:
+    resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
+    engines: {node: '>=6'}
+
+  levn@0.4.1:
+    resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+    engines: {node: '>= 0.8.0'}
+
+  lie@3.1.1:
+    resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==}
+
+  lightningcss-darwin-arm64@1.25.1:
+    resolution: {integrity: sha512-G4Dcvv85bs5NLENcu/s1f7ehzE3D5ThnlWSDwE190tWXRQCQaqwcuHe+MGSVI/slm0XrxnaayXY+cNl3cSricw==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+
+  lightningcss-darwin-arm64@1.27.0:
+    resolution: {integrity: sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+
+  lightningcss-darwin-x64@1.25.1:
+    resolution: {integrity: sha512-dYWuCzzfqRueDSmto6YU5SoGHvZTMU1Em9xvhcdROpmtOQLorurUZz8+xFxZ51lCO2LnYbfdjZ/gCqWEkwixNg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [darwin]
+
+  lightningcss-darwin-x64@1.27.0:
+    resolution: {integrity: sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [darwin]
+
+  lightningcss-freebsd-x64@1.25.1:
+    resolution: {integrity: sha512-hXoy2s9A3KVNAIoKz+Fp6bNeY+h9c3tkcx1J3+pS48CqAt+5bI/R/YY4hxGL57fWAIquRjGKW50arltD6iRt/w==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [freebsd]
+
+  lightningcss-freebsd-x64@1.27.0:
+    resolution: {integrity: sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [freebsd]
+
+  lightningcss-linux-arm-gnueabihf@1.25.1:
+    resolution: {integrity: sha512-tWyMgHFlHlp1e5iW3EpqvH5MvsgoN7ZkylBbG2R2LWxnvH3FuWCJOhtGcYx9Ks0Kv0eZOBud789odkYLhyf1ng==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm]
+    os: [linux]
+
+  lightningcss-linux-arm-gnueabihf@1.27.0:
+    resolution: {integrity: sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm]
+    os: [linux]
+
+  lightningcss-linux-arm64-gnu@1.25.1:
+    resolution: {integrity: sha512-Xjxsx286OT9/XSnVLIsFEDyDipqe4BcLeB4pXQ/FEA5+2uWCCuAEarUNQumRucnj7k6ftkAHUEph5r821KBccQ==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [linux]
+
+  lightningcss-linux-arm64-gnu@1.27.0:
+    resolution: {integrity: sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [linux]
+
+  lightningcss-linux-arm64-musl@1.25.1:
+    resolution: {integrity: sha512-IhxVFJoTW8wq6yLvxdPvyHv4NjzcpN1B7gjxrY3uaykQNXPHNIpChLB52+wfH+yS58zm1PL4LemUp8u9Cfp6Bw==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [linux]
+
+  lightningcss-linux-arm64-musl@1.27.0:
+    resolution: {integrity: sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [linux]
+
+  lightningcss-linux-x64-gnu@1.25.1:
+    resolution: {integrity: sha512-RXIaru79KrREPEd6WLXfKfIp4QzoppZvD3x7vuTKkDA64PwTzKJ2jaC43RZHRt8BmyIkRRlmywNhTRMbmkPYpA==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [linux]
+
+  lightningcss-linux-x64-gnu@1.27.0:
+    resolution: {integrity: sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [linux]
+
+  lightningcss-linux-x64-musl@1.25.1:
+    resolution: {integrity: sha512-TdcNqFsAENEEFr8fJWg0Y4fZ/nwuqTRsIr7W7t2wmDUlA8eSXVepeeONYcb+gtTj1RaXn/WgNLB45SFkz+XBZA==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [linux]
+
+  lightningcss-linux-x64-musl@1.27.0:
+    resolution: {integrity: sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [linux]
+
+  lightningcss-win32-arm64-msvc@1.27.0:
+    resolution: {integrity: sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [win32]
+
+  lightningcss-win32-x64-msvc@1.25.1:
+    resolution: {integrity: sha512-9KZZkmmy9oGDSrnyHuxP6iMhbsgChUiu/NSgOx+U1I/wTngBStDf2i2aGRCHvFqj19HqqBEI4WuGVQBa2V6e0A==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [win32]
+
+  lightningcss-win32-x64-msvc@1.27.0:
+    resolution: {integrity: sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [win32]
+
+  lightningcss@1.25.1:
+    resolution: {integrity: sha512-V0RMVZzK1+rCHpymRv4URK2lNhIRyO8g7U7zOFwVAhJuat74HtkjIQpQRKNCwFEYkRGpafOpmXXLoaoBcyVtBg==}
+    engines: {node: '>= 12.0.0'}
+
+  lightningcss@1.27.0:
+    resolution: {integrity: sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==}
+    engines: {node: '>= 12.0.0'}
+
+  lines-and-columns@1.2.4:
+    resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+  lnk@1.1.0:
+    resolution: {integrity: sha512-m3q+8W+stYiJYCBwefzrU+inN9h2KxofWuxhNH1iS+MdG9MIKfDpBtbmmIKstVwussx48PXALwonyzuzZUXjQQ==}
+    engines: {node: '>=4'}
+
+  localforage@1.10.0:
+    resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==}
+
+  locate-path@5.0.0:
+    resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+    engines: {node: '>=8'}
+
+  locate-path@6.0.0:
+    resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+    engines: {node: '>=10'}
+
+  lodash.debounce@4.0.8:
+    resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+
+  lodash.defaultsdeep@4.6.1:
+    resolution: {integrity: sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==}
+
+  lodash.includes@4.3.0:
+    resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
+
+  lodash.isboolean@3.0.3:
+    resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==}
+
+  lodash.isequal@4.5.0:
+    resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+
+  lodash.isinteger@4.0.4:
+    resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==}
+
+  lodash.isnumber@3.0.3:
+    resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==}
+
+  lodash.isplainobject@4.0.6:
+    resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+
+  lodash.isstring@4.0.1:
+    resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
+
+  lodash.memoize@4.1.2:
+    resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
+
+  lodash.merge@4.6.2:
+    resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+  lodash.once@4.1.1:
+    resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
+
+  lodash.sortby@4.7.0:
+    resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==}
+
+  lodash.uniq@4.5.0:
+    resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
+
+  lodash@4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+  long@5.2.3:
+    resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==}
+
+  longest-streak@3.1.0:
+    resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
+  look-it-up@2.1.0:
+    resolution: {integrity: sha512-nMoGWW2HurtuJf6XAL56FWTDCWLOTSsanrgwOyaR5Y4e3zfG5N/0cU5xWZSEU3tBxhQugRbV1xL9jb+ug7yZww==}
+
+  loose-envify@1.4.0:
+    resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+    hasBin: true
+
+  loupe@3.1.2:
+    resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==}
+
+  lowlight@3.1.0:
+    resolution: {integrity: sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ==}
+
+  lru-cache@10.4.3:
+    resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+  lru-cache@5.1.1:
+    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+  lru-cache@9.1.2:
+    resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==}
+    engines: {node: 14 || >=16.14}
+
+  lunr@2.3.9:
+    resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==}
+
+  lz-string@1.5.0:
+    resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
+    hasBin: true
+
+  magic-string@0.25.9:
+    resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
+
+  magic-string@0.30.11:
+    resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
+
+  magicast@0.3.5:
+    resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
+
+  make-dir@4.0.0:
+    resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
+    engines: {node: '>=10'}
+
+  makeerror@1.0.12:
+    resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+
+  map-or-similar@1.5.0:
+    resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==}
+
+  map-stream@0.1.0:
+    resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==}
+
+  markdown-table@3.0.3:
+    resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
+
+  markdown-to-jsx@7.5.0:
+    resolution: {integrity: sha512-RrBNcMHiFPcz/iqIj0n3wclzHXjwS7mzjBNWecKKVhNTIxQepIix6Il/wZCn2Cg5Y1ow2Qi84+eJrryFRWBEWw==}
+    engines: {node: '>= 10'}
+    peerDependencies:
+      react: '>= 0.14.0'
+
+  marked@4.3.0:
+    resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==}
+    engines: {node: '>= 12'}
+    hasBin: true
+
+  mdast-util-find-and-replace@3.0.1:
+    resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==}
+
+  mdast-util-from-markdown@2.0.1:
+    resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==}
+
+  mdast-util-gfm-autolink-literal@2.0.1:
+    resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
+
+  mdast-util-gfm-footnote@2.0.0:
+    resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==}
+
+  mdast-util-gfm-strikethrough@2.0.0:
+    resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+
+  mdast-util-gfm-table@2.0.0:
+    resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
+
+  mdast-util-gfm-task-list-item@2.0.0:
+    resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
+
+  mdast-util-gfm@3.0.0:
+    resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==}
+
+  mdast-util-math@3.0.0:
+    resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==}
+
+  mdast-util-newline-to-break@2.0.0:
+    resolution: {integrity: sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==}
+
+  mdast-util-phrasing@4.1.0:
+    resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+
+  mdast-util-to-hast@13.2.0:
+    resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
+
+  mdast-util-to-markdown@2.1.0:
+    resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==}
+
+  mdast-util-to-string@4.0.0:
+    resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+
+  mdn-data@2.0.28:
+    resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
+
+  mdn-data@2.0.30:
+    resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+
+  media-typer@0.3.0:
+    resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+    engines: {node: '>= 0.6'}
+
+  memoizerific@1.11.3:
+    resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==}
+
+  memory-fs@0.5.0:
+    resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==}
+    engines: {node: '>=4.3.0 <5.0.0 || >=5.10'}
+
+  merge-anything@5.1.7:
+    resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==}
+    engines: {node: '>=12.13'}
+
+  merge-descriptors@1.0.3:
+    resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
+
+  merge-stream@2.0.0:
+    resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+  merge2@1.4.1:
+    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+    engines: {node: '>= 8'}
+
+  methods@1.1.2:
+    resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
+    engines: {node: '>= 0.6'}
+
+  microdiff@1.3.2:
+    resolution: {integrity: sha512-pKy60S2febliZIbwdfEQKTtL5bLNxOyiRRmD400gueYl9XcHyNGxzHSlJWn9IMHwYXT0yohPYL08+bGozVk8cQ==}
+
+  micromark-core-commonmark@2.0.1:
+    resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==}
+
+  micromark-extension-gfm-autolink-literal@2.1.0:
+    resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
+
+  micromark-extension-gfm-footnote@2.1.0:
+    resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
+
+  micromark-extension-gfm-strikethrough@2.1.0:
+    resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
+
+  micromark-extension-gfm-table@2.1.0:
+    resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==}
+
+  micromark-extension-gfm-tagfilter@2.0.0:
+    resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
+
+  micromark-extension-gfm-task-list-item@2.1.0:
+    resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
+
+  micromark-extension-gfm@3.0.0:
+    resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+
+  micromark-extension-math@3.1.0:
+    resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==}
+
+  micromark-factory-destination@2.0.0:
+    resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==}
+
+  micromark-factory-label@2.0.0:
+    resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==}
+
+  micromark-factory-space@2.0.0:
+    resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==}
+
+  micromark-factory-title@2.0.0:
+    resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==}
+
+  micromark-factory-whitespace@2.0.0:
+    resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==}
+
+  micromark-util-character@2.1.0:
+    resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==}
+
+  micromark-util-chunked@2.0.0:
+    resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==}
+
+  micromark-util-classify-character@2.0.0:
+    resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==}
+
+  micromark-util-combine-extensions@2.0.0:
+    resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==}
+
+  micromark-util-decode-numeric-character-reference@2.0.1:
+    resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==}
+
+  micromark-util-decode-string@2.0.0:
+    resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==}
+
+  micromark-util-encode@2.0.0:
+    resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==}
+
+  micromark-util-html-tag-name@2.0.0:
+    resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==}
+
+  micromark-util-normalize-identifier@2.0.0:
+    resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==}
+
+  micromark-util-resolve-all@2.0.0:
+    resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==}
+
+  micromark-util-sanitize-uri@2.0.0:
+    resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==}
+
+  micromark-util-subtokenize@2.0.1:
+    resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==}
+
+  micromark-util-symbol@2.0.0:
+    resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==}
+
+  micromark-util-types@2.0.0:
+    resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==}
+
+  micromark@4.0.0:
+    resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==}
+
+  micromatch@4.0.8:
+    resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+    engines: {node: '>=8.6'}
+
+  mime-db@1.52.0:
+    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+    engines: {node: '>= 0.6'}
+
+  mime-types@2.1.35:
+    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+    engines: {node: '>= 0.6'}
+
+  mime@1.6.0:
+    resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  mimic-fn@2.1.0:
+    resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+    engines: {node: '>=6'}
+
+  min-indent@1.0.1:
+    resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+    engines: {node: '>=4'}
+
+  minimatch@3.1.2:
+    resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+  minimatch@5.1.6:
+    resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
+    engines: {node: '>=10'}
+
+  minimatch@9.0.5:
+    resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  minimist@1.2.8:
+    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+  minipass@7.1.2:
+    resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  mkdirp@0.5.6:
+    resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+    hasBin: true
+
+  mkdirp@3.0.1:
+    resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  mlly@1.7.2:
+    resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==}
+
+  mrmime@2.0.0:
+    resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
+    engines: {node: '>=10'}
+
+  ms@2.0.0:
+    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+  ms@2.1.3:
+    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+  nanoid@3.3.7:
+    resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+
+  natural-compare-lite@1.4.0:
+    resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
+
+  natural-compare@1.4.0:
+    resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+  negotiator@0.6.3:
+    resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+    engines: {node: '>= 0.6'}
+
+  node-cleanup@2.1.2:
+    resolution: {integrity: sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==}
+
+  node-eval@2.0.0:
+    resolution: {integrity: sha512-Ap+L9HznXAVeJj3TJ1op6M6bg5xtTq8L5CU/PJxtkhea/DrIxdTknGKIECKd/v/Lgql95iuMAYvIzBNd0pmcMg==}
+    engines: {node: '>= 4'}
+
+  node-fetch@2.7.0:
+    resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+    engines: {node: 4.x || >=6.0.0}
+    peerDependencies:
+      encoding: ^0.1.0
+    peerDependenciesMeta:
+      encoding:
+        optional: true
+
+  node-int64@0.4.0:
+    resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+
+  node-releases@2.0.18:
+    resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
+
+  normalize-path@3.0.0:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+
+  npm-run-path@4.0.1:
+    resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+    engines: {node: '>=8'}
+
+  nth-check@2.1.1:
+    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+  nwsapi@2.2.13:
+    resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==}
+
+  object-inspect@1.13.2:
+    resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
+    engines: {node: '>= 0.4'}
+
+  object-is@1.1.6:
+    resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+    engines: {node: '>= 0.4'}
+
+  object-keys@1.1.1:
+    resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+    engines: {node: '>= 0.4'}
+
+  object-path@0.11.8:
+    resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==}
+    engines: {node: '>= 10.12.0'}
+
+  object.assign@4.1.5:
+    resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
+    engines: {node: '>= 0.4'}
+
+  object.values@1.2.0:
+    resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
+    engines: {node: '>= 0.4'}
+
+  octokit@2.1.0:
+    resolution: {integrity: sha512-Pxi6uKTjBRZWgAwsw1NgHdRlL+QASCN35OYS7X79o7PtBME0CLXEroZmPtEwlWZbPTP+iDbEy2wCbSOgm0uGIQ==}
+    engines: {node: '>= 14'}
+
+  on-finished@2.4.1:
+    resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+    engines: {node: '>= 0.8'}
+
+  once@1.4.0:
+    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+  onetime@5.1.2:
+    resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+    engines: {node: '>=6'}
+
+  oniguruma-to-js@0.4.3:
+    resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==}
+
+  open@10.1.0:
+    resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==}
+    engines: {node: '>=18'}
+
+  open@8.4.2:
+    resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+    engines: {node: '>=12'}
+
+  optionator@0.9.4:
+    resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+    engines: {node: '>= 0.8.0'}
+
+  outdent@0.8.0:
+    resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==}
+
+  p-limit@2.3.0:
+    resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+    engines: {node: '>=6'}
+
+  p-limit@3.1.0:
+    resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+    engines: {node: '>=10'}
+
+  p-locate@4.1.0:
+    resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+    engines: {node: '>=8'}
+
+  p-locate@5.0.0:
+    resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+    engines: {node: '>=10'}
+
+  p-try@2.2.0:
+    resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+    engines: {node: '>=6'}
+
+  package-json-from-dist@1.0.1:
+    resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+  package-manager-detector@0.1.0:
+    resolution: {integrity: sha512-qRwvZgEE7geMY6xPChI3T0qrM0PL4s/AKiLnNVjhg3GdN2/fUUSrpGA5Z8mejMXauT1BS6RJIgWvSGAdqg8NnQ==}
+
+  parent-module@1.0.1:
+    resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+    engines: {node: '>=6'}
+
+  parse-json@5.2.0:
+    resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+    engines: {node: '>=8'}
+
+  parse5@6.0.1:
+    resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
+
+  parse5@7.1.2:
+    resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
+
+  parseurl@1.3.3:
+    resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+    engines: {node: '>= 0.8'}
+
+  path-browserify@1.0.1:
+    resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
+  path-exists@4.0.0:
+    resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+    engines: {node: '>=8'}
+
+  path-is-absolute@1.0.1:
+    resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+    engines: {node: '>=0.10.0'}
+
+  path-key@3.1.1:
+    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+    engines: {node: '>=8'}
+
+  path-parse@1.0.7:
+    resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+  path-scurry@1.11.1:
+    resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+    engines: {node: '>=16 || 14 >=14.18'}
+
+  path-to-regexp@0.1.10:
+    resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==}
+
+  path-type@4.0.0:
+    resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+    engines: {node: '>=8'}
+
+  pathe@1.1.2:
+    resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+
+  pathval@2.0.0:
+    resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
+    engines: {node: '>= 14.16'}
+
+  pause-stream@0.0.11:
+    resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==}
+
+  perfect-debounce@1.0.0:
+    resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
+
+  picocolors@1.1.0:
+    resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
+
+  picomatch@2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+
+  picomatch@4.0.2:
+    resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+    engines: {node: '>=12'}
+
+  pify@2.3.0:
+    resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+    engines: {node: '>=0.10.0'}
+
+  pirates@4.0.6:
+    resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
+    engines: {node: '>= 6'}
+
+  pkg-dir@4.2.0:
+    resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
+    engines: {node: '>=8'}
+
+  pkg-types@1.0.3:
+    resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
+
+  pkg-types@1.2.1:
+    resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==}
+
+  pluralize@8.0.0:
+    resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+    engines: {node: '>=4'}
+
+  polished@4.3.1:
+    resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==}
+    engines: {node: '>=10'}
+
+  possible-typed-array-names@1.0.0:
+    resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
+    engines: {node: '>= 0.4'}
+
+  postcss-discard-duplicates@7.0.1:
+    resolution: {integrity: sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.31
+
+  postcss-discard-empty@7.0.0:
+    resolution: {integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.31
+
+  postcss-merge-rules@7.0.2:
+    resolution: {integrity: sha512-VAR47UNvRsdrTHLe7TV1CeEtF9SJYR5ukIB9U4GZyZOptgtsS20xSxy+k5wMrI3udST6O1XuIn7cjQkg7sDAAw==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.31
+
+  postcss-minify-selectors@7.0.2:
+    resolution: {integrity: sha512-dCzm04wqW1uqLmDZ41XYNBJfjgps3ZugDpogAmJXoCb5oCiTzIX4oPXXKxDpTvWOnKxQKR4EbV4ZawJBLcdXXA==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.31
+
+  postcss-nested@6.0.1:
+    resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
+    engines: {node: '>=12.0'}
+    peerDependencies:
+      postcss: ^8.2.14
+
+  postcss-normalize-whitespace@7.0.0:
+    resolution: {integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.31
+
+  postcss-selector-parser@6.1.1:
+    resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==}
+    engines: {node: '>=4'}
+
+  postcss-value-parser@4.2.0:
+    resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+  postcss@8.4.47:
+    resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
+    engines: {node: ^10 || ^12 || >=14}
+
+  prelude-ls@1.2.1:
+    resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+    engines: {node: '>= 0.8.0'}
+
+  prettier-config-standard@7.0.0:
+    resolution: {integrity: sha512-NgZy4TYupJR6aMMuV/Aqs0ONnVhlFT8PXVkYRskxREq8EUhJHOddVfBxPV6fWpgcASpJSgvvhVLk0CBO5M3Hvw==}
+    peerDependencies:
+      prettier: ^2.6.0 || ^3.0.0
+
+  prettier-linter-helpers@1.0.0:
+    resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+    engines: {node: '>=6.0.0'}
+
+  prettier@2.8.8:
+    resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+
+  prettier@3.2.5:
+    resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==}
+    engines: {node: '>=14'}
+    hasBin: true
+
+  prettier@3.3.3:
+    resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==}
+    engines: {node: '>=14'}
+    hasBin: true
+
+  pretty-bytes@5.6.0:
+    resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
+    engines: {node: '>=6'}
+
+  pretty-bytes@6.1.1:
+    resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==}
+    engines: {node: ^14.13.1 || >=16.0.0}
+
+  pretty-format@27.5.1:
+    resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  pretty-format@29.7.0:
+    resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  prismjs@1.29.0:
+    resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
+    engines: {node: '>=6'}
+
+  process-nextick-args@2.0.1:
+    resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
+  process@0.11.10:
+    resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+    engines: {node: '>= 0.6.0'}
+
+  prompts@2.4.2:
+    resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+    engines: {node: '>= 6'}
+
+  property-information@6.5.0:
+    resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
+
+  proxy-addr@2.0.7:
+    resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+    engines: {node: '>= 0.10'}
+
+  prr@1.0.1:
+    resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
+
+  ps-tree@1.2.0:
+    resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==}
+    engines: {node: '>= 0.10'}
+    hasBin: true
+
+  psl@1.9.0:
+    resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
+
+  punycode@2.3.1:
+    resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+    engines: {node: '>=6'}
+
+  qs@6.13.0:
+    resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
+    engines: {node: '>=0.6'}
+
+  querystringify@2.2.0:
+    resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
+
+  queue-microtask@1.2.3:
+    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+  randombytes@2.1.0:
+    resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+
+  range-parser@1.2.1:
+    resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+    engines: {node: '>= 0.6'}
+
+  raw-body@2.5.2:
+    resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
+    engines: {node: '>= 0.8'}
+
+  react-colorful@5.6.1:
+    resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==}
+    peerDependencies:
+      react: '>=16.8.0'
+      react-dom: '>=16.8.0'
+
+  react-confetti@6.1.0:
+    resolution: {integrity: sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==}
+    engines: {node: '>=10.18'}
+    peerDependencies:
+      react: ^16.3.0 || ^17.0.1 || ^18.0.0
+
+  react-dom@18.3.1:
+    resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
+    peerDependencies:
+      react: ^18.3.1
+
+  react-is@17.0.2:
+    resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+
+  react-is@18.3.1:
+    resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+
+  react@18.3.1:
+    resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+    engines: {node: '>=0.10.0'}
+
+  readable-stream@2.3.8:
+    resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+
+  readdirp@3.6.0:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+
+  recast@0.23.9:
+    resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==}
+    engines: {node: '>= 4'}
+
+  redent@3.0.0:
+    resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
+    engines: {node: '>=8'}
+
+  regenerate-unicode-properties@10.2.0:
+    resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==}
+    engines: {node: '>=4'}
+
+  regenerate@1.4.2:
+    resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
+
+  regenerator-runtime@0.14.1:
+    resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+  regenerator-transform@0.15.2:
+    resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
+
+  regex@4.3.3:
+    resolution: {integrity: sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==}
+
+  regexp.prototype.flags@1.5.3:
+    resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==}
+    engines: {node: '>= 0.4'}
+
+  regexpu-core@6.1.1:
+    resolution: {integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==}
+    engines: {node: '>=4'}
+
+  regjsgen@0.8.0:
+    resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==}
+
+  regjsparser@0.11.1:
+    resolution: {integrity: sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==}
+    hasBin: true
+
+  rehype-external-links@3.0.0:
+    resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==}
+
+  rehype-highlight@7.0.0:
+    resolution: {integrity: sha512-QtobgRgYoQaK6p1eSr2SD1i61f7bjF2kZHAQHxeCHAuJf7ZUDMvQ7owDq9YTkmar5m5TSUol+2D3bp3KfJf/oA==}
+
+  rehype-katex@7.0.1:
+    resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==}
+
+  rehype-parse@9.0.1:
+    resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==}
+
+  rehype-prism@2.3.2:
+    resolution: {integrity: sha512-UvLT8kwsR7mPpAGtikypFTWV+Y8RkfoKCynLl+pa2MvrR6u4D72FZlVRkvxWa3ZkfMcWqAWekJ7s2J0GEp0v+Q==}
+    peerDependencies:
+      unified: ^10 || ^11
+
+  rehype-slug@6.0.0:
+    resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==}
+
+  rehype-stringify@10.0.1:
+    resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==}
+
+  remark-breaks@4.0.0:
+    resolution: {integrity: sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==}
+
+  remark-gfm@4.0.0:
+    resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==}
+
+  remark-math@6.0.0:
+    resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==}
+
+  remark-parse@11.0.0:
+    resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
+
+  remark-rehype@11.1.1:
+    resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==}
+
+  remark-stringify@11.0.0:
+    resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+
+  require-directory@2.1.1:
+    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+    engines: {node: '>=0.10.0'}
+
+  require-from-string@2.0.2:
+    resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+    engines: {node: '>=0.10.0'}
+
+  requires-port@1.0.0:
+    resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+
+  resolve-cwd@3.0.0:
+    resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
+    engines: {node: '>=8'}
+
+  resolve-from@4.0.0:
+    resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+    engines: {node: '>=4'}
+
+  resolve-from@5.0.0:
+    resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+    engines: {node: '>=8'}
+
+  resolve.exports@1.1.1:
+    resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==}
+    engines: {node: '>=10'}
+
+  resolve@1.22.8:
+    resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+    hasBin: true
+
+  reusify@1.0.4:
+    resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+  revolt-api@0.7.16:
+    resolution: {integrity: sha512-Buoc5XQAjAud2GxG210bNHiRne4lOSybuSYoN3FQJXQz1JApFuDx20PPnqJQS2r3/9eWZSgr1HlyBasvzACqTQ==}
+
+  rimraf@2.7.1:
+    resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
+    deprecated: Rimraf versions prior to v4 are no longer supported
+    hasBin: true
+
+  rimraf@3.0.2:
+    resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+    deprecated: Rimraf versions prior to v4 are no longer supported
+    hasBin: true
+
+  rollup@2.79.2:
+    resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==}
+    engines: {node: '>=10.0.0'}
+    hasBin: true
+
+  rollup@4.24.0:
+    resolution: {integrity: sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==}
+    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+    hasBin: true
+
+  rrweb-cssom@0.7.1:
+    resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
+
+  run-applescript@7.0.0:
+    resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==}
+    engines: {node: '>=18'}
+
+  run-parallel@1.2.0:
+    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+  rxjs@7.8.1:
+    resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+
+  safe-array-concat@1.1.2:
+    resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
+    engines: {node: '>=0.4'}
+
+  safe-buffer@5.1.2:
+    resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
+  safe-buffer@5.2.1:
+    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+  safe-regex-test@1.0.3:
+    resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
+    engines: {node: '>= 0.4'}
+
+  safer-buffer@2.1.2:
+    resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+  saxes@5.0.1:
+    resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==}
+    engines: {node: '>=10'}
+
+  saxes@6.0.0:
+    resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
+    engines: {node: '>=v12.22.7'}
+
+  scheduler@0.23.2:
+    resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+
+  semver@6.3.1:
+    resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+    hasBin: true
+
+  semver@7.6.3:
+    resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  send@0.19.0:
+    resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
+    engines: {node: '>= 0.8.0'}
+
+  serialize-javascript@6.0.2:
+    resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+
+  seroval-plugins@1.1.1:
+    resolution: {integrity: sha512-qNSy1+nUj7hsCOon7AO4wdAIo9P0jrzAMp18XhiOzA6/uO5TKtP7ScozVJ8T293oRIvi5wyCHSM4TrJo/c/GJA==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      seroval: ^1.0
+
+  seroval@1.1.1:
+    resolution: {integrity: sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==}
+    engines: {node: '>=10'}
+
+  serve-static@1.16.2:
+    resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
+    engines: {node: '>= 0.8.0'}
+
+  set-function-length@1.2.2:
+    resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+    engines: {node: '>= 0.4'}
+
+  set-function-name@2.0.2:
+    resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+    engines: {node: '>= 0.4'}
+
+  setprototypeof@1.2.0:
+    resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+  shebang-command@2.0.0:
+    resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+    engines: {node: '>=8'}
+
+  shebang-regex@3.0.0:
+    resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+    engines: {node: '>=8'}
+
+  shiki@0.14.7:
+    resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==}
+
+  shiki@1.22.0:
+    resolution: {integrity: sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==}
+
+  side-channel@1.0.6:
+    resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
+    engines: {node: '>= 0.4'}
+
+  siginfo@2.0.0:
+    resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+
+  signal-exit@3.0.7:
+    resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+  signal-exit@4.1.0:
+    resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+    engines: {node: '>=14'}
+
+  sirv@2.0.4:
+    resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
+    engines: {node: '>= 10'}
+
+  sisteransi@1.0.5:
+    resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+  slash@3.0.0:
+    resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+    engines: {node: '>=8'}
+
+  smob@1.5.0:
+    resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==}
+
+  solid-devtools@0.30.1:
+    resolution: {integrity: sha512-axpXL4JV1dnGhuei+nSGS8ewGeNkmIgFDsAlO90YyYY5t8wU1R0aYAQtL+I+5KICLKPBvfkzdcFa2br7AV4lAw==}
+    peerDependencies:
+      solid-js: ^1.8.0
+      solid-start: ^0.3.0
+      vite: ^2.2.3 || ^3.0.0 || ^4.0.0 || ^5.0.0
+    peerDependenciesMeta:
+      solid-start:
+        optional: true
+      vite:
+        optional: true
+
+  solid-dnd-directive@0.2.0:
+    resolution: {integrity: sha512-4aPKidTrwSVBHqeiUPPe218t+HyRp0S4iYNJw7nDsWqP33HHYhAwvAyWVfqlqHBlnA/+A5jdevRvbCOiLV5Qew==}
+    engines: {node: '>=14.16.0', npm: '>=6.14.8'}
+    peerDependencies:
+      solid-js: ^1.0.0
+
+  solid-floating-ui@0.3.1:
+    resolution: {integrity: sha512-o/QmGsWPS2Z3KidAxP0nDvN7alI7Kqy0kU+wd85Fz+au5SYcnYm7I6Fk3M60Za35azsPX0U+5fEtqfOuk6Ao0Q==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      '@floating-ui/dom': ^1.5
+      solid-js: ^1.8
+
+  solid-hcaptcha@0.4.0:
+    resolution: {integrity: sha512-ermYlhU09wPxqNZujVJr6NQI0T/25Ru8rN9a3gGjB83vqpQTapzP3HujmRBDGTF0Ghuy6r0xexhDnOYVTPrxhw==}
+    peerDependencies:
+      solid-js: ^1.6.15 || ^1.7.12
+
+  solid-icons@1.1.0:
+    resolution: {integrity: sha512-IesTfr/F1ElVwH2E1110s2RPXH4pujKfSs+koT8rwuTAdleO5s26lNSpqJV7D1+QHooJj18mcOiz2PIKs0ic+A==}
+    peerDependencies:
+      solid-js: '*'
+
+  solid-jest@0.2.0:
+    resolution: {integrity: sha512-1ILtAj+z6bh1vTvaDlcT8501vmkzkVZMk2aiexJy+XWTZ+sb9B7IWedvWadIhOwwL97fiW4eMmN6SrbaHjn12A==}
+    peerDependencies:
+      babel-preset-solid: ^1.0.0
+
+  solid-js@1.9.2:
+    resolution: {integrity: sha512-fe/K03nV+kMFJYhAOE8AIQHcGxB4rMIEoEyrulbtmf217NffbbwBqJnJI4ovt16e+kaIt0czE2WA7mP/pYN9yg==}
+
+  solid-motionone@1.0.2:
+    resolution: {integrity: sha512-nMdfTZND5FzZSD5gcaSmjjgF7aldMmk4PHC88rUSSdUcrCP/LlVl0xMoy/qncQihgkqHRW0ywewbpE/+ToEibA==}
+    engines: {node: '>=20', pnpm: '>=9.0.0'}
+    peerDependencies:
+      solid-js: ^1.8.0
+
+  solid-qr-code@0.1.11:
+    resolution: {integrity: sha512-8TpELeuK6OoPz5TfJaycsna63IivaSr6Y34qU79eYDF+SRTowO9os8gpElNvNe2FFROZuMZpf28jgmn9gV20Eg==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      solid-js: ^1.8.0
+
+  solid-refresh@0.6.3:
+    resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==}
+    peerDependencies:
+      solid-js: ^1.3
+
+  source-map-js@1.2.1:
+    resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+    engines: {node: '>=0.10.0'}
+
+  source-map-support@0.5.21:
+    resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+  source-map@0.5.7:
+    resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+    engines: {node: '>=0.10.0'}
+
+  source-map@0.6.1:
+    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+    engines: {node: '>=0.10.0'}
+
+  source-map@0.7.4:
+    resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+    engines: {node: '>= 8'}
+
+  source-map@0.8.0-beta.0:
+    resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
+    engines: {node: '>= 8'}
+
+  sourcemap-codec@1.4.8:
+    resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+    deprecated: Please use @jridgewell/sourcemap-codec instead
+
+  space-separated-tokens@2.0.2:
+    resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
+  split@0.3.3:
+    resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==}
+
+  sprintf-js@1.0.3:
+    resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+  stack-utils@2.0.6:
+    resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
+    engines: {node: '>=10'}
+
+  stackback@0.0.2:
+    resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+
+  statuses@2.0.1:
+    resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+    engines: {node: '>= 0.8'}
+
+  std-env@3.7.0:
+    resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==}
+
+  stop-iteration-iterator@1.0.0:
+    resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
+    engines: {node: '>= 0.4'}
+
+  storybook-solidjs-vite@1.0.0-beta.2:
+    resolution: {integrity: sha512-dD+VMYC5fBBQNesVb+mjB0LOkZIf100SQFbjAt9/sDstNUvc5ce3yZwLYXzgcOc7jcSMkrBu/cZNRzEM4YIAyw==}
+    engines: {node: ^14.18 || >=16}
+
+  storybook-solidjs@1.0.0-beta.2:
+    resolution: {integrity: sha512-wXjM/uH29IPjgxlPvQVNTM/7iBFNNzjuOugpk7iM2oy+sZl7K70eBjvOqGgX5v35pNHTaA8Ju3BlLdp+O20abg==}
+    engines: {node: '>=16.0.0'}
+    peerDependencies:
+      babel-preset-solid: ^1.6.6
+      solid-js: ^1.6.6
+
+  storybook@8.3.5:
+    resolution: {integrity: sha512-hYQVtP2l+3kO8oKDn4fjXXQYxgTRsj/LaV6lUMJH0zt+OhVmDXKJLxmdUP4ieTm0T8wEbSYosFavgPcQZlxRfw==}
+    hasBin: true
+
+  stream-combiner@0.0.4:
+    resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==}
+
+  string-argv@0.3.2:
+    resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
+    engines: {node: '>=0.6.19'}
+
+  string-length@4.0.2:
+    resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
+    engines: {node: '>=10'}
+
+  string-width@4.2.3:
+    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+    engines: {node: '>=8'}
+
+  string-width@5.1.2:
+    resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+    engines: {node: '>=12'}
+
+  string.prototype.matchall@4.0.11:
+    resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==}
+    engines: {node: '>= 0.4'}
+
+  string.prototype.trim@1.2.9:
+    resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
+    engines: {node: '>= 0.4'}
+
+  string.prototype.trimend@1.0.8:
+    resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==}
+
+  string.prototype.trimstart@1.0.8:
+    resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+    engines: {node: '>= 0.4'}
+
+  string_decoder@1.1.1:
+    resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+
+  stringify-entities@4.0.4:
+    resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+
+  stringify-object@3.3.0:
+    resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==}
+    engines: {node: '>=4'}
+
+  strip-ansi@6.0.1:
+    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+    engines: {node: '>=8'}
+
+  strip-ansi@7.1.0:
+    resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+    engines: {node: '>=12'}
+
+  strip-bom@4.0.0:
+    resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
+    engines: {node: '>=8'}
+
+  strip-comments@2.0.1:
+    resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==}
+    engines: {node: '>=10'}
+
+  strip-final-newline@2.0.0:
+    resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+    engines: {node: '>=6'}
+
+  strip-indent@3.0.0:
+    resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+    engines: {node: '>=8'}
+
+  strip-json-comments@3.1.1:
+    resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+    engines: {node: '>=8'}
+
+  style-to-object@0.3.0:
+    resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==}
+
+  style-to-object@1.0.8:
+    resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==}
+
+  supports-color@5.5.0:
+    resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+    engines: {node: '>=4'}
+
+  supports-color@7.2.0:
+    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+    engines: {node: '>=8'}
+
+  supports-color@8.1.1:
+    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+    engines: {node: '>=10'}
+
+  supports-hyperlinks@2.3.0:
+    resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==}
+    engines: {node: '>=8'}
+
+  supports-preserve-symlinks-flag@1.0.0:
+    resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+    engines: {node: '>= 0.4'}
+
+  svelte-dnd-action@0.9.11:
+    resolution: {integrity: sha512-hkuBs8rT0yVD0Xq9p9GxeHN1zYD8r7oZO872VQHg7DJe3cAYwus4WXpx3DNYZiTcLcIOmDw3BVNdKvAl/B6VPg==}
+
+  svgo@3.3.2:
+    resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==}
+    engines: {node: '>=14.0.0'}
+    hasBin: true
+
+  symbol-tree@3.2.4:
+    resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+
+  synckit@0.9.2:
+    resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+
+  tapable@1.1.3:
+    resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==}
+    engines: {node: '>=6'}
+
+  telejson@7.2.0:
+    resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==}
+
+  temp-dir@2.0.0:
+    resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==}
+    engines: {node: '>=8'}
+
+  tempy@0.6.0:
+    resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==}
+    engines: {node: '>=10'}
+
+  terminal-link@2.1.1:
+    resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==}
+    engines: {node: '>=8'}
+
+  terser@5.34.1:
+    resolution: {integrity: sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  test-exclude@6.0.0:
+    resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+    engines: {node: '>=8'}
+
+  test-exclude@7.0.1:
+    resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==}
+    engines: {node: '>=18'}
+
+  text-table@0.2.0:
+    resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+
+  throat@6.0.2:
+    resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==}
+
+  through@2.3.8:
+    resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
+  tiny-invariant@1.3.3:
+    resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
+
+  tinybench@2.9.0:
+    resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+
+  tinyexec@0.3.0:
+    resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==}
+
+  tinyglobby@0.2.9:
+    resolution: {integrity: sha512-8or1+BGEdk1Zkkw2ii16qSS7uVrQJPre5A9o/XkWPATkk23FZh/15BKFxPnlTy6vkljZxLqYCzzBMj30ZrSvjw==}
+    engines: {node: '>=12.0.0'}
+
+  tinypool@1.0.1:
+    resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+
+  tinyrainbow@1.2.0:
+    resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==}
+    engines: {node: '>=14.0.0'}
+
+  tinyspy@3.0.2:
+    resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
+    engines: {node: '>=14.0.0'}
+
+  tldts-core@6.1.50:
+    resolution: {integrity: sha512-na2EcZqmdA2iV9zHV7OHQDxxdciEpxrjbkp+aHmZgnZKHzoElLajP59np5/4+sare9fQBfixgvXKx8ev1d7ytw==}
+
+  tldts@6.1.50:
+    resolution: {integrity: sha512-q9GOap6q3KCsLMdOjXhWU5jVZ8/1dIib898JBRLsN+tBhENpBDcAVQbE0epADOjw11FhQQy9AcbqKGBQPUfTQA==}
+    hasBin: true
+
+  tmpl@1.0.5:
+    resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+
+  to-fast-properties@2.0.0:
+    resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+    engines: {node: '>=4'}
+
+  to-regex-range@5.0.1:
+    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+    engines: {node: '>=8.0'}
+
+  toidentifier@1.0.1:
+    resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+    engines: {node: '>=0.6'}
+
+  totalist@3.0.1:
+    resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
+    engines: {node: '>=6'}
+
+  tough-cookie@4.1.4:
+    resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
+    engines: {node: '>=6'}
+
+  tough-cookie@5.0.0:
+    resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==}
+    engines: {node: '>=16'}
+
+  tr46@0.0.3:
+    resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+  tr46@1.0.1:
+    resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
+
+  tr46@2.1.0:
+    resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==}
+    engines: {node: '>=8'}
+
+  tr46@5.0.0:
+    resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==}
+    engines: {node: '>=18'}
+
+  trim-lines@3.0.1:
+    resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+  trough@2.2.0:
+    resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
+  ts-api-utils@1.3.0:
+    resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
+    engines: {node: '>=16'}
+    peerDependencies:
+      typescript: '>=4.2.0'
+
+  ts-dedent@2.2.0:
+    resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==}
+    engines: {node: '>=6.10'}
+
+  ts-evaluator@1.2.0:
+    resolution: {integrity: sha512-ncSGek1p92bj2ifB7s9UBgryHCkU9vwC5d+Lplt12gT9DH+e41X8dMoHRQjIMeAvyG7j9dEnuHmwgOtuRIQL+Q==}
+    engines: {node: '>=14.19.0'}
+    peerDependencies:
+      jsdom: '>=14.x || >=15.x || >=16.x || >=17.x || >=18.x || >=19.x || >=20.x || >=21.x || >=22.x'
+      typescript: '>=3.2.x || >= 4.x || >= 5.x'
+    peerDependenciesMeta:
+      jsdom:
+        optional: true
+
+  ts-morph@21.0.1:
+    resolution: {integrity: sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==}
+
+  ts-pattern@5.0.8:
+    resolution: {integrity: sha512-aafbuAQOTEeWmA7wtcL94w6I89EgLD7F+IlWkr596wYxeb0oveWDO5dQpv85YP0CGbxXT/qXBIeV6IYLcoZ2uA==}
+
+  tsc-watch@6.2.0:
+    resolution: {integrity: sha512-2LBhf9kjKXnz7KQ/puLHlozMzzUNHAdYBNMkg3eksQJ9GBAgMg8czznM83T5PmsoUvDnXzfIeQn2lNcIYDr8LA==}
+    engines: {node: '>=12.12.0'}
+    hasBin: true
+    peerDependencies:
+      typescript: '*'
+
+  tsconfck@3.0.2:
+    resolution: {integrity: sha512-6lWtFjwuhS3XI4HsX4Zg0izOI3FU/AI9EGVlPEUMDIhvLPMD4wkiof0WCoDgW7qY+Dy198g4d9miAqUHWHFH6Q==}
+    engines: {node: ^18 || >=20}
+    hasBin: true
+    peerDependencies:
+      typescript: ^5.0.0
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  tslib@1.14.1:
+    resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+
+  tslib@2.7.0:
+    resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
+
+  tsutils@3.21.0:
+    resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+    engines: {node: '>= 6'}
+    peerDependencies:
+      typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+
+  tween-functions@1.2.0:
+    resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==}
+
+  type-check@0.4.0:
+    resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+    engines: {node: '>= 0.8.0'}
+
+  type-detect@4.0.8:
+    resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+    engines: {node: '>=4'}
+
+  type-fest@0.16.0:
+    resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==}
+    engines: {node: '>=10'}
+
+  type-fest@0.20.2:
+    resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+    engines: {node: '>=10'}
+
+  type-fest@0.21.3:
+    resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+    engines: {node: '>=10'}
+
+  type-fest@2.19.0:
+    resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+    engines: {node: '>=12.20'}
+
+  type-is@1.6.18:
+    resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+    engines: {node: '>= 0.6'}
+
+  typed-array-buffer@1.0.2:
+    resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-byte-length@1.0.1:
+    resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-byte-offset@1.0.2:
+    resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-length@1.0.6:
+    resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
+    engines: {node: '>= 0.4'}
+
+  typed-emitter@2.1.0:
+    resolution: {integrity: sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==}
+
+  typedarray-to-buffer@3.1.5:
+    resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
+
+  typedoc@0.25.13:
+    resolution: {integrity: sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==}
+    engines: {node: '>= 16'}
+    hasBin: true
+    peerDependencies:
+      typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x
+
+  typescript-eslint@8.8.1:
+    resolution: {integrity: sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
 
-  /@babel/plugin-transform-modules-commonjs@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==}
-    engines: {node: '>=6.9.0'}
+  typescript@4.9.5:
+    resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
+    engines: {node: '>=4.2.0'}
+    hasBin: true
+
+  typescript@5.3.3:
+    resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
+    engines: {node: '>=14.17'}
+    hasBin: true
+
+  typescript@5.6.3:
+    resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
+    engines: {node: '>=14.17'}
+    hasBin: true
+
+  ufo@1.5.4:
+    resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
+
+  ulid@2.3.0:
+    resolution: {integrity: sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==}
+    hasBin: true
+
+  unbox-primitive@1.0.2:
+    resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+
+  undici-types@5.26.5:
+    resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
+  undici-types@6.19.8:
+    resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+
+  unicode-canonical-property-names-ecmascript@2.0.1:
+    resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
+    engines: {node: '>=4'}
+
+  unicode-match-property-ecmascript@2.0.0:
+    resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
+    engines: {node: '>=4'}
+
+  unicode-match-property-value-ecmascript@2.2.0:
+    resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==}
+    engines: {node: '>=4'}
+
+  unicode-property-aliases-ecmascript@2.1.0:
+    resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==}
+    engines: {node: '>=4'}
+
+  unified@11.0.5:
+    resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+
+  unique-string@2.0.0:
+    resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
+    engines: {node: '>=8'}
+
+  unist-util-find-after@5.0.0:
+    resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
+
+  unist-util-is@6.0.0:
+    resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
+
+  unist-util-position@5.0.0:
+    resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
+  unist-util-remove-position@5.0.0:
+    resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
+
+  unist-util-select@5.1.0:
+    resolution: {integrity: sha512-4A5mfokSHG/rNQ4g7gSbdEs+H586xyd24sdJqF1IWamqrLHvYb+DH48fzxowyOhOfK7YSqX+XlCojAyuuyyT2A==}
+
+  unist-util-stringify-position@4.0.0:
+    resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+  unist-util-visit-parents@6.0.1:
+    resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
+
+  unist-util-visit@5.0.0:
+    resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+
+  universal-github-app-jwt@1.2.0:
+    resolution: {integrity: sha512-dncpMpnsKBk0eetwfN8D8OUHGfiDhhJ+mtsbMl+7PfW7mYjiH8LIcqRmYMtzYLgSh47HjfdBtrBwIQ/gizKR3g==}
+
+  universal-user-agent@6.0.1:
+    resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==}
+
+  universalify@0.2.0:
+    resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
+    engines: {node: '>= 4.0.0'}
+
+  universalify@2.0.1:
+    resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+    engines: {node: '>= 10.0.0'}
+
+  unpipe@1.0.0:
+    resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+    engines: {node: '>= 0.8'}
+
+  unplugin@1.14.1:
+    resolution: {integrity: sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==}
+    engines: {node: '>=14.0.0'}
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-simple-access': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      webpack-sources: ^3
+    peerDependenciesMeta:
+      webpack-sources:
+        optional: true
 
-  /@babel/plugin-transform-modules-systemjs@7.19.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==}
-    engines: {node: '>=6.9.0'}
+  upath@1.2.0:
+    resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==}
+    engines: {node: '>=4'}
+
+  update-browserslist-db@1.1.1:
+    resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
+    hasBin: true
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-hoist-variables': 7.24.7
-      '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-validator-identifier': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      browserslist: '>= 4.21.0'
 
-  /@babel/plugin-transform-modules-systemjs@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==}
-    engines: {node: '>=6.9.0'}
+  uri-js@4.4.1:
+    resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+  url-parse@1.5.10:
+    resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+
+  util-deprecate@1.0.2:
+    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+  util@0.12.5:
+    resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
+
+  utils-merge@1.0.1:
+    resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+    engines: {node: '>= 0.4.0'}
+
+  uuid@9.0.1:
+    resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
+    hasBin: true
+
+  v8-to-istanbul@8.1.1:
+    resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==}
+    engines: {node: '>=10.12.0'}
+
+  validate-html-nesting@1.2.2:
+    resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==}
+
+  vary@1.1.2:
+    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+    engines: {node: '>= 0.8'}
+
+  vfile-location@5.0.3:
+    resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
+
+  vfile-message@4.0.2:
+    resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
+
+  vfile@6.0.3:
+    resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+
+  vite-node@2.1.2:
+    resolution: {integrity: sha512-HPcGNN5g/7I2OtPjLqgOtCRu/qhVvBxTUD3qzitmL0SrG1cWFzxzhMDWussxSbrRYWqnKf8P2jiNhPMSN+ymsQ==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
+
+  vite-plugin-inspect@0.8.7:
+    resolution: {integrity: sha512-/XXou3MVc13A5O9/2Nd6xczjrUwt7ZyI9h8pTnUMkr5SshLcb0PJUOVq2V+XVkdeU4njsqAtmK87THZuO2coGA==}
+    engines: {node: '>=14'}
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-hoist-variables': 7.24.7
-      '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-validator-identifier': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      '@nuxt/kit': '*'
+      vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0
+    peerDependenciesMeta:
+      '@nuxt/kit':
+        optional: true
 
-  /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==}
-    engines: {node: '>=6.9.0'}
+  vite-plugin-pwa@0.20.5:
+    resolution: {integrity: sha512-aweuI/6G6n4C5Inn0vwHumElU/UEpNuO+9iZzwPZGTCH87TeZ6YFMrEY6ZUBQdIHHlhTsbMDryFARcSuOdsz9Q==}
+    engines: {node: '>=16.0.0'}
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      '@vite-pwa/assets-generator': ^0.2.6
+      vite: ^3.1.0 || ^4.0.0 || ^5.0.0
+      workbox-build: ^7.1.0
+      workbox-window: ^7.1.0
+    peerDependenciesMeta:
+      '@vite-pwa/assets-generator':
+        optional: true
 
-  /@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==}
-    engines: {node: '>=6.9.0'}
+  vite-plugin-solid-svg@0.8.1:
+    resolution: {integrity: sha512-ROGC2ae1eYUCMd+zfJtsbUtuZwsb6DZS0+Sy5/ZXDokOunGi0Ez/cL7OPdsixN3I0/rNYd/3hilo3kpRMAS+IA==}
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      solid-js: ^1
+      vite: '>=4'
 
-  /@babel/plugin-transform-named-capturing-groups-regex@7.19.1(@babel/core@7.24.7):
-    resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==}
-    engines: {node: '>=6.9.0'}
+  vite-plugin-solid@2.10.2:
+    resolution: {integrity: sha512-AOEtwMe2baBSXMXdo+BUwECC8IFHcKS6WQV/1NEd+Q7vHPap5fmIhLcAzr+DUJ04/KHx/1UBU0l1/GWP+rMAPQ==}
     peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+      '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.*
+      solid-js: ^1.7.2
+      vite: ^3.0.0 || ^4.0.0 || ^5.0.0
+    peerDependenciesMeta:
+      '@testing-library/jest-dom':
+        optional: true
 
-  /@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==}
-    engines: {node: '>=6.9.0'}
+  vite@5.4.8:
+    resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
     peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+      '@types/node': ^18.0.0 || >=20.0.0
+      less: '*'
+      lightningcss: ^1.21.0
+      sass: '*'
+      sass-embedded: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.4.0
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      less:
+        optional: true
+      lightningcss:
+        optional: true
+      sass:
+        optional: true
+      sass-embedded:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
 
-  /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==}
-    engines: {node: '>=6.9.0'}
+  vitefu@0.2.5:
+    resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+      vite: ^3.0.0 || ^4.0.0 || ^5.0.0
+    peerDependenciesMeta:
+      vite:
+        optional: true
 
-  /@babel/plugin-transform-new-target@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==}
-    engines: {node: '>=6.9.0'}
+  vitest@2.1.2:
+    resolution: {integrity: sha512-veNjLizOMkRrJ6xxb+pvxN6/QAWg95mzcRjtmkepXdN87FNfxAss9RKe2far/G9cQpipfgP2taqg0KiWsquj8A==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+      '@edge-runtime/vm': '*'
+      '@types/node': ^18.0.0 || >=20.0.0
+      '@vitest/browser': 2.1.2
+      '@vitest/ui': 2.1.2
+      happy-dom: '*'
+      jsdom: '*'
+    peerDependenciesMeta:
+      '@edge-runtime/vm':
+        optional: true
+      '@types/node':
+        optional: true
+      '@vitest/browser':
+        optional: true
+      '@vitest/ui':
+        optional: true
+      happy-dom:
+        optional: true
+      jsdom:
+        optional: true
+
+  vscode-oniguruma@1.7.0:
+    resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==}
+
+  vscode-textmate@8.0.0:
+    resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==}
+
+  w3c-hr-time@1.0.2:
+    resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==}
+    deprecated: Use your platform's native performance.now() and performance.timeOrigin.
+
+  w3c-xmlserializer@2.0.0:
+    resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==}
+    engines: {node: '>=10'}
+
+  w3c-xmlserializer@5.0.0:
+    resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
+    engines: {node: '>=18'}
+
+  walker@1.0.8:
+    resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+
+  web-namespaces@2.0.1:
+    resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+
+  webidl-conversions@3.0.1:
+    resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+  webidl-conversions@4.0.2:
+    resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
+
+  webidl-conversions@5.0.0:
+    resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==}
+    engines: {node: '>=8'}
+
+  webidl-conversions@6.1.0:
+    resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==}
+    engines: {node: '>=10.4'}
+
+  webidl-conversions@7.0.0:
+    resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+    engines: {node: '>=12'}
+
+  webpack-virtual-modules@0.6.2:
+    resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+  whatwg-encoding@1.0.5:
+    resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==}
+
+  whatwg-encoding@3.1.1:
+    resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
+    engines: {node: '>=18'}
+
+  whatwg-mimetype@2.3.0:
+    resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==}
+
+  whatwg-mimetype@4.0.0:
+    resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
+    engines: {node: '>=18'}
+
+  whatwg-url@14.0.0:
+    resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==}
+    engines: {node: '>=18'}
+
+  whatwg-url@5.0.0:
+    resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
 
-  /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.24.7):
-    resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7)
-    dev: true
+  whatwg-url@7.1.0:
+    resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
 
-  /@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7)
-    dev: true
+  whatwg-url@8.7.0:
+    resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==}
+    engines: {node: '>=10'}
 
-  /@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7)
-    dev: true
+  which-boxed-primitive@1.0.2:
+    resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
 
-  /@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-compilation-targets': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.7)
-    dev: true
+  which-collection@1.0.2:
+    resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+    engines: {node: '>= 0.4'}
 
-  /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-replace-supers': 7.19.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  which-typed-array@1.1.15:
+    resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
+    engines: {node: '>= 0.4'}
 
-  /@babel/plugin-transform-object-super@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  which@2.0.2:
+    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+    engines: {node: '>= 8'}
+    hasBin: true
 
-  /@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7)
-    dev: true
+  why-is-node-running@2.3.0:
+    resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+    engines: {node: '>=8'}
+    hasBin: true
 
-  /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.24.7):
-    resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
-      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  word-wrap@1.2.5:
+    resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+    engines: {node: '>=0.10.0'}
 
-  /@babel/plugin-transform-optional-chaining@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
-      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  workbox-background-sync@7.1.0:
+    resolution: {integrity: sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==}
 
-  /@babel/plugin-transform-parameters@7.20.3(@babel/core@7.24.7):
-    resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  workbox-broadcast-update@7.1.0:
+    resolution: {integrity: sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==}
 
-  /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  workbox-build@7.1.1:
+    resolution: {integrity: sha512-WdkVdC70VMpf5NBCtNbiwdSZeKVuhTEd5PV3mAwpTQCGAB5XbOny1P9egEgNdetv4srAMmMKjvBk4RD58LpooA==}
+    engines: {node: '>=16.0.0'}
 
-  /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.24.7):
-    resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  workbox-cacheable-response@7.1.0:
+    resolution: {integrity: sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==}
 
-  /@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  workbox-core@7.1.0:
+    resolution: {integrity: sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==}
 
-  /@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-annotate-as-pure': 7.24.7
-      '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  workbox-expiration@7.1.0:
+    resolution: {integrity: sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==}
 
-  /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  workbox-google-analytics@7.1.0:
+    resolution: {integrity: sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==}
 
-  /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  workbox-navigation-preload@7.1.0:
+    resolution: {integrity: sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==}
 
-  /@babel/plugin-transform-regenerator@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      regenerator-transform: 0.15.1
-    dev: true
+  workbox-precaching@7.1.0:
+    resolution: {integrity: sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==}
 
-  /@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      regenerator-transform: 0.15.2
-    dev: true
+  workbox-range-requests@7.1.0:
+    resolution: {integrity: sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==}
 
-  /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  workbox-recipes@7.1.0:
+    resolution: {integrity: sha512-NRrk4ycFN9BHXJB6WrKiRX3W3w75YNrNrzSX9cEZgFB5ubeGoO8s/SDmOYVrFYp9HMw6sh1Pm3eAY/1gVS8YLg==}
 
-  /@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  workbox-routing@7.1.0:
+    resolution: {integrity: sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==}
 
-  /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  workbox-strategies@7.1.0:
+    resolution: {integrity: sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==}
 
-  /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  workbox-streams@7.1.0:
+    resolution: {integrity: sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==}
 
-  /@babel/plugin-transform-spread@7.19.0(@babel/core@7.24.7):
-    resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-skip-transparent-expression-wrappers': 7.20.0
-    dev: true
+  workbox-sw@7.1.0:
+    resolution: {integrity: sha512-Hml/9+/njUXBglv3dtZ9WBKHI235AQJyLBV1G7EFmh4/mUdSQuXui80RtjDeVRrXnm/6QWgRUEHG3/YBVbxtsA==}
 
-  /@babel/plugin-transform-spread@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  workbox-window@7.1.0:
+    resolution: {integrity: sha512-ZHeROyqR+AS5UPzholQRDttLFqGMwP0Np8MKWAdyxsDETxq3qOAyXvqessc3GniohG6e0mAqSQyKOHmT8zPF7g==}
 
-  /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  wrap-ansi@7.0.0:
+    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+    engines: {node: '>=10'}
 
-  /@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  wrap-ansi@8.1.0:
+    resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+    engines: {node: '>=12'}
 
-  /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.24.7):
-    resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  wrappy@1.0.2:
+    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
 
-  /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  write-file-atomic@3.0.3:
+    resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
 
-  /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.24.7):
-    resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==}
-    engines: {node: '>=6.9.0'}
+  ws@7.5.10:
+    resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==}
+    engines: {node: '>=8.3.0'}
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+      bufferutil: ^4.0.1
+      utf-8-validate: ^5.0.2
+    peerDependenciesMeta:
+      bufferutil:
+        optional: true
+      utf-8-validate:
+        optional: true
 
-  /@babel/plugin-transform-typeof-symbol@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==}
-    engines: {node: '>=6.9.0'}
+  ws@8.18.0:
+    resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
+    engines: {node: '>=10.0.0'}
     peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+      bufferutil: ^4.0.1
+      utf-8-validate: '>=5.0.2'
+    peerDependenciesMeta:
+      bufferutil:
+        optional: true
+      utf-8-validate:
+        optional: true
 
-  /@babel/plugin-transform-typescript@7.19.1(@babel/core@7.24.7):
-    resolution: {integrity: sha512-+ILcOU+6mWLlvCwnL920m2Ow3wWx3Wo8n2t5aROQmV55GZt+hOiLvBaa3DNzRjSEHa1aauRs4/YLmkCfFkhhRQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-class-features-plugin': 7.19.0(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  xml-name-validator@3.0.0:
+    resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==}
 
-  /@babel/plugin-transform-typescript@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-annotate-as-pure': 7.24.7
-      '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  xml-name-validator@5.0.0:
+    resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
+    engines: {node: '>=18'}
 
-  /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.24.7):
-    resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  xmlchars@2.2.0:
+    resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
 
-  /@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  y18n@5.0.8:
+    resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+    engines: {node: '>=10'}
 
-  /@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  yallist@3.1.1:
+    resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
 
-  /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  yaml@1.10.2:
+    resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+    engines: {node: '>= 6'}
 
-  /@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  yargs-parser@20.2.9:
+    resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+    engines: {node: '>=10'}
 
-  /@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.24.7
-    dev: true
+  yargs@16.2.0:
+    resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
+    engines: {node: '>=10'}
 
-  /@babel/preset-env@7.20.2(@babel/core@7.24.7):
-    resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/compat-data': 7.21.0
-      '@babel/core': 7.24.7
-      '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.24.7)
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-validator-option': 7.21.0
-      '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9(@babel/core@7.24.7)
-      '@babel/plugin-proposal-async-generator-functions': 7.20.1(@babel/core@7.24.7)
-      '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-proposal-class-static-block': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.24.7)
-      '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-proposal-logical-assignment-operators': 7.18.9(@babel/core@7.24.7)
-      '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-proposal-object-rest-spread': 7.20.2(@babel/core@7.24.7)
-      '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-proposal-optional-chaining': 7.18.9(@babel/core@7.24.7)
-      '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-proposal-private-property-in-object': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7)
-      '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7)
-      '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7)
-      '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.24.7)
-      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7)
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7)
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7)
-      '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7)
-      '@babel/plugin-transform-arrow-functions': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-async-to-generator': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-block-scoping': 7.20.2(@babel/core@7.24.7)
-      '@babel/plugin-transform-classes': 7.20.2(@babel/core@7.24.7)
-      '@babel/plugin-transform-computed-properties': 7.18.9(@babel/core@7.24.7)
-      '@babel/plugin-transform-destructuring': 7.20.2(@babel/core@7.24.7)
-      '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.24.7)
-      '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-for-of': 7.18.8(@babel/core@7.24.7)
-      '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.24.7)
-      '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.24.7)
-      '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-modules-amd': 7.19.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-modules-commonjs': 7.19.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-modules-systemjs': 7.19.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1(@babel/core@7.24.7)
-      '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-parameters': 7.20.3(@babel/core@7.24.7)
-      '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-regenerator': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-spread': 7.19.0(@babel/core@7.24.7)
-      '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.24.7)
-      '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.24.7)
-      '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.24.7)
-      '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.24.7)
-      '@babel/preset-modules': 0.1.5(@babel/core@7.24.7)
-      '@babel/types': 7.24.7
-      babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.24.7)
-      babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.24.7)
-      babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.24.7)
-      core-js-compat: 3.26.1
-      semver: 6.3.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  yocto-queue@0.1.0:
+    resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+    engines: {node: '>=10'}
 
-  /@babel/preset-env@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/compat-data': 7.24.7
-      '@babel/core': 7.24.7
-      '@babel/helper-compilation-targets': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-validator-option': 7.24.7
-      '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7)
-      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7)
-      '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7)
-      '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7)
-      '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7)
-      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7)
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7)
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7)
-      '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7)
-      '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-async-generator-functions': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-block-scoping': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-classes': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-destructuring': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-function-name': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-literals': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-modules-systemjs': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-optional-chaining': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-typeof-symbol': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.24.7)
-      '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.7)
-      babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.7)
-      babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.7)
-      babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.7)
-      core-js-compat: 3.36.0
-      semver: 6.3.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  zwitch@2.0.4:
+    resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
 
-  /@babel/preset-flow@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-validator-option': 7.24.7
-      '@babel/plugin-transform-flow-strip-types': 7.24.7(@babel/core@7.24.7)
-    dev: true
+snapshots:
 
-  /@babel/preset-modules@0.1.5(@babel/core@7.24.7):
-    resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
+  '@adobe/css-tools@4.4.0': {}
+
+  '@ampproject/remapping@2.3.0':
     dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.24.7)
-      '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.24.7)
-      '@babel/types': 7.24.7
-      esutils: 2.0.3
-    dev: true
+      '@jridgewell/gen-mapping': 0.3.5
+      '@jridgewell/trace-mapping': 0.3.25
 
-  /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.7):
-    resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
+  '@antfu/utils@0.7.10': {}
+
+  '@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)':
     dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/types': 7.24.7
-      esutils: 2.0.3
-    dev: true
+      ajv: 8.17.1
+      json-schema: 0.4.0
+      jsonpointer: 5.0.1
+      leven: 3.1.0
 
-  /@babel/preset-typescript@7.16.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
+  '@babel/code-frame@7.25.7':
     dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.19.0
-      '@babel/helper-validator-option': 7.18.6
-      '@babel/plugin-transform-typescript': 7.19.1(@babel/core@7.24.7)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      '@babel/highlight': 7.25.7
+      picocolors: 1.1.0
 
-  /@babel/preset-typescript@7.24.7(@babel/core@7.24.7):
-    resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
+  '@babel/compat-data@7.25.7': {}
+
+  '@babel/core@7.25.7':
     dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-plugin-utils': 7.24.7
-      '@babel/helper-validator-option': 7.24.7
-      '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.24.7)
+      '@ampproject/remapping': 2.3.0
+      '@babel/code-frame': 7.25.7
+      '@babel/generator': 7.25.7
+      '@babel/helper-compilation-targets': 7.25.7
+      '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.7)
+      '@babel/helpers': 7.25.7
+      '@babel/parser': 7.25.7
+      '@babel/template': 7.25.7
+      '@babel/traverse': 7.25.7
+      '@babel/types': 7.25.7
+      convert-source-map: 2.0.0
+      debug: 4.3.7
+      gensync: 1.0.0-beta.2
+      json5: 2.2.3
+      semver: 6.3.1
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /@babel/register@7.24.6(@babel/core@7.24.7):
-    resolution: {integrity: sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
+  '@babel/generator@7.17.7':
     dependencies:
-      '@babel/core': 7.24.7
-      clone-deep: 4.0.1
-      find-cache-dir: 2.1.0
-      make-dir: 2.1.0
-      pirates: 4.0.6
-      source-map-support: 0.5.21
-    dev: true
+      '@babel/types': 7.17.0
+      jsesc: 2.5.2
+      source-map: 0.5.7
 
-  /@babel/regjsgen@0.8.0:
-    resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==}
-    dev: true
+  '@babel/generator@7.25.7':
+    dependencies:
+      '@babel/types': 7.25.7
+      '@jridgewell/gen-mapping': 0.3.5
+      '@jridgewell/trace-mapping': 0.3.25
+      jsesc: 3.0.2
 
-  /@babel/runtime@7.24.0:
-    resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==}
-    engines: {node: '>=6.9.0'}
+  '@babel/helper-annotate-as-pure@7.25.7':
     dependencies:
-      regenerator-runtime: 0.14.1
-    dev: true
+      '@babel/types': 7.25.7
 
-  /@babel/template@7.24.0:
-    resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==}
-    engines: {node: '>=6.9.0'}
+  '@babel/helper-builder-binary-assignment-operator-visitor@7.25.7':
     dependencies:
-      '@babel/code-frame': 7.24.7
-      '@babel/parser': 7.24.7
-      '@babel/types': 7.24.7
-    dev: true
+      '@babel/traverse': 7.25.7
+      '@babel/types': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@babel/template@7.24.7:
-    resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==}
-    engines: {node: '>=6.9.0'}
+  '@babel/helper-compilation-targets@7.25.7':
     dependencies:
-      '@babel/code-frame': 7.24.7
-      '@babel/parser': 7.24.7
-      '@babel/types': 7.24.7
-    dev: true
+      '@babel/compat-data': 7.25.7
+      '@babel/helper-validator-option': 7.25.7
+      browserslist: 4.24.0
+      lru-cache: 5.1.1
+      semver: 6.3.1
 
-  /@babel/traverse@7.23.2:
-    resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==}
-    engines: {node: '>=6.9.0'}
+  '@babel/helper-create-class-features-plugin@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@babel/code-frame': 7.23.5
-      '@babel/generator': 7.24.7
-      '@babel/helper-environment-visitor': 7.22.20
-      '@babel/helper-function-name': 7.23.0
-      '@babel/helper-hoist-variables': 7.22.5
-      '@babel/helper-split-export-declaration': 7.22.6
-      '@babel/parser': 7.24.7
-      '@babel/types': 7.24.7
-      debug: 4.3.4
-      globals: 11.12.0
+      '@babel/core': 7.25.7
+      '@babel/helper-annotate-as-pure': 7.25.7
+      '@babel/helper-member-expression-to-functions': 7.25.7
+      '@babel/helper-optimise-call-expression': 7.25.7
+      '@babel/helper-replace-supers': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.7
+      '@babel/traverse': 7.25.7
+      semver: 6.3.1
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /@babel/traverse@7.24.0:
-    resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==}
-    engines: {node: '>=6.9.0'}
+  '@babel/helper-create-regexp-features-plugin@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@babel/code-frame': 7.24.7
-      '@babel/generator': 7.24.7
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-function-name': 7.24.7
-      '@babel/helper-hoist-variables': 7.24.7
-      '@babel/helper-split-export-declaration': 7.24.7
-      '@babel/parser': 7.24.7
-      '@babel/types': 7.24.7
-      debug: 4.3.4
-      globals: 11.12.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-annotate-as-pure': 7.25.7
+      regexpu-core: 6.1.1
+      semver: 6.3.1
 
-  /@babel/traverse@7.24.7:
-    resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==}
-    engines: {node: '>=6.9.0'}
+  '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.7)':
     dependencies:
-      '@babel/code-frame': 7.24.7
-      '@babel/generator': 7.24.7
-      '@babel/helper-environment-visitor': 7.24.7
-      '@babel/helper-function-name': 7.24.7
-      '@babel/helper-hoist-variables': 7.24.7
-      '@babel/helper-split-export-declaration': 7.24.7
-      '@babel/parser': 7.24.7
-      '@babel/types': 7.24.7
-      debug: 4.3.4
-      globals: 11.12.0
+      '@babel/core': 7.25.7
+      '@babel/helper-compilation-targets': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      debug: 4.3.7
+      lodash.debounce: 4.0.8
+      resolve: 1.22.8
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /@babel/types@7.17.0:
-    resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==}
-    engines: {node: '>=6.9.0'}
+  '@babel/helper-environment-visitor@7.24.7':
     dependencies:
-      '@babel/helper-validator-identifier': 7.24.7
-      to-fast-properties: 2.0.0
-    dev: true
+      '@babel/types': 7.25.7
 
-  /@babel/types@7.24.0:
-    resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==}
-    engines: {node: '>=6.9.0'}
+  '@babel/helper-function-name@7.24.7':
     dependencies:
-      '@babel/helper-string-parser': 7.23.4
-      '@babel/helper-validator-identifier': 7.22.20
-      to-fast-properties: 2.0.0
-    dev: true
+      '@babel/template': 7.25.7
+      '@babel/types': 7.25.7
 
-  /@babel/types@7.24.7:
-    resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==}
-    engines: {node: '>=6.9.0'}
+  '@babel/helper-hoist-variables@7.24.7':
     dependencies:
-      '@babel/helper-string-parser': 7.24.7
-      '@babel/helper-validator-identifier': 7.24.7
-      to-fast-properties: 2.0.0
-    dev: true
-
-  /@bcoe/v8-coverage@0.2.3:
-    resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
-    dev: true
+      '@babel/types': 7.25.7
 
-  /@chromatic-com/storybook@1.5.0(react@18.3.1):
-    resolution: {integrity: sha512-LkLKv7SWu/6kGep1ft2HA1T/cm14wU0zoW71gE4cZRcgUoRQJtyhITFTLHrjqAxz6bVqNgqzQtd5oBZ2nK3L3g==}
-    engines: {node: '>=16.0.0', yarn: '>=1.22.18'}
+  '@babel/helper-member-expression-to-functions@7.25.7':
     dependencies:
-      chromatic: 11.5.3
-      filesize: 10.1.0
-      jsonfile: 6.1.0
-      react-confetti: 6.1.0(react@18.3.1)
-      strip-ansi: 7.1.0
+      '@babel/traverse': 7.25.7
+      '@babel/types': 7.25.7
     transitivePeerDependencies:
-      - '@chromatic-com/cypress'
-      - '@chromatic-com/playwright'
-      - react
-    dev: true
+      - supports-color
 
-  /@clack/core@0.3.4:
-    resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==}
+  '@babel/helper-module-imports@7.18.6':
     dependencies:
-      picocolors: 1.0.0
-      sisteransi: 1.0.5
-    dev: true
+      '@babel/types': 7.25.7
 
-  /@clack/prompts@0.7.0:
-    resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==}
+  '@babel/helper-module-imports@7.25.7':
     dependencies:
-      '@clack/core': 0.3.4
-      picocolors: 1.0.0
-      sisteransi: 1.0.5
-    dev: true
-    bundledDependencies:
-      - is-unicode-supported
-
-  /@colors/colors@1.5.0:
-    resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
-    engines: {node: '>=0.1.90'}
-    requiresBuild: true
-    dev: true
-    optional: true
+      '@babel/traverse': 7.25.7
+      '@babel/types': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@csstools/postcss-cascade-layers@4.0.3(postcss@8.4.35):
-    resolution: {integrity: sha512-RbkQoOH23yGhWVetgBTwFgIOHEyU2tKMN7blTz/YAKKabR6tr9pP7mYS23Q9snFY2hr8WSaV8Le64KdM9BtUSA==}
-    engines: {node: ^14 || ^16 || >=18}
-    peerDependencies:
-      postcss: ^8.4
+  '@babel/helper-module-transforms@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.15)
-      postcss: 8.4.35
-      postcss-selector-parser: 6.0.15
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-module-imports': 7.25.7
+      '@babel/helper-simple-access': 7.25.7
+      '@babel/helper-validator-identifier': 7.25.7
+      '@babel/traverse': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@csstools/selector-specificity@3.0.2(postcss-selector-parser@6.0.15):
-    resolution: {integrity: sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==}
-    engines: {node: ^14 || ^16 || >=18}
-    peerDependencies:
-      postcss-selector-parser: ^6.0.13
+  '@babel/helper-optimise-call-expression@7.25.7':
     dependencies:
-      postcss-selector-parser: 6.0.15
-    dev: true
+      '@babel/types': 7.25.7
 
-  /@discoveryjs/json-ext@0.5.7:
-    resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==}
-    engines: {node: '>=10.0.0'}
-    dev: true
+  '@babel/helper-plugin-utils@7.25.7': {}
 
-  /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1):
-    resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==}
-    peerDependencies:
-      react: '>=16.8.0'
+  '@babel/helper-remap-async-to-generator@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      react: 18.3.1
-    dev: true
-
-  /@esbuild/aix-ppc64@0.19.12:
-    resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [aix]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/aix-ppc64@0.20.2:
-    resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [aix]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/android-arm64@0.19.12:
-    resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/android-arm64@0.20.2:
-    resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/android-arm@0.19.12:
-    resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/android-arm@0.20.2:
-    resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/android-x64@0.19.12:
-    resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/android-x64@0.20.2:
-    resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/darwin-arm64@0.19.12:
-    resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/darwin-arm64@0.20.2:
-    resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/darwin-x64@0.19.12:
-    resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/darwin-x64@0.20.2:
-    resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/freebsd-arm64@0.19.12:
-    resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/freebsd-arm64@0.20.2:
-    resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/freebsd-x64@0.19.12:
-    resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/freebsd-x64@0.20.2:
-    resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/linux-arm64@0.19.12:
-    resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/linux-arm64@0.20.2:
-    resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/linux-arm@0.19.12:
-    resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /@esbuild/linux-arm@0.20.2:
-    resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+      '@babel/core': 7.25.7
+      '@babel/helper-annotate-as-pure': 7.25.7
+      '@babel/helper-wrap-function': 7.25.7
+      '@babel/traverse': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@esbuild/linux-ia32@0.19.12:
-    resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/helper-replace-supers@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-member-expression-to-functions': 7.25.7
+      '@babel/helper-optimise-call-expression': 7.25.7
+      '@babel/traverse': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@esbuild/linux-ia32@0.20.2:
-    resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/helper-simple-access@7.25.7':
+    dependencies:
+      '@babel/traverse': 7.25.7
+      '@babel/types': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@esbuild/linux-loong64@0.19.12:
-    resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
-    engines: {node: '>=12'}
-    cpu: [loong64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/helper-skip-transparent-expression-wrappers@7.25.7':
+    dependencies:
+      '@babel/traverse': 7.25.7
+      '@babel/types': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@esbuild/linux-loong64@0.20.2:
-    resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==}
-    engines: {node: '>=12'}
-    cpu: [loong64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/helper-split-export-declaration@7.24.7':
+    dependencies:
+      '@babel/types': 7.25.7
 
-  /@esbuild/linux-mips64el@0.19.12:
-    resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/helper-string-parser@7.25.7': {}
 
-  /@esbuild/linux-mips64el@0.20.2:
-    resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==}
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/helper-validator-identifier@7.25.7': {}
 
-  /@esbuild/linux-ppc64@0.19.12:
-    resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/helper-validator-option@7.25.7': {}
 
-  /@esbuild/linux-ppc64@0.20.2:
-    resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/helper-wrap-function@7.25.7':
+    dependencies:
+      '@babel/template': 7.25.7
+      '@babel/traverse': 7.25.7
+      '@babel/types': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@esbuild/linux-riscv64@0.19.12:
-    resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/helpers@7.25.7':
+    dependencies:
+      '@babel/template': 7.25.7
+      '@babel/types': 7.25.7
 
-  /@esbuild/linux-riscv64@0.20.2:
-    resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==}
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/highlight@7.25.7':
+    dependencies:
+      '@babel/helper-validator-identifier': 7.25.7
+      chalk: 2.4.2
+      js-tokens: 4.0.0
+      picocolors: 1.1.0
 
-  /@esbuild/linux-s390x@0.19.12:
-    resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/parser@7.25.7':
+    dependencies:
+      '@babel/types': 7.25.7
 
-  /@esbuild/linux-s390x@0.20.2:
-    resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==}
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/traverse': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@esbuild/linux-x64@0.19.12:
-    resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@esbuild/linux-x64@0.20.2:
-    resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@esbuild/netbsd-x64@0.19.12:
-    resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.7
+      '@babel/plugin-transform-optional-chaining': 7.25.7(@babel/core@7.25.7)
+    transitivePeerDependencies:
+      - supports-color
 
-  /@esbuild/netbsd-x64@0.20.2:
-    resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/traverse': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@esbuild/openbsd-x64@0.19.12:
-    resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
 
-  /@esbuild/openbsd-x64@0.20.2:
-    resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@esbuild/sunos-x64@0.19.12:
-    resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@esbuild/sunos-x64@0.20.2:
-    resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@esbuild/win32-arm64@0.19.12:
-    resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@esbuild/win32-arm64@0.20.2:
-    resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@esbuild/win32-ia32@0.19.12:
-    resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@esbuild/win32-ia32@0.20.2:
-    resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-syntax-import-assertions@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@esbuild/win32-x64@0.19.12:
-    resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-syntax-import-attributes@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@esbuild/win32-x64@0.20.2:
-    resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0):
-    resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    peerDependencies:
-      eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+  '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.7)':
     dependencies:
-      eslint: 8.57.0
-      eslint-visitor-keys: 3.4.3
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@eslint-community/regexpp@4.10.0:
-    resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
-    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
-    dev: true
+  '@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@eslint-community/regexpp@4.5.0:
-    resolution: {integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==}
-    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
-    dev: true
+  '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@eslint/eslintrc@2.1.4:
-    resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+  '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.7)':
     dependencies:
-      ajv: 6.12.6
-      debug: 4.3.4
-      espree: 9.6.1
-      globals: 13.20.0
-      ignore: 5.3.1
-      import-fresh: 3.3.0
-      js-yaml: 4.1.0
-      minimatch: 3.1.2
-      strip-json-comments: 3.1.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@eslint/js@8.57.0:
-    resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    dev: true
+  '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@fal-works/esbuild-plugin-global-externals@2.1.2:
-    resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==}
-    dev: true
+  '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@floating-ui/core@1.6.0:
-    resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==}
+  '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.7)':
     dependencies:
-      '@floating-ui/utils': 0.2.1
-    dev: false
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@floating-ui/dom@1.6.3:
-    resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==}
+  '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.7)':
     dependencies:
-      '@floating-ui/core': 1.6.0
-      '@floating-ui/utils': 0.2.1
-    dev: false
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@floating-ui/utils@0.2.1:
-    resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==}
-    dev: false
+  '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@fontsource/inter@5.0.17:
-    resolution: {integrity: sha512-2meBGx1kt7u5LwzGc5Sz5rka6ZDrydg6nT3x6Wkt310vHXUchIywrO8pooWMzZdHYcyFY/cv4lEpJZgMD94bCg==}
-    dev: false
+  '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@fontsource/jetbrains-mono@5.0.19:
-    resolution: {integrity: sha512-SdwUuvdfuAvGWRRc4LOFRSmDrpkE+vFUpCtOIOUl1PpXdLfeU//93BZiGf7j/oFGSZJbHAurfux2uLT38/NIjw==}
-    dev: false
+  '@babel/plugin-syntax-typescript@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@fontsource/open-sans@5.0.27:
-    resolution: {integrity: sha512-tFTqx2TE9srmM3pMEHldw0lTglqhKwFX6PVDEL0OF9xNT0x5W9brsezFHhV/U36pQV9So7S0vo4yVpnLzBBQew==}
-    dev: false
+  '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@hcaptcha/types@1.0.3:
-    resolution: {integrity: sha512-1mbU6eSGawRrqeahRrOzZo/SVLI6oZ5/azuBpSyVrRRR96CnS3fOVDWfzxpngfxKD0/I9Rwu6c/3ITqD8rXeTQ==}
-    dev: false
+  '@babel/plugin-transform-arrow-functions@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@humanwhocodes/config-array@0.11.14:
-    resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
-    engines: {node: '>=10.10.0'}
+  '@babel/plugin-transform-async-generator-functions@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@humanwhocodes/object-schema': 2.0.2
-      debug: 4.3.4
-      minimatch: 3.1.2
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/helper-remap-async-to-generator': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.7)
+      '@babel/traverse': 7.25.7
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /@humanwhocodes/module-importer@1.0.1:
-    resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
-    engines: {node: '>=12.22'}
-    dev: true
-
-  /@humanwhocodes/object-schema@2.0.2:
-    resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==}
-    dev: true
+  '@babel/plugin-transform-async-to-generator@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-module-imports': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/helper-remap-async-to-generator': 7.25.7(@babel/core@7.25.7)
+    transitivePeerDependencies:
+      - supports-color
 
-  /@isaacs/cliui@8.0.2:
-    resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
-    engines: {node: '>=12'}
+  '@babel/plugin-transform-block-scoped-functions@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      string-width: 5.1.2
-      string-width-cjs: /string-width@4.2.3
-      strip-ansi: 7.1.0
-      strip-ansi-cjs: /strip-ansi@6.0.1
-      wrap-ansi: 8.1.0
-      wrap-ansi-cjs: /wrap-ansi@7.0.0
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@istanbuljs/load-nyc-config@1.1.0:
-    resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
-    engines: {node: '>=8'}
+  '@babel/plugin-transform-block-scoping@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      camelcase: 5.3.1
-      find-up: 4.1.0
-      get-package-type: 0.1.0
-      js-yaml: 3.14.1
-      resolve-from: 5.0.0
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@istanbuljs/schema@0.1.3:
-    resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
-    engines: {node: '>=8'}
-    dev: true
+  '@babel/plugin-transform-class-properties@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-create-class-features-plugin': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@jest/console@27.5.1:
-    resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  '@babel/plugin-transform-class-static-block@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@jest/types': 27.5.1
-      '@types/node': 20.12.2
-      chalk: 4.1.2
-      jest-message-util: 27.5.1
-      jest-util: 27.5.1
-      slash: 3.0.0
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-create-class-features-plugin': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.7)
+    transitivePeerDependencies:
+      - supports-color
 
-  /@jest/core@27.5.1:
-    resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    peerDependencies:
-      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
-    peerDependenciesMeta:
-      node-notifier:
-        optional: true
+  '@babel/plugin-transform-classes@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@jest/console': 27.5.1
-      '@jest/reporters': 27.5.1
-      '@jest/test-result': 27.5.1
-      '@jest/transform': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/node': 20.12.2
-      ansi-escapes: 4.3.2
-      chalk: 4.1.2
-      emittery: 0.8.1
-      exit: 0.1.2
-      graceful-fs: 4.2.11
-      jest-changed-files: 27.5.1
-      jest-config: 27.5.1
-      jest-haste-map: 27.5.1
-      jest-message-util: 27.5.1
-      jest-regex-util: 27.5.1
-      jest-resolve: 27.5.1
-      jest-resolve-dependencies: 27.5.1
-      jest-runner: 27.5.1
-      jest-runtime: 27.5.1
-      jest-snapshot: 27.5.1
-      jest-util: 27.5.1
-      jest-validate: 27.5.1
-      jest-watcher: 27.5.1
-      micromatch: 4.0.5
-      rimraf: 3.0.2
-      slash: 3.0.0
-      strip-ansi: 6.0.1
+      '@babel/core': 7.25.7
+      '@babel/helper-annotate-as-pure': 7.25.7
+      '@babel/helper-compilation-targets': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/helper-replace-supers': 7.25.7(@babel/core@7.25.7)
+      '@babel/traverse': 7.25.7
+      globals: 11.12.0
     transitivePeerDependencies:
-      - bufferutil
-      - canvas
       - supports-color
-      - ts-node
-      - utf-8-validate
-    dev: true
 
-  /@jest/environment@27.5.1:
-    resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  '@babel/plugin-transform-computed-properties@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@jest/fake-timers': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/node': 20.12.2
-      jest-mock: 27.5.1
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/template': 7.25.7
 
-  /@jest/fake-timers@27.5.1:
-    resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  '@babel/plugin-transform-destructuring@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@jest/types': 27.5.1
-      '@sinonjs/fake-timers': 8.1.0
-      '@types/node': 20.12.2
-      jest-message-util: 27.5.1
-      jest-mock: 27.5.1
-      jest-util: 27.5.1
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@jest/globals@27.5.1:
-    resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  '@babel/plugin-transform-dotall-regex@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@jest/environment': 27.5.1
-      '@jest/types': 27.5.1
-      expect: 27.5.1
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@jest/reporters@27.5.1:
-    resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    peerDependencies:
-      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
-    peerDependenciesMeta:
-      node-notifier:
-        optional: true
+  '@babel/plugin-transform-duplicate-keys@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@bcoe/v8-coverage': 0.2.3
-      '@jest/console': 27.5.1
-      '@jest/test-result': 27.5.1
-      '@jest/transform': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/node': 20.12.2
-      chalk: 4.1.2
-      collect-v8-coverage: 1.0.1
-      exit: 0.1.2
-      glob: 7.2.3
-      graceful-fs: 4.2.11
-      istanbul-lib-coverage: 3.2.2
-      istanbul-lib-instrument: 5.2.1
-      istanbul-lib-report: 3.0.1
-      istanbul-lib-source-maps: 4.0.1
-      istanbul-reports: 3.1.7
-      jest-haste-map: 27.5.1
-      jest-resolve: 27.5.1
-      jest-util: 27.5.1
-      jest-worker: 27.5.1
-      slash: 3.0.0
-      source-map: 0.6.1
-      string-length: 4.0.2
-      terminal-link: 2.1.1
-      v8-to-istanbul: 8.1.1
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+
+  '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
+
+  '@babel/plugin-transform-dynamic-import@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.7)
+
+  '@babel/plugin-transform-exponentiation-operator@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /@jest/schemas@29.6.3:
-    resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+  '@babel/plugin-transform-export-namespace-from@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@sinclair/typebox': 0.27.8
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.7)
 
-  /@jest/source-map@27.5.1:
-    resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  '@babel/plugin-transform-for-of@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      callsites: 3.1.0
-      graceful-fs: 4.2.11
-      source-map: 0.6.1
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@jest/test-result@27.5.1:
-    resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  '@babel/plugin-transform-function-name@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@jest/console': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/istanbul-lib-coverage': 2.0.4
-      collect-v8-coverage: 1.0.1
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-compilation-targets': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/traverse': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@jest/test-sequencer@27.5.1:
-    resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  '@babel/plugin-transform-json-strings@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@jest/test-result': 27.5.1
-      graceful-fs: 4.2.11
-      jest-haste-map: 27.5.1
-      jest-runtime: 27.5.1
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.7)
+
+  '@babel/plugin-transform-literals@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+
+  '@babel/plugin-transform-logical-assignment-operators@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.7)
+
+  '@babel/plugin-transform-member-expression-literals@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+
+  '@babel/plugin-transform-modules-amd@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /@jest/transform@27.5.1:
-    resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  '@babel/plugin-transform-modules-commonjs@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@babel/core': 7.24.0
-      '@jest/types': 27.5.1
-      babel-plugin-istanbul: 6.1.1
-      chalk: 4.1.2
-      convert-source-map: 1.9.0
-      fast-json-stable-stringify: 2.1.0
-      graceful-fs: 4.2.11
-      jest-haste-map: 27.5.1
-      jest-regex-util: 27.5.1
-      jest-util: 27.5.1
-      micromatch: 4.0.5
-      pirates: 4.0.5
-      slash: 3.0.0
-      source-map: 0.6.1
-      write-file-atomic: 3.0.3
+      '@babel/core': 7.25.7
+      '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/helper-simple-access': 7.25.7
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /@jest/types@27.5.1:
-    resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  '@babel/plugin-transform-modules-systemjs@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@types/istanbul-lib-coverage': 2.0.4
-      '@types/istanbul-reports': 3.0.1
-      '@types/node': 20.12.2
-      '@types/yargs': 16.0.4
-      chalk: 4.1.2
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/helper-validator-identifier': 7.25.7
+      '@babel/traverse': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@jridgewell/gen-mapping@0.3.5:
-    resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
-    engines: {node: '>=6.0.0'}
+  '@babel/plugin-transform-modules-umd@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@jridgewell/set-array': 1.2.1
-      '@jridgewell/sourcemap-codec': 1.4.15
-      '@jridgewell/trace-mapping': 0.3.25
-    dev: true
-
-  /@jridgewell/resolve-uri@3.1.2:
-    resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
-    engines: {node: '>=6.0.0'}
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@jridgewell/set-array@1.2.1:
-    resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
-    engines: {node: '>=6.0.0'}
-    dev: true
+  '@babel/plugin-transform-named-capturing-groups-regex@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@jridgewell/source-map@0.3.6:
-    resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
+  '@babel/plugin-transform-new-target@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@jridgewell/gen-mapping': 0.3.5
-      '@jridgewell/trace-mapping': 0.3.25
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@jridgewell/sourcemap-codec@1.4.15:
-    resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
-    dev: true
+  '@babel/plugin-transform-nullish-coalescing-operator@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.7)
 
-  /@jridgewell/trace-mapping@0.3.25:
-    resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+  '@babel/plugin-transform-numeric-separator@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@jridgewell/resolve-uri': 3.1.2
-      '@jridgewell/sourcemap-codec': 1.4.15
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.7)
 
-  /@material-design-icons/svg@0.14.13:
-    resolution: {integrity: sha512-nCExGZOtoLoFeeqShEOM4XA9DkkLzLlQdk/ZxHxps0//dz6e1Lw3fvQbZ2X/+0Dz2O+udiEukfZ4Nd4KpHg8aA==}
-    dev: false
+  '@babel/plugin-transform-object-rest-spread@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-compilation-targets': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.7)
+      '@babel/plugin-transform-parameters': 7.25.7(@babel/core@7.25.7)
 
-  /@material/material-color-utilities@0.2.7:
-    resolution: {integrity: sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==}
-    dev: false
+  '@babel/plugin-transform-object-super@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/helper-replace-supers': 7.25.7(@babel/core@7.25.7)
+    transitivePeerDependencies:
+      - supports-color
 
-  /@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==}
-    peerDependencies:
-      '@types/react': '>=16'
-      react: '>=16'
+  '@babel/plugin-transform-optional-catch-binding@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@types/mdx': 2.0.13
-      '@types/react': 18.3.3
-      react: 18.3.1
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.7)
 
-  /@minht11/solid-virtual-container@0.2.1(solid-js@1.8.15):
-    resolution: {integrity: sha512-HvQWx1uE5NWwx9WsN4waFtmyOjhZKMA/3vBf+j3zGsRfi556LCUk4oOmqZcOvIB5nEpHezvuZ8oUlwxigdO3Xg==}
-    peerDependencies:
-      solid-js: '>= 1.0.0'
+  '@babel/plugin-transform-optional-chaining@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      solid-js: 1.8.15
-    dev: false
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.7
+      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.7)
+    transitivePeerDependencies:
+      - supports-color
 
-  /@motionone/animation@10.17.0:
-    resolution: {integrity: sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg==}
+  '@babel/plugin-transform-parameters@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@motionone/easing': 10.17.0
-      '@motionone/types': 10.17.0
-      '@motionone/utils': 10.17.0
-      tslib: 2.6.2
-    dev: false
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@motionone/dom@10.17.0:
-    resolution: {integrity: sha512-cMm33swRlCX/qOPHWGbIlCl0K9Uwi6X5RiL8Ma6OrlJ/TP7Q+Np5GE4xcZkFptysFjMTi4zcZzpnNQGQ5D6M0Q==}
+  '@babel/plugin-transform-private-methods@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@motionone/animation': 10.17.0
-      '@motionone/generators': 10.17.0
-      '@motionone/types': 10.17.0
-      '@motionone/utils': 10.17.0
-      hey-listen: 1.0.8
-      tslib: 2.6.2
-    dev: false
+      '@babel/core': 7.25.7
+      '@babel/helper-create-class-features-plugin': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
 
-  /@motionone/easing@10.17.0:
-    resolution: {integrity: sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg==}
+  '@babel/plugin-transform-private-property-in-object@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@motionone/utils': 10.17.0
-      tslib: 2.6.2
-    dev: false
+      '@babel/core': 7.25.7
+      '@babel/helper-annotate-as-pure': 7.25.7
+      '@babel/helper-create-class-features-plugin': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.7)
+    transitivePeerDependencies:
+      - supports-color
 
-  /@motionone/generators@10.17.0:
-    resolution: {integrity: sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ==}
+  '@babel/plugin-transform-property-literals@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@motionone/types': 10.17.0
-      '@motionone/utils': 10.17.0
-      tslib: 2.6.2
-    dev: false
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@motionone/solid@10.16.4(solid-js@1.8.15):
-    resolution: {integrity: sha512-xS3vDhWgTB7xdSYnOTs69Ai09WWjuG6bbz2E+NjP7DswD3X2jLZNNTFmf8GTGhj7UeFHiZgtERIjvpGgZTuEiQ==}
-    deprecated: Motion One for Solid is deprecated. Use solid-motionone instead https://github.com/solidjs-community/solid-motionone
-    peerDependencies:
-      solid-js: ^1.5.0
+  '@babel/plugin-transform-regenerator@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@motionone/dom': 10.17.0
-      '@motionone/utils': 10.17.0
-      '@solid-primitives/props': 3.1.11(solid-js@1.8.15)
-      '@solid-primitives/refs': 1.0.8(solid-js@1.8.15)
-      '@solid-primitives/transition-group': 1.0.5(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      regenerator-transform: 0.15.2
 
-  /@motionone/types@10.17.0:
-    resolution: {integrity: sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA==}
-    dev: false
+  '@babel/plugin-transform-reserved-words@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@motionone/utils@10.17.0:
-    resolution: {integrity: sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg==}
+  '@babel/plugin-transform-shorthand-properties@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      '@motionone/types': 10.17.0
-      hey-listen: 1.0.8
-      tslib: 2.6.2
-    dev: false
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
 
-  /@mxssfd/typedoc-theme@1.1.3(typedoc@0.25.1):
-    resolution: {integrity: sha512-/yP5rqhvibMpzXpmw0YLLRCpoj3uVWWlwyJseZXzGxTfiA6/fd1uubUqNoQAi2U19atMDonq8mQc+hlVctrX4g==}
-    engines: {node: '>= 14'}
-    peerDependencies:
-      typedoc: ^0.25.1
+  '@babel/plugin-transform-spread@7.25.7(@babel/core@7.25.7)':
     dependencies:
-      typedoc: 0.25.1(typescript@5.4.2)
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.7
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-sticky-regex@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+
+  '@babel/plugin-transform-template-literals@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+
+  '@babel/plugin-transform-typeof-symbol@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+
+  '@babel/plugin-transform-typescript@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-annotate-as-pure': 7.25.7
+      '@babel/helper-create-class-features-plugin': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.7
+      '@babel/plugin-syntax-typescript': 7.25.7(@babel/core@7.25.7)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-unicode-escapes@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+
+  '@babel/plugin-transform-unicode-property-regex@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
+
+  '@babel/plugin-transform-unicode-regex@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
+
+  '@babel/plugin-transform-unicode-sets-regex@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/core': 7.25.7
+      '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.7)
+      '@babel/helper-plugin-utils': 7.25.7
+
+  '@babel/preset-env@7.25.7(@babel/core@7.25.7)':
+    dependencies:
+      '@babel/compat-data': 7.25.7
+      '@babel/core': 7.25.7
+      '@babel/helper-compilation-targets': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/helper-validator-option': 7.25.7
+      '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.7)
+      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.7)
+      '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.7)
+      '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.7)
+      '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.7)
+      '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.7)
+      '@babel/plugin-syntax-import-assertions': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-syntax-import-attributes': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.7)
+      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.7)
+      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.7)
+      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.7)
+      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.7)
+      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.7)
+      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.7)
+      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.7)
+      '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.7)
+      '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.7)
+      '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.7)
+      '@babel/plugin-transform-arrow-functions': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-async-generator-functions': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-async-to-generator': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-block-scoped-functions': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-block-scoping': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-class-properties': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-class-static-block': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-classes': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-computed-properties': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-destructuring': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-dotall-regex': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-duplicate-keys': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-dynamic-import': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-exponentiation-operator': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-export-namespace-from': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-for-of': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-function-name': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-json-strings': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-literals': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-logical-assignment-operators': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-member-expression-literals': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-modules-amd': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-modules-commonjs': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-modules-systemjs': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-modules-umd': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-named-capturing-groups-regex': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-new-target': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-nullish-coalescing-operator': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-numeric-separator': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-object-rest-spread': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-object-super': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-optional-catch-binding': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-optional-chaining': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-parameters': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-private-methods': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-private-property-in-object': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-property-literals': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-regenerator': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-reserved-words': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-shorthand-properties': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-spread': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-sticky-regex': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-template-literals': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-typeof-symbol': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-unicode-escapes': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-unicode-property-regex': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-unicode-regex': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-transform-unicode-sets-regex': 7.25.7(@babel/core@7.25.7)
+      '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.7)
+      babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.7)
+      babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.7)
+      babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.7)
+      core-js-compat: 3.38.1
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
 
-  /@ndelangen/get-tarball@3.0.9:
-    resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==}
+  '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.7)':
     dependencies:
-      gunzip-maybe: 1.4.2
-      pump: 3.0.0
-      tar-fs: 2.1.1
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/types': 7.25.7
+      esutils: 2.0.3
 
-  /@nodelib/fs.scandir@2.1.5:
-    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
-    engines: {node: '>= 8'}
+  '@babel/preset-typescript@7.16.7(@babel/core@7.25.7)':
     dependencies:
-      '@nodelib/fs.stat': 2.0.5
-      run-parallel: 1.2.0
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-plugin-utils': 7.25.7
+      '@babel/helper-validator-option': 7.25.7
+      '@babel/plugin-transform-typescript': 7.25.7(@babel/core@7.25.7)
+    transitivePeerDependencies:
+      - supports-color
 
-  /@nodelib/fs.stat@2.0.5:
-    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
-    engines: {node: '>= 8'}
-    dev: true
+  '@babel/runtime@7.25.7':
+    dependencies:
+      regenerator-runtime: 0.14.1
 
-  /@nodelib/fs.walk@1.2.8:
-    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
-    engines: {node: '>= 8'}
+  '@babel/template@7.25.7':
     dependencies:
-      '@nodelib/fs.scandir': 2.1.5
-      fastq: 1.13.0
-    dev: true
+      '@babel/code-frame': 7.25.7
+      '@babel/parser': 7.25.7
+      '@babel/types': 7.25.7
 
-  /@nothing-but/utils@0.12.1:
-    resolution: {integrity: sha512-1qZU1Q5El0IjE7JT/ucvJNzdr2hL3W8Rm27xNf1p6gb3Nw8pGnZmxp6/GEW9h+I1k1cICxXNq25hBwknTQ7yhg==}
-    dev: false
+  '@babel/traverse@7.23.2':
+    dependencies:
+      '@babel/code-frame': 7.25.7
+      '@babel/generator': 7.25.7
+      '@babel/helper-environment-visitor': 7.24.7
+      '@babel/helper-function-name': 7.24.7
+      '@babel/helper-hoist-variables': 7.24.7
+      '@babel/helper-split-export-declaration': 7.24.7
+      '@babel/parser': 7.25.7
+      '@babel/types': 7.25.7
+      debug: 4.3.7
+      globals: 11.12.0
+    transitivePeerDependencies:
+      - supports-color
 
-  /@octokit/app@13.1.8:
-    resolution: {integrity: sha512-bCncePMguVyFpdBbnceFKfmPOuUD94T189GuQ0l00ZcQ+mX4hyPqnaWJlsXE2HSdA71eV7p8GPDZ+ErplTkzow==}
-    engines: {node: '>= 14'}
+  '@babel/traverse@7.25.7':
     dependencies:
-      '@octokit/auth-app': 4.0.13
-      '@octokit/auth-unauthenticated': 3.0.5
-      '@octokit/core': 4.2.4
-      '@octokit/oauth-app': 4.2.4
-      '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4)
-      '@octokit/types': 9.3.2
-      '@octokit/webhooks': 10.9.2
+      '@babel/code-frame': 7.25.7
+      '@babel/generator': 7.25.7
+      '@babel/parser': 7.25.7
+      '@babel/template': 7.25.7
+      '@babel/types': 7.25.7
+      debug: 4.3.7
+      globals: 11.12.0
     transitivePeerDependencies:
-      - encoding
-    dev: false
+      - supports-color
 
-  /@octokit/auth-app@4.0.13:
-    resolution: {integrity: sha512-NBQkmR/Zsc+8fWcVIFrwDgNXS7f4XDrkd9LHdi9DPQw1NdGHLviLzRO2ZBwTtepnwHXW5VTrVU9eFGijMUqllg==}
-    engines: {node: '>= 14'}
+  '@babel/types@7.17.0':
     dependencies:
-      '@octokit/auth-oauth-app': 5.0.6
-      '@octokit/auth-oauth-user': 2.1.2
-      '@octokit/request': 6.2.8
-      '@octokit/request-error': 3.0.3
-      '@octokit/types': 9.3.2
-      deprecation: 2.3.1
-      lru-cache: 9.1.2
-      universal-github-app-jwt: 1.1.2
-      universal-user-agent: 6.0.1
+      '@babel/helper-validator-identifier': 7.25.7
+      to-fast-properties: 2.0.0
+
+  '@babel/types@7.25.7':
+    dependencies:
+      '@babel/helper-string-parser': 7.25.7
+      '@babel/helper-validator-identifier': 7.25.7
+      to-fast-properties: 2.0.0
+
+  '@bcoe/v8-coverage@0.2.3': {}
+
+  '@chromatic-com/storybook@2.0.2(react@18.3.1)':
+    dependencies:
+      chromatic: 11.12.0
+      filesize: 10.1.6
+      jsonfile: 6.1.0
+      react-confetti: 6.1.0(react@18.3.1)
+      strip-ansi: 7.1.0
     transitivePeerDependencies:
-      - encoding
-    dev: false
+      - '@chromatic-com/cypress'
+      - '@chromatic-com/playwright'
+      - react
+
+  '@clack/core@0.3.4':
+    dependencies:
+      picocolors: 1.1.0
+      sisteransi: 1.0.5
+
+  '@clack/prompts@0.7.0':
+    dependencies:
+      '@clack/core': 0.3.4
+      picocolors: 1.1.0
+      sisteransi: 1.0.5
+
+  '@csstools/postcss-cascade-layers@4.0.6(postcss@8.4.47)':
+    dependencies:
+      '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.1)
+      postcss: 8.4.47
+      postcss-selector-parser: 6.1.1
+
+  '@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.1)':
+    dependencies:
+      postcss-selector-parser: 6.1.1
+
+  '@esbuild/aix-ppc64@0.20.2':
+    optional: true
+
+  '@esbuild/aix-ppc64@0.21.5':
+    optional: true
+
+  '@esbuild/aix-ppc64@0.23.1':
+    optional: true
+
+  '@esbuild/android-arm64@0.20.2':
+    optional: true
+
+  '@esbuild/android-arm64@0.21.5':
+    optional: true
+
+  '@esbuild/android-arm64@0.23.1':
+    optional: true
+
+  '@esbuild/android-arm@0.20.2':
+    optional: true
+
+  '@esbuild/android-arm@0.21.5':
+    optional: true
+
+  '@esbuild/android-arm@0.23.1':
+    optional: true
+
+  '@esbuild/android-x64@0.20.2':
+    optional: true
+
+  '@esbuild/android-x64@0.21.5':
+    optional: true
+
+  '@esbuild/android-x64@0.23.1':
+    optional: true
+
+  '@esbuild/darwin-arm64@0.20.2':
+    optional: true
+
+  '@esbuild/darwin-arm64@0.21.5':
+    optional: true
+
+  '@esbuild/darwin-arm64@0.23.1':
+    optional: true
+
+  '@esbuild/darwin-x64@0.20.2':
+    optional: true
+
+  '@esbuild/darwin-x64@0.21.5':
+    optional: true
+
+  '@esbuild/darwin-x64@0.23.1':
+    optional: true
+
+  '@esbuild/freebsd-arm64@0.20.2':
+    optional: true
+
+  '@esbuild/freebsd-arm64@0.21.5':
+    optional: true
+
+  '@esbuild/freebsd-arm64@0.23.1':
+    optional: true
+
+  '@esbuild/freebsd-x64@0.20.2':
+    optional: true
+
+  '@esbuild/freebsd-x64@0.21.5':
+    optional: true
+
+  '@esbuild/freebsd-x64@0.23.1':
+    optional: true
+
+  '@esbuild/linux-arm64@0.20.2':
+    optional: true
+
+  '@esbuild/linux-arm64@0.21.5':
+    optional: true
+
+  '@esbuild/linux-arm64@0.23.1':
+    optional: true
+
+  '@esbuild/linux-arm@0.20.2':
+    optional: true
+
+  '@esbuild/linux-arm@0.21.5':
+    optional: true
+
+  '@esbuild/linux-arm@0.23.1':
+    optional: true
+
+  '@esbuild/linux-ia32@0.20.2':
+    optional: true
+
+  '@esbuild/linux-ia32@0.21.5':
+    optional: true
+
+  '@esbuild/linux-ia32@0.23.1':
+    optional: true
+
+  '@esbuild/linux-loong64@0.20.2':
+    optional: true
+
+  '@esbuild/linux-loong64@0.21.5':
+    optional: true
+
+  '@esbuild/linux-loong64@0.23.1':
+    optional: true
+
+  '@esbuild/linux-mips64el@0.20.2':
+    optional: true
+
+  '@esbuild/linux-mips64el@0.21.5':
+    optional: true
+
+  '@esbuild/linux-mips64el@0.23.1':
+    optional: true
+
+  '@esbuild/linux-ppc64@0.20.2':
+    optional: true
+
+  '@esbuild/linux-ppc64@0.21.5':
+    optional: true
+
+  '@esbuild/linux-ppc64@0.23.1':
+    optional: true
+
+  '@esbuild/linux-riscv64@0.20.2':
+    optional: true
 
-  /@octokit/auth-oauth-app@5.0.6:
-    resolution: {integrity: sha512-SxyfIBfeFcWd9Z/m1xa4LENTQ3l1y6Nrg31k2Dcb1jS5ov7pmwMJZ6OGX8q3K9slRgVpeAjNA1ipOAMHkieqyw==}
-    engines: {node: '>= 14'}
-    dependencies:
-      '@octokit/auth-oauth-device': 4.0.5
-      '@octokit/auth-oauth-user': 2.1.2
-      '@octokit/request': 6.2.8
-      '@octokit/types': 9.3.2
-      '@types/btoa-lite': 1.0.2
-      btoa-lite: 1.0.0
-      universal-user-agent: 6.0.1
-    transitivePeerDependencies:
-      - encoding
-    dev: false
+  '@esbuild/linux-riscv64@0.21.5':
+    optional: true
 
-  /@octokit/auth-oauth-device@4.0.5:
-    resolution: {integrity: sha512-XyhoWRTzf2ZX0aZ52a6Ew5S5VBAfwwx1QnC2Np6Et3MWQpZjlREIcbcvVZtkNuXp6Z9EeiSLSDUqm3C+aMEHzQ==}
-    engines: {node: '>= 14'}
-    dependencies:
-      '@octokit/oauth-methods': 2.0.6
-      '@octokit/request': 6.2.8
-      '@octokit/types': 9.3.2
-      universal-user-agent: 6.0.1
-    transitivePeerDependencies:
-      - encoding
-    dev: false
+  '@esbuild/linux-riscv64@0.23.1':
+    optional: true
 
-  /@octokit/auth-oauth-user@2.1.2:
-    resolution: {integrity: sha512-kkRqNmFe7s5GQcojE3nSlF+AzYPpPv7kvP/xYEnE57584pixaFBH8Vovt+w5Y3E4zWUEOxjdLItmBTFAWECPAg==}
-    engines: {node: '>= 14'}
-    dependencies:
-      '@octokit/auth-oauth-device': 4.0.5
-      '@octokit/oauth-methods': 2.0.6
-      '@octokit/request': 6.2.8
-      '@octokit/types': 9.3.2
-      btoa-lite: 1.0.0
-      universal-user-agent: 6.0.1
-    transitivePeerDependencies:
-      - encoding
-    dev: false
+  '@esbuild/linux-s390x@0.20.2':
+    optional: true
 
-  /@octokit/auth-token@3.0.4:
-    resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==}
-    engines: {node: '>= 14'}
-    dev: false
+  '@esbuild/linux-s390x@0.21.5':
+    optional: true
 
-  /@octokit/auth-unauthenticated@3.0.5:
-    resolution: {integrity: sha512-yH2GPFcjrTvDWPwJWWCh0tPPtTL5SMgivgKPA+6v/XmYN6hGQkAto8JtZibSKOpf8ipmeYhLNWQ2UgW0GYILCw==}
-    engines: {node: '>= 14'}
-    dependencies:
-      '@octokit/request-error': 3.0.3
-      '@octokit/types': 9.3.2
-    dev: false
+  '@esbuild/linux-s390x@0.23.1':
+    optional: true
 
-  /@octokit/core@4.2.4:
-    resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==}
-    engines: {node: '>= 14'}
-    dependencies:
-      '@octokit/auth-token': 3.0.4
-      '@octokit/graphql': 5.0.6
-      '@octokit/request': 6.2.8
-      '@octokit/request-error': 3.0.3
-      '@octokit/types': 9.3.2
-      before-after-hook: 2.2.3
-      universal-user-agent: 6.0.1
-    transitivePeerDependencies:
-      - encoding
-    dev: false
+  '@esbuild/linux-x64@0.20.2':
+    optional: true
 
-  /@octokit/endpoint@7.0.6:
-    resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==}
-    engines: {node: '>= 14'}
-    dependencies:
-      '@octokit/types': 9.3.2
-      is-plain-object: 5.0.0
-      universal-user-agent: 6.0.1
-    dev: false
+  '@esbuild/linux-x64@0.21.5':
+    optional: true
 
-  /@octokit/graphql@5.0.6:
-    resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==}
-    engines: {node: '>= 14'}
-    dependencies:
-      '@octokit/request': 6.2.8
-      '@octokit/types': 9.3.2
-      universal-user-agent: 6.0.1
-    transitivePeerDependencies:
-      - encoding
-    dev: false
+  '@esbuild/linux-x64@0.23.1':
+    optional: true
 
-  /@octokit/oauth-app@4.2.4:
-    resolution: {integrity: sha512-iuOVFrmm5ZKNavRtYu5bZTtmlKLc5uVgpqTfMEqYYf2OkieV6VdxKZAb5qLVdEPL8LU2lMWcGpavPBV835cgoA==}
-    engines: {node: '>= 14'}
-    dependencies:
-      '@octokit/auth-oauth-app': 5.0.6
-      '@octokit/auth-oauth-user': 2.1.2
-      '@octokit/auth-unauthenticated': 3.0.5
-      '@octokit/core': 4.2.4
-      '@octokit/oauth-authorization-url': 5.0.0
-      '@octokit/oauth-methods': 2.0.6
-      '@types/aws-lambda': 8.10.136
-      fromentries: 1.3.2
-      universal-user-agent: 6.0.1
-    transitivePeerDependencies:
-      - encoding
-    dev: false
+  '@esbuild/netbsd-x64@0.20.2':
+    optional: true
 
-  /@octokit/oauth-authorization-url@5.0.0:
-    resolution: {integrity: sha512-y1WhN+ERDZTh0qZ4SR+zotgsQUE1ysKnvBt1hvDRB2WRzYtVKQjn97HEPzoehh66Fj9LwNdlZh+p6TJatT0zzg==}
-    engines: {node: '>= 14'}
-    dev: false
+  '@esbuild/netbsd-x64@0.21.5':
+    optional: true
 
-  /@octokit/oauth-methods@2.0.6:
-    resolution: {integrity: sha512-l9Uml2iGN2aTWLZcm8hV+neBiFXAQ9+3sKiQe/sgumHlL6HDg0AQ8/l16xX/5jJvfxueqTW5CWbzd0MjnlfHZw==}
-    engines: {node: '>= 14'}
-    dependencies:
-      '@octokit/oauth-authorization-url': 5.0.0
-      '@octokit/request': 6.2.8
-      '@octokit/request-error': 3.0.3
-      '@octokit/types': 9.3.2
-      btoa-lite: 1.0.0
-    transitivePeerDependencies:
-      - encoding
-    dev: false
+  '@esbuild/netbsd-x64@0.23.1':
+    optional: true
 
-  /@octokit/openapi-types@18.1.1:
-    resolution: {integrity: sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==}
-    dev: false
+  '@esbuild/openbsd-arm64@0.23.1':
+    optional: true
 
-  /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4):
-    resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==}
-    engines: {node: '>= 14'}
-    peerDependencies:
-      '@octokit/core': '>=4'
-    dependencies:
-      '@octokit/core': 4.2.4
-      '@octokit/tsconfig': 1.0.2
-      '@octokit/types': 9.3.2
-    dev: false
+  '@esbuild/openbsd-x64@0.20.2':
+    optional: true
 
-  /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4):
-    resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==}
-    engines: {node: '>= 14'}
-    peerDependencies:
-      '@octokit/core': '>=3'
-    dependencies:
-      '@octokit/core': 4.2.4
-      '@octokit/types': 10.0.0
-    dev: false
+  '@esbuild/openbsd-x64@0.21.5':
+    optional: true
 
-  /@octokit/plugin-retry@4.1.6(@octokit/core@4.2.4):
-    resolution: {integrity: sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==}
-    engines: {node: '>= 14'}
-    peerDependencies:
-      '@octokit/core': '>=3'
-    dependencies:
-      '@octokit/core': 4.2.4
-      '@octokit/types': 9.3.2
-      bottleneck: 2.19.5
-    dev: false
+  '@esbuild/openbsd-x64@0.23.1':
+    optional: true
 
-  /@octokit/plugin-throttling@5.2.3(@octokit/core@4.2.4):
-    resolution: {integrity: sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==}
-    engines: {node: '>= 14'}
-    peerDependencies:
-      '@octokit/core': ^4.0.0
-    dependencies:
-      '@octokit/core': 4.2.4
-      '@octokit/types': 9.3.2
-      bottleneck: 2.19.5
-    dev: false
+  '@esbuild/sunos-x64@0.20.2':
+    optional: true
 
-  /@octokit/request-error@3.0.3:
-    resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==}
-    engines: {node: '>= 14'}
-    dependencies:
-      '@octokit/types': 9.3.2
-      deprecation: 2.3.1
-      once: 1.4.0
-    dev: false
+  '@esbuild/sunos-x64@0.21.5':
+    optional: true
 
-  /@octokit/request@6.2.8:
-    resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==}
-    engines: {node: '>= 14'}
-    dependencies:
-      '@octokit/endpoint': 7.0.6
-      '@octokit/request-error': 3.0.3
-      '@octokit/types': 9.3.2
-      is-plain-object: 5.0.0
-      node-fetch: 2.7.0
-      universal-user-agent: 6.0.1
-    transitivePeerDependencies:
-      - encoding
-    dev: false
+  '@esbuild/sunos-x64@0.23.1':
+    optional: true
 
-  /@octokit/tsconfig@1.0.2:
-    resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==}
-    dev: false
+  '@esbuild/win32-arm64@0.20.2':
+    optional: true
 
-  /@octokit/types@10.0.0:
-    resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==}
-    dependencies:
-      '@octokit/openapi-types': 18.1.1
-    dev: false
+  '@esbuild/win32-arm64@0.21.5':
+    optional: true
 
-  /@octokit/types@9.3.2:
-    resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==}
-    dependencies:
-      '@octokit/openapi-types': 18.1.1
-    dev: false
+  '@esbuild/win32-arm64@0.23.1':
+    optional: true
 
-  /@octokit/webhooks-methods@3.0.3:
-    resolution: {integrity: sha512-2vM+DCNTJ5vL62O5LagMru6XnYhV4fJslK+5YUkTa6rWlW2S+Tqs1lF9Wr9OGqHfVwpBj3TeztWfVON/eUoW1Q==}
-    engines: {node: '>= 14'}
-    dev: false
+  '@esbuild/win32-ia32@0.20.2':
+    optional: true
 
-  /@octokit/webhooks-types@6.11.0:
-    resolution: {integrity: sha512-AanzbulOHljrku1NGfafxdpTCfw2ENaWzH01N2vqQM+cUFbk868Cgh0xylz0JIM9BoKbfI++bdD6EYX0Q/UTEw==}
-    dev: false
+  '@esbuild/win32-ia32@0.21.5':
+    optional: true
 
-  /@octokit/webhooks@10.9.2:
-    resolution: {integrity: sha512-hFVF/szz4l/Y/GQdKxNmQjUke0XJXK986p+ucIlubTGVPVtVtup5G1jarQfvCMBs9Fvlf9dvH8K83E4lefmofQ==}
-    engines: {node: '>= 14'}
+  '@esbuild/win32-ia32@0.23.1':
+    optional: true
+
+  '@esbuild/win32-x64@0.20.2':
+    optional: true
+
+  '@esbuild/win32-x64@0.21.5':
+    optional: true
+
+  '@esbuild/win32-x64@0.23.1':
+    optional: true
+
+  '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)':
     dependencies:
-      '@octokit/request-error': 3.0.3
-      '@octokit/webhooks-methods': 3.0.3
-      '@octokit/webhooks-types': 6.11.0
-      aggregate-error: 3.1.0
-    dev: false
+      eslint: 8.57.1
+      eslint-visitor-keys: 3.4.3
 
-  /@pandacss/config@0.35.0:
-    resolution: {integrity: sha512-bCH6do+yDIOzJQi58D++wSR0Zhcrm/UaOxbTSqW6D/nLly1v+idbBEkG4h7iZVTnP0t1SIsmi0GASbhIsMtjtA==}
+  '@eslint-community/eslint-utils@4.4.0(eslint@9.12.0)':
     dependencies:
-      '@pandacss/logger': 0.35.0
-      '@pandacss/preset-base': 0.35.0
-      '@pandacss/preset-panda': 0.35.0
-      '@pandacss/shared': 0.35.0
-      '@pandacss/types': 0.35.0
-      bundle-n-require: 1.1.1
-      escalade: 3.1.2
-      merge-anything: 5.1.7
-      microdiff: 1.3.2
-      typescript: 5.3.3
-    dev: true
-
-  /@pandacss/core@0.35.0:
-    resolution: {integrity: sha512-v4kbXbE+333newADA0TY/NVJCYbdxbq1y9UswYewu9c+2SQJCKnBucqOJ9FUn3nUUHVrzjDS5c72qo/WqjCtng==}
-    dependencies:
-      '@csstools/postcss-cascade-layers': 4.0.3(postcss@8.4.35)
-      '@pandacss/is-valid-prop': 0.35.0
-      '@pandacss/logger': 0.35.0
-      '@pandacss/shared': 0.35.0
-      '@pandacss/token-dictionary': 0.35.0
-      '@pandacss/types': 0.35.0
-      browserslist: 4.23.0
-      hookable: 5.5.3
-      lightningcss: 1.23.0
-      lodash.merge: 4.6.2
-      outdent: 0.8.0
-      postcss: 8.4.35
-      postcss-discard-duplicates: 6.0.1(postcss@8.4.35)
-      postcss-discard-empty: 6.0.1(postcss@8.4.35)
-      postcss-merge-rules: 6.0.3(postcss@8.4.35)
-      postcss-minify-selectors: 6.0.2(postcss@8.4.35)
-      postcss-nested: 6.0.1(postcss@8.4.35)
-      postcss-normalize-whitespace: 6.0.1(postcss@8.4.35)
-      postcss-selector-parser: 6.0.15
-      ts-pattern: 5.0.8
-    dev: true
+      eslint: 9.12.0
+      eslint-visitor-keys: 3.4.3
 
-  /@pandacss/dev@0.35.0(jsdom@24.0.0)(typescript@5.4.2):
-    resolution: {integrity: sha512-mJiGMCmwFuHbvcnBZvwRpgrlM5JZYRrGgtVFiv7ulaXUW000JZwGGWyY6tO56cGeEl9i9JV4yutLSwQSz2AxMg==}
-    hasBin: true
+  '@eslint-community/regexpp@4.11.1': {}
+
+  '@eslint/config-array@0.18.0':
     dependencies:
-      '@clack/prompts': 0.7.0
-      '@pandacss/config': 0.35.0
-      '@pandacss/logger': 0.35.0
-      '@pandacss/node': 0.35.0(jsdom@24.0.0)(typescript@5.4.2)
-      '@pandacss/postcss': 0.35.0(jsdom@24.0.0)(typescript@5.4.2)
-      '@pandacss/preset-panda': 0.35.0
-      '@pandacss/shared': 0.35.0
-      '@pandacss/token-dictionary': 0.35.0
-      '@pandacss/types': 0.35.0
-      cac: 6.7.14
+      '@eslint/object-schema': 2.1.4
+      debug: 4.3.7
+      minimatch: 3.1.2
     transitivePeerDependencies:
-      - jsdom
-      - typescript
-    dev: true
+      - supports-color
 
-  /@pandacss/extractor@0.35.0(jsdom@24.0.0)(typescript@5.4.2):
-    resolution: {integrity: sha512-FruYUwxq3w510zprLYYdhpadO4CKbtSnyKJq+R2eHIEqv8K8pNbAMENSnvp/N5zyZ38431GqGO3kOr9SLVZX+A==}
+  '@eslint/core@0.6.0': {}
+
+  '@eslint/eslintrc@2.1.4':
     dependencies:
-      '@pandacss/shared': 0.35.0
-      ts-evaluator: 1.2.0(jsdom@24.0.0)(typescript@5.4.2)
-      ts-morph: 21.0.1
+      ajv: 6.12.6
+      debug: 4.3.7
+      espree: 9.6.1
+      globals: 13.24.0
+      ignore: 5.3.2
+      import-fresh: 3.3.0
+      js-yaml: 4.1.0
+      minimatch: 3.1.2
+      strip-json-comments: 3.1.1
     transitivePeerDependencies:
-      - jsdom
-      - typescript
-    dev: true
+      - supports-color
 
-  /@pandacss/generator@0.35.0:
-    resolution: {integrity: sha512-bfq78jxwZ41t7OFM4/V7qtL9CjVhlk9ZKxqQZHvca2Qb++gjZ1RzrHoU0L1tasqZkSLK9TDAo7xuRrjY0QWzDw==}
+  '@eslint/eslintrc@3.1.0':
     dependencies:
-      '@pandacss/core': 0.35.0
-      '@pandacss/is-valid-prop': 0.35.0
-      '@pandacss/logger': 0.35.0
-      '@pandacss/shared': 0.35.0
-      '@pandacss/token-dictionary': 0.35.0
-      '@pandacss/types': 0.35.0
-      javascript-stringify: 2.1.0
-      outdent: 0.8.0
-      pluralize: 8.0.0
-      postcss: 8.4.35
-      ts-pattern: 5.0.8
-    dev: true
+      ajv: 6.12.6
+      debug: 4.3.7
+      espree: 10.2.0
+      globals: 14.0.0
+      ignore: 5.3.2
+      import-fresh: 3.3.0
+      js-yaml: 4.1.0
+      minimatch: 3.1.2
+      strip-json-comments: 3.1.1
+    transitivePeerDependencies:
+      - supports-color
 
-  /@pandacss/is-valid-prop@0.35.0:
-    resolution: {integrity: sha512-NzY4w7wGvA4WidVi82BYSLhPCJ0zj+RONCOg02vmSf4GcjB6RAUM7qZla+t9SV8wKupbv/dRY2VW9goslcAQwA==}
-    dev: true
+  '@eslint/js@8.57.1': {}
 
-  /@pandacss/logger@0.35.0:
-    resolution: {integrity: sha512-TuexbsGBSKFNZdMzZldI24SkbBGfNFrLxJzTLXoiyIe1CmBbfspeFbyqV+YXpR6r29NaH0qkHVPge09yinTdOA==}
-    dependencies:
-      '@pandacss/types': 0.35.0
-      kleur: 4.1.5
-    dev: true
-
-  /@pandacss/node@0.35.0(jsdom@24.0.0)(typescript@5.4.2):
-    resolution: {integrity: sha512-QCYT53YsGQ2KJhaXfaozUNV0hKLvbp6Kl6hA93JtwWlU0M2O7SgJuz3zRoG03xKj1Vo1Wwn96Ca1hIw9h329kw==}
-    dependencies:
-      '@pandacss/config': 0.35.0
-      '@pandacss/core': 0.35.0
-      '@pandacss/extractor': 0.35.0(jsdom@24.0.0)(typescript@5.4.2)
-      '@pandacss/generator': 0.35.0
-      '@pandacss/logger': 0.35.0
-      '@pandacss/parser': 0.35.0(jsdom@24.0.0)(typescript@5.4.2)
-      '@pandacss/shared': 0.35.0
-      '@pandacss/token-dictionary': 0.35.0
-      '@pandacss/types': 0.35.0
-      browserslist: 4.23.0
-      chokidar: 3.6.0
-      fast-glob: 3.3.2
-      file-size: 1.0.0
-      filesize: 10.1.0
-      fs-extra: 11.2.0
-      glob-parent: 6.0.2
-      is-glob: 4.0.3
-      lodash.merge: 4.6.2
-      look-it-up: 2.1.0
-      outdent: 0.8.0
-      perfect-debounce: 1.0.0
-      pkg-types: 1.0.3
-      pluralize: 8.0.0
-      postcss: 8.4.35
-      preferred-pm: 3.1.2
-      prettier: 3.2.5
-      ts-morph: 21.0.1
-      ts-pattern: 5.0.8
-      tsconfck: 3.0.2(typescript@5.4.2)
-    transitivePeerDependencies:
-      - jsdom
-      - typescript
-    dev: true
+  '@eslint/js@9.12.0': {}
 
-  /@pandacss/parser@0.35.0(jsdom@24.0.0)(typescript@5.4.2):
-    resolution: {integrity: sha512-mZUZiymSb0O/SeBOhVtaJSqb/NEuWy0xkQM3umih7VRciqEscgaOlpna3enrV9VSziNi6E/ma2CAMrVca/pNpw==}
+  '@eslint/object-schema@2.1.4': {}
+
+  '@eslint/plugin-kit@0.2.0':
     dependencies:
-      '@pandacss/config': 0.35.0
-      '@pandacss/core': 0.35.0
-      '@pandacss/extractor': 0.35.0(jsdom@24.0.0)(typescript@5.4.2)
-      '@pandacss/logger': 0.35.0
-      '@pandacss/shared': 0.35.0
-      '@pandacss/types': 0.35.0
-      '@vue/compiler-sfc': 3.4.19
-      magic-string: 0.30.8
-      ts-morph: 21.0.1
-      ts-pattern: 5.0.8
-    transitivePeerDependencies:
-      - jsdom
-      - typescript
-    dev: true
+      levn: 0.4.1
 
-  /@pandacss/postcss@0.35.0(jsdom@24.0.0)(typescript@5.4.2):
-    resolution: {integrity: sha512-1kZJJwGRpZu5ulEVY4o7PyuezcwmQZU8/3D+Nq17mHLiFZBrZF0mthgtBF5lHtnmgfNrA+JdthrDBQ2oc4Abyw==}
+  '@floating-ui/core@1.6.8':
     dependencies:
-      '@pandacss/node': 0.35.0(jsdom@24.0.0)(typescript@5.4.2)
-      postcss: 8.4.35
-    transitivePeerDependencies:
-      - jsdom
-      - typescript
-    dev: true
+      '@floating-ui/utils': 0.2.8
 
-  /@pandacss/preset-base@0.35.0:
-    resolution: {integrity: sha512-b0ElhHLKQGqNt2tWKKCVm5s3yo+BfbErWkY7ryQ9/DvMKV2yGpkB46Ncf1ySK0naLoEPSNTK4Yk6m18rXY14Tw==}
+  '@floating-ui/dom@1.6.11':
     dependencies:
-      '@pandacss/types': 0.35.0
-    dev: true
+      '@floating-ui/core': 1.6.8
+      '@floating-ui/utils': 0.2.8
 
-  /@pandacss/preset-panda@0.35.0:
-    resolution: {integrity: sha512-fKPZmmXa3WKriGpII3dUlubz4DVbqaBtOl6xbI6CrYyhpYDuTJbzIPsEA56L3LzMzyTGYP42ylP1tBHKBMTSjQ==}
-    dependencies:
-      '@pandacss/types': 0.35.0
-    dev: true
+  '@floating-ui/utils@0.2.8': {}
 
-  /@pandacss/shared@0.35.0:
-    resolution: {integrity: sha512-ZozLTritlmIzVHD/LQ/UqxwXQXO23+sTEGmrDPqma4rBSCB/9VXAmh4h+7xkAVr4E6ZO7lGMkJf655ffhyswwQ==}
-    dev: true
+  '@fontsource/inter@5.1.0': {}
 
-  /@pandacss/token-dictionary@0.35.0:
-    resolution: {integrity: sha512-QE0dbl4P+2KhcU3RFeOYKK3kzd/pWBjuSaH+z3YlBhC61/hGgI1ZkoJviVECXYrqy42MTddOZ/SIlE6AXB/j3A==}
-    dependencies:
-      '@pandacss/logger': 0.35.0
-      '@pandacss/shared': 0.35.0
-      '@pandacss/types': 0.35.0
-      ts-pattern: 5.0.8
-    dev: true
+  '@fontsource/jetbrains-mono@5.1.1': {}
 
-  /@pandacss/types@0.35.0:
-    resolution: {integrity: sha512-o049YHTZxJQAB7POc0k5tk7QQByGsMN6JBzQSxlcRp/hry/QYuYikj7SSZRcc2Vd+TVCnVgh8c/W9iznvN0Kag==}
-    dev: true
+  '@fontsource/open-sans@5.1.0': {}
 
-  /@pkgjs/parseargs@0.11.0:
-    resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
-    engines: {node: '>=14'}
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@hcaptcha/types@1.0.4': {}
 
-  /@polka/url@1.0.0-next.25:
-    resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==}
-    dev: true
+  '@humanfs/core@0.19.0': {}
 
-  /@radix-ui/primitive@1.0.1:
-    resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==}
+  '@humanfs/node@0.16.5':
     dependencies:
-      '@babel/runtime': 7.24.0
-    dev: true
+      '@humanfs/core': 0.19.0
+      '@humanwhocodes/retry': 0.3.1
 
-  /@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==}
-    peerDependencies:
-      '@types/react': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
+  '@humanwhocodes/config-array@0.13.0':
     dependencies:
-      '@babel/runtime': 7.24.0
-      '@types/react': 18.3.3
-      react: 18.3.1
-    dev: true
+      '@humanwhocodes/object-schema': 2.0.3
+      debug: 4.3.7
+      minimatch: 3.1.2
+    transitivePeerDependencies:
+      - supports-color
 
-  /@radix-ui/react-context@1.0.1(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==}
-    peerDependencies:
-      '@types/react': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
-    dependencies:
-      '@babel/runtime': 7.24.0
-      '@types/react': 18.3.3
-      react: 18.3.1
-    dev: true
+  '@humanwhocodes/module-importer@1.0.1': {}
 
-  /@radix-ui/react-dialog@1.0.5(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==}
-    peerDependencies:
-      '@types/react': '*'
-      '@types/react-dom': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-      react-dom: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
-      '@types/react-dom':
-        optional: true
-    dependencies:
-      '@babel/runtime': 7.24.0
-      '@radix-ui/primitive': 1.0.1
-      '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@radix-ui/react-dismissable-layer': 1.0.5(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)
-      '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@radix-ui/react-focus-scope': 1.0.4(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)
-      '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@radix-ui/react-portal': 1.0.4(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)
-      '@radix-ui/react-presence': 1.0.1(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)
-      '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)
-      '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1)
-      '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@types/react': 18.3.3
-      aria-hidden: 1.2.4
-      react: 18.3.1
-      react-dom: 18.3.1(react@18.3.1)
-      react-remove-scroll: 2.5.5(@types/react@18.3.3)(react@18.3.1)
-    dev: true
+  '@humanwhocodes/object-schema@2.0.3': {}
 
-  /@radix-ui/react-dismissable-layer@1.0.5(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==}
-    peerDependencies:
-      '@types/react': '*'
-      '@types/react-dom': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-      react-dom: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
-      '@types/react-dom':
-        optional: true
+  '@humanwhocodes/retry@0.3.1': {}
+
+  '@isaacs/cliui@8.0.2':
     dependencies:
-      '@babel/runtime': 7.24.0
-      '@radix-ui/primitive': 1.0.1
-      '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)
-      '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.3)(react@18.3.1)
-      '@types/react': 18.3.3
-      react: 18.3.1
-      react-dom: 18.3.1(react@18.3.1)
-    dev: true
+      string-width: 5.1.2
+      string-width-cjs: string-width@4.2.3
+      strip-ansi: 7.1.0
+      strip-ansi-cjs: strip-ansi@6.0.1
+      wrap-ansi: 8.1.0
+      wrap-ansi-cjs: wrap-ansi@7.0.0
 
-  /@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==}
-    peerDependencies:
-      '@types/react': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
+  '@istanbuljs/load-nyc-config@1.1.0':
     dependencies:
-      '@babel/runtime': 7.24.0
-      '@types/react': 18.3.3
-      react: 18.3.1
-    dev: true
+      camelcase: 5.3.1
+      find-up: 4.1.0
+      get-package-type: 0.1.0
+      js-yaml: 3.14.1
+      resolve-from: 5.0.0
 
-  /@radix-ui/react-focus-scope@1.0.4(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==}
-    peerDependencies:
-      '@types/react': '*'
-      '@types/react-dom': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-      react-dom: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
-      '@types/react-dom':
-        optional: true
+  '@istanbuljs/schema@0.1.3': {}
+
+  '@jest/console@27.5.1':
     dependencies:
-      '@babel/runtime': 7.24.0
-      '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)
-      '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@types/react': 18.3.3
-      react: 18.3.1
-      react-dom: 18.3.1(react@18.3.1)
-    dev: true
+      '@jest/types': 27.5.1
+      '@types/node': 20.16.11
+      chalk: 4.1.2
+      jest-message-util: 27.5.1
+      jest-util: 27.5.1
+      slash: 3.0.0
 
-  /@radix-ui/react-id@1.0.1(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==}
-    peerDependencies:
-      '@types/react': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
+  '@jest/core@27.5.1':
     dependencies:
-      '@babel/runtime': 7.24.0
-      '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@types/react': 18.3.3
-      react: 18.3.1
-    dev: true
+      '@jest/console': 27.5.1
+      '@jest/reporters': 27.5.1
+      '@jest/test-result': 27.5.1
+      '@jest/transform': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/node': 20.16.11
+      ansi-escapes: 4.3.2
+      chalk: 4.1.2
+      emittery: 0.8.1
+      exit: 0.1.2
+      graceful-fs: 4.2.11
+      jest-changed-files: 27.5.1
+      jest-config: 27.5.1
+      jest-haste-map: 27.5.1
+      jest-message-util: 27.5.1
+      jest-regex-util: 27.5.1
+      jest-resolve: 27.5.1
+      jest-resolve-dependencies: 27.5.1
+      jest-runner: 27.5.1
+      jest-runtime: 27.5.1
+      jest-snapshot: 27.5.1
+      jest-util: 27.5.1
+      jest-validate: 27.5.1
+      jest-watcher: 27.5.1
+      micromatch: 4.0.8
+      rimraf: 3.0.2
+      slash: 3.0.0
+      strip-ansi: 6.0.1
+    transitivePeerDependencies:
+      - bufferutil
+      - canvas
+      - supports-color
+      - ts-node
+      - utf-8-validate
 
-  /@radix-ui/react-portal@1.0.4(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==}
-    peerDependencies:
-      '@types/react': '*'
-      '@types/react-dom': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-      react-dom: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
-      '@types/react-dom':
-        optional: true
+  '@jest/environment@27.5.1':
     dependencies:
-      '@babel/runtime': 7.24.0
-      '@radix-ui/react-primitive': 1.0.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)
-      '@types/react': 18.3.3
-      react: 18.3.1
-      react-dom: 18.3.1(react@18.3.1)
-    dev: true
+      '@jest/fake-timers': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/node': 20.16.11
+      jest-mock: 27.5.1
 
-  /@radix-ui/react-presence@1.0.1(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==}
-    peerDependencies:
-      '@types/react': '*'
-      '@types/react-dom': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-      react-dom: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
-      '@types/react-dom':
-        optional: true
+  '@jest/fake-timers@27.5.1':
     dependencies:
-      '@babel/runtime': 7.24.0
-      '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@types/react': 18.3.3
-      react: 18.3.1
-      react-dom: 18.3.1(react@18.3.1)
-    dev: true
+      '@jest/types': 27.5.1
+      '@sinonjs/fake-timers': 8.1.0
+      '@types/node': 20.16.11
+      jest-message-util: 27.5.1
+      jest-mock: 27.5.1
+      jest-util: 27.5.1
 
-  /@radix-ui/react-primitive@1.0.3(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==}
-    peerDependencies:
-      '@types/react': '*'
-      '@types/react-dom': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-      react-dom: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
-      '@types/react-dom':
-        optional: true
+  '@jest/globals@27.5.1':
     dependencies:
-      '@babel/runtime': 7.24.0
-      '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1)
-      '@types/react': 18.3.3
-      react: 18.3.1
-      react-dom: 18.3.1(react@18.3.1)
-    dev: true
+      '@jest/environment': 27.5.1
+      '@jest/types': 27.5.1
+      expect: 27.5.1
 
-  /@radix-ui/react-slot@1.0.2(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==}
-    peerDependencies:
-      '@types/react': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
+  '@jest/reporters@27.5.1':
     dependencies:
-      '@babel/runtime': 7.24.0
-      '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@types/react': 18.3.3
-      react: 18.3.1
-    dev: true
+      '@bcoe/v8-coverage': 0.2.3
+      '@jest/console': 27.5.1
+      '@jest/test-result': 27.5.1
+      '@jest/transform': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/node': 20.16.11
+      chalk: 4.1.2
+      collect-v8-coverage: 1.0.2
+      exit: 0.1.2
+      glob: 7.2.3
+      graceful-fs: 4.2.11
+      istanbul-lib-coverage: 3.2.2
+      istanbul-lib-instrument: 5.2.1
+      istanbul-lib-report: 3.0.1
+      istanbul-lib-source-maps: 4.0.1
+      istanbul-reports: 3.1.7
+      jest-haste-map: 27.5.1
+      jest-resolve: 27.5.1
+      jest-util: 27.5.1
+      jest-worker: 27.5.1
+      slash: 3.0.0
+      source-map: 0.6.1
+      string-length: 4.0.2
+      terminal-link: 2.1.1
+      v8-to-istanbul: 8.1.1
+    transitivePeerDependencies:
+      - supports-color
 
-  /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==}
-    peerDependencies:
-      '@types/react': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
+  '@jest/schemas@29.6.3':
     dependencies:
-      '@babel/runtime': 7.24.0
-      '@types/react': 18.3.3
-      react: 18.3.1
-    dev: true
+      '@sinclair/typebox': 0.27.8
 
-  /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==}
-    peerDependencies:
-      '@types/react': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
+  '@jest/source-map@27.5.1':
     dependencies:
-      '@babel/runtime': 7.24.0
-      '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@types/react': 18.3.3
-      react: 18.3.1
-    dev: true
+      callsites: 3.1.0
+      graceful-fs: 4.2.11
+      source-map: 0.6.1
 
-  /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==}
-    peerDependencies:
-      '@types/react': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
+  '@jest/test-result@27.5.1':
     dependencies:
-      '@babel/runtime': 7.24.0
-      '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@types/react': 18.3.3
-      react: 18.3.1
-    dev: true
+      '@jest/console': 27.5.1
+      '@jest/types': 27.5.1
+      '@types/istanbul-lib-coverage': 2.0.6
+      collect-v8-coverage: 1.0.2
 
-  /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==}
-    peerDependencies:
-      '@types/react': '*'
-      react: ^16.8 || ^17.0 || ^18.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
+  '@jest/test-sequencer@27.5.1':
     dependencies:
-      '@babel/runtime': 7.24.0
-      '@types/react': 18.3.3
-      react: 18.3.1
-    dev: true
+      '@jest/test-result': 27.5.1
+      graceful-fs: 4.2.11
+      jest-haste-map: 27.5.1
+      jest-runtime: 27.5.1
+    transitivePeerDependencies:
+      - supports-color
 
-  /@rollup/plugin-babel@5.3.1(@babel/core@7.24.7)(rollup@2.79.1):
-    resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==}
-    engines: {node: '>= 10.0.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-      '@types/babel__core': ^7.1.9
-      rollup: ^1.20.0||^2.0.0
-    peerDependenciesMeta:
-      '@types/babel__core':
-        optional: true
+  '@jest/transform@27.5.1':
     dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-module-imports': 7.24.7
-      '@rollup/pluginutils': 3.1.0(rollup@2.79.1)
-      rollup: 2.79.1
+      '@babel/core': 7.25.7
+      '@jest/types': 27.5.1
+      babel-plugin-istanbul: 6.1.1
+      chalk: 4.1.2
+      convert-source-map: 1.9.0
+      fast-json-stable-stringify: 2.1.0
+      graceful-fs: 4.2.11
+      jest-haste-map: 27.5.1
+      jest-regex-util: 27.5.1
+      jest-util: 27.5.1
+      micromatch: 4.0.8
+      pirates: 4.0.6
+      slash: 3.0.0
+      source-map: 0.6.1
+      write-file-atomic: 3.0.3
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1):
-    resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==}
-    engines: {node: '>= 10.0.0'}
-    peerDependencies:
-      rollup: ^1.20.0||^2.0.0
+  '@jest/types@27.5.1':
     dependencies:
-      '@rollup/pluginutils': 3.1.0(rollup@2.79.1)
-      '@types/resolve': 1.17.1
-      builtin-modules: 3.3.0
-      deepmerge: 4.3.1
-      is-module: 1.0.0
-      resolve: 1.22.8
-      rollup: 2.79.1
-    dev: true
+      '@types/istanbul-lib-coverage': 2.0.6
+      '@types/istanbul-reports': 3.0.4
+      '@types/node': 20.16.11
+      '@types/yargs': 16.0.9
+      chalk: 4.1.2
 
-  /@rollup/plugin-replace@2.4.2(rollup@2.79.1):
-    resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==}
-    peerDependencies:
-      rollup: ^1.20.0 || ^2.0.0
+  '@jridgewell/gen-mapping@0.3.5':
     dependencies:
-      '@rollup/pluginutils': 3.1.0(rollup@2.79.1)
-      magic-string: 0.25.9
-      rollup: 2.79.1
-    dev: true
+      '@jridgewell/set-array': 1.2.1
+      '@jridgewell/sourcemap-codec': 1.5.0
+      '@jridgewell/trace-mapping': 0.3.25
 
-  /@rollup/pluginutils@3.1.0(rollup@2.79.1):
-    resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==}
-    engines: {node: '>= 8.0.0'}
-    peerDependencies:
-      rollup: ^1.20.0||^2.0.0
+  '@jridgewell/resolve-uri@3.1.2': {}
+
+  '@jridgewell/set-array@1.2.1': {}
+
+  '@jridgewell/source-map@0.3.6':
     dependencies:
-      '@types/estree': 0.0.39
-      estree-walker: 1.0.1
-      picomatch: 2.3.1
-      rollup: 2.79.1
-    dev: true
+      '@jridgewell/gen-mapping': 0.3.5
+      '@jridgewell/trace-mapping': 0.3.25
 
-  /@rollup/pluginutils@5.1.0(rollup@2.79.1):
-    resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
-    engines: {node: '>=14.0.0'}
-    peerDependencies:
-      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
-    peerDependenciesMeta:
-      rollup:
-        optional: true
+  '@jridgewell/sourcemap-codec@1.5.0': {}
+
+  '@jridgewell/trace-mapping@0.3.25':
     dependencies:
-      '@types/estree': 1.0.5
-      estree-walker: 2.0.2
-      picomatch: 2.3.1
-      rollup: 2.79.1
-    dev: true
+      '@jridgewell/resolve-uri': 3.1.2
+      '@jridgewell/sourcemap-codec': 1.5.0
 
-  /@rollup/rollup-android-arm-eabi@4.13.0:
-    resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==}
-    cpu: [arm]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@material-design-icons/svg@0.14.13': {}
 
-  /@rollup/rollup-android-arm64@4.13.0:
-    resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@material/material-color-utilities@0.3.0': {}
 
-  /@rollup/rollup-darwin-arm64@4.13.0:
-    resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@mdx-js/react@3.0.1(@types/react@18.3.11)(react@18.3.1)':
+    dependencies:
+      '@types/mdx': 2.0.13
+      '@types/react': 18.3.11
+      react: 18.3.1
+
+  '@minht11/solid-virtual-container@0.2.1(solid-js@1.9.2)':
+    dependencies:
+      solid-js: 1.9.2
+
+  '@motionone/animation@10.18.0':
+    dependencies:
+      '@motionone/easing': 10.18.0
+      '@motionone/types': 10.17.1
+      '@motionone/utils': 10.18.0
+      tslib: 2.7.0
+
+  '@motionone/dom@10.18.0':
+    dependencies:
+      '@motionone/animation': 10.18.0
+      '@motionone/generators': 10.18.0
+      '@motionone/types': 10.17.1
+      '@motionone/utils': 10.18.0
+      hey-listen: 1.0.8
+      tslib: 2.7.0
 
-  /@rollup/rollup-darwin-x64@4.13.0:
-    resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@motionone/easing@10.18.0':
+    dependencies:
+      '@motionone/utils': 10.18.0
+      tslib: 2.7.0
 
-  /@rollup/rollup-linux-arm-gnueabihf@4.13.0:
-    resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@motionone/generators@10.18.0':
+    dependencies:
+      '@motionone/types': 10.17.1
+      '@motionone/utils': 10.18.0
+      tslib: 2.7.0
 
-  /@rollup/rollup-linux-arm64-gnu@4.13.0:
-    resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@motionone/types@10.17.1': {}
 
-  /@rollup/rollup-linux-arm64-musl@4.13.0:
-    resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@motionone/utils@10.18.0':
+    dependencies:
+      '@motionone/types': 10.17.1
+      hey-listen: 1.0.8
+      tslib: 2.7.0
 
-  /@rollup/rollup-linux-riscv64-gnu@4.13.0:
-    resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@mxssfd/typedoc-theme@1.1.7(typedoc@0.25.13(typescript@5.6.3))':
+    dependencies:
+      typedoc: 0.25.13(typescript@5.6.3)
 
-  /@rollup/rollup-linux-x64-gnu@4.13.0:
-    resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@nodelib/fs.scandir@2.1.5':
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      run-parallel: 1.2.0
 
-  /@rollup/rollup-linux-x64-musl@4.13.0:
-    resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@nodelib/fs.stat@2.0.5': {}
 
-  /@rollup/rollup-win32-arm64-msvc@4.13.0:
-    resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@nodelib/fs.walk@1.2.8':
+    dependencies:
+      '@nodelib/fs.scandir': 2.1.5
+      fastq: 1.17.1
 
-  /@rollup/rollup-win32-ia32-msvc@4.13.0:
-    resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@nothing-but/utils@0.12.1': {}
 
-  /@rollup/rollup-win32-x64-msvc@4.13.0:
-    resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
+  '@octokit/app@13.1.8':
+    dependencies:
+      '@octokit/auth-app': 4.0.13
+      '@octokit/auth-unauthenticated': 3.0.5
+      '@octokit/core': 4.2.4
+      '@octokit/oauth-app': 4.2.4
+      '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4)
+      '@octokit/types': 9.3.2
+      '@octokit/webhooks': 10.9.2
+    transitivePeerDependencies:
+      - encoding
 
-  /@sentry-internal/feedback@7.107.0:
-    resolution: {integrity: sha512-okF0B9AJHrpkwNMxNs/Lffw3N5ZNbGwz4uvCfyOfnMxc7E2VfDM18QzUvTBRvNr3bA9wl+InJ+EMG3aZhyPunA==}
-    engines: {node: '>=12'}
+  '@octokit/auth-app@4.0.13':
     dependencies:
-      '@sentry/core': 7.107.0
-      '@sentry/types': 7.107.0
-      '@sentry/utils': 7.107.0
-    dev: false
+      '@octokit/auth-oauth-app': 5.0.6
+      '@octokit/auth-oauth-user': 2.1.2
+      '@octokit/request': 6.2.8
+      '@octokit/request-error': 3.0.3
+      '@octokit/types': 9.3.2
+      deprecation: 2.3.1
+      lru-cache: 9.1.2
+      universal-github-app-jwt: 1.2.0
+      universal-user-agent: 6.0.1
+    transitivePeerDependencies:
+      - encoding
 
-  /@sentry-internal/replay-canvas@7.107.0:
-    resolution: {integrity: sha512-dmDL9g3QDfo7axBOsVnpiKdJ/DXrdeuRv1AqsLgwzJKvItsv0ZizX0u+rj5b1UoxcwbXRMxJ0hit5a1yt3t/ow==}
-    engines: {node: '>=12'}
+  '@octokit/auth-oauth-app@5.0.6':
     dependencies:
-      '@sentry/core': 7.107.0
-      '@sentry/replay': 7.107.0
-      '@sentry/types': 7.107.0
-      '@sentry/utils': 7.107.0
-    dev: false
+      '@octokit/auth-oauth-device': 4.0.5
+      '@octokit/auth-oauth-user': 2.1.2
+      '@octokit/request': 6.2.8
+      '@octokit/types': 9.3.2
+      '@types/btoa-lite': 1.0.2
+      btoa-lite: 1.0.0
+      universal-user-agent: 6.0.1
+    transitivePeerDependencies:
+      - encoding
 
-  /@sentry-internal/tracing@7.107.0:
-    resolution: {integrity: sha512-le9wM8+OHBbq7m/8P7JUJ1UhSPIty+Z/HmRXc5Z64ODZcOwFV6TmDpYx729IXDdz36XUKmeI+BeM7yQdTTZPfQ==}
-    engines: {node: '>=8'}
+  '@octokit/auth-oauth-device@4.0.5':
     dependencies:
-      '@sentry/core': 7.107.0
-      '@sentry/types': 7.107.0
-      '@sentry/utils': 7.107.0
-    dev: false
+      '@octokit/oauth-methods': 2.0.6
+      '@octokit/request': 6.2.8
+      '@octokit/types': 9.3.2
+      universal-user-agent: 6.0.1
+    transitivePeerDependencies:
+      - encoding
 
-  /@sentry/browser@7.107.0:
-    resolution: {integrity: sha512-KnqaQDhxv6w9dJ+mYLsNwPeGZfgbpM3vaismBNyJCKLgWn2V75kxkSq+bDX8LQT/13AyK7iFp317L6P8EuNa3g==}
-    engines: {node: '>=8'}
+  '@octokit/auth-oauth-user@2.1.2':
     dependencies:
-      '@sentry-internal/feedback': 7.107.0
-      '@sentry-internal/replay-canvas': 7.107.0
-      '@sentry-internal/tracing': 7.107.0
-      '@sentry/core': 7.107.0
-      '@sentry/replay': 7.107.0
-      '@sentry/types': 7.107.0
-      '@sentry/utils': 7.107.0
-    dev: false
-
-  /@sentry/core@7.107.0:
-    resolution: {integrity: sha512-C7ogye6+KPyBi8NVL0P8Rxx3Ur7Td8ufnjxosVy678lqY+dcYPk/HONROrzUFYW5fMKWL4/KYnwP+x9uHnkDmw==}
-    engines: {node: '>=8'}
+      '@octokit/auth-oauth-device': 4.0.5
+      '@octokit/oauth-methods': 2.0.6
+      '@octokit/request': 6.2.8
+      '@octokit/types': 9.3.2
+      btoa-lite: 1.0.0
+      universal-user-agent: 6.0.1
+    transitivePeerDependencies:
+      - encoding
+
+  '@octokit/auth-token@3.0.4': {}
+
+  '@octokit/auth-unauthenticated@3.0.5':
     dependencies:
-      '@sentry/types': 7.107.0
-      '@sentry/utils': 7.107.0
-    dev: false
+      '@octokit/request-error': 3.0.3
+      '@octokit/types': 9.3.2
 
-  /@sentry/replay@7.107.0:
-    resolution: {integrity: sha512-BNJDEVaEwr/YnV22qnyVA1almx/3p615m3+KaF8lPo7YleYgJGSJv1auH64j1G8INkrJ0J0wFBujb1EFjMYkxA==}
-    engines: {node: '>=12'}
+  '@octokit/core@4.2.4':
     dependencies:
-      '@sentry-internal/tracing': 7.107.0
-      '@sentry/core': 7.107.0
-      '@sentry/types': 7.107.0
-      '@sentry/utils': 7.107.0
-    dev: false
+      '@octokit/auth-token': 3.0.4
+      '@octokit/graphql': 5.0.6
+      '@octokit/request': 6.2.8
+      '@octokit/request-error': 3.0.3
+      '@octokit/types': 9.3.2
+      before-after-hook: 2.2.3
+      universal-user-agent: 6.0.1
+    transitivePeerDependencies:
+      - encoding
 
-  /@sentry/tracing@7.107.0:
-    resolution: {integrity: sha512-nxOmwlJgx9gW1c0EWtTWQxOBLxcgCGNOT2LezZTcGZ0G0Fw4y5Y+pNY0f8hP4rcJdNHhXzetEOR/I3Jauix+fw==}
-    engines: {node: '>=8'}
+  '@octokit/endpoint@7.0.6':
     dependencies:
-      '@sentry-internal/tracing': 7.107.0
-    dev: false
+      '@octokit/types': 9.3.2
+      is-plain-object: 5.0.0
+      universal-user-agent: 6.0.1
 
-  /@sentry/types@7.107.0:
-    resolution: {integrity: sha512-H7qcPjPSUWHE/Zf5bR1EE24G0pGVuJgrSx8Tvvl5nKEepswMYlbXHRVSDN0gTk/E5Z7cqf+hUBOpkQgZyps77w==}
-    engines: {node: '>=8'}
-    dev: false
+  '@octokit/graphql@5.0.6':
+    dependencies:
+      '@octokit/request': 6.2.8
+      '@octokit/types': 9.3.2
+      universal-user-agent: 6.0.1
+    transitivePeerDependencies:
+      - encoding
 
-  /@sentry/utils@7.107.0:
-    resolution: {integrity: sha512-C6PbN5gHh73MRHohnReeQ60N8rrLYa9LciHue3Ru2290eSThg4CzsPnx4SzkGpkSeVlhhptKtKZ+hp/ha3iVuw==}
-    engines: {node: '>=8'}
+  '@octokit/oauth-app@4.2.4':
     dependencies:
-      '@sentry/types': 7.107.0
-    dev: false
+      '@octokit/auth-oauth-app': 5.0.6
+      '@octokit/auth-oauth-user': 2.1.2
+      '@octokit/auth-unauthenticated': 3.0.5
+      '@octokit/core': 4.2.4
+      '@octokit/oauth-authorization-url': 5.0.0
+      '@octokit/oauth-methods': 2.0.6
+      '@types/aws-lambda': 8.10.145
+      fromentries: 1.3.2
+      universal-user-agent: 6.0.1
+    transitivePeerDependencies:
+      - encoding
 
-  /@shikijs/core@1.9.0:
-    resolution: {integrity: sha512-cbSoY8P/jgGByG8UOl3jnP/CWg/Qk+1q+eAKWtcrU3pNoILF8wTsLB0jT44qUBV8Ce1SvA9uqcM9Xf+u3fJFBw==}
-    dev: false
+  '@octokit/oauth-authorization-url@5.0.0': {}
 
-  /@sinclair/typebox@0.27.8:
-    resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
-    dev: true
+  '@octokit/oauth-methods@2.0.6':
+    dependencies:
+      '@octokit/oauth-authorization-url': 5.0.0
+      '@octokit/request': 6.2.8
+      '@octokit/request-error': 3.0.3
+      '@octokit/types': 9.3.2
+      btoa-lite: 1.0.0
+    transitivePeerDependencies:
+      - encoding
 
-  /@sindresorhus/merge-streams@2.3.0:
-    resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==}
-    engines: {node: '>=18'}
-    dev: true
+  '@octokit/openapi-types@18.1.1': {}
 
-  /@sinonjs/commons@1.8.5:
-    resolution: {integrity: sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==}
+  '@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4)':
     dependencies:
-      type-detect: 4.0.8
-    dev: true
+      '@octokit/core': 4.2.4
+      '@octokit/tsconfig': 1.0.2
+      '@octokit/types': 9.3.2
 
-  /@sinonjs/fake-timers@8.1.0:
-    resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==}
+  '@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4)':
     dependencies:
-      '@sinonjs/commons': 1.8.5
-    dev: true
+      '@octokit/core': 4.2.4
+      '@octokit/types': 10.0.0
 
-  /@solid-aria/button@0.1.3(solid-js@1.8.15):
-    resolution: {integrity: sha512-gN7/d5YkHAbQPhzBVbNNp9grf9w+mxFRulbmeXjp61hFNLOJRDcdMPCri5MmfUJ8D2BwefcyHvCGTCc62Ua23A==}
-    peerDependencies:
-      solid-js: ^1.4.4
+  '@octokit/plugin-retry@4.1.6(@octokit/core@4.2.4)':
     dependencies:
-      '@solid-aria/focus': 0.1.4(solid-js@1.8.15)
-      '@solid-aria/interactions': 0.1.4(solid-js@1.8.15)
-      '@solid-aria/toggle': 0.1.3(solid-js@1.8.15)
-      '@solid-aria/types': 0.1.4(solid-js@1.8.15)
-      '@solid-aria/utils': 0.2.1(solid-js@1.8.15)
-      '@solid-primitives/props': 2.2.2(solid-js@1.8.15)
-      '@solid-primitives/utils': 2.2.1(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
-
-  /@solid-aria/focus@0.1.4(solid-js@1.8.15):
-    resolution: {integrity: sha512-yX/BbN97s7ascNJu0yB+p1bx48U0NOOWw7+TYlGcAfFGc2HMNpIxG5OdhWGUoz8D9Tp5ELEgWgN3d4dAf7Hk9Q==}
-    peerDependencies:
-      solid-js: ^1.4.4
+      '@octokit/core': 4.2.4
+      '@octokit/types': 9.3.2
+      bottleneck: 2.19.5
+
+  '@octokit/plugin-throttling@5.2.3(@octokit/core@4.2.4)':
     dependencies:
-      '@solid-aria/interactions': 0.1.4(solid-js@1.8.15)
-      '@solid-aria/types': 0.1.4(solid-js@1.8.15)
-      '@solid-aria/utils': 0.2.1(solid-js@1.8.15)
-      '@solid-primitives/props': 2.2.2(solid-js@1.8.15)
-      '@solid-primitives/utils': 2.2.1(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@octokit/core': 4.2.4
+      '@octokit/types': 9.3.2
+      bottleneck: 2.19.5
 
-  /@solid-aria/interactions@0.1.4(solid-js@1.8.15):
-    resolution: {integrity: sha512-gVJWJTX51mZfURoak39mxCo/vUQl8UInctJBlT2nIc3VQrTPL4ekOV6czrvTffpduoWgXeuf61+Dabc7b920lQ==}
-    peerDependencies:
-      solid-js: ^1.4.4
+  '@octokit/request-error@3.0.3':
     dependencies:
-      '@solid-aria/types': 0.1.4(solid-js@1.8.15)
-      '@solid-aria/utils': 0.2.1(solid-js@1.8.15)
-      '@solid-primitives/platform': 0.0.100(solid-js@1.8.15)
-      '@solid-primitives/props': 2.2.2(solid-js@1.8.15)
-      '@solid-primitives/utils': 2.2.1(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@octokit/types': 9.3.2
+      deprecation: 2.3.1
+      once: 1.4.0
 
-  /@solid-aria/toggle@0.1.3(solid-js@1.8.15):
-    resolution: {integrity: sha512-ZVRhY+Te8XBFFcumuu2J92LBntlmV6ss/6fNkDfhvr4LV42VB1goRZvPJk8rqakyR3JkQBTnQuxt7idrqqaxgA==}
-    peerDependencies:
-      solid-js: ^1.4.4
+  '@octokit/request@6.2.8':
     dependencies:
-      '@solid-aria/focus': 0.1.4(solid-js@1.8.15)
-      '@solid-aria/interactions': 0.1.4(solid-js@1.8.15)
-      '@solid-aria/types': 0.1.4(solid-js@1.8.15)
-      '@solid-aria/utils': 0.2.1(solid-js@1.8.15)
-      '@solid-primitives/props': 2.2.2(solid-js@1.8.15)
-      '@solid-primitives/utils': 2.2.1(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@octokit/endpoint': 7.0.6
+      '@octokit/request-error': 3.0.3
+      '@octokit/types': 9.3.2
+      is-plain-object: 5.0.0
+      node-fetch: 2.7.0
+      universal-user-agent: 6.0.1
+    transitivePeerDependencies:
+      - encoding
 
-  /@solid-aria/types@0.1.4(solid-js@1.8.15):
-    resolution: {integrity: sha512-CxVXiZPE+nfD7wr7+6xtY3IrCTyAfL3zW4tH4NtsxlqBoz10tLFRCsTqeyl6OWMDhwABIaSdeHPKXVnKsKErcQ==}
-    peerDependencies:
-      solid-js: ^1.4.4
+  '@octokit/tsconfig@1.0.2': {}
+
+  '@octokit/types@10.0.0':
     dependencies:
-      '@solid-primitives/utils': 2.2.1(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@octokit/openapi-types': 18.1.1
 
-  /@solid-aria/utils@0.2.1(solid-js@1.8.15):
-    resolution: {integrity: sha512-zZgPpdg7azQUKE2jDUnCmzopN8CFdeKKcFTIv9ICrc0afS1qUR8ScywWBF/AwNBgGYhneBr7xEOwAHxe+zUcHQ==}
-    peerDependencies:
-      solid-js: ^1.4.4
+  '@octokit/types@9.3.2':
     dependencies:
-      '@solid-aria/types': 0.1.4(solid-js@1.8.15)
-      '@solid-primitives/utils': 2.2.1(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@octokit/openapi-types': 18.1.1
 
-  /@solid-devtools/debugger@0.18.1(solid-js@1.8.15):
-    resolution: {integrity: sha512-PFbf3+t5ua/v9HpnYOo24NIIM/pf/ZUFYF26YWy8qq2ddRbkKL87nmG5gDGvtgK7lVV3GM3O01fdq4YnSG1SYg==}
-    peerDependencies:
-      solid-js: ^1.6.2
+  '@octokit/webhooks-methods@3.0.3': {}
+
+  '@octokit/webhooks-types@6.11.0': {}
+
+  '@octokit/webhooks@10.9.2':
     dependencies:
-      '@solid-devtools/shared': 0.10.6(solid-js@1.8.15)
-      '@solid-primitives/bounds': 0.0.105(solid-js@1.8.15)
-      '@solid-primitives/cursor': 0.0.103(solid-js@1.8.15)
-      '@solid-primitives/event-bus': 0.1.6(solid-js@1.8.15)
-      '@solid-primitives/event-listener': 2.3.3(solid-js@1.8.15)
-      '@solid-primitives/keyboard': 1.2.8(solid-js@1.8.15)
-      '@solid-primitives/platform': 0.0.102(solid-js@1.8.15)
-      '@solid-primitives/scheduled': 1.4.3(solid-js@1.8.15)
-      '@solid-primitives/utils': 4.0.1(solid-js@1.8.15)
-      solid-js: 1.8.15
-      type-fest: 3.13.1
-    dev: true
+      '@octokit/request-error': 3.0.3
+      '@octokit/webhooks-methods': 3.0.3
+      '@octokit/webhooks-types': 6.11.0
+      aggregate-error: 3.1.0
 
-  /@solid-devtools/debugger@0.23.3(solid-js@1.8.15):
-    resolution: {integrity: sha512-VrgswTjb2FyHxQJp5y5u7OaJ2k1R14LYlAOX/1rDZrGHWKdGYCaWHGzxI7C8AExtMP+LS+WOxy0uXMPQpoAD2g==}
-    peerDependencies:
-      solid-js: ^1.8.0
+  '@pandacss/config@0.46.1':
     dependencies:
-      '@nothing-but/utils': 0.12.1
-      '@solid-devtools/shared': 0.13.1(solid-js@1.8.15)
-      '@solid-primitives/bounds': 0.0.118(solid-js@1.8.15)
-      '@solid-primitives/cursor': 0.0.112(solid-js@1.8.15)
-      '@solid-primitives/event-bus': 1.0.11(solid-js@1.8.15)
-      '@solid-primitives/event-listener': 2.3.3(solid-js@1.8.15)
-      '@solid-primitives/keyboard': 1.2.8(solid-js@1.8.15)
-      '@solid-primitives/platform': 0.1.2(solid-js@1.8.15)
-      '@solid-primitives/rootless': 1.4.5(solid-js@1.8.15)
-      '@solid-primitives/scheduled': 1.4.3(solid-js@1.8.15)
-      '@solid-primitives/static-store': 0.0.5(solid-js@1.8.15)
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
-
-  /@solid-devtools/frontend@0.11.4(solid-js@1.8.15):
-    resolution: {integrity: sha512-tG/Jr0cp5iJ4+HwS0N5p/QfchKeKB71fos+021bU2SZWTtx8aB05zaOKhpdkGZbq2X1Vgzs+xMODOR+yqH4oMA==}
-    peerDependencies:
-      solid-js: ^1.8.0
+      '@pandacss/logger': 0.46.1
+      '@pandacss/preset-base': 0.46.1
+      '@pandacss/preset-panda': 0.46.1
+      '@pandacss/shared': 0.46.1
+      '@pandacss/types': 0.46.1
+      bundle-n-require: 1.1.1
+      escalade: 3.1.2
+      merge-anything: 5.1.7
+      microdiff: 1.3.2
+      typescript: 5.3.3
+
+  '@pandacss/core@0.46.1':
     dependencies:
-      '@nothing-but/utils': 0.12.1
-      '@solid-devtools/debugger': 0.23.3(solid-js@1.8.15)
-      '@solid-devtools/shared': 0.13.1(solid-js@1.8.15)
-      '@solid-devtools/theme': 0.0.1
-      '@solid-primitives/context': 0.2.3(solid-js@1.8.15)
-      '@solid-primitives/cursor': 0.0.112(solid-js@1.8.15)
-      '@solid-primitives/date': 2.0.21(solid-js@1.8.15)
-      '@solid-primitives/event-bus': 1.0.11(solid-js@1.8.15)
-      '@solid-primitives/event-listener': 2.3.3(solid-js@1.8.15)
-      '@solid-primitives/jsx-tokenizer': 1.0.10(solid-js@1.8.15)
-      '@solid-primitives/keyboard': 1.2.8(solid-js@1.8.15)
-      '@solid-primitives/keyed': 1.2.2(solid-js@1.8.15)
-      '@solid-primitives/media': 2.2.8(solid-js@1.8.15)
-      '@solid-primitives/mouse': 2.0.19(solid-js@1.8.15)
-      '@solid-primitives/props': 3.1.11(solid-js@1.8.15)
-      '@solid-primitives/range': 0.1.18(solid-js@1.8.15)
-      '@solid-primitives/resize-observer': 2.0.25(solid-js@1.8.15)
-      '@solid-primitives/scheduled': 1.4.3(solid-js@1.8.15)
-      '@solid-primitives/static-store': 0.0.5(solid-js@1.8.15)
-      '@solid-primitives/styles': 0.0.111(solid-js@1.8.15)
-      '@solid-primitives/timer': 1.3.9(solid-js@1.8.15)
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      clsx: 2.1.0
-      solid-headless: 0.13.1(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
-
-  /@solid-devtools/overlay@0.29.3(solid-js@1.8.15):
-    resolution: {integrity: sha512-/iWw9ooHZLnZVaVlrdrbiV1MRvuOc4IBz7NwPlW34y8C+1jRXvFwG11GvQfJTE+FRMjmuMoM+JmPHU0jWACo4g==}
-    peerDependencies:
-      solid-js: ^1.8.0
+      '@csstools/postcss-cascade-layers': 4.0.6(postcss@8.4.47)
+      '@pandacss/is-valid-prop': 0.46.1
+      '@pandacss/logger': 0.46.1
+      '@pandacss/shared': 0.46.1
+      '@pandacss/token-dictionary': 0.46.1
+      '@pandacss/types': 0.46.1
+      browserslist: 4.23.3
+      hookable: 5.5.3
+      lightningcss: 1.25.1
+      lodash.merge: 4.6.2
+      outdent: 0.8.0
+      postcss: 8.4.47
+      postcss-discard-duplicates: 7.0.1(postcss@8.4.47)
+      postcss-discard-empty: 7.0.0(postcss@8.4.47)
+      postcss-merge-rules: 7.0.2(postcss@8.4.47)
+      postcss-minify-selectors: 7.0.2(postcss@8.4.47)
+      postcss-nested: 6.0.1(postcss@8.4.47)
+      postcss-normalize-whitespace: 7.0.0(postcss@8.4.47)
+      postcss-selector-parser: 6.1.1
+      ts-pattern: 5.0.8
+
+  '@pandacss/dev@0.46.1(jsdom@25.0.1)(typescript@5.6.3)':
     dependencies:
-      '@nothing-but/utils': 0.12.1
-      '@solid-devtools/debugger': 0.23.3(solid-js@1.8.15)
-      '@solid-devtools/frontend': 0.11.4(solid-js@1.8.15)
-      '@solid-devtools/shared': 0.13.1(solid-js@1.8.15)
-      '@solid-primitives/cursor': 0.0.112(solid-js@1.8.15)
-      '@solid-primitives/event-listener': 2.3.3(solid-js@1.8.15)
-      '@solid-primitives/media': 2.2.8(solid-js@1.8.15)
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
-
-  /@solid-devtools/shared@0.10.6(solid-js@1.8.15):
-    resolution: {integrity: sha512-UfLERQMxULRl2GoNc/Y1fMkRp71uTk/56dksowRLMdsyFpH3vqKr3+AHfm/2tXI/XeRAvXsXhC90zpVff5y+Hg==}
-    peerDependencies:
-      solid-js: ^1.6.2
-    dependencies:
-      '@solid-primitives/event-bus': 0.1.6(solid-js@1.8.15)
-      '@solid-primitives/event-listener': 2.3.3(solid-js@1.8.15)
-      '@solid-primitives/media': 2.2.8(solid-js@1.8.15)
-      '@solid-primitives/refs': 0.3.7(solid-js@1.8.15)
-      '@solid-primitives/rootless': 1.4.5(solid-js@1.8.15)
-      '@solid-primitives/scheduled': 1.4.3(solid-js@1.8.15)
-      '@solid-primitives/styles': 0.0.101(solid-js@1.8.15)
-      '@solid-primitives/utils': 4.0.1(solid-js@1.8.15)
-      solid-js: 1.8.15
-      type-fest: 3.13.1
-    dev: true
-
-  /@solid-devtools/shared@0.13.1(solid-js@1.8.15):
-    resolution: {integrity: sha512-qaAcZF47FFr4alVQSy5ooLy7mMt4MMDxSHw52heY1oCut8yfXDrnLcYDONabfoin2WYIwsQpjYhryHgjtB0uDg==}
-    peerDependencies:
-      solid-js: ^1.8.0
+      '@clack/prompts': 0.7.0
+      '@pandacss/config': 0.46.1
+      '@pandacss/logger': 0.46.1
+      '@pandacss/node': 0.46.1(jsdom@25.0.1)(typescript@5.6.3)
+      '@pandacss/postcss': 0.46.1(jsdom@25.0.1)(typescript@5.6.3)
+      '@pandacss/preset-panda': 0.46.1
+      '@pandacss/shared': 0.46.1
+      '@pandacss/token-dictionary': 0.46.1
+      '@pandacss/types': 0.46.1
+      cac: 6.7.14
+    transitivePeerDependencies:
+      - jsdom
+      - typescript
+
+  '@pandacss/extractor@0.46.1(jsdom@25.0.1)(typescript@5.6.3)':
     dependencies:
-      '@solid-primitives/event-bus': 1.0.11(solid-js@1.8.15)
-      '@solid-primitives/event-listener': 2.3.3(solid-js@1.8.15)
-      '@solid-primitives/media': 2.2.8(solid-js@1.8.15)
-      '@solid-primitives/refs': 1.0.8(solid-js@1.8.15)
-      '@solid-primitives/rootless': 1.4.5(solid-js@1.8.15)
-      '@solid-primitives/scheduled': 1.4.3(solid-js@1.8.15)
-      '@solid-primitives/static-store': 0.0.5(solid-js@1.8.15)
-      '@solid-primitives/styles': 0.0.111(solid-js@1.8.15)
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
-
-  /@solid-devtools/theme@0.0.1:
-    resolution: {integrity: sha512-10Kky0Ed4S89PFpJfcFsU6cc3ckNPTAjiEGYYoBdfaekvvAibdWllkbKhiDngPkwFUY8BpSi5ZLMlBPBxrxgLg==}
+      '@pandacss/shared': 0.46.1
+      ts-evaluator: 1.2.0(jsdom@25.0.1)(typescript@5.6.3)
+      ts-morph: 21.0.1
+    transitivePeerDependencies:
+      - jsdom
+      - typescript
+
+  '@pandacss/generator@0.46.1':
     dependencies:
-      '@nothing-but/utils': 0.12.1
-    dev: false
-
-  /@solid-devtools/transform@0.10.4(solid-js@1.8.15)(vite@5.1.6):
-    resolution: {integrity: sha512-r8JzHMmBFgaFy+FQVQdvNpTX8L3zwuiW1/puV3VHyaw1FpODmdmkbOnQgUQgHqN/X1LLPzTMtVGKLcDmJJOQbQ==}
-    deprecated: vite plugin has been moved entirely to 'solid-devtools' pacakge.
-    peerDependencies:
-      solid-js: ^1.6.2
-      vite: ^2.2.3 || ^3.0.0 || ^4.0.0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0)
-      '@babel/types': 7.24.0
-      '@solid-devtools/debugger': 0.18.1(solid-js@1.8.15)
-      '@solid-devtools/shared': 0.10.6(solid-js@1.8.15)
-      solid-js: 1.8.15
-      vite: 5.1.6
+      '@pandacss/core': 0.46.1
+      '@pandacss/is-valid-prop': 0.46.1
+      '@pandacss/logger': 0.46.1
+      '@pandacss/shared': 0.46.1
+      '@pandacss/token-dictionary': 0.46.1
+      '@pandacss/types': 0.46.1
+      javascript-stringify: 2.1.0
+      outdent: 0.8.0
+      pluralize: 8.0.0
+      postcss: 8.4.47
+      ts-pattern: 5.0.8
+
+  '@pandacss/is-valid-prop@0.46.1': {}
+
+  '@pandacss/logger@0.46.1':
+    dependencies:
+      '@pandacss/types': 0.46.1
+      kleur: 4.1.5
+
+  '@pandacss/node@0.46.1(jsdom@25.0.1)(typescript@5.6.3)':
+    dependencies:
+      '@pandacss/config': 0.46.1
+      '@pandacss/core': 0.46.1
+      '@pandacss/extractor': 0.46.1(jsdom@25.0.1)(typescript@5.6.3)
+      '@pandacss/generator': 0.46.1
+      '@pandacss/logger': 0.46.1
+      '@pandacss/parser': 0.46.1(jsdom@25.0.1)(typescript@5.6.3)
+      '@pandacss/shared': 0.46.1
+      '@pandacss/token-dictionary': 0.46.1
+      '@pandacss/types': 0.46.1
+      browserslist: 4.23.3
+      chokidar: 3.6.0
+      fast-glob: 3.3.2
+      file-size: 1.0.0
+      filesize: 10.1.6
+      fs-extra: 11.2.0
+      glob-parent: 6.0.2
+      is-glob: 4.0.3
+      lodash.merge: 4.6.2
+      look-it-up: 2.1.0
+      outdent: 0.8.0
+      package-manager-detector: 0.1.0
+      perfect-debounce: 1.0.0
+      pkg-types: 1.0.3
+      pluralize: 8.0.0
+      postcss: 8.4.47
+      prettier: 3.2.5
+      ts-morph: 21.0.1
+      ts-pattern: 5.0.8
+      tsconfck: 3.0.2(typescript@5.6.3)
     transitivePeerDependencies:
-      - supports-color
-    dev: true
+      - jsdom
+      - typescript
 
-  /@solid-primitives/bounds@0.0.105(solid-js@1.8.15):
-    resolution: {integrity: sha512-a2ZRuZayXV1/kSKx8cEOR5pIs2zKAF9lS3Gj/r7uHmBQBmn25GYCYOwj4LbLQbqqbumZr2eJO+/wDyi4UOX5pw==}
-    peerDependencies:
-      solid-js: ^1.6.0
+  '@pandacss/parser@0.46.1(jsdom@25.0.1)(typescript@5.6.3)':
     dependencies:
-      '@solid-primitives/event-listener': 2.3.3(solid-js@1.8.15)
-      '@solid-primitives/resize-observer': 2.0.25(solid-js@1.8.15)
-      '@solid-primitives/utils': 4.0.1(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: true
+      '@pandacss/config': 0.46.1
+      '@pandacss/core': 0.46.1
+      '@pandacss/extractor': 0.46.1(jsdom@25.0.1)(typescript@5.6.3)
+      '@pandacss/logger': 0.46.1
+      '@pandacss/shared': 0.46.1
+      '@pandacss/types': 0.46.1
+      '@vue/compiler-sfc': 3.4.19
+      magic-string: 0.30.11
+      ts-morph: 21.0.1
+      ts-pattern: 5.0.8
+    transitivePeerDependencies:
+      - jsdom
+      - typescript
 
-  /@solid-primitives/bounds@0.0.118(solid-js@1.8.15):
-    resolution: {integrity: sha512-Qj42w8LlnhJ3r/t+t0c0vrdwIvvQMPgjEFGmLiwREaA85ojLbgL9lSBq2tKvljeLCvRVkgj10KEUf+vc99VCIg==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@pandacss/postcss@0.46.1(jsdom@25.0.1)(typescript@5.6.3)':
     dependencies:
-      '@solid-primitives/event-listener': 2.3.3(solid-js@1.8.15)
-      '@solid-primitives/resize-observer': 2.0.25(solid-js@1.8.15)
-      '@solid-primitives/static-store': 0.0.5(solid-js@1.8.15)
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@pandacss/node': 0.46.1(jsdom@25.0.1)(typescript@5.6.3)
+      postcss: 8.4.47
+    transitivePeerDependencies:
+      - jsdom
+      - typescript
 
-  /@solid-primitives/context@0.2.3(solid-js@1.8.15):
-    resolution: {integrity: sha512-6/e8qu9qJf48FJ+sxc/B782NdgFw5TvI8+r6U0gHizumfZcWZg8FAJqvRZAiwlygkUNiTQOGTeO10LVbMm0kvg==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@pandacss/preset-base@0.46.1':
     dependencies:
-      solid-js: 1.8.15
-    dev: false
+      '@pandacss/types': 0.46.1
 
-  /@solid-primitives/cursor@0.0.103(solid-js@1.8.15):
-    resolution: {integrity: sha512-bb5x5lCimBf7R2VqrrMVcP2y/aGTMjNj7fjvY+RvTAC3/WtG/odqeYwka4lCBV27pX9TiJCKtNS6mVTigdfLMA==}
-    peerDependencies:
-      solid-js: ^1.6.0
+  '@pandacss/preset-panda@0.46.1':
     dependencies:
-      '@solid-primitives/utils': 4.0.1(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: true
+      '@pandacss/types': 0.46.1
 
-  /@solid-primitives/cursor@0.0.112(solid-js@1.8.15):
-    resolution: {integrity: sha512-TAtU7qD7ipSLSXHnq8FhhosAPVX+dnOCb/ITcGcLlj8e/C9YKcxDhgBHJ3R/d1xDRb5/vO/szJtEz6fnQD311Q==}
-    peerDependencies:
-      solid-js: ^1.6.12
-    dependencies:
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+  '@pandacss/shared@0.46.1': {}
 
-  /@solid-primitives/date@2.0.21(solid-js@1.8.15):
-    resolution: {integrity: sha512-DZSmILY9YZarO0IVRzac8gQ6aMgC9QKzKJEgZnv7cF5K4QdkzhdkYud3HC/pfacZ7x1elopZrS0HbCkQllCrYg==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@pandacss/token-dictionary@0.46.1':
     dependencies:
-      '@solid-primitives/memo': 1.3.8(solid-js@1.8.15)
-      '@solid-primitives/timer': 1.3.9(solid-js@1.8.15)
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@pandacss/logger': 0.46.1
+      '@pandacss/shared': 0.46.1
+      '@pandacss/types': 0.46.1
+      ts-pattern: 5.0.8
 
-  /@solid-primitives/event-bus@0.1.6(solid-js@1.8.15):
-    resolution: {integrity: sha512-UGtBU5zDyjSYnX0BjaYFcs1XfRD6BDN6VEJi4ydxePaUEKlloOG53BsLZjFgTux8cMEmJAaHjoJQH3/SBt3zcw==}
-    peerDependencies:
-      solid-js: ^1.6.0
-    dependencies:
-      '@solid-primitives/immutable': 0.1.10(solid-js@1.8.15)
-      '@solid-primitives/utils': 5.5.2(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: true
+  '@pandacss/types@0.46.1': {}
 
-  /@solid-primitives/event-bus@1.0.11(solid-js@1.8.15):
-    resolution: {integrity: sha512-bSwVA4aI2aNHomSbEroUnisMSyDDXJbrw4U8kFEvrcYdlLrJX5i6QeCFx+vj/zdQQw62KAllrEIyWP8KMpPVnQ==}
-    peerDependencies:
-      solid-js: ^1.6.12
-    dependencies:
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+  '@pkgjs/parseargs@0.11.0':
+    optional: true
 
-  /@solid-primitives/event-listener@2.3.3(solid-js@1.8.15):
-    resolution: {integrity: sha512-DAJbl+F0wrFW2xmcV8dKMBhk9QLVLuBSW+TR4JmIfTaObxd13PuL7nqaXnaYKDWOYa6otB00qcCUIGbuIhSUgQ==}
-    peerDependencies:
-      solid-js: ^1.6.12
-    dependencies:
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
+  '@pkgr/core@0.1.1': {}
 
-  /@solid-primitives/i18n@1.1.1(solid-js@1.8.15):
-    resolution: {integrity: sha512-ywIJ4MADZ25of6X/hgPTd6UNWbgM6X/ZNJStIexAlaLi9fFWw1yFRP/cllSBabEfMoCWgOETgoT16JQzxZlphg==}
-    peerDependencies:
-      solid-js: ^1.3.1
-    dependencies:
-      solid-js: 1.8.15
-    dev: false
+  '@polka/url@1.0.0-next.28': {}
 
-  /@solid-primitives/immutable@0.1.10(solid-js@1.8.15):
-    resolution: {integrity: sha512-5XkiiBGSuUaoG2HFei1bG2eDyUwsj/b6IBP7ggm4UMU5mM/APz1u7e3rzMyPn5zVqnHT3oRSbj3UDPNYb5Y9Qg==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@rollup/plugin-babel@5.3.1(@babel/core@7.25.7)(@types/babel__core@7.20.5)(rollup@2.79.2)':
     dependencies:
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/helper-module-imports': 7.25.7
+      '@rollup/pluginutils': 3.1.0(rollup@2.79.2)
+      rollup: 2.79.2
+    optionalDependencies:
+      '@types/babel__core': 7.20.5
+    transitivePeerDependencies:
+      - supports-color
 
-  /@solid-primitives/jsx-tokenizer@1.0.10(solid-js@1.8.15):
-    resolution: {integrity: sha512-OziPOhJcVneuEwuC4Ys2atePcBhXZK00h93Tg+dGw5GUijB8hvP97qXZ9Q8oNai0FCInlGUOYQnOgM9piBoSMQ==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@rollup/plugin-node-resolve@15.3.0(rollup@2.79.2)':
     dependencies:
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@rollup/pluginutils': 5.1.2(rollup@2.79.2)
+      '@types/resolve': 1.20.2
+      deepmerge: 4.3.1
+      is-module: 1.0.0
+      resolve: 1.22.8
+    optionalDependencies:
+      rollup: 2.79.2
 
-  /@solid-primitives/keyboard@1.2.8(solid-js@1.8.15):
-    resolution: {integrity: sha512-pJtcbkjozS6L1xvTht9rPpyPpX55nAkfBzbFWdf3y0Suwh6qClTibvvObzKOf7uzQ+8aZRDH4LsoGmbTKXtJjQ==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@rollup/plugin-replace@2.4.2(rollup@2.79.2)':
     dependencies:
-      '@solid-primitives/event-listener': 2.3.3(solid-js@1.8.15)
-      '@solid-primitives/rootless': 1.4.5(solid-js@1.8.15)
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
+      '@rollup/pluginutils': 3.1.0(rollup@2.79.2)
+      magic-string: 0.25.9
+      rollup: 2.79.2
 
-  /@solid-primitives/keyed@1.2.2(solid-js@1.8.15):
-    resolution: {integrity: sha512-oBziY40JK4XmJ57XGkFl8j0GtEarSu0hhjdkUQgqL/U0QQE3TZrRo9uhgH7I6VGJKBKG7SAraTPE6S5lVLM1ow==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@rollup/plugin-terser@0.4.4(rollup@2.79.2)':
     dependencies:
-      solid-js: 1.8.15
-    dev: false
+      serialize-javascript: 6.0.2
+      smob: 1.5.0
+      terser: 5.34.1
+    optionalDependencies:
+      rollup: 2.79.2
 
-  /@solid-primitives/map@0.4.11(solid-js@1.8.15):
-    resolution: {integrity: sha512-OAD65RPxMDYv41oAvadPCqedZfDX92BbWLUC+Qwh9okVMDAF/5UM+t1916OAfGV01Cr30d/fxIT1x86P+gFgSQ==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@rollup/pluginutils@3.1.0(rollup@2.79.2)':
     dependencies:
-      '@solid-primitives/trigger': 1.0.11(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@types/estree': 0.0.39
+      estree-walker: 1.0.1
+      picomatch: 2.3.1
+      rollup: 2.79.2
 
-  /@solid-primitives/media@2.2.8(solid-js@1.8.15):
-    resolution: {integrity: sha512-jcwTxjEn07W5KEeQIc0nR+07xRjvsWTf115PIwScCWgo6aPkfW3x74aq7lH5F3mLfb/9SeTn0ixz8fBVel3cHg==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@rollup/pluginutils@5.1.2(rollup@2.79.2)':
     dependencies:
-      '@solid-primitives/event-listener': 2.3.3(solid-js@1.8.15)
-      '@solid-primitives/rootless': 1.4.5(solid-js@1.8.15)
-      '@solid-primitives/static-store': 0.0.8(solid-js@1.8.15)
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
+      '@types/estree': 1.0.6
+      estree-walker: 2.0.2
+      picomatch: 2.3.1
+    optionalDependencies:
+      rollup: 2.79.2
 
-  /@solid-primitives/memo@1.3.8(solid-js@1.8.15):
-    resolution: {integrity: sha512-U75pfLFSxFmM2xbx1+2XPPyWbaXrnUFF10spbFuOUgJ7azrC+4y+FnrVi4RKqHw9gftd8aKQuTiyMQq468YLQw==}
-    peerDependencies:
-      solid-js: ^1.6.12
-    dependencies:
-      '@solid-primitives/scheduled': 1.4.3(solid-js@1.8.15)
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+  '@rollup/rollup-android-arm-eabi@4.24.0':
+    optional: true
 
-  /@solid-primitives/mouse@2.0.19(solid-js@1.8.15):
-    resolution: {integrity: sha512-mVYhWsMjjIdZ8iLIypiYGhNGtLOFVCmCeXaNQVYUjPOZkZOm9aaKjjGqgdwVw5RtJ0ZfNvKH/A5WE1t/fOBvLA==}
-    peerDependencies:
-      solid-js: ^1.6.12
-    dependencies:
-      '@solid-primitives/event-listener': 2.3.3(solid-js@1.8.15)
-      '@solid-primitives/rootless': 1.4.5(solid-js@1.8.15)
-      '@solid-primitives/static-store': 0.0.8(solid-js@1.8.15)
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+  '@rollup/rollup-android-arm64@4.24.0':
+    optional: true
 
-  /@solid-primitives/platform@0.0.100(solid-js@1.8.15):
-    resolution: {integrity: sha512-TMGeDtjA8b7xlUQGq3QhdR8SSa49bvqhFJ0iD+iy4fsnEHr9xA5hIDyBX/ntmz70SbOVyz+z9IdXwBnqurr4bQ==}
-    peerDependencies:
-      solid-js: ^1.4.0
-    dependencies:
-      solid-js: 1.8.15
-    dev: false
+  '@rollup/rollup-darwin-arm64@4.24.0':
+    optional: true
 
-  /@solid-primitives/platform@0.0.102(solid-js@1.8.15):
-    resolution: {integrity: sha512-1eZA1/HYOhmlZ9LrrGot+LUi/ypO2NXqfB+9F1WY98dGNDMz9pG9k+X7kg2YDJTUHDGbzY7WrsBRyAE8LurE7Q==}
-    peerDependencies:
-      solid-js: ^1.5.0
-    dependencies:
-      solid-js: 1.8.15
-    dev: true
+  '@rollup/rollup-darwin-x64@4.24.0':
+    optional: true
 
-  /@solid-primitives/platform@0.1.2(solid-js@1.8.15):
-    resolution: {integrity: sha512-sSxcZfuUrtxcwV0vdjmGnZQcflACzMfLriVeIIWXKp8hzaS3Or3tO6EFQkTd3L8T5dTq+kTtLvPscXIpL0Wzdg==}
-    peerDependencies:
-      solid-js: ^1.6.12
-    dependencies:
-      solid-js: 1.8.15
-    dev: false
+  '@rollup/rollup-linux-arm-gnueabihf@4.24.0':
+    optional: true
 
-  /@solid-primitives/props@2.2.2(solid-js@1.8.15):
-    resolution: {integrity: sha512-vjRRoi/z3S2ylIJKCs+mN07oxDmt2S9gPCbTqkEx8jYHnvzocpt34UQdglLoSklTE6jI37JhW3g/Cs8Qr/peHg==}
-    peerDependencies:
-      solid-js: ^1.3.0
-    dependencies:
-      '@solid-primitives/utils': 3.1.0(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+  '@rollup/rollup-linux-arm-musleabihf@4.24.0':
+    optional: true
 
-  /@solid-primitives/props@3.1.11(solid-js@1.8.15):
-    resolution: {integrity: sha512-jZAKWwvDRHjiydIumDgMj68qviIbowQ1ci7nkEAgzgvanNkhKSQV8iPgR2jMk1uv7S2ZqXYHslVQTgJel/TEyg==}
-    peerDependencies:
-      solid-js: ^1.6.12
-    dependencies:
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+  '@rollup/rollup-linux-arm64-gnu@4.24.0':
+    optional: true
 
-  /@solid-primitives/range@0.1.18(solid-js@1.8.15):
-    resolution: {integrity: sha512-F5OTdpRFdeLOPEHs92S714GKUk1ZUUmEJ45Z/Z5h6i43DHi7fUFgUL7LeHFxVgIjtGv+Tg5Op7aM9PdSo5iqeQ==}
-    peerDependencies:
-      solid-js: ^1.6.12
-    dependencies:
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+  '@rollup/rollup-linux-arm64-musl@4.24.0':
+    optional: true
 
-  /@solid-primitives/refs@0.3.7(solid-js@1.8.15):
-    resolution: {integrity: sha512-aqidj/Sw5b2FvXgvNP8zH5HC2jEzDbFju+xRUCxZguaBmDJJyzec12fpZ9JV6SiWCyk08nZ/N4rfPNQnt1af1Q==}
-    peerDependencies:
-      solid-js: ^1.6.0
+  '@rollup/rollup-linux-powerpc64le-gnu@4.24.0':
+    optional: true
+
+  '@rollup/rollup-linux-riscv64-gnu@4.24.0':
+    optional: true
+
+  '@rollup/rollup-linux-s390x-gnu@4.24.0':
+    optional: true
+
+  '@rollup/rollup-linux-x64-gnu@4.24.0':
+    optional: true
+
+  '@rollup/rollup-linux-x64-musl@4.24.0':
+    optional: true
+
+  '@rollup/rollup-win32-arm64-msvc@4.24.0':
+    optional: true
+
+  '@rollup/rollup-win32-ia32-msvc@4.24.0':
+    optional: true
+
+  '@rollup/rollup-win32-x64-msvc@4.24.0':
+    optional: true
+
+  '@sentry-internal/browser-utils@8.33.1':
     dependencies:
-      '@solid-primitives/immutable': 0.1.10(solid-js@1.8.15)
-      '@solid-primitives/rootless': 1.4.5(solid-js@1.8.15)
-      '@solid-primitives/utils': 5.5.2(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: true
+      '@sentry/core': 8.33.1
+      '@sentry/types': 8.33.1
+      '@sentry/utils': 8.33.1
 
-  /@solid-primitives/refs@1.0.8(solid-js@1.8.15):
-    resolution: {integrity: sha512-+jIsWG8/nYvhaCoG2Vg6CJOLgTmPKFbaCrNQKWfChalgUf9WrVxWw0CdJb3yX15n5lUcQ0jBo6qYtuVVmBLpBw==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@sentry-internal/feedback@8.33.1':
     dependencies:
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@sentry/core': 8.33.1
+      '@sentry/types': 8.33.1
+      '@sentry/utils': 8.33.1
 
-  /@solid-primitives/resize-observer@2.0.25(solid-js@1.8.15):
-    resolution: {integrity: sha512-jVDXkt2MiriYRaz4DYs62185d+6jQ+1DCsR+v7f6XMsIJJuf963qdBRFjtZtKXBaxdPNMyuPeDgf5XQe3EoDJg==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@sentry-internal/replay-canvas@8.33.1':
     dependencies:
-      '@solid-primitives/event-listener': 2.3.3(solid-js@1.8.15)
-      '@solid-primitives/rootless': 1.4.5(solid-js@1.8.15)
-      '@solid-primitives/static-store': 0.0.8(solid-js@1.8.15)
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
+      '@sentry-internal/replay': 8.33.1
+      '@sentry/core': 8.33.1
+      '@sentry/types': 8.33.1
+      '@sentry/utils': 8.33.1
 
-  /@solid-primitives/rootless@1.4.5(solid-js@1.8.15):
-    resolution: {integrity: sha512-GFJE9GC3ojx0aUKqAUZmQPyU8fOVMtnVNrkdk2yS4kd17WqVSpXpoTmo9CnOwA+PG7FTzdIkogvfLQSLs4lrww==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@sentry-internal/replay@8.33.1':
     dependencies:
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
+      '@sentry-internal/browser-utils': 8.33.1
+      '@sentry/core': 8.33.1
+      '@sentry/types': 8.33.1
+      '@sentry/utils': 8.33.1
 
-  /@solid-primitives/scheduled@1.4.3(solid-js@1.8.15):
-    resolution: {integrity: sha512-HfWN5w7b7FEc6VPLBKnnE302h90jsLMuR28Fcf7neRGGf8jBj6wm6/UFQ00VlKexHFMR6KQ2u4VBh5a1ZcqM8g==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@sentry-internal/tracing@7.114.0':
     dependencies:
-      solid-js: 1.8.15
+      '@sentry/core': 7.114.0
+      '@sentry/types': 7.114.0
+      '@sentry/utils': 7.114.0
 
-  /@solid-primitives/script-loader@2.1.2(solid-js@1.8.15):
-    resolution: {integrity: sha512-dIeJ3FWfBAlYZzQ0XLpv1ukHcTxPYphCURS01Hri18ykb28eCOdYtgn3OVNgYzAvm9y8rW5IoyIMY+JzYD6Fhw==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@sentry/browser@8.33.1':
     dependencies:
-      solid-js: 1.8.15
-    dev: false
+      '@sentry-internal/browser-utils': 8.33.1
+      '@sentry-internal/feedback': 8.33.1
+      '@sentry-internal/replay': 8.33.1
+      '@sentry-internal/replay-canvas': 8.33.1
+      '@sentry/core': 8.33.1
+      '@sentry/types': 8.33.1
+      '@sentry/utils': 8.33.1
 
-  /@solid-primitives/set@0.4.11(solid-js@1.8.15):
-    resolution: {integrity: sha512-DBA4KjOvqc8aer0EO14MkJM6pgs+WHujkfRVwwE31i7NVzpiqp3RY9it2dvmLthj4MHzvOBoeZosgN8Pm44GiA==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@sentry/core@7.114.0':
     dependencies:
-      '@solid-primitives/trigger': 1.0.11(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@sentry/types': 7.114.0
+      '@sentry/utils': 7.114.0
 
-  /@solid-primitives/static-store@0.0.5(solid-js@1.8.15):
-    resolution: {integrity: sha512-ssQ+s/wrlFAEE4Zw8GV499yBfvWx7SMm+ZVc11wvao4T5xg9VfXCL9Oa+x4h+vPMvSV/Knv5LrsLiUa+wlJUXQ==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@sentry/core@8.33.1':
     dependencies:
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@sentry/types': 8.33.1
+      '@sentry/utils': 8.33.1
 
-  /@solid-primitives/static-store@0.0.8(solid-js@1.8.15):
-    resolution: {integrity: sha512-ZecE4BqY0oBk0YG00nzaAWO5Mjcny8Fc06CdbXadH9T9lzq/9GefqcSe/5AtdXqjvY/DtJ5C6CkcjPZO0o/eqg==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@sentry/tracing@7.114.0':
     dependencies:
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
+      '@sentry-internal/tracing': 7.114.0
 
-  /@solid-primitives/styles@0.0.101(solid-js@1.8.15):
-    resolution: {integrity: sha512-tHkeUMntlS/w+/zDzXJv82hhMy3J3q7tVV3ZTbahRo0hZienAM8ZJrCYZNK/fu2px8NHVSZFRufxv9qhIclPTw==}
-    peerDependencies:
-      solid-js: ^1.5.0
+  '@sentry/types@7.114.0': {}
+
+  '@sentry/types@8.33.1': {}
+
+  '@sentry/utils@7.114.0':
     dependencies:
-      '@solid-primitives/rootless': 1.4.5(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: true
+      '@sentry/types': 7.114.0
 
-  /@solid-primitives/styles@0.0.111(solid-js@1.8.15):
-    resolution: {integrity: sha512-1mBxOGAPXmfD5oYCvqjKBDN7SuNjz2qz7RdH7KtsuNLQh6lpuSKadtHnLvru0Y8Vz1InqTJisBIy/6P5kyDmPw==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@sentry/utils@8.33.1':
     dependencies:
-      '@solid-primitives/rootless': 1.4.5(solid-js@1.8.15)
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@sentry/types': 8.33.1
 
-  /@solid-primitives/timer@1.3.9(solid-js@1.8.15):
-    resolution: {integrity: sha512-uD+4+boV7k+5W+hL5d30eodUXSwOfOQz8AfbMPVmLOHaTmd0mdfpw0NkYhyn1rgcx1bSn/nHTd8lraHiMhO/6w==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@shikijs/core@1.22.0':
     dependencies:
-      solid-js: 1.8.15
-    dev: false
+      '@shikijs/engine-javascript': 1.22.0
+      '@shikijs/engine-oniguruma': 1.22.0
+      '@shikijs/types': 1.22.0
+      '@shikijs/vscode-textmate': 9.3.0
+      '@types/hast': 3.0.4
+      hast-util-to-html: 9.0.3
 
-  /@solid-primitives/transition-group@1.0.5(solid-js@1.8.15):
-    resolution: {integrity: sha512-G3FuqvL13kQ55WzWPX2ewiXdZ/1iboiX53195sq7bbkDbXqP6TYKiadwEdsaDogW5rPnPYAym3+xnsNplQJRKQ==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@shikijs/engine-javascript@1.22.0':
     dependencies:
-      solid-js: 1.8.15
-    dev: false
+      '@shikijs/types': 1.22.0
+      '@shikijs/vscode-textmate': 9.3.0
+      oniguruma-to-js: 0.4.3
 
-  /@solid-primitives/trigger@1.0.11(solid-js@1.8.15):
-    resolution: {integrity: sha512-4oc8grBzBit7ByXgE1aZ0QXfhdlhXaiFjDKYsOhRyUJa8fN4hdr2IgsYqjmHwxyjK+Dm2OUwkCI1bGkaLgtgXg==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@shikijs/engine-oniguruma@1.22.0':
     dependencies:
-      '@solid-primitives/utils': 6.2.3(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@shikijs/types': 1.22.0
+      '@shikijs/vscode-textmate': 9.3.0
 
-  /@solid-primitives/utils@2.2.1(solid-js@1.8.15):
-    resolution: {integrity: sha512-vaBO3MGOpjzitbSAVuJkYZnzNPRl6sRrw2do390DEBbfeqMfPpW4fAEb5/tI4b5T13V1xAY+giHoxqvVg2SRhQ==}
-    peerDependencies:
-      solid-js: ^1.4.1
+  '@shikijs/types@1.22.0':
     dependencies:
-      solid-js: 1.8.15
-    dev: false
+      '@shikijs/vscode-textmate': 9.3.0
+      '@types/hast': 3.0.4
 
-  /@solid-primitives/utils@3.1.0(solid-js@1.8.15):
-    resolution: {integrity: sha512-/rerChcwgFtHEgVCCBY7BXGHh7a83HcIAzR8QhXJ789geIVbBs2YxHF4UUZlG7ec00NKSfvO3+sQquN/xKQLMw==}
-    peerDependencies:
-      solid-js: ^1.5.0
+  '@shikijs/vscode-textmate@9.3.0': {}
+
+  '@sinclair/typebox@0.27.8': {}
+
+  '@sinonjs/commons@1.8.6':
     dependencies:
-      solid-js: 1.8.15
-    dev: false
+      type-detect: 4.0.8
 
-  /@solid-primitives/utils@4.0.1(solid-js@1.8.15):
-    resolution: {integrity: sha512-06fSyBair7ZxCquMjIqJes29aNg65X776TVw4EUN7PBtdWsGUeIZ9F/H4ek7yrDSxaSDaPHeye5knEYsYAq2gA==}
-    peerDependencies:
-      solid-js: ^1.6.0
+  '@sinonjs/fake-timers@8.1.0':
     dependencies:
-      solid-js: 1.8.15
-    dev: true
+      '@sinonjs/commons': 1.8.6
 
-  /@solid-primitives/utils@5.5.2(solid-js@1.8.15):
-    resolution: {integrity: sha512-L52ig3eHKU6CqbPCKJIb4lweBuINHBOERcE1duApyKozEN8+zCqEKwD1Qo9ljKeEzJTBGWClxNpwEiNTUWTGvg==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@solid-aria/button@0.1.3(solid-js@1.9.2)':
     dependencies:
-      solid-js: 1.8.15
-    dev: true
+      '@solid-aria/focus': 0.1.4(solid-js@1.9.2)
+      '@solid-aria/interactions': 0.1.4(solid-js@1.9.2)
+      '@solid-aria/toggle': 0.1.3(solid-js@1.9.2)
+      '@solid-aria/types': 0.1.4(solid-js@1.9.2)
+      '@solid-aria/utils': 0.2.1(solid-js@1.9.2)
+      '@solid-primitives/props': 2.2.2(solid-js@1.9.2)
+      '@solid-primitives/utils': 2.2.1(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@solid-primitives/utils@6.2.3(solid-js@1.8.15):
-    resolution: {integrity: sha512-CqAwKb2T5Vi72+rhebSsqNZ9o67buYRdEJrIFzRXz3U59QqezuuxPsyzTSVCacwS5Pf109VRsgCJQoxKRoECZQ==}
-    peerDependencies:
-      solid-js: ^1.6.12
+  '@solid-aria/focus@0.1.4(solid-js@1.9.2)':
     dependencies:
-      solid-js: 1.8.15
+      '@solid-aria/interactions': 0.1.4(solid-js@1.9.2)
+      '@solid-aria/types': 0.1.4(solid-js@1.9.2)
+      '@solid-aria/utils': 0.2.1(solid-js@1.9.2)
+      '@solid-primitives/props': 2.2.2(solid-js@1.9.2)
+      '@solid-primitives/utils': 2.2.1(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@solidjs/router@0.13.0(solid-js@1.8.15):
-    resolution: {integrity: sha512-YHLbFv9J53+iG4yVrh0vVdYiyXPTk892UyZ1jiMPsUXn2dYkX4552N+8SjvlKWWsmNmYxaoefM6jZn1YtVIUUg==}
-    peerDependencies:
-      solid-js: ^1.8.6
+  '@solid-aria/interactions@0.1.4(solid-js@1.9.2)':
     dependencies:
-      solid-js: 1.8.15
+      '@solid-aria/types': 0.1.4(solid-js@1.9.2)
+      '@solid-aria/utils': 0.2.1(solid-js@1.9.2)
+      '@solid-primitives/platform': 0.0.100(solid-js@1.9.2)
+      '@solid-primitives/props': 2.2.2(solid-js@1.9.2)
+      '@solid-primitives/utils': 2.2.1(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@solidjs/testing-library@0.8.6(@solidjs/router@0.13.0)(solid-js@1.8.15):
-    resolution: {integrity: sha512-MnDGfUw38SjE+lmCDZ44HeZq5WbDU7s/BTa7uvqv55GKatddoWiJmHanUAbuEtmwMdEv+fFQQzftkqrFXEn1BQ==}
-    engines: {node: '>= 14'}
-    peerDependencies:
-      '@solidjs/router': '>=0.9.0'
-      solid-js: '>=1.0.0'
+  '@solid-aria/toggle@0.1.3(solid-js@1.9.2)':
     dependencies:
-      '@solidjs/router': 0.13.0(solid-js@1.8.15)
-      '@testing-library/dom': 9.3.4
-      solid-js: 1.8.15
-    dev: true
+      '@solid-aria/focus': 0.1.4(solid-js@1.9.2)
+      '@solid-aria/interactions': 0.1.4(solid-js@1.9.2)
+      '@solid-aria/types': 0.1.4(solid-js@1.9.2)
+      '@solid-aria/utils': 0.2.1(solid-js@1.9.2)
+      '@solid-primitives/props': 2.2.2(solid-js@1.9.2)
+      '@solid-primitives/utils': 2.2.1(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/addon-actions@8.2.0-alpha.5:
-    resolution: {integrity: sha512-LVPOqkGgU9WbF79pTzMiAKBZMpRov7dEwHkhEnu4Z8ex2pFetTm5yMvbpWwCxtNZBOeAMpxPMG4lWxZ9hRofbA==}
+  '@solid-aria/types@0.1.4(solid-js@1.9.2)':
     dependencies:
-      '@storybook/core-events': 8.2.0-alpha.5
-      '@storybook/global': 5.0.0
-      '@types/uuid': 9.0.8
-      dequal: 2.0.3
-      polished: 4.3.1
-      uuid: 9.0.1
-    dev: true
+      '@solid-primitives/utils': 2.2.1(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/addon-backgrounds@8.2.0-alpha.5:
-    resolution: {integrity: sha512-5XBKVNO5a4Nt9ZPyI+ctX/vI6USw5M++1Mw7B+PxUTQIGmH/FlV52RUFv9kd32NRQ3jCrF3QxfjHbuLJyP1Ziw==}
+  '@solid-aria/utils@0.2.1(solid-js@1.9.2)':
     dependencies:
-      '@storybook/global': 5.0.0
-      memoizerific: 1.11.3
-      ts-dedent: 2.2.0
-    dev: true
+      '@solid-aria/types': 0.1.4(solid-js@1.9.2)
+      '@solid-primitives/utils': 2.2.1(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/addon-controls@8.2.0-alpha.5(@types/react@18.3.3)(prettier@3.2.5)(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-fygipOcpoRA4HC6AgsbWCQ4bjBGg7B2suBXKRSdSX0TRVhPpHnGEnysXXPyzo3cpA4VWho86q15MJAcvWNrSSA==}
+  '@solid-devtools/debugger@0.23.4(solid-js@1.9.2)':
     dependencies:
-      '@storybook/blocks': 8.2.0-alpha.5(@types/react@18.3.3)(prettier@3.2.5)(react-dom@18.3.1)(react@18.3.1)
-      dequal: 2.0.3
-      lodash: 4.17.21
-      ts-dedent: 2.2.0
-    transitivePeerDependencies:
-      - '@types/react'
-      - '@types/react-dom'
-      - encoding
-      - prettier
-      - react
-      - react-dom
-      - supports-color
-    dev: true
-
-  /@storybook/addon-docs@8.2.0-alpha.5(prettier@3.2.5):
-    resolution: {integrity: sha512-G0oZTF+HpF+WfYVcsvPoF+eHcWtgsHcUXpTEKgrgyv/WT/GpawWrrRSky9/iEk2mAWqw+oQKE4uh1nswaB1iOQ==}
-    dependencies:
-      '@babel/core': 7.24.7
-      '@mdx-js/react': 3.0.1(@types/react@18.3.3)(react@18.3.1)
-      '@storybook/blocks': 8.2.0-alpha.5(@types/react@18.3.3)(prettier@3.2.5)(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/client-logger': 8.2.0-alpha.5
-      '@storybook/components': 8.2.0-alpha.5(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/csf-plugin': 8.2.0-alpha.5
-      '@storybook/csf-tools': 8.2.0-alpha.5
-      '@storybook/global': 5.0.0
-      '@storybook/node-logger': 8.2.0-alpha.5
-      '@storybook/preview-api': 8.2.0-alpha.5
-      '@storybook/react-dom-shim': 8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/theming': 8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/types': 8.2.0-alpha.5
-      '@types/react': 18.3.3
-      fs-extra: 11.2.0
-      react: 18.3.1
-      react-dom: 18.3.1(react@18.3.1)
-      rehype-external-links: 3.0.0
-      rehype-slug: 6.0.0
-      ts-dedent: 2.2.0
-    transitivePeerDependencies:
-      - '@types/react-dom'
-      - encoding
-      - prettier
-      - supports-color
-    dev: true
-
-  /@storybook/addon-essentials@8.2.0-alpha.5(@types/react@18.3.3)(prettier@3.2.5)(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-EzYDBzp7iJShevPs0iHMVoYcMrZgUhxH+5Kc/NNG4LxBo1yBVYgj3fr1SZ1h0ChVti8SGc2slUcXLV/s1hZFUg==}
-    dependencies:
-      '@storybook/addon-actions': 8.2.0-alpha.5
-      '@storybook/addon-backgrounds': 8.2.0-alpha.5
-      '@storybook/addon-controls': 8.2.0-alpha.5(@types/react@18.3.3)(prettier@3.2.5)(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/addon-docs': 8.2.0-alpha.5(prettier@3.2.5)
-      '@storybook/addon-highlight': 8.2.0-alpha.5
-      '@storybook/addon-measure': 8.2.0-alpha.5
-      '@storybook/addon-outline': 8.2.0-alpha.5
-      '@storybook/addon-toolbars': 8.2.0-alpha.5
-      '@storybook/addon-viewport': 8.2.0-alpha.5
-      '@storybook/core-common': 8.2.0-alpha.5(prettier@3.2.5)
-      '@storybook/manager-api': 8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/node-logger': 8.2.0-alpha.5
-      '@storybook/preview-api': 8.2.0-alpha.5
-      ts-dedent: 2.2.0
-    transitivePeerDependencies:
-      - '@types/react'
-      - '@types/react-dom'
-      - encoding
-      - prettier
-      - react
-      - react-dom
-      - supports-color
-    dev: true
+      '@nothing-but/utils': 0.12.1
+      '@solid-devtools/shared': 0.13.2(solid-js@1.9.2)
+      '@solid-primitives/bounds': 0.0.118(solid-js@1.9.2)
+      '@solid-primitives/cursor': 0.0.112(solid-js@1.9.2)
+      '@solid-primitives/event-bus': 1.0.11(solid-js@1.9.2)
+      '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.2)
+      '@solid-primitives/keyboard': 1.2.8(solid-js@1.9.2)
+      '@solid-primitives/platform': 0.1.2(solid-js@1.9.2)
+      '@solid-primitives/rootless': 1.4.5(solid-js@1.9.2)
+      '@solid-primitives/scheduled': 1.4.3(solid-js@1.9.2)
+      '@solid-primitives/static-store': 0.0.5(solid-js@1.9.2)
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/addon-highlight@8.2.0-alpha.5:
-    resolution: {integrity: sha512-A2wEiJ7ln7yX3LOPPJUeA5CAGpssHUXnOoBq97r20vfANztBpOrljVX4cuP7DXmr3G6ThZ0ME6uN/snwWQ3GoA==}
+  '@solid-devtools/shared@0.13.2(solid-js@1.9.2)':
     dependencies:
-      '@storybook/global': 5.0.0
-    dev: true
+      '@solid-primitives/event-bus': 1.0.11(solid-js@1.9.2)
+      '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.2)
+      '@solid-primitives/media': 2.2.9(solid-js@1.9.2)
+      '@solid-primitives/refs': 1.0.8(solid-js@1.9.2)
+      '@solid-primitives/rootless': 1.4.5(solid-js@1.9.2)
+      '@solid-primitives/scheduled': 1.4.3(solid-js@1.9.2)
+      '@solid-primitives/static-store': 0.0.5(solid-js@1.9.2)
+      '@solid-primitives/styles': 0.0.111(solid-js@1.9.2)
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/addon-interactions@8.2.0-alpha.5(vitest@1.4.0):
-    resolution: {integrity: sha512-mPXwuJpnFVAkZllEnYST4mz7kLHSjVttA+JaeVfRkgb0LehQHsIpUi1WcEcvLfq7s3E3ylz5ZS0kUJX2/WsC4A==}
+  '@solid-primitives/bounds@0.0.118(solid-js@1.9.2)':
     dependencies:
-      '@storybook/global': 5.0.0
-      '@storybook/instrumenter': 8.2.0-alpha.5
-      '@storybook/test': 8.2.0-alpha.5(vitest@1.4.0)
-      '@storybook/types': 8.2.0-alpha.5
-      polished: 4.3.1
-      ts-dedent: 2.2.0
-    transitivePeerDependencies:
-      - '@jest/globals'
-      - '@types/bun'
-      - '@types/jest'
-      - jest
-      - vitest
-    dev: true
+      '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.2)
+      '@solid-primitives/resize-observer': 2.0.26(solid-js@1.9.2)
+      '@solid-primitives/static-store': 0.0.5(solid-js@1.9.2)
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/addon-links@8.2.0-alpha.5(react@18.3.1):
-    resolution: {integrity: sha512-h+fdVkZRbNGokCL4fPwGpOfKQPB5WWOAzYY/u7Q/6vL7GxPMUDRb8oP/ZM5srheOdZ1LudLu7gXlclabtVKLDQ==}
-    peerDependencies:
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
-    peerDependenciesMeta:
-      react:
-        optional: true
+  '@solid-primitives/cursor@0.0.112(solid-js@1.9.2)':
     dependencies:
-      '@storybook/csf': 0.1.8
-      '@storybook/global': 5.0.0
-      react: 18.3.1
-      ts-dedent: 2.2.0
-    dev: true
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/addon-measure@8.2.0-alpha.5:
-    resolution: {integrity: sha512-zWqJlsgPAhq54YwyOXJqifrvH0/DK8o2E2/K2rt/xS+lwpIE9Yr4pfRECQ6UD7diGNXgKxVaMBbi35/krVsyMQ==}
+  '@solid-primitives/event-bus@1.0.11(solid-js@1.9.2)':
     dependencies:
-      '@storybook/global': 5.0.0
-      tiny-invariant: 1.3.3
-    dev: true
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/addon-outline@8.2.0-alpha.5:
-    resolution: {integrity: sha512-KL3JbXsQh+CrwGFcvjAEiG8bZ9qe+J0QYipBCodyPzFl+sOhpsvMAzLL1LJxbwI2Qgf7O+iztmkqv/P360tnRA==}
+  '@solid-primitives/event-listener@2.3.3(solid-js@1.9.2)':
     dependencies:
-      '@storybook/global': 5.0.0
-      ts-dedent: 2.2.0
-    dev: true
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/addon-toolbars@8.2.0-alpha.5:
-    resolution: {integrity: sha512-NHH/7WH7sBtARIb/KpVPSRaAKQjb5wj6ld6QKU0ozucgLIHp6qUxgapKIf8RAhfdDYHPmAR0bIK5konlSb8Zdw==}
-    dev: true
+  '@solid-primitives/i18n@2.1.1(solid-js@1.9.2)':
+    dependencies:
+      solid-js: 1.9.2
 
-  /@storybook/addon-viewport@8.2.0-alpha.5:
-    resolution: {integrity: sha512-lhoKTT1lhlprgm+Dwg/Mm19wwqXhNOFCXHdWD8h9dKuhYKPv/9gvPJsAhIjRHIjJdAu8rjOeBUdBgPlS9d/HWg==}
+  '@solid-primitives/keyboard@1.2.8(solid-js@1.9.2)':
     dependencies:
-      memoizerific: 1.11.3
-    dev: true
+      '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.2)
+      '@solid-primitives/rootless': 1.4.5(solid-js@1.9.2)
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/blocks@8.2.0-alpha.5(@types/react@18.3.3)(prettier@3.2.5)(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-G8xEdHpBy99Jy6PgCqKvJwRCSKPmLJqPtjd8gRfVVwJrFtTTZG6ELAUplC9KDWxAjP11WIRPG9O7boSkNxPyYQ==}
-    peerDependencies:
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
-      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
-    peerDependenciesMeta:
-      react:
-        optional: true
-      react-dom:
-        optional: true
+  '@solid-primitives/keyed@1.2.2(solid-js@1.9.2)':
     dependencies:
-      '@storybook/channels': 8.2.0-alpha.5
-      '@storybook/client-logger': 8.2.0-alpha.5
-      '@storybook/components': 8.2.0-alpha.5(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/core-events': 8.2.0-alpha.5
-      '@storybook/csf': 0.1.8
-      '@storybook/docs-tools': 8.2.0-alpha.5(prettier@3.2.5)
-      '@storybook/global': 5.0.0
-      '@storybook/icons': 1.2.9(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/manager-api': 8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/preview-api': 8.2.0-alpha.5
-      '@storybook/theming': 8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/types': 8.2.0-alpha.5
-      '@types/lodash': 4.17.0
-      color-convert: 2.0.1
-      dequal: 2.0.3
-      lodash: 4.17.21
-      markdown-to-jsx: 7.4.7(react@18.3.1)
-      memoizerific: 1.11.3
-      polished: 4.3.1
-      react: 18.3.1
-      react-colorful: 5.6.1(react-dom@18.3.1)(react@18.3.1)
-      react-dom: 18.3.1(react@18.3.1)
-      telejson: 7.2.0
-      tocbot: 4.28.2
-      ts-dedent: 2.2.0
-      util-deprecate: 1.0.2
-    transitivePeerDependencies:
-      - '@types/react'
-      - '@types/react-dom'
-      - encoding
-      - prettier
-      - supports-color
-    dev: true
+      solid-js: 1.9.2
 
-  /@storybook/builder-manager@8.2.0-alpha.5(prettier@3.2.5):
-    resolution: {integrity: sha512-CcpMFUEGRhKFuz6BZbKXRCxDtuejJPD9hh1g/LOpJqsoALRbpjC2cGoK5PUJb05lvgkGUjR9kBwXfjDysVwcyg==}
+  '@solid-primitives/map@0.4.13(solid-js@1.9.2)':
     dependencies:
-      '@fal-works/esbuild-plugin-global-externals': 2.1.2
-      '@storybook/core-common': 8.2.0-alpha.5(prettier@3.2.5)
-      '@storybook/manager': 8.2.0-alpha.5
-      '@storybook/node-logger': 8.2.0-alpha.5
-      '@types/ejs': 3.1.5
-      '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.20.2)
-      browser-assert: 1.2.1
-      ejs: 3.1.10
-      esbuild: 0.20.2
-      esbuild-plugin-alias: 0.2.1
-      express: 4.19.2
-      fs-extra: 11.2.0
-      process: 0.11.10
-      util: 0.12.5
-    transitivePeerDependencies:
-      - encoding
-      - prettier
-      - supports-color
-    dev: true
+      '@solid-primitives/trigger': 1.1.0(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/builder-vite@8.2.0-alpha.10(prettier@3.2.5)(typescript@5.4.2)(vite@5.1.6):
-    resolution: {integrity: sha512-kWLMSuBb0VHW/iu+yg/IoI23c9jgz5ijzp84b7k8RFzbEnDaFGKOFybbHElvGhUEey0P4rauzDcarZ69sbg/Yg==}
-    peerDependencies:
-      '@preact/preset-vite': '*'
-      typescript: '>= 4.3.x'
-      vite: ^4.0.0 || ^5.0.0
-      vite-plugin-glimmerx: '*'
-    peerDependenciesMeta:
-      '@preact/preset-vite':
-        optional: true
-      typescript:
-        optional: true
-      vite-plugin-glimmerx:
-        optional: true
+  '@solid-primitives/media@2.2.9(solid-js@1.9.2)':
     dependencies:
-      '@storybook/channels': 8.2.0-alpha.10
-      '@storybook/client-logger': 8.2.0-alpha.10
-      '@storybook/core-common': 8.2.0-alpha.10(prettier@3.2.5)
-      '@storybook/core-events': 8.2.0-alpha.10
-      '@storybook/csf-plugin': 8.2.0-alpha.10
-      '@storybook/node-logger': 8.2.0-alpha.10
-      '@storybook/preview': 8.2.0-alpha.10
-      '@storybook/preview-api': 8.2.0-alpha.10
-      '@storybook/types': 8.2.0-alpha.10
-      '@types/find-cache-dir': 3.2.1
-      browser-assert: 1.2.1
-      es-module-lexer: 1.5.3
-      express: 4.19.2
-      find-cache-dir: 3.3.2
-      fs-extra: 11.2.0
-      magic-string: 0.30.8
-      ts-dedent: 2.2.0
-      typescript: 5.4.2
-      vite: 5.1.6
-    transitivePeerDependencies:
-      - encoding
-      - prettier
-      - supports-color
-    dev: true
+      '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.2)
+      '@solid-primitives/rootless': 1.4.5(solid-js@1.9.2)
+      '@solid-primitives/static-store': 0.0.8(solid-js@1.9.2)
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/channels@8.1.6:
-    resolution: {integrity: sha512-CzDnP6qfI8OC8pGUk+wPUzLPYcKhX8XbriF2gBtwl6qVM8YfkHP2mLTiDYDwBIi0rLuUbSm/SpILXQ/ouOHOGw==}
+  '@solid-primitives/platform@0.0.100(solid-js@1.9.2)':
     dependencies:
-      '@storybook/client-logger': 8.1.6
-      '@storybook/core-events': 8.1.6
-      '@storybook/global': 5.0.0
-      telejson: 7.2.0
-      tiny-invariant: 1.3.3
-    dev: true
+      solid-js: 1.9.2
 
-  /@storybook/channels@8.2.0-alpha.10:
-    resolution: {integrity: sha512-b2+6TuPYR6fsfkgkvZO/LhvhlV2XeUh8Jbxk2MvmSwMa2hIR99N263wivUEK9398pSfqaqiyFQiUiaRWErUvJQ==}
+  '@solid-primitives/platform@0.1.2(solid-js@1.9.2)':
     dependencies:
-      '@storybook/client-logger': 8.2.0-alpha.10
-      '@storybook/core-events': 8.2.0-alpha.10
-      '@storybook/global': 5.0.0
-      telejson: 7.2.0
-      tiny-invariant: 1.3.3
-    dev: true
+      solid-js: 1.9.2
 
-  /@storybook/channels@8.2.0-alpha.5:
-    resolution: {integrity: sha512-Z+uEsD3iZ4R7eMFMXEUU9DRCC2HLvaYvdoej5bFqh75cCADiqAPZeL5mb/gUeiEIM0f5rx0npcFVYX1A1GR3rA==}
+  '@solid-primitives/props@2.2.2(solid-js@1.9.2)':
     dependencies:
-      '@storybook/client-logger': 8.2.0-alpha.5
-      '@storybook/core-events': 8.2.0-alpha.5
-      '@storybook/global': 5.0.0
-      telejson: 7.2.0
-      tiny-invariant: 1.3.3
-    dev: true
+      '@solid-primitives/utils': 3.1.0(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/cli@8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-1gEK2AZTTsBu2Yv/UDA/Nwxm0ptrf79uK8xR+OV3fBYEQGweDXh/wW5G1hwyGlgQiWaELNhl9jDmFAgy/SAsfQ==}
-    hasBin: true
+  '@solid-primitives/props@3.1.11(solid-js@1.9.2)':
     dependencies:
-      '@babel/core': 7.24.7
-      '@babel/types': 7.24.7
-      '@ndelangen/get-tarball': 3.0.9
-      '@storybook/codemod': 8.2.0-alpha.5
-      '@storybook/core-common': 8.2.0-alpha.5(prettier@3.2.5)
-      '@storybook/core-events': 8.2.0-alpha.5
-      '@storybook/core-server': 8.2.0-alpha.5(prettier@3.2.5)(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/csf-tools': 8.2.0-alpha.5
-      '@storybook/node-logger': 8.2.0-alpha.5
-      '@storybook/telemetry': 8.2.0-alpha.5(prettier@3.2.5)
-      '@storybook/types': 8.2.0-alpha.5
-      '@types/semver': 7.5.8
-      '@yarnpkg/fslib': 2.10.3
-      '@yarnpkg/libzip': 2.3.0
-      chalk: 4.1.2
-      commander: 6.2.1
-      cross-spawn: 7.0.3
-      detect-indent: 6.1.0
-      envinfo: 7.13.0
-      execa: 5.1.1
-      find-up: 5.0.0
-      fs-extra: 11.2.0
-      get-npm-tarball-url: 2.1.0
-      giget: 1.2.3
-      globby: 14.0.1
-      jscodeshift: 0.15.2(@babel/preset-env@7.24.7)
-      leven: 3.1.0
-      ora: 5.4.1
-      prettier: 3.2.5
-      prompts: 2.4.2
-      read-pkg-up: 7.0.1
-      semver: 7.5.4
-      strip-json-comments: 3.1.1
-      tempy: 3.1.0
-      tiny-invariant: 1.3.3
-      ts-dedent: 2.2.0
-    transitivePeerDependencies:
-      - '@babel/preset-env'
-      - bufferutil
-      - encoding
-      - react
-      - react-dom
-      - supports-color
-      - utf-8-validate
-    dev: true
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/client-logger@8.1.6:
-    resolution: {integrity: sha512-QfSoUxS1rmrBzO7o99og9g+Gkm7sTmU5ZOpTkjszjlRqfV6/77eUnUOzUikej4LqPLmlJV5fqGuvoP0aNVksDw==}
+  '@solid-primitives/refs@1.0.8(solid-js@1.9.2)':
     dependencies:
-      '@storybook/global': 5.0.0
-    dev: true
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/client-logger@8.2.0-alpha.10:
-    resolution: {integrity: sha512-SN4aYOtpXl1EErjqGzc2CSOzR34R7O/4qGxklztD/ce9W/M15+Q85tjS5m7/erMbKt+7RnJ4o/LKhshdMRaRSw==}
+  '@solid-primitives/resize-observer@2.0.26(solid-js@1.9.2)':
     dependencies:
-      '@storybook/global': 5.0.0
-    dev: true
+      '@solid-primitives/event-listener': 2.3.3(solid-js@1.9.2)
+      '@solid-primitives/rootless': 1.4.5(solid-js@1.9.2)
+      '@solid-primitives/static-store': 0.0.8(solid-js@1.9.2)
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/client-logger@8.2.0-alpha.5:
-    resolution: {integrity: sha512-DHdvd2uWSqc3u+O7pIH2KTSsDmu4OWTfmJwqSGvYnr4daLMXKhb/X6iHHooDox1L2KZm7ZWwBUOvMMvbsk2aTA==}
+  '@solid-primitives/rootless@1.4.5(solid-js@1.9.2)':
     dependencies:
-      '@storybook/global': 5.0.0
-    dev: true
-
-  /@storybook/codemod@8.2.0-alpha.5:
-    resolution: {integrity: sha512-ODs/ky0zaEkxUYp0pTpleE1/U/xhwEXyJsLiZS/3TygTrz3R9kCShPKUK76wmPGvkxwnRFdTO94Umqe+eugyvw==}
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/preset-env': 7.24.7(@babel/core@7.24.7)
-      '@babel/types': 7.24.7
-      '@storybook/csf': 0.1.8
-      '@storybook/csf-tools': 8.2.0-alpha.5
-      '@storybook/node-logger': 8.2.0-alpha.5
-      '@storybook/types': 8.2.0-alpha.5
-      '@types/cross-spawn': 6.0.6
-      cross-spawn: 7.0.3
-      globby: 14.0.1
-      jscodeshift: 0.15.2(@babel/preset-env@7.24.7)
-      lodash: 4.17.21
-      prettier: 3.2.5
-      recast: 0.23.9
-      tiny-invariant: 1.3.3
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/components@8.2.0-alpha.5(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-v6RiQyGHOekuMvpB2rnWXr292slSOwKze75zLnWw+UVWt1WPENs4nUCOPzBCOH2bPKsrXkYOcdMz7OsfIlpEkQ==}
-    peerDependencies:
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
-      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+  '@solid-primitives/scheduled@1.4.3(solid-js@1.9.2)':
     dependencies:
-      '@radix-ui/react-dialog': 1.0.5(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)
-      '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1)
-      '@storybook/client-logger': 8.2.0-alpha.5
-      '@storybook/csf': 0.1.8
-      '@storybook/global': 5.0.0
-      '@storybook/icons': 1.2.9(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/theming': 8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/types': 8.2.0-alpha.5
-      memoizerific: 1.11.3
-      react: 18.3.1
-      react-dom: 18.3.1(react@18.3.1)
-      util-deprecate: 1.0.2
-    transitivePeerDependencies:
-      - '@types/react'
-      - '@types/react-dom'
-    dev: true
+      solid-js: 1.9.2
 
-  /@storybook/core-common@8.1.6(prettier@3.2.5):
-    resolution: {integrity: sha512-OTlfJFaTOB588ibXrrFm0TAXam6E5xV1VXSjNXL+fIifx8Kjln2HNSy1JKjvcblQneYiV4J1xPCVnAIe0EGHDg==}
-    peerDependencies:
-      prettier: ^2 || ^3
-    peerDependenciesMeta:
-      prettier:
-        optional: true
+  '@solid-primitives/script-loader@2.2.0(solid-js@1.9.2)':
     dependencies:
-      '@storybook/core-events': 8.1.6
-      '@storybook/csf-tools': 8.1.6
-      '@storybook/node-logger': 8.1.6
-      '@storybook/types': 8.1.6
-      '@yarnpkg/fslib': 2.10.3
-      '@yarnpkg/libzip': 2.3.0
-      chalk: 4.1.2
-      cross-spawn: 7.0.3
-      esbuild: 0.20.2
-      esbuild-register: 3.5.0(esbuild@0.20.2)
-      execa: 5.1.1
-      file-system-cache: 2.3.0
-      find-cache-dir: 3.3.2
-      find-up: 5.0.0
-      fs-extra: 11.2.0
-      glob: 10.4.1
-      handlebars: 4.7.8
-      lazy-universal-dotenv: 4.0.0
-      node-fetch: 2.7.0
-      picomatch: 2.3.1
-      pkg-dir: 5.0.0
-      prettier: 3.2.5
-      prettier-fallback: /prettier@3.2.5
-      pretty-hrtime: 1.0.3
-      resolve-from: 5.0.0
-      semver: 7.5.4
-      tempy: 3.1.0
-      tiny-invariant: 1.3.3
-      ts-dedent: 2.2.0
-      util: 0.12.5
-    transitivePeerDependencies:
-      - encoding
-      - supports-color
-    dev: true
+      solid-js: 1.9.2
 
-  /@storybook/core-common@8.2.0-alpha.10(prettier@3.2.5):
-    resolution: {integrity: sha512-wVRW83B+WI/PpQ1gw9GWjnxHt3H5hbT1RSYbZp0zeuSJTJ3u+oj55HPdXWpVEe0oXHtCDKyleRHgswPdO2PNdg==}
-    peerDependencies:
-      prettier: ^2 || ^3
-    peerDependenciesMeta:
-      prettier:
-        optional: true
+  '@solid-primitives/set@0.4.12(solid-js@1.9.2)':
     dependencies:
-      '@storybook/core-events': 8.2.0-alpha.10
-      '@storybook/csf-tools': 8.2.0-alpha.10
-      '@storybook/node-logger': 8.2.0-alpha.10
-      '@storybook/types': 8.2.0-alpha.10
-      '@yarnpkg/fslib': 2.10.3
-      '@yarnpkg/libzip': 2.3.0
-      chalk: 4.1.2
-      cross-spawn: 7.0.3
-      esbuild: 0.20.2
-      esbuild-register: 3.5.0(esbuild@0.20.2)
-      execa: 5.1.1
-      file-system-cache: 2.3.0
-      find-cache-dir: 3.3.2
-      find-up: 5.0.0
-      fs-extra: 11.2.0
-      glob: 10.4.1
-      handlebars: 4.7.8
-      lazy-universal-dotenv: 4.0.0
-      node-fetch: 2.7.0
-      picomatch: 2.3.1
-      pkg-dir: 5.0.0
-      prettier: 3.2.5
-      prettier-fallback: /prettier@3.2.5
-      pretty-hrtime: 1.0.3
-      resolve-from: 5.0.0
-      semver: 7.5.4
-      tempy: 3.1.0
-      tiny-invariant: 1.3.3
-      ts-dedent: 2.2.0
-    transitivePeerDependencies:
-      - encoding
-      - supports-color
-    dev: true
+      '@solid-primitives/trigger': 1.1.0(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/core-common@8.2.0-alpha.5(prettier@3.2.5):
-    resolution: {integrity: sha512-BSwPNGPj70Cv4d4gZDQgEDPR6tutbD7lCuH/Nq/Z5o/GLfk5yDpgqfjhPvtlEKmwAOzZ88YdPTXqL1VpgLm8LQ==}
-    peerDependencies:
-      prettier: ^2 || ^3
-    peerDependenciesMeta:
-      prettier:
-        optional: true
+  '@solid-primitives/static-store@0.0.5(solid-js@1.9.2)':
     dependencies:
-      '@storybook/core-events': 8.2.0-alpha.5
-      '@storybook/csf-tools': 8.2.0-alpha.5
-      '@storybook/node-logger': 8.2.0-alpha.5
-      '@storybook/types': 8.2.0-alpha.5
-      '@yarnpkg/fslib': 2.10.3
-      '@yarnpkg/libzip': 2.3.0
-      chalk: 4.1.2
-      cross-spawn: 7.0.3
-      esbuild: 0.20.2
-      esbuild-register: 3.5.0(esbuild@0.20.2)
-      execa: 5.1.1
-      file-system-cache: 2.3.0
-      find-cache-dir: 3.3.2
-      find-up: 5.0.0
-      fs-extra: 11.2.0
-      glob: 10.4.1
-      handlebars: 4.7.8
-      lazy-universal-dotenv: 4.0.0
-      node-fetch: 2.7.0
-      picomatch: 2.3.1
-      pkg-dir: 5.0.0
-      prettier: 3.2.5
-      prettier-fallback: /prettier@3.2.5
-      pretty-hrtime: 1.0.3
-      resolve-from: 5.0.0
-      semver: 7.5.4
-      tempy: 3.1.0
-      tiny-invariant: 1.3.3
-      ts-dedent: 2.2.0
-      util: 0.12.5
-    transitivePeerDependencies:
-      - encoding
-      - supports-color
-    dev: true
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/core-events@8.1.6:
-    resolution: {integrity: sha512-DaIVe4TUp/7uQdSJYGmJv9S/S364tSgZ3S3dZ1vsf1rgoUbCp5kTBtcd/fcqgukMPREgCgO9oDhmemI3SLAqzw==}
+  '@solid-primitives/static-store@0.0.8(solid-js@1.9.2)':
     dependencies:
-      '@storybook/csf': 0.1.8
-      ts-dedent: 2.2.0
-    dev: true
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/core-events@8.2.0-alpha.10:
-    resolution: {integrity: sha512-9GO8cJPPHB6SKxoCg9n78otdRswRI6lwRrd+TFxfZsCUpjePOqqJT2QliGNT0AE8280TXreEex2/oAAjTV3D+g==}
+  '@solid-primitives/styles@0.0.111(solid-js@1.9.2)':
     dependencies:
-      '@storybook/csf': 0.1.8
-      ts-dedent: 2.2.0
-    dev: true
+      '@solid-primitives/rootless': 1.4.5(solid-js@1.9.2)
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/core-events@8.2.0-alpha.5:
-    resolution: {integrity: sha512-keJeWLsC18jDx8tcrQwZEgkU88sEGUTaienkKdZ0OtTlJC36JfSQkkw3pM4r1+ad4p3Bv5lhMzdjG7awUKaOAw==}
+  '@solid-primitives/transition-group@1.0.5(solid-js@1.9.2)':
     dependencies:
-      '@storybook/csf': 0.1.8
-      ts-dedent: 2.2.0
-    dev: true
-
-  /@storybook/core-server@8.2.0-alpha.5(prettier@3.2.5)(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-Vq7ZBtBqXn5nhAoaErZmkhM27Yarmckg5M5PyAANO5LCsd4rT8TvryeU6q3M5WxY9ADcvcqjXc/mcTXXZ+ltTg==}
-    dependencies:
-      '@aw-web-design/x-default-browser': 1.4.126
-      '@babel/core': 7.24.7
-      '@babel/parser': 7.24.7
-      '@discoveryjs/json-ext': 0.5.7
-      '@storybook/builder-manager': 8.2.0-alpha.5(prettier@3.2.5)
-      '@storybook/channels': 8.2.0-alpha.5
-      '@storybook/core-common': 8.2.0-alpha.5(prettier@3.2.5)
-      '@storybook/core-events': 8.2.0-alpha.5
-      '@storybook/csf': 0.1.8
-      '@storybook/csf-tools': 8.2.0-alpha.5
-      '@storybook/docs-mdx': 3.1.0-next.0
-      '@storybook/global': 5.0.0
-      '@storybook/manager': 8.2.0-alpha.5
-      '@storybook/manager-api': 8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/node-logger': 8.2.0-alpha.5
-      '@storybook/preview-api': 8.2.0-alpha.5
-      '@storybook/telemetry': 8.2.0-alpha.5(prettier@3.2.5)
-      '@storybook/types': 8.2.0-alpha.5
-      '@types/detect-port': 1.3.5
-      '@types/diff': 5.2.1
-      '@types/node': 18.19.24
-      '@types/pretty-hrtime': 1.0.3
-      '@types/semver': 7.5.8
-      better-opn: 3.0.2
-      chalk: 4.1.2
-      cli-table3: 0.6.5
-      compression: 1.7.4
-      detect-port: 1.6.1
-      diff: 5.2.0
-      express: 4.19.2
-      fs-extra: 11.2.0
-      globby: 14.0.1
-      ip: 2.0.1
-      lodash: 4.17.21
-      open: 8.4.2
-      pretty-hrtime: 1.0.3
-      prompts: 2.4.2
-      read-pkg-up: 7.0.1
-      semver: 7.5.4
-      telejson: 7.2.0
-      tiny-invariant: 1.3.3
-      ts-dedent: 2.2.0
-      util: 0.12.5
-      util-deprecate: 1.0.2
-      watchpack: 2.4.1
-      ws: 8.16.0
-    transitivePeerDependencies:
-      - bufferutil
-      - encoding
-      - prettier
-      - react
-      - react-dom
-      - supports-color
-      - utf-8-validate
-    dev: true
+      solid-js: 1.9.2
 
-  /@storybook/csf-plugin@8.2.0-alpha.10:
-    resolution: {integrity: sha512-8bGOGXZfjL3ZV0AsaKCa/xZWR6/XGvb6RoMud+nN/vd/sCQLlkxKLQBWVB0cK075RhBdocxDhPKxvllirbP2KA==}
+  '@solid-primitives/trigger@1.1.0(solid-js@1.9.2)':
     dependencies:
-      '@storybook/csf-tools': 8.2.0-alpha.10
-      unplugin: 1.10.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      '@solid-primitives/utils': 6.2.3(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /@storybook/csf-plugin@8.2.0-alpha.5:
-    resolution: {integrity: sha512-DF3MBTwNZlWpSlPQoeLa7ZbsZX8ZRmFEd0YKhk+nFlUjRYHWIgFGaM2LjGLTxtN7RLKWi96GqgAy/iOeJv2uog==}
+  '@solid-primitives/utils@2.2.1(solid-js@1.9.2)':
     dependencies:
-      '@storybook/csf-tools': 8.2.0-alpha.5
-      unplugin: 1.10.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      solid-js: 1.9.2
 
-  /@storybook/csf-tools@8.1.6:
-    resolution: {integrity: sha512-jrKfHFNhiLBhWWW4/fm2wgKEVg55e6QuYUHY16KGd7PdPuzm+2Pt7jIl5V9yIj6a59YbjeMpT6jWPKbFx2TuCw==}
+  '@solid-primitives/utils@3.1.0(solid-js@1.9.2)':
     dependencies:
-      '@babel/generator': 7.24.7
-      '@babel/parser': 7.24.7
-      '@babel/traverse': 7.24.7
-      '@babel/types': 7.24.7
-      '@storybook/csf': 0.1.8
-      '@storybook/types': 8.1.6
-      fs-extra: 11.2.0
-      recast: 0.23.9
-      ts-dedent: 2.2.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      solid-js: 1.9.2
 
-  /@storybook/csf-tools@8.2.0-alpha.10:
-    resolution: {integrity: sha512-g/OG30gIX7M20xBI8/0gvAR/GfplGhCxtPhkKyqfVVLU3InJq0C/DTXeif2A6TNwLMQapK1ZNv5Nn/chrVtGRA==}
+  '@solid-primitives/utils@6.2.3(solid-js@1.9.2)':
     dependencies:
-      '@babel/generator': 7.24.7
-      '@babel/parser': 7.24.7
-      '@babel/traverse': 7.24.7
-      '@babel/types': 7.24.7
-      '@storybook/csf': 0.1.8
-      '@storybook/types': 8.2.0-alpha.10
-      fs-extra: 11.2.0
-      recast: 0.23.9
-      ts-dedent: 2.2.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      solid-js: 1.9.2
 
-  /@storybook/csf-tools@8.2.0-alpha.5:
-    resolution: {integrity: sha512-SHBMEZ70g4Y28qYmz4laryGRtaRePB9WbpOt7iVgSOBZEQA+UC7vagGlAXcW0ZlV7ZqQIef9aGxco351k7e9rQ==}
+  '@solidjs/router@0.14.7(solid-js@1.9.2)':
     dependencies:
-      '@babel/generator': 7.24.7
-      '@babel/parser': 7.24.7
-      '@babel/traverse': 7.24.7
-      '@babel/types': 7.24.7
-      '@storybook/csf': 0.1.8
-      '@storybook/types': 8.2.0-alpha.5
-      fs-extra: 11.2.0
-      recast: 0.23.9
-      ts-dedent: 2.2.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+      solid-js: 1.9.2
 
-  /@storybook/csf@0.1.8:
-    resolution: {integrity: sha512-Ntab9o7LjBCbFIao5l42itFiaSh/Qu+l16l/r/9qmV9LnYZkO+JQ7tzhdlwpgJfhs+B5xeejpdAtftDRyXNajw==}
+  '@solidjs/testing-library@0.8.10(@solidjs/router@0.14.7(solid-js@1.9.2))(solid-js@1.9.2)':
     dependencies:
-      type-fest: 2.19.0
-    dev: true
+      '@testing-library/dom': 10.4.0
+      solid-js: 1.9.2
+    optionalDependencies:
+      '@solidjs/router': 0.14.7(solid-js@1.9.2)
+
+  '@storybook/addon-actions@8.3.5(storybook@8.3.5)':
+    dependencies:
+      '@storybook/global': 5.0.0
+      '@types/uuid': 9.0.8
+      dequal: 2.0.3
+      polished: 4.3.1
+      storybook: 8.3.5
+      uuid: 9.0.1
 
-  /@storybook/docs-mdx@3.1.0-next.0:
-    resolution: {integrity: sha512-t4syFIeSyufieNovZbLruPt2DmRKpbwL4fERCZ1MifWDRIORCKLc4NCEHy+IqvIqd71/SJV2k4B51nF7vlJfmQ==}
-    dev: true
+  '@storybook/addon-backgrounds@8.3.5(storybook@8.3.5)':
+    dependencies:
+      '@storybook/global': 5.0.0
+      memoizerific: 1.11.3
+      storybook: 8.3.5
+      ts-dedent: 2.2.0
 
-  /@storybook/docs-tools@8.1.6(prettier@3.2.5):
-    resolution: {integrity: sha512-IhqQHSJ5nEBEJ162P/6/6c45toLinWpAkB7pwbAoP00djZSzfHNdQ4HfpZSGfD4GUJIvzsqMzUlyqCKLAoRPPA==}
+  '@storybook/addon-controls@8.3.5(storybook@8.3.5)':
     dependencies:
-      '@storybook/core-common': 8.1.6(prettier@3.2.5)
-      '@storybook/core-events': 8.1.6
-      '@storybook/preview-api': 8.1.6
-      '@storybook/types': 8.1.6
-      '@types/doctrine': 0.0.3
-      assert: 2.1.0
-      doctrine: 3.0.0
+      '@storybook/global': 5.0.0
+      dequal: 2.0.3
       lodash: 4.17.21
+      storybook: 8.3.5
+      ts-dedent: 2.2.0
+
+  '@storybook/addon-docs@8.3.5(storybook@8.3.5)':
+    dependencies:
+      '@mdx-js/react': 3.0.1(@types/react@18.3.11)(react@18.3.1)
+      '@storybook/blocks': 8.3.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)
+      '@storybook/csf-plugin': 8.3.5(storybook@8.3.5)
+      '@storybook/global': 5.0.0
+      '@storybook/react-dom-shim': 8.3.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)
+      '@types/react': 18.3.11
+      fs-extra: 11.2.0
+      react: 18.3.1
+      react-dom: 18.3.1(react@18.3.1)
+      rehype-external-links: 3.0.0
+      rehype-slug: 6.0.0
+      storybook: 8.3.5
+      ts-dedent: 2.2.0
     transitivePeerDependencies:
-      - encoding
-      - prettier
-      - supports-color
-    dev: true
+      - webpack-sources
 
-  /@storybook/docs-tools@8.2.0-alpha.5(prettier@3.2.5):
-    resolution: {integrity: sha512-2tKbHguR4Z3gEk1/A/rZD3GFEUVFVhPZajZ7EK3aT0cED8Eq86ZERuv76OwkEi+xsSFFEIDECXstRz8PCAUYvQ==}
+  '@storybook/addon-essentials@8.3.5(storybook@8.3.5)':
     dependencies:
-      '@storybook/core-common': 8.2.0-alpha.5(prettier@3.2.5)
-      '@storybook/core-events': 8.2.0-alpha.5
-      '@storybook/preview-api': 8.2.0-alpha.5
-      '@storybook/types': 8.2.0-alpha.5
-      '@types/doctrine': 0.0.3
-      assert: 2.1.0
-      doctrine: 3.0.0
-      lodash: 4.17.21
+      '@storybook/addon-actions': 8.3.5(storybook@8.3.5)
+      '@storybook/addon-backgrounds': 8.3.5(storybook@8.3.5)
+      '@storybook/addon-controls': 8.3.5(storybook@8.3.5)
+      '@storybook/addon-docs': 8.3.5(storybook@8.3.5)
+      '@storybook/addon-highlight': 8.3.5(storybook@8.3.5)
+      '@storybook/addon-measure': 8.3.5(storybook@8.3.5)
+      '@storybook/addon-outline': 8.3.5(storybook@8.3.5)
+      '@storybook/addon-toolbars': 8.3.5(storybook@8.3.5)
+      '@storybook/addon-viewport': 8.3.5(storybook@8.3.5)
+      storybook: 8.3.5
+      ts-dedent: 2.2.0
     transitivePeerDependencies:
-      - encoding
-      - prettier
-      - supports-color
-    dev: true
+      - webpack-sources
 
-  /@storybook/global@5.0.0:
-    resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==}
-    dev: true
+  '@storybook/addon-highlight@8.3.5(storybook@8.3.5)':
+    dependencies:
+      '@storybook/global': 5.0.0
+      storybook: 8.3.5
 
-  /@storybook/html@8.1.6(prettier@3.2.5):
-    resolution: {integrity: sha512-Mn2wP5CWeuhX4ejgsjzVloi/RwVneGOg/71mrn7C1118rYDG4Q1ICnTd9P+O0eW7RWHCZF4kGhQTq7HLlO0PQQ==}
-    engines: {node: '>=18.0.0'}
+  '@storybook/addon-interactions@8.3.5(storybook@8.3.5)':
     dependencies:
-      '@storybook/docs-tools': 8.1.6(prettier@3.2.5)
       '@storybook/global': 5.0.0
-      '@storybook/preview-api': 8.1.6
-      '@storybook/types': 8.1.6
+      '@storybook/instrumenter': 8.3.5(storybook@8.3.5)
+      '@storybook/test': 8.3.5(storybook@8.3.5)
+      polished: 4.3.1
+      storybook: 8.3.5
       ts-dedent: 2.2.0
-    transitivePeerDependencies:
-      - encoding
-      - prettier
-      - supports-color
-    dev: true
 
-  /@storybook/icons@1.2.9(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-cOmylsz25SYXaJL/gvTk/dl3pyk7yBFRfeXTsHvTA3dfhoU/LWSq0NKL9nM7WBasJyn6XPSGnLS4RtKXLw5EUg==}
-    engines: {node: '>=14.0.0'}
-    peerDependencies:
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0
-      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+  '@storybook/addon-links@8.3.5(react@18.3.1)(storybook@8.3.5)':
     dependencies:
+      '@storybook/csf': 0.1.11
+      '@storybook/global': 5.0.0
+      storybook: 8.3.5
+      ts-dedent: 2.2.0
+    optionalDependencies:
       react: 18.3.1
-      react-dom: 18.3.1(react@18.3.1)
-    dev: true
 
-  /@storybook/instrumenter@8.2.0-alpha.5:
-    resolution: {integrity: sha512-8AA5HjtG9VWAayW/PRhl7gx8hmMxqmeaYgQBrls2gz2RqhjU00/QLI2iArqO9roUHzADjpsXlNcjAkExvJBllg==}
+  '@storybook/addon-measure@8.3.5(storybook@8.3.5)':
     dependencies:
-      '@storybook/channels': 8.2.0-alpha.5
-      '@storybook/client-logger': 8.2.0-alpha.5
-      '@storybook/core-events': 8.2.0-alpha.5
       '@storybook/global': 5.0.0
-      '@storybook/preview-api': 8.2.0-alpha.5
-      '@vitest/utils': 1.4.0
-      util: 0.12.5
-    dev: true
+      storybook: 8.3.5
+      tiny-invariant: 1.3.3
 
-  /@storybook/manager-api@8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-+GKdiKAG3oPCxdcBv46FMMQz+MNYOvcuoJbISesjyJSPlRuxIO+D7EYh5QA/AjjHGLpQt8GlvaXeGOuSuNO5HA==}
+  '@storybook/addon-outline@8.3.5(storybook@8.3.5)':
     dependencies:
-      '@storybook/channels': 8.2.0-alpha.5
-      '@storybook/client-logger': 8.2.0-alpha.5
-      '@storybook/core-events': 8.2.0-alpha.5
-      '@storybook/csf': 0.1.8
       '@storybook/global': 5.0.0
-      '@storybook/icons': 1.2.9(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/router': 8.2.0-alpha.5
-      '@storybook/theming': 8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1)
-      '@storybook/types': 8.2.0-alpha.5
-      dequal: 2.0.3
-      lodash: 4.17.21
-      memoizerific: 1.11.3
-      store2: 2.14.3
-      telejson: 7.2.0
+      storybook: 8.3.5
       ts-dedent: 2.2.0
-    transitivePeerDependencies:
-      - react
-      - react-dom
-    dev: true
-
-  /@storybook/manager@8.2.0-alpha.5:
-    resolution: {integrity: sha512-gY7mCiUTRZJDWT8y1C+3/cIg9lemPiicBbpEaGo3S+XAEP7HwevFWzcDfvGW49L1uqb2vdBuz6o2XxGON84Ecw==}
-    dev: true
 
-  /@storybook/node-logger@8.1.6:
-    resolution: {integrity: sha512-IZEiTLFHu8Oom/vdEGpisSw5CfU+cw6/fTaX1P3EVClFOWVuy8/3X5MPu4wJH3jPym6E2DBduIUFeRsiuq61gA==}
-    dev: true
-
-  /@storybook/node-logger@8.2.0-alpha.10:
-    resolution: {integrity: sha512-emfSCYPGJpQUO/rDS+gJlLWfQHbUZ23fhFHCs9sq1jJWo9ocWoBClf4LnFsPEva8VWtUHhhoKf8T5/APPPkiCQ==}
-    dev: true
+  '@storybook/addon-toolbars@8.3.5(storybook@8.3.5)':
+    dependencies:
+      storybook: 8.3.5
 
-  /@storybook/node-logger@8.2.0-alpha.5:
-    resolution: {integrity: sha512-8mA1phBebnAgdMiSFX6fLWWqxBG95RNVmRq6luwoYkF40XhSi4GlWW9psR63yOyzWSiv8Iz4H+f52Ju5326/Kw==}
-    dev: true
+  '@storybook/addon-viewport@8.3.5(storybook@8.3.5)':
+    dependencies:
+      memoizerific: 1.11.3
+      storybook: 8.3.5
 
-  /@storybook/preview-api@8.1.6:
-    resolution: {integrity: sha512-g9EvVg/DYqmjMh1uivJBJnSIvURyuK4LLabYicQNmYdQJscAeXX2bpMcA4aeci9BBm9B2RP7JbSnq7DbXZaJYA==}
+  '@storybook/blocks@8.3.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)':
     dependencies:
-      '@storybook/channels': 8.1.6
-      '@storybook/client-logger': 8.1.6
-      '@storybook/core-events': 8.1.6
-      '@storybook/csf': 0.1.8
+      '@storybook/csf': 0.1.11
       '@storybook/global': 5.0.0
-      '@storybook/types': 8.1.6
-      '@types/qs': 6.9.15
+      '@storybook/icons': 1.2.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@types/lodash': 4.17.10
+      color-convert: 2.0.1
       dequal: 2.0.3
       lodash: 4.17.21
+      markdown-to-jsx: 7.5.0(react@18.3.1)
       memoizerific: 1.11.3
-      qs: 6.12.1
-      tiny-invariant: 1.3.3
+      polished: 4.3.1
+      react-colorful: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      storybook: 8.3.5
+      telejson: 7.2.0
       ts-dedent: 2.2.0
       util-deprecate: 1.0.2
-    dev: true
+    optionalDependencies:
+      react: 18.3.1
+      react-dom: 18.3.1(react@18.3.1)
 
-  /@storybook/preview-api@8.2.0-alpha.10:
-    resolution: {integrity: sha512-6HeyFxVM8AXge1t7F/F2rMG18n/qSGrfEJQk8xUGPYFJcl/lV+xjVgcuJ+K7vlG7cfjESSDbfkzNzyRqgTHNVw==}
+  '@storybook/builder-vite@8.4.0-alpha.6(storybook@8.3.5)(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1))':
     dependencies:
-      '@storybook/channels': 8.2.0-alpha.10
-      '@storybook/client-logger': 8.2.0-alpha.10
-      '@storybook/core-events': 8.2.0-alpha.10
-      '@storybook/csf': 0.1.8
-      '@storybook/global': 5.0.0
-      '@storybook/types': 8.2.0-alpha.10
-      '@types/qs': 6.9.15
-      dequal: 2.0.3
-      lodash: 4.17.21
-      memoizerific: 1.11.3
-      qs: 6.12.1
-      tiny-invariant: 1.3.3
+      '@storybook/csf-plugin': 8.4.0-alpha.6(storybook@8.3.5)
+      browser-assert: 1.2.1
+      storybook: 8.3.5
       ts-dedent: 2.2.0
-      util-deprecate: 1.0.2
-    dev: true
+      vite: 5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)
+    transitivePeerDependencies:
+      - webpack-sources
+
+  '@storybook/components@8.3.5(storybook@8.3.5)':
+    dependencies:
+      storybook: 8.3.5
+
+  '@storybook/core@8.3.5':
+    dependencies:
+      '@storybook/csf': 0.1.11
+      '@types/express': 4.17.21
+      better-opn: 3.0.2
+      browser-assert: 1.2.1
+      esbuild: 0.23.1
+      esbuild-register: 3.6.0(esbuild@0.23.1)
+      express: 4.21.1
+      jsdoc-type-pratt-parser: 4.1.0
+      process: 0.11.10
+      recast: 0.23.9
+      semver: 7.6.3
+      util: 0.12.5
+      ws: 8.18.0
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+
+  '@storybook/csf-plugin@8.3.5(storybook@8.3.5)':
+    dependencies:
+      storybook: 8.3.5
+      unplugin: 1.14.1
+    transitivePeerDependencies:
+      - webpack-sources
+
+  '@storybook/csf-plugin@8.4.0-alpha.6(storybook@8.3.5)':
+    dependencies:
+      storybook: 8.3.5
+      unplugin: 1.14.1
+    transitivePeerDependencies:
+      - webpack-sources
+
+  '@storybook/csf@0.1.11':
+    dependencies:
+      type-fest: 2.19.0
 
-  /@storybook/preview-api@8.2.0-alpha.5:
-    resolution: {integrity: sha512-WPXHr4/n0bw69IW/tv6M6TrFMaZNUvt5+T6KcWpm8wzv36MHR7VHcr8Zn2v4ymXqRQ0hgQR3n2/tpQO5zWDIVA==}
+  '@storybook/global@5.0.0': {}
+
+  '@storybook/html@8.3.5(storybook@8.3.5)':
     dependencies:
-      '@storybook/channels': 8.2.0-alpha.5
-      '@storybook/client-logger': 8.2.0-alpha.5
-      '@storybook/core-events': 8.2.0-alpha.5
-      '@storybook/csf': 0.1.8
+      '@storybook/components': 8.3.5(storybook@8.3.5)
       '@storybook/global': 5.0.0
-      '@storybook/types': 8.2.0-alpha.5
-      '@types/qs': 6.9.15
-      dequal: 2.0.3
-      lodash: 4.17.21
-      memoizerific: 1.11.3
-      qs: 6.12.1
-      tiny-invariant: 1.3.3
+      '@storybook/manager-api': 8.3.5(storybook@8.3.5)
+      '@storybook/preview-api': 8.3.5(storybook@8.3.5)
+      '@storybook/theming': 8.3.5(storybook@8.3.5)
+      storybook: 8.3.5
       ts-dedent: 2.2.0
-      util-deprecate: 1.0.2
-    dev: true
 
-  /@storybook/preview@8.2.0-alpha.10:
-    resolution: {integrity: sha512-/A5t87NLFcMu0mz7YyLbJp7bqxq8xe1vZqknFfXsnkYx9S0IQHpm7XQ/Eq3NXJDuN7yGwE8elpFi6BelmItqfA==}
-    dev: true
-
-  /@storybook/react-dom-shim@8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-QG0w4dNWiGGwu0PasbeEHE7uW+kHjGsB5kltAnMOJB8BO6v6NRShsfAmEGz+OvKHJLosSvVUjojrj6Xhvr+VQw==}
-    peerDependencies:
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
-      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+  '@storybook/icons@1.2.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
-    dev: true
 
-  /@storybook/router@8.2.0-alpha.5:
-    resolution: {integrity: sha512-tbdFKNU2xY30lDNwiLwCGvUgmXInN6vDkYiPMVRzxGaY24bRbM0dxklYgDpqJWTBYEFEmd5ItGM0XNKgx5SV5w==}
+  '@storybook/instrumenter@8.3.5(storybook@8.3.5)':
     dependencies:
-      '@storybook/client-logger': 8.2.0-alpha.5
-      memoizerific: 1.11.3
-      qs: 6.12.1
-    dev: true
+      '@storybook/global': 5.0.0
+      '@vitest/utils': 2.1.2
+      storybook: 8.3.5
+      util: 0.12.5
 
-  /@storybook/telemetry@8.2.0-alpha.5(prettier@3.2.5):
-    resolution: {integrity: sha512-oyfBSOXAsf3dwB7Onwh+8xbVcUGGWR0Ek6aNvMoI3Jojbgan6IKuzEL2P5Kx2p0cqoY2FSOfgxmaQqIHkqVzzQ==}
+  '@storybook/manager-api@8.3.5(storybook@8.3.5)':
     dependencies:
-      '@storybook/client-logger': 8.2.0-alpha.5
-      '@storybook/core-common': 8.2.0-alpha.5(prettier@3.2.5)
-      '@storybook/csf-tools': 8.2.0-alpha.5
-      chalk: 4.1.2
-      detect-package-manager: 2.0.1
-      fetch-retry: 5.0.6
-      fs-extra: 11.2.0
-      read-pkg-up: 7.0.1
-    transitivePeerDependencies:
-      - encoding
-      - prettier
-      - supports-color
-    dev: true
+      storybook: 8.3.5
 
-  /@storybook/test@8.2.0-alpha.5(vitest@1.4.0):
-    resolution: {integrity: sha512-u5g5maZYwj84S6NsHq5uSyyiBG9f6pcVw3+K+a8hwanMCJyybG6436krSNXLUUH8NF03KOFw+yRdi3CKHrZZ1Q==}
-    dependencies:
-      '@storybook/client-logger': 8.2.0-alpha.5
-      '@storybook/core-events': 8.2.0-alpha.5
-      '@storybook/instrumenter': 8.2.0-alpha.5
-      '@storybook/preview-api': 8.2.0-alpha.5
-      '@testing-library/dom': 9.3.4
-      '@testing-library/jest-dom': 6.4.2(vitest@1.4.0)
-      '@testing-library/user-event': 14.5.2(@testing-library/dom@9.3.4)
-      '@vitest/expect': 1.3.1
-      '@vitest/spy': 1.4.0
-      util: 0.12.5
-    transitivePeerDependencies:
-      - '@jest/globals'
-      - '@types/bun'
-      - '@types/jest'
-      - jest
-      - vitest
-    dev: true
-
-  /@storybook/testing-library@0.2.2:
-    resolution: {integrity: sha512-L8sXFJUHmrlyU2BsWWZGuAjv39Jl1uAqUHdxmN42JY15M4+XCMjGlArdCCjDe1wpTSW6USYISA9axjZojgtvnw==}
-    deprecated: In Storybook 8, this package functionality has been integrated to a new package called @storybook/test, which uses Vitest APIs for an improved experience. When upgrading to Storybook 8 with 'npx storybook@latest upgrade', you will get prompted and will get an automigration for the new package. Please migrate when you can.
+  '@storybook/preview-api@8.3.5(storybook@8.3.5)':
     dependencies:
-      '@testing-library/dom': 9.3.4
-      '@testing-library/user-event': 14.5.2(@testing-library/dom@9.3.4)
-      ts-dedent: 2.2.0
-    dev: true
+      storybook: 8.3.5
 
-  /@storybook/theming@8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-A88YPmFATMjN4NGa4zuqUxOWOD23AsGNmkHBY+dshXKQCEu/rub8pFYy87NfSvkqqIGuoAAPvB3kTS0QC3D4xQ==}
-    peerDependencies:
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
-      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
-    peerDependenciesMeta:
-      react:
-        optional: true
-      react-dom:
-        optional: true
+  '@storybook/react-dom-shim@8.3.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.5)':
     dependencies:
-      '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1)
-      '@storybook/client-logger': 8.2.0-alpha.5
-      '@storybook/global': 5.0.0
-      memoizerific: 1.11.3
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
-    dev: true
+      storybook: 8.3.5
 
-  /@storybook/types@8.1.6:
-    resolution: {integrity: sha512-cWpS9+x1pxCO39spR8QmumMK2ub2p5cvMtrRvWaIjBFPbCwm2CvjBXFWIra2veBCZTxUKJ9VWxvi7pzRHjN/nw==}
+  '@storybook/test@8.3.5(storybook@8.3.5)':
     dependencies:
-      '@storybook/channels': 8.1.6
-      '@types/express': 4.17.21
-      file-system-cache: 2.3.0
-    dev: true
+      '@storybook/csf': 0.1.11
+      '@storybook/global': 5.0.0
+      '@storybook/instrumenter': 8.3.5(storybook@8.3.5)
+      '@testing-library/dom': 10.4.0
+      '@testing-library/jest-dom': 6.5.0
+      '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0)
+      '@vitest/expect': 2.0.5
+      '@vitest/spy': 2.0.5
+      storybook: 8.3.5
+      util: 0.12.5
 
-  /@storybook/types@8.2.0-alpha.10:
-    resolution: {integrity: sha512-KPETpUZTHlJXpm6plaDRLD5wseRzKE0+2Zwqxj4Tx0OAu2gCVF/szQZzcBbxdmXUbE7RHwHEDFs3MRNQuhep6g==}
+  '@storybook/testing-library@0.2.2':
     dependencies:
-      '@storybook/channels': 8.2.0-alpha.10
-      '@types/express': 4.17.21
-      file-system-cache: 2.3.0
-    dev: true
+      '@testing-library/dom': 9.3.4
+      '@testing-library/user-event': 14.5.2(@testing-library/dom@9.3.4)
+      ts-dedent: 2.2.0
 
-  /@storybook/types@8.2.0-alpha.5:
-    resolution: {integrity: sha512-XsJkswMxwjAOn6fKsgxrweJBl0LE7r9St5wHkcxqNPIR87T/euL5ZazQvQVUdUjZiZ7O0NkMcFB4tH7VR+6TCQ==}
+  '@storybook/theming@8.3.5(storybook@8.3.5)':
     dependencies:
-      '@storybook/channels': 8.2.0-alpha.5
-      '@types/express': 4.17.21
-      file-system-cache: 2.3.0
-    dev: true
+      storybook: 8.3.5
 
-  /@surma/rollup-plugin-off-main-thread@2.2.3:
-    resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==}
+  '@surma/rollup-plugin-off-main-thread@2.2.3':
     dependencies:
       ejs: 3.1.10
       json5: 2.2.3
       magic-string: 0.25.9
-      string.prototype.matchall: 4.0.10
-    dev: true
+      string.prototype.matchall: 4.0.11
 
-  /@tanstack/query-core@5.48.0:
-    resolution: {integrity: sha512-lZAfPPeVIqXCswE9SSbG33B6/91XOWt/Iq41bFeWb/mnHwQSIfFRbkS4bfs+WhIk9abRArF9Id2fp0Mgo+hq6Q==}
-    dev: false
+  '@tanstack/query-core@5.59.0': {}
 
-  /@tanstack/solid-query@5.48.0(solid-js@1.8.15):
-    resolution: {integrity: sha512-ZhztevTrG9NPdfAoGRk1YD+O4Ao9dEIg9NdaP9yvcxHQ1jcSj8mEC56pCKKTeBcxR8o7L5fB8KhvbxBWzEtNWA==}
-    peerDependencies:
-      solid-js: ^1.6.0
+  '@tanstack/solid-query@5.59.0(solid-js@1.9.2)':
     dependencies:
-      '@tanstack/query-core': 5.48.0
-      solid-js: 1.8.15
-    dev: false
+      '@tanstack/query-core': 5.59.0
+      solid-js: 1.9.2
 
-  /@tauri-apps/api@1.5.3:
-    resolution: {integrity: sha512-zxnDjHHKjOsrIzZm6nO5Xapb/BxqUq1tc7cGkFXsFkGTsSWgCPH1D8mm0XS9weJY2OaR73I3k3S+b7eSzJDfqA==}
-    engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'}
-    dev: false
+  '@tauri-apps/api@2.0.2': {}
 
-  /@tauri-apps/cli-darwin-arm64@1.2.3:
-    resolution: {integrity: sha512-phJN3fN8FtZZwqXg08bcxfq1+X1JSDglLvRxOxB7VWPq+O5SuB8uLyssjJsu+PIhyZZnIhTGdjhzLSFhSXfLsw==}
-    engines: {node: '>= 10'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
+  '@tauri-apps/cli-darwin-arm64@2.0.2':
     optional: true
 
-  /@tauri-apps/cli-darwin-x64@1.2.3:
-    resolution: {integrity: sha512-jFZ/y6z8z6v4yliIbXKBXA7BJgtZVMsITmEXSuD6s5+eCOpDhQxbRkr6CA+FFfr+/r96rWSDSgDenDQuSvPAKw==}
-    engines: {node: '>= 10'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
+  '@tauri-apps/cli-darwin-x64@2.0.2':
     optional: true
 
-  /@tauri-apps/cli-linux-arm-gnueabihf@1.2.3:
-    resolution: {integrity: sha512-C7h5vqAwXzY0kRGSU00Fj8PudiDWFCiQqqUNI1N+fhCILrzWZB9TPBwdx33ZfXKt/U4+emdIoo/N34v3TiAOmQ==}
-    engines: {node: '>= 10'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
+  '@tauri-apps/cli-linux-arm-gnueabihf@2.0.2':
     optional: true
 
-  /@tauri-apps/cli-linux-arm64-gnu@1.2.3:
-    resolution: {integrity: sha512-buf1c8sdkuUzVDkGPQpyUdAIIdn5r0UgXU6+H5fGPq/Xzt5K69JzXaeo6fHsZEZghbV0hOK+taKV4J0m30UUMQ==}
-    engines: {node: '>= 10'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
+  '@tauri-apps/cli-linux-arm64-gnu@2.0.2':
     optional: true
 
-  /@tauri-apps/cli-linux-arm64-musl@1.2.3:
-    resolution: {integrity: sha512-x88wPS9W5xAyk392vc4uNHcKBBvCp0wf4H9JFMF9OBwB7vfd59LbQCFcPSu8f0BI7bPrOsyHqspWHuFL8ojQEA==}
-    engines: {node: '>= 10'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
+  '@tauri-apps/cli-linux-arm64-musl@2.0.2':
     optional: true
 
-  /@tauri-apps/cli-linux-x64-gnu@1.2.3:
-    resolution: {integrity: sha512-ZMz1jxEVe0B4/7NJnlPHmwmSIuwiD6ViXKs8F+OWWz2Y4jn5TGxWKFg7DLx5OwQTRvEIZxxT7lXHi5CuTNAxKg==}
-    engines: {node: '>= 10'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
+  '@tauri-apps/cli-linux-x64-gnu@2.0.2':
     optional: true
 
-  /@tauri-apps/cli-linux-x64-musl@1.2.3:
-    resolution: {integrity: sha512-B/az59EjJhdbZDzawEVox0LQu2ZHCZlk8rJf85AMIktIUoAZPFbwyiUv7/zjzA/sY6Nb58OSJgaPL2/IBy7E0A==}
-    engines: {node: '>= 10'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
+  '@tauri-apps/cli-linux-x64-musl@2.0.2':
     optional: true
 
-  /@tauri-apps/cli-win32-ia32-msvc@1.2.3:
-    resolution: {integrity: sha512-ypdO1OdC5ugNJAKO2m3sb1nsd+0TSvMS9Tr5qN/ZSMvtSduaNwrcZ3D7G/iOIanrqu/Nl8t3LYlgPZGBKlw7Ng==}
-    engines: {node: '>= 10'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
+  '@tauri-apps/cli-win32-arm64-msvc@2.0.2':
     optional: true
 
-  /@tauri-apps/cli-win32-x64-msvc@1.2.3:
-    resolution: {integrity: sha512-CsbHQ+XhnV/2csOBBDVfH16cdK00gNyNYUW68isedmqcn8j+s0e9cQ1xXIqi+Hue3awp8g3ImYN5KPepf3UExw==}
-    engines: {node: '>= 10'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
+  '@tauri-apps/cli-win32-ia32-msvc@2.0.2':
     optional: true
 
-  /@tauri-apps/cli@1.2.3:
-    resolution: {integrity: sha512-erxtXuPhMEGJPBtnhPILD4AjuT81GZsraqpFvXAmEJZ2p8P6t7MVBifCL8LznRknznM3jn90D3M8RNBP3wcXTw==}
-    engines: {node: '>= 10'}
-    hasBin: true
+  '@tauri-apps/cli-win32-x64-msvc@2.0.2':
+    optional: true
+
+  '@tauri-apps/cli@2.0.2':
     optionalDependencies:
-      '@tauri-apps/cli-darwin-arm64': 1.2.3
-      '@tauri-apps/cli-darwin-x64': 1.2.3
-      '@tauri-apps/cli-linux-arm-gnueabihf': 1.2.3
-      '@tauri-apps/cli-linux-arm64-gnu': 1.2.3
-      '@tauri-apps/cli-linux-arm64-musl': 1.2.3
-      '@tauri-apps/cli-linux-x64-gnu': 1.2.3
-      '@tauri-apps/cli-linux-x64-musl': 1.2.3
-      '@tauri-apps/cli-win32-ia32-msvc': 1.2.3
-      '@tauri-apps/cli-win32-x64-msvc': 1.2.3
-    dev: true
-
-  /@testing-library/dom@9.3.4:
-    resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==}
-    engines: {node: '>=14'}
+      '@tauri-apps/cli-darwin-arm64': 2.0.2
+      '@tauri-apps/cli-darwin-x64': 2.0.2
+      '@tauri-apps/cli-linux-arm-gnueabihf': 2.0.2
+      '@tauri-apps/cli-linux-arm64-gnu': 2.0.2
+      '@tauri-apps/cli-linux-arm64-musl': 2.0.2
+      '@tauri-apps/cli-linux-x64-gnu': 2.0.2
+      '@tauri-apps/cli-linux-x64-musl': 2.0.2
+      '@tauri-apps/cli-win32-arm64-msvc': 2.0.2
+      '@tauri-apps/cli-win32-ia32-msvc': 2.0.2
+      '@tauri-apps/cli-win32-x64-msvc': 2.0.2
+
+  '@testing-library/dom@10.4.0':
+    dependencies:
+      '@babel/code-frame': 7.25.7
+      '@babel/runtime': 7.25.7
+      '@types/aria-query': 5.0.4
+      aria-query: 5.3.0
+      chalk: 4.1.2
+      dom-accessibility-api: 0.5.16
+      lz-string: 1.5.0
+      pretty-format: 27.5.1
+
+  '@testing-library/dom@9.3.4':
     dependencies:
-      '@babel/code-frame': 7.23.5
-      '@babel/runtime': 7.24.0
+      '@babel/code-frame': 7.25.7
+      '@babel/runtime': 7.25.7
       '@types/aria-query': 5.0.4
       aria-query: 5.1.3
       chalk: 4.1.2
       dom-accessibility-api: 0.5.16
       lz-string: 1.5.0
       pretty-format: 27.5.1
-    dev: true
 
-  /@testing-library/jest-dom@6.4.2(vitest@1.4.0):
-    resolution: {integrity: sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==}
-    engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
-    peerDependencies:
-      '@jest/globals': '>= 28'
-      '@types/bun': latest
-      '@types/jest': '>= 28'
-      jest: '>= 28'
-      vitest: '>= 0.32'
-    peerDependenciesMeta:
-      '@jest/globals':
-        optional: true
-      '@types/bun':
-        optional: true
-      '@types/jest':
-        optional: true
-      jest:
-        optional: true
-      vitest:
-        optional: true
+  '@testing-library/jest-dom@6.5.0':
     dependencies:
-      '@adobe/css-tools': 4.3.3
-      '@babel/runtime': 7.24.0
-      aria-query: 5.3.0
+      '@adobe/css-tools': 4.4.0
+      aria-query: 5.3.2
       chalk: 3.0.0
       css.escape: 1.5.1
       dom-accessibility-api: 0.6.3
       lodash: 4.17.21
       redent: 3.0.0
-      vitest: 1.4.0(jsdom@24.0.0)
-    dev: true
 
-  /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4):
-    resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==}
-    engines: {node: '>=12', npm: '>=6'}
-    peerDependencies:
-      '@testing-library/dom': '>=7.21.4'
+  '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)':
+    dependencies:
+      '@testing-library/dom': 10.4.0
+
+  '@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4)':
     dependencies:
       '@testing-library/dom': 9.3.4
-    dev: true
 
-  /@thisbeyond/solid-dnd@0.7.5(solid-js@1.8.15):
-    resolution: {integrity: sha512-DfI5ff+yYGpK9M21LhYwIPlbP2msKxN2ARwuu6GF8tT1GgNVDTI8VCQvH4TJFoVApP9d44izmAcTh/iTCH2UUw==}
-    engines: {node: '>=18.0.0', pnpm: '>=8.6.0'}
-    peerDependencies:
-      solid-js: ^1.5
+  '@thisbeyond/solid-dnd@0.7.5(solid-js@1.9.2)':
     dependencies:
-      solid-js: 1.8.15
-    dev: false
+      solid-js: 1.9.2
 
-  /@tootallnate/once@1.1.2:
-    resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==}
-    engines: {node: '>= 6'}
-    dev: true
+  '@tootallnate/once@1.1.2': {}
 
-  /@trivago/prettier-plugin-sort-imports@4.3.0(prettier@2.8.8):
-    resolution: {integrity: sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==}
-    peerDependencies:
-      '@vue/compiler-sfc': 3.x
-      prettier: 2.x - 3.x
-    peerDependenciesMeta:
-      '@vue/compiler-sfc':
-        optional: true
+  '@trivago/prettier-plugin-sort-imports@4.3.0(@vue/compiler-sfc@3.5.11)(prettier@2.8.8)':
     dependencies:
       '@babel/generator': 7.17.7
-      '@babel/parser': 7.21.3
+      '@babel/parser': 7.25.7
       '@babel/traverse': 7.23.2
       '@babel/types': 7.17.0
       javascript-natural-sort: 0.7.1
       lodash: 4.17.21
       prettier: 2.8.8
+    optionalDependencies:
+      '@vue/compiler-sfc': 3.5.11
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /@trysound/sax@0.2.0:
-    resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
-    engines: {node: '>=10.13.0'}
-    dev: true
+  '@trysound/sax@0.2.0': {}
 
-  /@ts-morph/common@0.22.0:
-    resolution: {integrity: sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==}
+  '@ts-morph/common@0.22.0':
     dependencies:
       fast-glob: 3.3.2
-      minimatch: 9.0.4
+      minimatch: 9.0.5
       mkdirp: 3.0.1
       path-browserify: 1.0.1
-    dev: true
 
-  /@types/aria-query@5.0.4:
-    resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
-    dev: true
+  '@types/aria-query@5.0.4': {}
 
-  /@types/aws-lambda@8.10.136:
-    resolution: {integrity: sha512-cmmgqxdVGhxYK9lZMYYXYRJk6twBo53ivtXjIUEFZxfxe4TkZTZBK3RRWrY2HjJcUIix0mdifn15yjOAat5lTA==}
-    dev: false
+  '@types/aws-lambda@8.10.145': {}
 
-  /@types/babel__core@7.20.5:
-    resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+  '@types/babel__core@7.20.5':
     dependencies:
-      '@babel/parser': 7.24.7
-      '@babel/types': 7.24.7
+      '@babel/parser': 7.25.7
+      '@babel/types': 7.25.7
       '@types/babel__generator': 7.6.8
       '@types/babel__template': 7.4.4
-      '@types/babel__traverse': 7.20.5
-    dev: true
+      '@types/babel__traverse': 7.20.6
 
-  /@types/babel__generator@7.6.8:
-    resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
+  '@types/babel__generator@7.6.8':
     dependencies:
-      '@babel/types': 7.24.7
-    dev: true
+      '@babel/types': 7.25.7
 
-  /@types/babel__template@7.4.4:
-    resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+  '@types/babel__template@7.4.4':
     dependencies:
-      '@babel/parser': 7.24.7
-      '@babel/types': 7.24.7
-    dev: true
+      '@babel/parser': 7.25.7
+      '@babel/types': 7.25.7
 
-  /@types/babel__traverse@7.20.5:
-    resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==}
+  '@types/babel__traverse@7.20.6':
     dependencies:
-      '@babel/types': 7.24.7
-    dev: true
+      '@babel/types': 7.25.7
 
-  /@types/body-parser@1.19.5:
-    resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
+  '@types/body-parser@1.19.5':
     dependencies:
       '@types/connect': 3.4.38
-      '@types/node': 20.12.2
-    dev: true
-
-  /@types/btoa-lite@1.0.2:
-    resolution: {integrity: sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==}
-    dev: false
+      '@types/node': 20.16.11
 
-  /@types/connect@3.4.38:
-    resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
-    dependencies:
-      '@types/node': 20.12.2
-    dev: true
+  '@types/btoa-lite@1.0.2': {}
 
-  /@types/cross-spawn@6.0.6:
-    resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==}
+  '@types/connect@3.4.38':
     dependencies:
-      '@types/node': 20.12.2
-    dev: true
+      '@types/node': 20.16.11
 
-  /@types/debug@4.1.12:
-    resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+  '@types/debug@4.1.12':
     dependencies:
       '@types/ms': 0.7.34
-    dev: false
-
-  /@types/detect-port@1.3.5:
-    resolution: {integrity: sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==}
-    dev: true
-
-  /@types/diff@5.2.1:
-    resolution: {integrity: sha512-uxpcuwWJGhe2AR1g8hD9F5OYGCqjqWnBUQFD8gMZsDbv8oPHzxJF6iMO6n8Tk0AdzlxoaaoQhOYlIg/PukVU8g==}
-    dev: true
 
-  /@types/doctrine@0.0.3:
-    resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==}
-    dev: true
-
-  /@types/ejs@3.1.5:
-    resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==}
-    dev: true
-
-  /@types/emscripten@1.39.13:
-    resolution: {integrity: sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==}
-    dev: true
-
-  /@types/estree@0.0.39:
-    resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==}
-    dev: true
+  '@types/estree@0.0.39': {}
 
-  /@types/estree@1.0.5:
-    resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
-    dev: true
+  '@types/estree@1.0.6': {}
 
-  /@types/express-serve-static-core@4.19.3:
-    resolution: {integrity: sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==}
+  '@types/express-serve-static-core@4.19.6':
     dependencies:
-      '@types/node': 20.12.2
-      '@types/qs': 6.9.15
+      '@types/node': 20.16.11
+      '@types/qs': 6.9.16
       '@types/range-parser': 1.2.7
       '@types/send': 0.17.4
-    dev: true
 
-  /@types/express@4.17.21:
-    resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
+  '@types/express@4.17.21':
     dependencies:
       '@types/body-parser': 1.19.5
-      '@types/express-serve-static-core': 4.19.3
-      '@types/qs': 6.9.15
+      '@types/express-serve-static-core': 4.19.6
+      '@types/qs': 6.9.16
       '@types/serve-static': 1.15.7
-    dev: true
-
-  /@types/find-cache-dir@3.2.1:
-    resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==}
-    dev: true
-
-  /@types/graceful-fs@4.1.5:
-    resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==}
-    dependencies:
-      '@types/node': 20.12.2
-    dev: true
 
-  /@types/hast@2.3.10:
-    resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
+  '@types/graceful-fs@4.1.9':
     dependencies:
-      '@types/unist': 2.0.10
-    dev: false
+      '@types/node': 20.16.11
 
-  /@types/hast@3.0.4:
-    resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+  '@types/hast@3.0.4':
     dependencies:
-      '@types/unist': 3.0.2
+      '@types/unist': 3.0.3
 
-  /@types/http-errors@2.0.4:
-    resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
-    dev: true
+  '@types/http-errors@2.0.4': {}
 
-  /@types/istanbul-lib-coverage@2.0.4:
-    resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==}
-    dev: true
+  '@types/istanbul-lib-coverage@2.0.6': {}
 
-  /@types/istanbul-lib-report@3.0.0:
-    resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==}
+  '@types/istanbul-lib-report@3.0.3':
     dependencies:
-      '@types/istanbul-lib-coverage': 2.0.4
-    dev: true
+      '@types/istanbul-lib-coverage': 2.0.6
 
-  /@types/istanbul-reports@3.0.1:
-    resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==}
+  '@types/istanbul-reports@3.0.4':
     dependencies:
-      '@types/istanbul-lib-report': 3.0.0
-    dev: true
+      '@types/istanbul-lib-report': 3.0.3
 
-  /@types/jest@27.5.2:
-    resolution: {integrity: sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==}
+  '@types/jest@27.5.2':
     dependencies:
       jest-matcher-utils: 27.5.1
       pretty-format: 27.5.1
-    dev: true
 
-  /@types/json-schema@7.0.15:
-    resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
-    dev: true
+  '@types/json-schema@7.0.15': {}
 
-  /@types/jsonwebtoken@9.0.6:
-    resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==}
+  '@types/jsonwebtoken@9.0.7':
     dependencies:
-      '@types/node': 20.12.2
-    dev: false
+      '@types/node': 20.16.11
 
-  /@types/katex@0.16.7:
-    resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==}
-    dev: false
+  '@types/katex@0.16.7': {}
 
-  /@types/lodash.defaultsdeep@4.6.9:
-    resolution: {integrity: sha512-pLtCFK0YkHfGtGLYLNMTbFB5/G5+RsmQCIbbHH8GOAXjv+gDkVilY98kILfe8JH2Kev0OCReYxp1AjxEjP8ixA==}
+  '@types/lodash.defaultsdeep@4.6.9':
     dependencies:
-      '@types/lodash': 4.17.0
-    dev: true
+      '@types/lodash': 4.17.10
 
-  /@types/lodash.isequal@4.5.8:
-    resolution: {integrity: sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==}
+  '@types/lodash.isequal@4.5.8':
     dependencies:
-      '@types/lodash': 4.17.0
-    dev: true
-
-  /@types/lodash@4.17.0:
-    resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==}
-    dev: true
+      '@types/lodash': 4.17.10
 
-  /@types/mdast@3.0.15:
-    resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==}
-    dependencies:
-      '@types/unist': 2.0.10
-    dev: false
+  '@types/lodash@4.17.10': {}
 
-  /@types/mdast@4.0.3:
-    resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==}
+  '@types/mdast@4.0.4':
     dependencies:
-      '@types/unist': 3.0.2
+      '@types/unist': 3.0.3
 
-  /@types/mdx@2.0.13:
-    resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
-    dev: true
+  '@types/mdx@2.0.13': {}
 
-  /@types/mime@1.3.5:
-    resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
-    dev: true
+  '@types/mime@1.3.5': {}
 
-  /@types/ms@0.7.34:
-    resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
-    dev: false
+  '@types/ms@0.7.34': {}
 
-  /@types/node@17.0.45:
-    resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
-    dev: true
+  '@types/node@17.0.45': {}
 
-  /@types/node@18.19.24:
-    resolution: {integrity: sha512-eghAz3gnbQbvnHqB+mgB2ZR3aH6RhdEmHGS48BnV75KceQPHqabkxKI0BbUSsqhqy2Ddhc2xD/VAR9ySZd57Lw==}
+  '@types/node@18.19.55':
     dependencies:
       undici-types: 5.26.5
-    dev: true
 
-  /@types/node@20.12.2:
-    resolution: {integrity: sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==}
+  '@types/node@20.16.11':
     dependencies:
-      undici-types: 5.26.5
-
-  /@types/node@20.3.3:
-    resolution: {integrity: sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==}
-    dev: true
-
-  /@types/normalize-package-data@2.4.4:
-    resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
-    dev: true
+      undici-types: 6.19.8
 
-  /@types/parse-json@4.0.2:
-    resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
-    dev: true
+  '@types/node@22.7.5':
+    dependencies:
+      undici-types: 6.19.8
 
-  /@types/prettier@2.7.1:
-    resolution: {integrity: sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==}
-    dev: true
+  '@types/parse-json@4.0.2': {}
 
-  /@types/pretty-hrtime@1.0.3:
-    resolution: {integrity: sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==}
-    dev: true
+  '@types/prettier@2.7.3': {}
 
-  /@types/prop-types@15.7.12:
-    resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==}
-    dev: true
+  '@types/prop-types@15.7.13': {}
 
-  /@types/qs@6.9.15:
-    resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==}
-    dev: true
+  '@types/qs@6.9.16': {}
 
-  /@types/range-parser@1.2.7:
-    resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
-    dev: true
+  '@types/range-parser@1.2.7': {}
 
-  /@types/react@18.3.3:
-    resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==}
+  '@types/react@18.3.11':
     dependencies:
-      '@types/prop-types': 15.7.12
+      '@types/prop-types': 15.7.13
       csstype: 3.1.3
-    dev: true
 
-  /@types/resolve@1.17.1:
-    resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
-    dependencies:
-      '@types/node': 20.12.2
-    dev: true
+  '@types/resolve@1.20.2': {}
 
-  /@types/semver@7.5.8:
-    resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
-    dev: true
+  '@types/semver@7.5.8': {}
 
-  /@types/send@0.17.4:
-    resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
+  '@types/send@0.17.4':
     dependencies:
       '@types/mime': 1.3.5
-      '@types/node': 20.12.2
-    dev: true
+      '@types/node': 20.16.11
 
-  /@types/serve-static@1.15.7:
-    resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==}
+  '@types/serve-static@1.15.7':
     dependencies:
       '@types/http-errors': 2.0.4
-      '@types/node': 20.12.2
+      '@types/node': 20.16.11
       '@types/send': 0.17.4
-    dev: true
-
-  /@types/stack-utils@2.0.1:
-    resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==}
-    dev: true
 
-  /@types/trusted-types@2.0.7:
-    resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
-    dev: true
+  '@types/stack-utils@2.0.3': {}
 
-  /@types/unist@2.0.10:
-    resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
-    dev: false
+  '@types/trusted-types@2.0.7': {}
 
-  /@types/unist@3.0.2:
-    resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==}
+  '@types/unist@3.0.3': {}
 
-  /@types/uuid@9.0.8:
-    resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==}
-    dev: true
+  '@types/uuid@9.0.8': {}
 
-  /@types/ws@8.5.10:
-    resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==}
+  '@types/ws@8.5.12':
     dependencies:
-      '@types/node': 18.19.24
-    dev: true
+      '@types/node': 20.16.11
 
-  /@types/yargs-parser@21.0.0:
-    resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==}
-    dev: true
+  '@types/yargs-parser@21.0.3': {}
 
-  /@types/yargs@16.0.4:
-    resolution: {integrity: sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==}
+  '@types/yargs@16.0.9':
     dependencies:
-      '@types/yargs-parser': 21.0.0
-    dev: true
+      '@types/yargs-parser': 21.0.3
 
-  /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.2):
-    resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    peerDependencies:
-      '@typescript-eslint/parser': ^5.0.0
-      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
-      typescript: '*'
-    peerDependenciesMeta:
-      typescript:
-        optional: true
+  '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)':
     dependencies:
-      '@eslint-community/regexpp': 4.5.0
-      '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2)
+      '@eslint-community/regexpp': 4.11.1
+      '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.6.3)
       '@typescript-eslint/scope-manager': 5.62.0
-      '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2)
-      '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2)
-      debug: 4.3.4
-      eslint: 8.57.0
+      '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3)
+      '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3)
+      debug: 4.3.7
+      eslint: 8.57.1
       graphemer: 1.4.0
-      ignore: 5.2.0
+      ignore: 5.3.2
       natural-compare-lite: 1.4.0
-      semver: 7.5.4
-      tsutils: 3.21.0(typescript@5.4.2)
-      typescript: 5.4.2
+      semver: 7.6.3
+      tsutils: 3.21.0(typescript@5.6.3)
+    optionalDependencies:
+      typescript: 5.6.3
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2):
-    resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    peerDependencies:
-      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
-      typescript: '*'
-    peerDependenciesMeta:
-      typescript:
-        optional: true
+  '@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3)':
+    dependencies:
+      '@eslint-community/regexpp': 4.11.1
+      '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3)
+      '@typescript-eslint/scope-manager': 8.8.1
+      '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3)
+      '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3)
+      '@typescript-eslint/visitor-keys': 8.8.1
+      eslint: 9.12.0
+      graphemer: 1.4.0
+      ignore: 5.3.2
+      natural-compare: 1.4.0
+      ts-api-utils: 1.3.0(typescript@5.6.3)
+    optionalDependencies:
+      typescript: 5.6.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3)':
     dependencies:
       '@typescript-eslint/scope-manager': 5.62.0
       '@typescript-eslint/types': 5.62.0
-      '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2)
-      debug: 4.3.4
-      eslint: 8.57.0
-      typescript: 5.4.2
+      '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3)
+      debug: 4.3.7
+      eslint: 8.57.1
+    optionalDependencies:
+      typescript: 5.6.3
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /@typescript-eslint/scope-manager@5.62.0:
-    resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+  '@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3)':
+    dependencies:
+      '@typescript-eslint/scope-manager': 8.8.1
+      '@typescript-eslint/types': 8.8.1
+      '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3)
+      '@typescript-eslint/visitor-keys': 8.8.1
+      debug: 4.3.7
+      eslint: 9.12.0
+    optionalDependencies:
+      typescript: 5.6.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/scope-manager@5.62.0':
     dependencies:
       '@typescript-eslint/types': 5.62.0
       '@typescript-eslint/visitor-keys': 5.62.0
-    dev: true
 
-  /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.4.2):
-    resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    peerDependencies:
-      eslint: '*'
-      typescript: '*'
-    peerDependenciesMeta:
-      typescript:
-        optional: true
+  '@typescript-eslint/scope-manager@8.8.1':
+    dependencies:
+      '@typescript-eslint/types': 8.8.1
+      '@typescript-eslint/visitor-keys': 8.8.1
+
+  '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.6.3)':
     dependencies:
-      '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2)
-      '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2)
-      debug: 4.3.4
-      eslint: 8.57.0
-      tsutils: 3.21.0(typescript@5.4.2)
-      typescript: 5.4.2
+      '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3)
+      '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3)
+      debug: 4.3.7
+      eslint: 8.57.1
+      tsutils: 3.21.0(typescript@5.6.3)
+    optionalDependencies:
+      typescript: 5.6.3
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /@typescript-eslint/types@5.62.0:
-    resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    dev: true
+  '@typescript-eslint/type-utils@8.8.1(eslint@9.12.0)(typescript@5.6.3)':
+    dependencies:
+      '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3)
+      '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3)
+      debug: 4.3.7
+      ts-api-utils: 1.3.0(typescript@5.6.3)
+    optionalDependencies:
+      typescript: 5.6.3
+    transitivePeerDependencies:
+      - eslint
+      - supports-color
 
-  /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.2):
-    resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    peerDependencies:
-      typescript: '*'
-    peerDependenciesMeta:
-      typescript:
-        optional: true
+  '@typescript-eslint/types@5.62.0': {}
+
+  '@typescript-eslint/types@8.8.1': {}
+
+  '@typescript-eslint/typescript-estree@5.62.0(typescript@5.6.3)':
     dependencies:
       '@typescript-eslint/types': 5.62.0
       '@typescript-eslint/visitor-keys': 5.62.0
-      debug: 4.3.4
+      debug: 4.3.7
       globby: 11.1.0
       is-glob: 4.0.3
-      semver: 7.5.4
-      tsutils: 3.21.0(typescript@5.4.2)
-      typescript: 5.4.2
+      semver: 7.6.3
+      tsutils: 3.21.0(typescript@5.6.3)
+    optionalDependencies:
+      typescript: 5.6.3
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.2):
-    resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    peerDependencies:
-      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+  '@typescript-eslint/typescript-estree@8.8.1(typescript@5.6.3)':
+    dependencies:
+      '@typescript-eslint/types': 8.8.1
+      '@typescript-eslint/visitor-keys': 8.8.1
+      debug: 4.3.7
+      fast-glob: 3.3.2
+      is-glob: 4.0.3
+      minimatch: 9.0.5
+      semver: 7.6.3
+      ts-api-utils: 1.3.0(typescript@5.6.3)
+    optionalDependencies:
+      typescript: 5.6.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.6.3)':
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1)
       '@types/json-schema': 7.0.15
       '@types/semver': 7.5.8
       '@typescript-eslint/scope-manager': 5.62.0
       '@typescript-eslint/types': 5.62.0
-      '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2)
-      eslint: 8.57.0
+      '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3)
+      eslint: 8.57.1
       eslint-scope: 5.1.1
-      semver: 7.5.4
+      semver: 7.6.3
     transitivePeerDependencies:
       - supports-color
       - typescript
-    dev: true
 
-  /@typescript-eslint/visitor-keys@5.62.0:
-    resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+  '@typescript-eslint/utils@8.8.1(eslint@9.12.0)(typescript@5.6.3)':
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0)
+      '@typescript-eslint/scope-manager': 8.8.1
+      '@typescript-eslint/types': 8.8.1
+      '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3)
+      eslint: 9.12.0
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
+  '@typescript-eslint/visitor-keys@5.62.0':
+    dependencies:
+      '@typescript-eslint/types': 5.62.0
+      eslint-visitor-keys: 3.4.3
+
+  '@typescript-eslint/visitor-keys@8.8.1':
     dependencies:
-      '@typescript-eslint/types': 5.62.0
+      '@typescript-eslint/types': 8.8.1
       eslint-visitor-keys: 3.4.3
-    dev: true
 
-  /@ungap/structured-clone@1.2.0:
-    resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+  '@ungap/structured-clone@1.2.0': {}
 
-  /@vitest/coverage-v8@1.6.0(vitest@1.4.0):
-    resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==}
-    peerDependencies:
-      vitest: 1.6.0
+  '@vitest/coverage-v8@2.1.2(vitest@2.1.2(@types/node@22.7.5)(jsdom@25.0.1)(lightningcss@1.27.0)(terser@5.34.1))':
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@bcoe/v8-coverage': 0.2.3
-      debug: 4.3.4
+      debug: 4.3.7
       istanbul-lib-coverage: 3.2.2
       istanbul-lib-report: 3.0.1
-      istanbul-lib-source-maps: 5.0.4
+      istanbul-lib-source-maps: 5.0.6
       istanbul-reports: 3.1.7
-      magic-string: 0.30.8
-      magicast: 0.3.4
-      picocolors: 1.0.0
+      magic-string: 0.30.11
+      magicast: 0.3.5
       std-env: 3.7.0
-      strip-literal: 2.0.0
-      test-exclude: 6.0.0
-      vitest: 1.4.0(jsdom@24.0.0)
+      test-exclude: 7.0.1
+      tinyrainbow: 1.2.0
+      vitest: 2.1.2(@types/node@22.7.5)(jsdom@25.0.1)(lightningcss@1.27.0)(terser@5.34.1)
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /@vitest/expect@1.3.1:
-    resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==}
+  '@vitest/expect@2.0.5':
+    dependencies:
+      '@vitest/spy': 2.0.5
+      '@vitest/utils': 2.0.5
+      chai: 5.1.1
+      tinyrainbow: 1.2.0
+
+  '@vitest/expect@2.1.2':
+    dependencies:
+      '@vitest/spy': 2.1.2
+      '@vitest/utils': 2.1.2
+      chai: 5.1.1
+      tinyrainbow: 1.2.0
+
+  '@vitest/mocker@2.1.2(@vitest/spy@2.1.2)(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1))':
     dependencies:
-      '@vitest/spy': 1.3.1
-      '@vitest/utils': 1.3.1
-      chai: 4.4.1
-    dev: true
+      '@vitest/spy': 2.1.2
+      estree-walker: 3.0.3
+      magic-string: 0.30.11
+    optionalDependencies:
+      vite: 5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)
+
+  '@vitest/pretty-format@2.0.5':
+    dependencies:
+      tinyrainbow: 1.2.0
 
-  /@vitest/expect@1.4.0:
-    resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==}
+  '@vitest/pretty-format@2.1.2':
     dependencies:
-      '@vitest/spy': 1.4.0
-      '@vitest/utils': 1.4.0
-      chai: 4.4.1
-    dev: true
+      tinyrainbow: 1.2.0
 
-  /@vitest/runner@1.4.0:
-    resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==}
+  '@vitest/runner@2.1.2':
     dependencies:
-      '@vitest/utils': 1.4.0
-      p-limit: 5.0.0
+      '@vitest/utils': 2.1.2
       pathe: 1.1.2
-    dev: true
 
-  /@vitest/snapshot@1.4.0:
-    resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==}
+  '@vitest/snapshot@2.1.2':
     dependencies:
-      magic-string: 0.30.8
+      '@vitest/pretty-format': 2.1.2
+      magic-string: 0.30.11
       pathe: 1.1.2
-      pretty-format: 29.7.0
-    dev: true
 
-  /@vitest/spy@1.3.1:
-    resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==}
+  '@vitest/spy@2.0.5':
     dependencies:
-      tinyspy: 2.2.1
-    dev: true
+      tinyspy: 3.0.2
 
-  /@vitest/spy@1.4.0:
-    resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==}
+  '@vitest/spy@2.1.2':
     dependencies:
-      tinyspy: 2.2.1
-    dev: true
+      tinyspy: 3.0.2
 
-  /@vitest/utils@1.3.1:
-    resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==}
+  '@vitest/utils@2.0.5':
     dependencies:
-      diff-sequences: 29.6.3
+      '@vitest/pretty-format': 2.0.5
       estree-walker: 3.0.3
-      loupe: 2.3.7
-      pretty-format: 29.7.0
-    dev: true
+      loupe: 3.1.2
+      tinyrainbow: 1.2.0
 
-  /@vitest/utils@1.4.0:
-    resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==}
+  '@vitest/utils@2.1.2':
     dependencies:
-      diff-sequences: 29.6.3
-      estree-walker: 3.0.3
-      loupe: 2.3.7
-      pretty-format: 29.7.0
-    dev: true
+      '@vitest/pretty-format': 2.1.2
+      loupe: 3.1.2
+      tinyrainbow: 1.2.0
 
-  /@vue/compiler-core@3.4.19:
-    resolution: {integrity: sha512-gj81785z0JNzRcU0Mq98E56e4ltO1yf8k5PQ+tV/7YHnbZkrM0fyFyuttnN8ngJZjbpofWE/m4qjKBiLl8Ju4w==}
+  '@vue/compiler-core@3.4.19':
     dependencies:
-      '@babel/parser': 7.24.7
+      '@babel/parser': 7.25.7
       '@vue/shared': 3.4.19
       entities: 4.5.0
       estree-walker: 2.0.2
-      source-map-js: 1.2.0
-    dev: true
+      source-map-js: 1.2.1
 
-  /@vue/compiler-dom@3.4.19:
-    resolution: {integrity: sha512-vm6+cogWrshjqEHTzIDCp72DKtea8Ry/QVpQRYoyTIg9k7QZDX6D8+HGURjtmatfgM8xgCFtJJaOlCaRYRK3QA==}
+  '@vue/compiler-core@3.5.11':
+    dependencies:
+      '@babel/parser': 7.25.7
+      '@vue/shared': 3.5.11
+      entities: 4.5.0
+      estree-walker: 2.0.2
+      source-map-js: 1.2.1
+    optional: true
+
+  '@vue/compiler-dom@3.4.19':
     dependencies:
       '@vue/compiler-core': 3.4.19
       '@vue/shared': 3.4.19
-    dev: true
 
-  /@vue/compiler-sfc@3.4.19:
-    resolution: {integrity: sha512-LQ3U4SN0DlvV0xhr1lUsgLCYlwQfUfetyPxkKYu7dkfvx7g3ojrGAkw0AERLOKYXuAGnqFsEuytkdcComei3Yg==}
+  '@vue/compiler-dom@3.5.11':
+    dependencies:
+      '@vue/compiler-core': 3.5.11
+      '@vue/shared': 3.5.11
+    optional: true
+
+  '@vue/compiler-sfc@3.4.19':
     dependencies:
-      '@babel/parser': 7.24.7
+      '@babel/parser': 7.25.7
       '@vue/compiler-core': 3.4.19
       '@vue/compiler-dom': 3.4.19
       '@vue/compiler-ssr': 3.4.19
       '@vue/shared': 3.4.19
       estree-walker: 2.0.2
-      magic-string: 0.30.8
-      postcss: 8.4.35
-      source-map-js: 1.2.0
-    dev: true
+      magic-string: 0.30.11
+      postcss: 8.4.47
+      source-map-js: 1.2.1
 
-  /@vue/compiler-ssr@3.4.19:
-    resolution: {integrity: sha512-P0PLKC4+u4OMJ8sinba/5Z/iDT84uMRRlrWzadgLA69opCpI1gG4N55qDSC+dedwq2fJtzmGald05LWR5TFfLw==}
+  '@vue/compiler-sfc@3.5.11':
+    dependencies:
+      '@babel/parser': 7.25.7
+      '@vue/compiler-core': 3.5.11
+      '@vue/compiler-dom': 3.5.11
+      '@vue/compiler-ssr': 3.5.11
+      '@vue/shared': 3.5.11
+      estree-walker: 2.0.2
+      magic-string: 0.30.11
+      postcss: 8.4.47
+      source-map-js: 1.2.1
+    optional: true
+
+  '@vue/compiler-ssr@3.4.19':
     dependencies:
       '@vue/compiler-dom': 3.4.19
       '@vue/shared': 3.4.19
-    dev: true
-
-  /@vue/shared@3.4.19:
-    resolution: {integrity: sha512-/KliRRHMF6LoiThEy+4c1Z4KB/gbPrGjWwJR+crg2otgrf/egKzRaCPvJ51S5oetgsgXLfc4Rm5ZgrKHZrtMSw==}
-    dev: true
 
-  /@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.20.2):
-    resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==}
-    engines: {node: '>=14.15.0'}
-    peerDependencies:
-      esbuild: '>=0.10.0'
+  '@vue/compiler-ssr@3.5.11':
     dependencies:
-      esbuild: 0.20.2
-      tslib: 2.6.2
-    dev: true
+      '@vue/compiler-dom': 3.5.11
+      '@vue/shared': 3.5.11
+    optional: true
 
-  /@yarnpkg/fslib@2.10.3:
-    resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==}
-    engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'}
-    dependencies:
-      '@yarnpkg/libzip': 2.3.0
-      tslib: 1.14.1
-    dev: true
+  '@vue/shared@3.4.19': {}
 
-  /@yarnpkg/libzip@2.3.0:
-    resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==}
-    engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'}
-    dependencies:
-      '@types/emscripten': 1.39.13
-      tslib: 1.14.1
-    dev: true
+  '@vue/shared@3.5.11':
+    optional: true
 
-  /abab@2.0.6:
-    resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
-    dev: true
+  abab@2.0.6: {}
 
-  /accepts@1.3.8:
-    resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
-    engines: {node: '>= 0.6'}
+  accepts@1.3.8:
     dependencies:
       mime-types: 2.1.35
       negotiator: 0.6.3
-    dev: true
 
-  /acorn-globals@6.0.0:
-    resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==}
+  acorn-globals@6.0.0:
     dependencies:
       acorn: 7.4.1
       acorn-walk: 7.2.0
-    dev: true
 
-  /acorn-jsx@5.3.2(acorn@8.11.3):
-    resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
-    peerDependencies:
-      acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+  acorn-jsx@5.3.2(acorn@8.12.1):
     dependencies:
-      acorn: 8.11.3
-    dev: true
-
-  /acorn-walk@7.2.0:
-    resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
-    engines: {node: '>=0.4.0'}
-    dev: true
-
-  /acorn-walk@8.3.2:
-    resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==}
-    engines: {node: '>=0.4.0'}
-    dev: true
+      acorn: 8.12.1
 
-  /acorn@7.4.1:
-    resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
-    engines: {node: '>=0.4.0'}
-    hasBin: true
-    dev: true
+  acorn-walk@7.2.0: {}
 
-  /acorn@8.11.3:
-    resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
-    engines: {node: '>=0.4.0'}
-    hasBin: true
-    dev: true
+  acorn@7.4.1: {}
 
-  /address@1.2.2:
-    resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==}
-    engines: {node: '>= 10.0.0'}
-    dev: true
+  acorn@8.12.1: {}
 
-  /agent-base@6.0.2:
-    resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
-    engines: {node: '>= 6.0.0'}
+  agent-base@6.0.2:
     dependencies:
-      debug: 4.3.4
+      debug: 4.3.7
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /agent-base@7.1.0:
-    resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==}
-    engines: {node: '>= 14'}
+  agent-base@7.1.1:
     dependencies:
-      debug: 4.3.4
+      debug: 4.3.7
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /aggregate-error@3.1.0:
-    resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
-    engines: {node: '>=8'}
+  aggregate-error@3.1.0:
     dependencies:
       clean-stack: 2.2.0
       indent-string: 4.0.0
-    dev: false
 
-  /ajv@6.12.6:
-    resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+  ajv@6.12.6:
     dependencies:
       fast-deep-equal: 3.1.3
       fast-json-stable-stringify: 2.1.0
       json-schema-traverse: 0.4.1
       uri-js: 4.4.1
-    dev: true
 
-  /ajv@8.12.0:
-    resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+  ajv@8.17.1:
     dependencies:
       fast-deep-equal: 3.1.3
+      fast-uri: 3.0.2
       json-schema-traverse: 1.0.0
       require-from-string: 2.0.2
-      uri-js: 4.4.1
-    dev: true
 
-  /ansi-colors@4.1.3:
-    resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
-    engines: {node: '>=6'}
-    dev: true
+  ansi-colors@4.1.3: {}
 
-  /ansi-escapes@4.3.2:
-    resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
-    engines: {node: '>=8'}
+  ansi-escapes@4.3.2:
     dependencies:
       type-fest: 0.21.3
-    dev: true
 
-  /ansi-regex@5.0.1:
-    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
-    engines: {node: '>=8'}
-    dev: true
+  ansi-regex@5.0.1: {}
 
-  /ansi-regex@6.0.1:
-    resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
-    engines: {node: '>=12'}
-    dev: true
+  ansi-regex@6.1.0: {}
 
-  /ansi-sequence-parser@1.1.0:
-    resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==}
-    dev: true
+  ansi-sequence-parser@1.1.1: {}
 
-  /ansi-styles@3.2.1:
-    resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
-    engines: {node: '>=4'}
+  ansi-styles@3.2.1:
     dependencies:
       color-convert: 1.9.3
-    dev: true
 
-  /ansi-styles@4.3.0:
-    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
-    engines: {node: '>=8'}
+  ansi-styles@4.3.0:
     dependencies:
       color-convert: 2.0.1
-    dev: true
 
-  /ansi-styles@5.2.0:
-    resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
-    engines: {node: '>=10'}
-    dev: true
+  ansi-styles@5.2.0: {}
 
-  /ansi-styles@6.2.1:
-    resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
-    engines: {node: '>=12'}
-    dev: true
+  ansi-styles@6.2.1: {}
 
-  /anymatch@3.1.3:
-    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
-    engines: {node: '>= 8'}
+  anymatch@3.1.3:
     dependencies:
       normalize-path: 3.0.0
       picomatch: 2.3.1
-    dev: true
 
-  /app-root-dir@1.0.2:
-    resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==}
-    dev: true
-
-  /argparse@1.0.10:
-    resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+  argparse@1.0.10:
     dependencies:
       sprintf-js: 1.0.3
-    dev: true
 
-  /argparse@2.0.1:
-    resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
-    dev: true
-
-  /aria-hidden@1.2.4:
-    resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
-    engines: {node: '>=10'}
-    dependencies:
-      tslib: 2.6.2
-    dev: true
+  argparse@2.0.1: {}
 
-  /aria-query@5.1.3:
-    resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
+  aria-query@5.1.3:
     dependencies:
       deep-equal: 2.2.3
-    dev: true
 
-  /aria-query@5.3.0:
-    resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+  aria-query@5.3.0:
     dependencies:
       dequal: 2.0.3
-    dev: true
 
-  /array-buffer-byte-length@1.0.0:
-    resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
-    dependencies:
-      call-bind: 1.0.7
-      is-array-buffer: 3.0.2
-    dev: true
+  aria-query@5.3.2: {}
 
-  /array-buffer-byte-length@1.0.1:
-    resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
-    engines: {node: '>= 0.4'}
+  array-buffer-byte-length@1.0.1:
     dependencies:
       call-bind: 1.0.7
       is-array-buffer: 3.0.4
-    dev: true
 
-  /array-flatten@1.1.1:
-    resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
-    dev: true
+  array-flatten@1.1.1: {}
 
-  /array-includes@3.1.6:
-    resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==}
-    engines: {node: '>= 0.4'}
+  array-includes@3.1.8:
     dependencies:
       call-bind: 1.0.7
-      define-properties: 1.2.0
-      es-abstract: 1.21.2
+      define-properties: 1.2.1
+      es-abstract: 1.23.3
+      es-object-atoms: 1.0.0
       get-intrinsic: 1.2.4
       is-string: 1.0.7
-    dev: true
 
-  /array-union@2.1.0:
-    resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
-    engines: {node: '>=8'}
-    dev: true
+  array-union@2.1.0: {}
 
-  /arraybuffer.prototype.slice@1.0.3:
-    resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
-    engines: {node: '>= 0.4'}
+  array.prototype.flat@1.3.2:
+    dependencies:
+      call-bind: 1.0.7
+      define-properties: 1.2.1
+      es-abstract: 1.23.3
+      es-shim-unscopables: 1.0.2
+
+  arraybuffer.prototype.slice@1.0.3:
     dependencies:
       array-buffer-byte-length: 1.0.1
       call-bind: 1.0.7
       define-properties: 1.2.1
-      es-abstract: 1.23.1
+      es-abstract: 1.23.3
       es-errors: 1.3.0
       get-intrinsic: 1.2.4
       is-array-buffer: 3.0.4
       is-shared-array-buffer: 1.0.3
-    dev: true
-
-  /arrify@1.0.1:
-    resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
-    engines: {node: '>=0.10.0'}
-    dev: true
 
-  /assert@2.1.0:
-    resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==}
-    dependencies:
-      call-bind: 1.0.7
-      is-nan: 1.3.2
-      object-is: 1.1.6
-      object.assign: 4.1.5
-      util: 0.12.5
-    dev: true
+  arrify@1.0.1: {}
 
-  /assertion-error@1.1.0:
-    resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
-    dev: true
+  assertion-error@2.0.1: {}
 
-  /ast-types@0.16.1:
-    resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==}
-    engines: {node: '>=4'}
+  ast-types@0.16.1:
     dependencies:
-      tslib: 2.6.2
-    dev: true
+      tslib: 2.7.0
 
-  /async@3.2.5:
-    resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==}
-    dev: true
+  async@3.2.6: {}
 
-  /asynckit@0.4.0:
-    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
-    dev: true
+  asynckit@0.4.0: {}
 
-  /at-least-node@1.0.0:
-    resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
-    engines: {node: '>= 4.0.0'}
-    dev: true
+  at-least-node@1.0.0: {}
 
-  /available-typed-arrays@1.0.7:
-    resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
-    engines: {node: '>= 0.4'}
+  available-typed-arrays@1.0.7:
     dependencies:
       possible-typed-array-names: 1.0.0
-    dev: true
 
-  /axios@0.26.1:
-    resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==}
+  axios@0.26.1:
     dependencies:
-      follow-redirects: 1.15.2
+      follow-redirects: 1.15.9
     transitivePeerDependencies:
       - debug
-    dev: false
-
-  /babel-core@7.0.0-bridge.0(@babel/core@7.24.7):
-    resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-    dev: true
-
-  /babel-jest@27.5.1(@babel/core@7.24.0):
-    resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    peerDependencies:
-      '@babel/core': ^7.8.0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@jest/transform': 27.5.1
-      '@jest/types': 27.5.1
-      '@types/babel__core': 7.20.5
-      babel-plugin-istanbul: 6.1.1
-      babel-preset-jest: 27.5.1(@babel/core@7.24.0)
-      chalk: 4.1.2
-      graceful-fs: 4.2.11
-      slash: 3.0.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /babel-jest@27.5.1(@babel/core@7.24.7):
-    resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    peerDependencies:
-      '@babel/core': ^7.8.0
+  babel-jest@27.5.1(@babel/core@7.25.7):
     dependencies:
-      '@babel/core': 7.24.7
+      '@babel/core': 7.25.7
       '@jest/transform': 27.5.1
       '@jest/types': 27.5.1
       '@types/babel__core': 7.20.5
       babel-plugin-istanbul: 6.1.1
-      babel-preset-jest: 27.5.1(@babel/core@7.24.7)
+      babel-preset-jest: 27.5.1(@babel/core@7.25.7)
       chalk: 4.1.2
       graceful-fs: 4.2.11
       slash: 3.0.0
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /babel-plugin-codegen@4.1.5:
-    resolution: {integrity: sha512-mId3XW/ndFe7kqUdDUPvMhzYC7ST2gC+C20pO2jVVRQqlHrB1KbMpI/mpawX3DKkAmAuAzWVcBFHb5ULRyNl4A==}
-    engines: {node: '>=10', npm: '>=6'}
+  babel-plugin-codegen@4.1.5:
     dependencies:
-      '@babel/runtime': 7.24.0
+      '@babel/runtime': 7.25.7
       babel-plugin-macros: 3.1.0
       require-from-string: 2.0.2
-    dev: true
 
-  /babel-plugin-istanbul@6.1.1:
-    resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
-    engines: {node: '>=8'}
+  babel-plugin-istanbul@6.1.1:
     dependencies:
-      '@babel/helper-plugin-utils': 7.24.7
+      '@babel/helper-plugin-utils': 7.25.7
       '@istanbuljs/load-nyc-config': 1.1.0
       '@istanbuljs/schema': 0.1.3
       istanbul-lib-instrument: 5.2.1
       test-exclude: 6.0.0
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /babel-plugin-jest-hoist@27.5.1:
-    resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  babel-plugin-jest-hoist@27.5.1:
     dependencies:
-      '@babel/template': 7.24.7
-      '@babel/types': 7.24.7
+      '@babel/template': 7.25.7
+      '@babel/types': 7.25.7
       '@types/babel__core': 7.20.5
-      '@types/babel__traverse': 7.20.5
-    dev: true
-
-  /babel-plugin-jsx-dom-expressions@0.37.17(@babel/core@7.24.0):
-    resolution: {integrity: sha512-1bv8rOTzs6TR3DVyVZ7ElxyPEhnS556FMWRIsB3gBPfkn/cSKaLvXLGk+X1lvI+SzcUo4G+UcmJrn3vr1ig8mQ==}
-    peerDependencies:
-      '@babel/core': ^7.20.12
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/helper-module-imports': 7.18.6
-      '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.24.0)
-      '@babel/types': 7.24.7
-      html-entities: 2.3.3
-      validate-html-nesting: 1.2.1
-    dev: true
+      '@types/babel__traverse': 7.20.6
 
-  /babel-plugin-jsx-dom-expressions@0.37.17(@babel/core@7.24.7):
-    resolution: {integrity: sha512-1bv8rOTzs6TR3DVyVZ7ElxyPEhnS556FMWRIsB3gBPfkn/cSKaLvXLGk+X1lvI+SzcUo4G+UcmJrn3vr1ig8mQ==}
-    peerDependencies:
-      '@babel/core': ^7.20.12
+  babel-plugin-jsx-dom-expressions@0.39.2(@babel/core@7.25.7):
     dependencies:
-      '@babel/core': 7.24.7
+      '@babel/core': 7.25.7
       '@babel/helper-module-imports': 7.18.6
-      '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.24.7)
-      '@babel/types': 7.24.7
+      '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.25.7)
+      '@babel/types': 7.25.7
       html-entities: 2.3.3
-      validate-html-nesting: 1.2.1
-    dev: true
+      jest-diff: 29.7.0
+      parse5: 7.1.2
+      validate-html-nesting: 1.2.2
 
-  /babel-plugin-macros@3.1.0:
-    resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
-    engines: {node: '>=10', npm: '>=6'}
+  babel-plugin-macros@3.1.0:
     dependencies:
-      '@babel/runtime': 7.24.0
+      '@babel/runtime': 7.25.7
       cosmiconfig: 7.1.0
       resolve: 1.22.8
-    dev: true
-
-  /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.24.7):
-    resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/compat-data': 7.23.5
-      '@babel/core': 7.24.7
-      '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.24.7)
-      semver: 6.3.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.7):
-    resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==}
-    peerDependencies:
-      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+  babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.7):
     dependencies:
-      '@babel/compat-data': 7.24.7
-      '@babel/core': 7.24.7
-      '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.7)
+      '@babel/compat-data': 7.25.7
+      '@babel/core': 7.25.7
+      '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.7)
       semver: 6.3.1
     transitivePeerDependencies:
       - supports-color
-    dev: true
-
-  /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.7):
-    resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==}
-    peerDependencies:
-      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.7)
-      core-js-compat: 3.37.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.24.7):
-    resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.24.7)
-      core-js-compat: 3.26.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
 
-  /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.24.7):
-    resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
+  babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.7):
     dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.24.7)
+      '@babel/core': 7.25.7
+      '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.7)
+      core-js-compat: 3.38.1
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.7):
-    resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==}
-    peerDependencies:
-      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+  babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.7):
     dependencies:
-      '@babel/core': 7.24.7
-      '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7)
+      '@babel/core': 7.25.7
+      '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.7)
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.0):
-    resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.0
-      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.0)
-      '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.0)
-      '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.0)
-      '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.0)
-      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.0)
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.0)
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.0)
-      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.0)
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0)
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.0)
-      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.0)
-      '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.0)
-    dev: true
-
-  /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7):
-    resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7)
-      '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7)
-      '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7)
-      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7)
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7)
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7)
-      '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7)
-    dev: true
-
-  /babel-preset-jest@27.5.1(@babel/core@7.24.0):
-    resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    peerDependencies:
-      '@babel/core': ^7.0.0
+  babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.7):
     dependencies:
-      '@babel/core': 7.24.0
-      babel-plugin-jest-hoist: 27.5.1
-      babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0)
-    dev: true
+      '@babel/core': 7.25.7
+      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.7)
+      '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.7)
+      '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.7)
+      '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.7)
+      '@babel/plugin-syntax-import-attributes': 7.25.7(@babel/core@7.25.7)
+      '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.7)
+      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.7)
+      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.7)
+      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.7)
+      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.7)
+      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.7)
+      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.7)
+      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.7)
+      '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.7)
+      '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.7)
 
-  /babel-preset-jest@27.5.1(@babel/core@7.24.7):
-    resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    peerDependencies:
-      '@babel/core': ^7.0.0
+  babel-preset-jest@27.5.1(@babel/core@7.25.7):
     dependencies:
-      '@babel/core': 7.24.7
+      '@babel/core': 7.25.7
       babel-plugin-jest-hoist: 27.5.1
-      babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7)
-    dev: true
-
-  /babel-preset-solid@1.8.15(@babel/core@7.24.0):
-    resolution: {integrity: sha512-P2yOQbB7Hn/m4YvpXV6ExHIMcgNWXWXcvY4kJzG3yqAB3hKS58OZRsvJ7RObsZWqXRvZTITBIwnpK0BMGu+ZIQ==}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.24.0
-      babel-plugin-jsx-dom-expressions: 0.37.17(@babel/core@7.24.0)
-    dev: true
+      babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.7)
 
-  /babel-preset-solid@1.8.15(@babel/core@7.24.7):
-    resolution: {integrity: sha512-P2yOQbB7Hn/m4YvpXV6ExHIMcgNWXWXcvY4kJzG3yqAB3hKS58OZRsvJ7RObsZWqXRvZTITBIwnpK0BMGu+ZIQ==}
-    peerDependencies:
-      '@babel/core': ^7.0.0
+  babel-preset-solid@1.9.2(@babel/core@7.25.7):
     dependencies:
-      '@babel/core': 7.24.7
-      babel-plugin-jsx-dom-expressions: 0.37.17(@babel/core@7.24.7)
-    dev: true
-
-  /bail@2.0.2:
-    resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+      '@babel/core': 7.25.7
+      babel-plugin-jsx-dom-expressions: 0.39.2(@babel/core@7.25.7)
 
-  /balanced-match@1.0.2:
-    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
-    dev: true
+  bail@2.0.2: {}
 
-  /base64-js@1.5.1:
-    resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
-    dev: true
+  balanced-match@1.0.2: {}
 
-  /before-after-hook@2.2.3:
-    resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==}
-    dev: false
+  before-after-hook@2.2.3: {}
 
-  /better-opn@3.0.2:
-    resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==}
-    engines: {node: '>=12.0.0'}
+  better-opn@3.0.2:
     dependencies:
       open: 8.4.2
-    dev: true
-
-  /big-integer@1.6.52:
-    resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}
-    engines: {node: '>=0.6'}
-    dev: true
-
-  /binary-extensions@2.3.0:
-    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
-    engines: {node: '>=8'}
-    dev: true
 
-  /bl@4.1.0:
-    resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
-    dependencies:
-      buffer: 5.7.1
-      inherits: 2.0.4
-      readable-stream: 3.6.2
-    dev: true
+  binary-extensions@2.3.0: {}
 
-  /body-parser@1.20.2:
-    resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
-    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+  body-parser@1.20.3:
     dependencies:
       bytes: 3.1.2
       content-type: 1.0.5
@@ -8207,246 +10400,136 @@ packages:
       http-errors: 2.0.0
       iconv-lite: 0.4.24
       on-finished: 2.4.1
-      qs: 6.11.0
+      qs: 6.13.0
       raw-body: 2.5.2
       type-is: 1.6.18
       unpipe: 1.0.0
     transitivePeerDependencies:
       - supports-color
-    dev: true
-
-  /boolbase@1.0.0:
-    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
 
-  /bottleneck@2.19.5:
-    resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==}
-    dev: false
+  boolbase@1.0.0: {}
 
-  /bplist-parser@0.2.0:
-    resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==}
-    engines: {node: '>= 5.10.0'}
-    dependencies:
-      big-integer: 1.6.52
-    dev: true
+  bottleneck@2.19.5: {}
 
-  /brace-expansion@1.1.11:
-    resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+  brace-expansion@1.1.11:
     dependencies:
       balanced-match: 1.0.2
       concat-map: 0.0.1
-    dev: true
 
-  /brace-expansion@2.0.1:
-    resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+  brace-expansion@2.0.1:
     dependencies:
       balanced-match: 1.0.2
-    dev: true
 
-  /braces@3.0.2:
-    resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
-    engines: {node: '>=8'}
+  braces@3.0.3:
     dependencies:
-      fill-range: 7.0.1
-    dev: true
+      fill-range: 7.1.1
 
-  /browser-assert@1.2.1:
-    resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==}
-    dev: true
+  browser-assert@1.2.1: {}
 
-  /browser-process-hrtime@1.0.0:
-    resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==}
-    dev: true
+  browser-process-hrtime@1.0.0: {}
 
-  /browserify-zlib@0.1.4:
-    resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==}
+  browserslist@4.23.3:
     dependencies:
-      pako: 0.2.9
-    dev: true
+      caniuse-lite: 1.0.30001667
+      electron-to-chromium: 1.5.33
+      node-releases: 2.0.18
+      update-browserslist-db: 1.1.1(browserslist@4.23.3)
 
-  /browserslist@4.23.0:
-    resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==}
-    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
-    hasBin: true
+  browserslist@4.24.0:
     dependencies:
-      caniuse-lite: 1.0.30001598
-      electron-to-chromium: 1.4.708
-      node-releases: 2.0.14
-      update-browserslist-db: 1.0.13(browserslist@4.23.0)
-    dev: true
+      caniuse-lite: 1.0.30001667
+      electron-to-chromium: 1.5.33
+      node-releases: 2.0.18
+      update-browserslist-db: 1.1.1(browserslist@4.24.0)
 
-  /bser@2.1.1:
-    resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+  bser@2.1.1:
     dependencies:
       node-int64: 0.4.0
-    dev: true
-
-  /btoa-lite@1.0.0:
-    resolution: {integrity: sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==}
-    dev: false
-
-  /buffer-equal-constant-time@1.0.1:
-    resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
-    dev: false
 
-  /buffer-from@1.1.2:
-    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
-    dev: true
+  btoa-lite@1.0.0: {}
 
-  /buffer@5.7.1:
-    resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
-    dependencies:
-      base64-js: 1.5.1
-      ieee754: 1.2.1
-    dev: true
+  buffer-equal-constant-time@1.0.1: {}
 
-  /builtin-modules@3.3.0:
-    resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
-    engines: {node: '>=6'}
-    dev: true
+  buffer-from@1.1.2: {}
 
-  /bundle-n-require@1.1.1:
-    resolution: {integrity: sha512-EB2wFjXF106LQLe/CYnKCMCdLeTW47AtcEtUfiqAOgr2a08k0+YgRklur2aLfEYHlhz6baMskZ8L2U92Hh0vyA==}
+  bundle-n-require@1.1.1:
     dependencies:
       esbuild: 0.20.2
       node-eval: 2.0.0
-    dev: true
 
-  /bundle-name@4.1.0:
-    resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
-    engines: {node: '>=18'}
+  bundle-name@4.1.0:
     dependencies:
       run-applescript: 7.0.0
-    dev: true
-
-  /bytes@3.0.0:
-    resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
-    engines: {node: '>= 0.8'}
-    dev: true
-
-  /bytes@3.1.2:
-    resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
-    engines: {node: '>= 0.8'}
-    dev: true
 
-  /cac@6.7.14:
-    resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
-    engines: {node: '>=8'}
-    dev: true
+  bytes@3.1.2: {}
 
-  /call-bind@1.0.7:
-    resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
-    engines: {node: '>= 0.4'}
+  cac@6.7.14: {}
+
+  call-bind@1.0.7:
     dependencies:
       es-define-property: 1.0.0
       es-errors: 1.3.0
       function-bind: 1.1.2
       get-intrinsic: 1.2.4
       set-function-length: 1.2.2
-    dev: true
 
-  /callsites@3.1.0:
-    resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
-    engines: {node: '>=6'}
-    dev: true
+  callsites@3.1.0: {}
 
-  /camelcase@5.3.1:
-    resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
-    engines: {node: '>=6'}
-    dev: true
+  camelcase@5.3.1: {}
 
-  /camelcase@6.3.0:
-    resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
-    engines: {node: '>=10'}
-    dev: true
+  camelcase@6.3.0: {}
 
-  /caniuse-api@3.0.0:
-    resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==}
+  caniuse-api@3.0.0:
     dependencies:
-      browserslist: 4.23.0
-      caniuse-lite: 1.0.30001598
+      browserslist: 4.23.3
+      caniuse-lite: 1.0.30001667
       lodash.memoize: 4.1.2
       lodash.uniq: 4.5.0
-    dev: true
 
-  /caniuse-lite@1.0.30001598:
-    resolution: {integrity: sha512-j8mQRDziG94uoBfeFuqsJUNECW37DXpnvhcMJMdlH2u3MRkq1sAI0LJcXP1i/Py0KbSIC4UDj8YHPrTn5YsL+Q==}
-    dev: true
+  caniuse-lite@1.0.30001667: {}
 
-  /ccount@2.0.1:
-    resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+  ccount@2.0.1: {}
 
-  /chai@4.4.1:
-    resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==}
-    engines: {node: '>=4'}
+  chai@5.1.1:
     dependencies:
-      assertion-error: 1.1.0
-      check-error: 1.0.3
-      deep-eql: 4.1.3
-      get-func-name: 2.0.2
-      loupe: 2.3.7
-      pathval: 1.1.1
-      type-detect: 4.0.8
-    dev: true
+      assertion-error: 2.0.1
+      check-error: 2.1.1
+      deep-eql: 5.0.2
+      loupe: 3.1.2
+      pathval: 2.0.0
 
-  /chalk@2.4.2:
-    resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
-    engines: {node: '>=4'}
+  chalk@2.4.2:
     dependencies:
       ansi-styles: 3.2.1
       escape-string-regexp: 1.0.5
       supports-color: 5.5.0
-    dev: true
 
-  /chalk@3.0.0:
-    resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
-    engines: {node: '>=8'}
+  chalk@3.0.0:
     dependencies:
       ansi-styles: 4.3.0
       supports-color: 7.2.0
-    dev: true
 
-  /chalk@4.1.2:
-    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
-    engines: {node: '>=10'}
+  chalk@4.1.2:
     dependencies:
       ansi-styles: 4.3.0
       supports-color: 7.2.0
-    dev: true
 
-  /chalk@5.3.0:
-    resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
-    engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
-    dev: false
+  chalk@5.3.0: {}
 
-  /char-regex@1.0.2:
-    resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
-    engines: {node: '>=10'}
-    dev: true
+  char-regex@1.0.2: {}
 
-  /character-entities-html4@2.1.0:
-    resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
-    dev: true
+  character-entities-html4@2.1.0: {}
 
-  /character-entities-legacy@3.0.0:
-    resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
-    dev: true
+  character-entities-legacy@3.0.0: {}
 
-  /character-entities@2.0.2:
-    resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
-    dev: false
+  character-entities@2.0.2: {}
 
-  /check-error@1.0.3:
-    resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
-    dependencies:
-      get-func-name: 2.0.2
-    dev: true
+  check-error@2.1.1: {}
 
-  /chokidar@3.6.0:
-    resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
-    engines: {node: '>= 8.10.0'}
+  chokidar@3.6.0:
     dependencies:
       anymatch: 3.1.3
-      braces: 3.0.2
+      braces: 3.0.3
       glob-parent: 5.1.2
       is-binary-path: 2.1.0
       is-glob: 4.0.3
@@ -8454,497 +10537,208 @@ packages:
       readdirp: 3.6.0
     optionalDependencies:
       fsevents: 2.3.3
-    dev: true
-
-  /chownr@1.1.4:
-    resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
-    dev: true
-
-  /chownr@2.0.0:
-    resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
-    engines: {node: '>=10'}
-    dev: true
 
-  /chromatic@11.5.3:
-    resolution: {integrity: sha512-EtDDXA4OdhsjE0IuLr5AZvOX+ZYXgqdRPtdTAQrM3nImjlteQ5biBmdEEEcdAXDTPU881rEUaUIy2owecB0wYg==}
-    hasBin: true
-    peerDependencies:
-      '@chromatic-com/cypress': ^0.*.* || ^1.0.0
-      '@chromatic-com/playwright': ^0.*.* || ^1.0.0
-    peerDependenciesMeta:
-      '@chromatic-com/cypress':
-        optional: true
-      '@chromatic-com/playwright':
-        optional: true
-    dev: true
-
-  /ci-info@3.5.0:
-    resolution: {integrity: sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==}
-    dev: true
-
-  /ci-info@3.8.0:
-    resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /citty@0.1.6:
-    resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
-    dependencies:
-      consola: 3.2.3
-    dev: true
-
-  /cjs-module-lexer@1.2.2:
-    resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==}
-    dev: true
-
-  /clean-stack@2.2.0:
-    resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
-    engines: {node: '>=6'}
-    dev: false
+  chromatic@11.12.0: {}
 
-  /cli-cursor@3.1.0:
-    resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
-    engines: {node: '>=8'}
-    dependencies:
-      restore-cursor: 3.1.0
-    dev: true
+  ci-info@3.9.0: {}
 
-  /cli-spinners@2.9.2:
-    resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
-    engines: {node: '>=6'}
-    dev: true
+  cjs-module-lexer@1.4.1: {}
 
-  /cli-table3@0.6.5:
-    resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==}
-    engines: {node: 10.* || >= 12.*}
-    dependencies:
-      string-width: 4.2.3
-    optionalDependencies:
-      '@colors/colors': 1.5.0
-    dev: true
+  clean-stack@2.2.0: {}
 
-  /cliui@7.0.4:
-    resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+  cliui@7.0.4:
     dependencies:
       string-width: 4.2.3
       strip-ansi: 6.0.1
       wrap-ansi: 7.0.0
-    dev: true
-
-  /clone-deep@4.0.1:
-    resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==}
-    engines: {node: '>=6'}
-    dependencies:
-      is-plain-object: 2.0.4
-      kind-of: 6.0.3
-      shallow-clone: 3.0.1
-    dev: true
 
-  /clone@1.0.4:
-    resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
-    engines: {node: '>=0.8'}
-    dev: true
-
-  /clsx@2.1.0:
-    resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==}
-    engines: {node: '>=6'}
-    dev: false
-
-  /co@4.6.0:
-    resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
-    engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
-    dev: true
+  co@4.6.0: {}
 
-  /code-block-writer@12.0.0:
-    resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==}
-    dev: true
+  code-block-writer@12.0.0: {}
 
-  /collect-v8-coverage@1.0.1:
-    resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==}
-    dev: true
+  collect-v8-coverage@1.0.2: {}
 
-  /color-convert@1.9.3:
-    resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+  color-convert@1.9.3:
     dependencies:
       color-name: 1.1.3
-    dev: true
 
-  /color-convert@2.0.1:
-    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
-    engines: {node: '>=7.0.0'}
+  color-convert@2.0.1:
     dependencies:
       color-name: 1.1.4
-    dev: true
 
-  /color-name@1.1.3:
-    resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
-    dev: true
+  color-name@1.1.3: {}
 
-  /color-name@1.1.4:
-    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
-    dev: true
+  color-name@1.1.4: {}
 
-  /color-name@2.0.0:
-    resolution: {integrity: sha512-SbtvAMWvASO5TE2QP07jHBMXKafgdZz8Vrsrn96fiL+O92/FN/PLARzUW5sKt013fjAprK2d2iCn2hk2Xb5oow==}
-    engines: {node: '>=12.20'}
-    dev: false
+  color-name@2.0.0: {}
 
-  /color-parse@2.0.2:
-    resolution: {integrity: sha512-eCtOz5w5ttWIUcaKLiktF+DxZO1R9KLNY/xhbV6CkhM7sR3GhVghmt6X6yOnzeaM24po+Z9/S1apbXMwA3Iepw==}
+  color-parse@2.0.2:
     dependencies:
       color-name: 2.0.0
-    dev: false
 
-  /color-rgba@3.0.0:
-    resolution: {integrity: sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==}
+  color-rgba@3.0.0:
     dependencies:
       color-parse: 2.0.2
       color-space: 2.0.1
-    dev: false
 
-  /color-space@2.0.1:
-    resolution: {integrity: sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA==}
-    dev: false
+  color-space@2.0.1: {}
 
-  /combined-stream@1.0.8:
-    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
-    engines: {node: '>= 0.8'}
+  combined-stream@1.0.8:
     dependencies:
       delayed-stream: 1.0.0
-    dev: true
-
-  /comma-separated-tokens@2.0.3:
-    resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
 
-  /commander@2.20.3:
-    resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
-    dev: true
-
-  /commander@6.2.1:
-    resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
-    engines: {node: '>= 6'}
-    dev: true
-
-  /commander@7.2.0:
-    resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
-    engines: {node: '>= 10'}
-    dev: true
-
-  /commander@8.3.0:
-    resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
-    engines: {node: '>= 12'}
-    dev: false
+  comma-separated-tokens@2.0.3: {}
 
-  /common-tags@1.8.2:
-    resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
-    engines: {node: '>=4.0.0'}
-    dev: true
+  commander@2.20.3: {}
 
-  /commondir@1.0.1:
-    resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
-    dev: true
+  commander@7.2.0: {}
 
-  /compressible@2.0.18:
-    resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
-    engines: {node: '>= 0.6'}
-    dependencies:
-      mime-db: 1.52.0
-    dev: true
+  commander@8.3.0: {}
 
-  /compression@1.7.4:
-    resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      accepts: 1.3.8
-      bytes: 3.0.0
-      compressible: 2.0.18
-      debug: 2.6.9
-      on-headers: 1.0.2
-      safe-buffer: 5.1.2
-      vary: 1.1.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  common-tags@1.8.2: {}
 
-  /concat-map@0.0.1:
-    resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
-    dev: true
+  concat-map@0.0.1: {}
 
-  /consola@3.2.3:
-    resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==}
-    engines: {node: ^14.18.0 || >=16.10.0}
-    dev: true
+  confbox@0.1.8: {}
 
-  /content-disposition@0.5.4:
-    resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
-    engines: {node: '>= 0.6'}
+  content-disposition@0.5.4:
     dependencies:
       safe-buffer: 5.2.1
-    dev: true
-
-  /content-type@1.0.5:
-    resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
-    engines: {node: '>= 0.6'}
-    dev: true
 
-  /convert-source-map@1.9.0:
-    resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
-    dev: true
-
-  /convert-source-map@2.0.0:
-    resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
-    dev: true
+  content-type@1.0.5: {}
 
-  /cookie-signature@1.0.6:
-    resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
-    dev: true
+  convert-source-map@1.9.0: {}
 
-  /cookie@0.6.0:
-    resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
-    engines: {node: '>= 0.6'}
-    dev: true
+  convert-source-map@2.0.0: {}
 
-  /core-js-compat@3.26.1:
-    resolution: {integrity: sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==}
-    dependencies:
-      browserslist: 4.23.0
-    dev: true
+  cookie-signature@1.0.6: {}
 
-  /core-js-compat@3.36.0:
-    resolution: {integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==}
-    dependencies:
-      browserslist: 4.23.0
-    dev: true
+  cookie@0.7.1: {}
 
-  /core-js-compat@3.37.1:
-    resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==}
+  core-js-compat@3.38.1:
     dependencies:
-      browserslist: 4.23.0
-    dev: true
+      browserslist: 4.24.0
 
-  /core-util-is@1.0.3:
-    resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
-    dev: true
+  core-util-is@1.0.3: {}
 
-  /cosmiconfig@7.1.0:
-    resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
-    engines: {node: '>=10'}
+  cosmiconfig@7.1.0:
     dependencies:
       '@types/parse-json': 4.0.2
       import-fresh: 3.3.0
       parse-json: 5.2.0
       path-type: 4.0.0
       yaml: 1.10.2
-    dev: true
 
-  /cross-spawn@7.0.3:
-    resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
-    engines: {node: '>= 8'}
+  cross-spawn@7.0.3:
     dependencies:
       path-key: 3.1.1
       shebang-command: 2.0.0
       which: 2.0.2
-    dev: true
 
-  /crosspath@2.0.0:
-    resolution: {integrity: sha512-ju88BYCQ2uvjO2bR+SsgLSTwTSctU+6Vp2ePbKPgSCZyy4MWZxYsT738DlKVRE5utUjobjPRm1MkTYKJxCmpTA==}
-    engines: {node: '>=14.9.0'}
+  crosspath@2.0.0:
     dependencies:
       '@types/node': 17.0.45
-    dev: true
-
-  /crypto-random-string@2.0.0:
-    resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
-    engines: {node: '>=8'}
-    dev: true
 
-  /crypto-random-string@4.0.0:
-    resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==}
-    engines: {node: '>=12'}
-    dependencies:
-      type-fest: 1.4.0
-    dev: true
+  crypto-random-string@2.0.0: {}
 
-  /css-select@5.1.0:
-    resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
+  css-select@5.1.0:
     dependencies:
       boolbase: 1.0.0
       css-what: 6.1.0
       domhandler: 5.0.3
       domutils: 3.1.0
       nth-check: 2.1.1
-    dev: true
 
-  /css-selector-parser@3.0.5:
-    resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==}
-    dev: false
+  css-selector-parser@3.0.5: {}
 
-  /css-tree@2.2.1:
-    resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
-    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+  css-tree@2.2.1:
     dependencies:
       mdn-data: 2.0.28
-      source-map-js: 1.2.0
-    dev: true
+      source-map-js: 1.2.1
 
-  /css-tree@2.3.1:
-    resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
-    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+  css-tree@2.3.1:
     dependencies:
       mdn-data: 2.0.30
-      source-map-js: 1.2.0
-    dev: true
+      source-map-js: 1.2.1
 
-  /css-what@6.1.0:
-    resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
-    engines: {node: '>= 6'}
-    dev: true
+  css-what@6.1.0: {}
 
-  /css.escape@1.5.1:
-    resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
-    dev: true
+  css.escape@1.5.1: {}
 
-  /cssesc@3.0.0:
-    resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
-    engines: {node: '>=4'}
-    hasBin: true
-    dev: true
+  cssesc@3.0.0: {}
 
-  /cssnano-utils@4.0.2(postcss@8.4.35):
-    resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==}
-    engines: {node: ^14 || ^16 || >=18.0}
-    peerDependencies:
-      postcss: ^8.4.31
+  cssnano-utils@5.0.0(postcss@8.4.47):
     dependencies:
-      postcss: 8.4.35
-    dev: true
+      postcss: 8.4.47
 
-  /csso@5.0.5:
-    resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
-    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+  csso@5.0.5:
     dependencies:
       css-tree: 2.2.1
-    dev: true
 
-  /cssom@0.3.8:
-    resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==}
-    dev: true
+  cssom@0.3.8: {}
 
-  /cssom@0.4.4:
-    resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==}
-    dev: true
+  cssom@0.4.4: {}
 
-  /cssstyle@2.3.0:
-    resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==}
-    engines: {node: '>=8'}
+  cssstyle@2.3.0:
     dependencies:
       cssom: 0.3.8
-    dev: true
 
-  /cssstyle@4.0.1:
-    resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==}
-    engines: {node: '>=18'}
+  cssstyle@4.1.0:
     dependencies:
-      rrweb-cssom: 0.6.0
-    dev: true
+      rrweb-cssom: 0.7.1
 
-  /csstype@3.1.3:
-    resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+  csstype@3.1.3: {}
 
-  /data-urls@2.0.0:
-    resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==}
-    engines: {node: '>=10'}
+  data-urls@2.0.0:
     dependencies:
       abab: 2.0.6
       whatwg-mimetype: 2.3.0
       whatwg-url: 8.7.0
-    dev: true
 
-  /data-urls@5.0.0:
-    resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
-    engines: {node: '>=18'}
+  data-urls@5.0.0:
     dependencies:
       whatwg-mimetype: 4.0.0
       whatwg-url: 14.0.0
-    dev: true
 
-  /data-view-buffer@1.0.1:
-    resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
-    engines: {node: '>= 0.4'}
+  data-view-buffer@1.0.1:
     dependencies:
       call-bind: 1.0.7
       es-errors: 1.3.0
       is-data-view: 1.0.1
-    dev: true
 
-  /data-view-byte-length@1.0.1:
-    resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==}
-    engines: {node: '>= 0.4'}
+  data-view-byte-length@1.0.1:
     dependencies:
       call-bind: 1.0.7
       es-errors: 1.3.0
       is-data-view: 1.0.1
-    dev: true
 
-  /data-view-byte-offset@1.0.0:
-    resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
-    engines: {node: '>= 0.4'}
+  data-view-byte-offset@1.0.0:
     dependencies:
       call-bind: 1.0.7
       es-errors: 1.3.0
       is-data-view: 1.0.1
-    dev: true
 
-  /dayjs@1.11.10:
-    resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==}
-    dev: false
+  dayjs@1.11.13: {}
 
-  /debug@2.6.9:
-    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
-    peerDependencies:
-      supports-color: '*'
-    peerDependenciesMeta:
-      supports-color:
-        optional: true
+  debug@2.6.9:
     dependencies:
       ms: 2.0.0
-    dev: true
 
-  /debug@4.3.4:
-    resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
-    engines: {node: '>=6.0'}
-    peerDependencies:
-      supports-color: '*'
-    peerDependenciesMeta:
-      supports-color:
-        optional: true
+  debug@4.3.7:
     dependencies:
-      ms: 2.1.2
+      ms: 2.1.3
 
-  /decimal.js@10.4.3:
-    resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
-    dev: true
+  decimal.js@10.4.3: {}
 
-  /decode-named-character-reference@1.0.2:
-    resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
+  decode-named-character-reference@1.0.2:
     dependencies:
       character-entities: 2.0.2
-    dev: false
 
-  /dedent@0.7.0:
-    resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
-    dev: true
+  dedent@0.7.0: {}
 
-  /deep-eql@4.1.3:
-    resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==}
-    engines: {node: '>=6'}
-    dependencies:
-      type-detect: 4.0.8
-    dev: true
+  deep-eql@5.0.2: {}
 
-  /deep-equal@2.2.3:
-    resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==}
-    engines: {node: '>= 0.4'}
+  deep-equal@2.2.3:
     dependencies:
       array-buffer-byte-length: 1.0.1
       call-bind: 1.0.7
@@ -8959,399 +10753,151 @@ packages:
       object-is: 1.1.6
       object-keys: 1.1.1
       object.assign: 4.1.5
-      regexp.prototype.flags: 1.5.2
+      regexp.prototype.flags: 1.5.3
       side-channel: 1.0.6
       which-boxed-primitive: 1.0.2
       which-collection: 1.0.2
       which-typed-array: 1.1.15
-    dev: true
-
-  /deep-is@0.1.4:
-    resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
-    dev: true
-
-  /deepmerge@4.2.2:
-    resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==}
-    engines: {node: '>=0.10.0'}
-    dev: true
 
-  /deepmerge@4.3.1:
-    resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
-    engines: {node: '>=0.10.0'}
-    dev: true
+  deep-is@0.1.4: {}
 
-  /default-browser-id@3.0.0:
-    resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==}
-    engines: {node: '>=12'}
-    dependencies:
-      bplist-parser: 0.2.0
-      untildify: 4.0.0
-    dev: true
+  deepmerge@4.3.1: {}
 
-  /default-browser-id@5.0.0:
-    resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==}
-    engines: {node: '>=18'}
-    dev: true
+  default-browser-id@5.0.0: {}
 
-  /default-browser@5.2.1:
-    resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==}
-    engines: {node: '>=18'}
+  default-browser@5.2.1:
     dependencies:
       bundle-name: 4.1.0
       default-browser-id: 5.0.0
-    dev: true
 
-  /defaults@1.0.4:
-    resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
-    dependencies:
-      clone: 1.0.4
-    dev: true
-
-  /define-data-property@1.1.4:
-    resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
-    engines: {node: '>= 0.4'}
+  define-data-property@1.1.4:
     dependencies:
       es-define-property: 1.0.0
       es-errors: 1.3.0
       gopd: 1.0.1
-    dev: true
 
-  /define-lazy-prop@2.0.0:
-    resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /define-lazy-prop@3.0.0:
-    resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
-    engines: {node: '>=12'}
-    dev: true
+  define-lazy-prop@2.0.0: {}
 
-  /define-properties@1.2.0:
-    resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      has-property-descriptors: 1.0.2
-      object-keys: 1.1.1
-    dev: true
+  define-lazy-prop@3.0.0: {}
 
-  /define-properties@1.2.1:
-    resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
-    engines: {node: '>= 0.4'}
+  define-properties@1.2.1:
     dependencies:
       define-data-property: 1.1.4
       has-property-descriptors: 1.0.2
       object-keys: 1.1.1
-    dev: true
-
-  /defu@6.1.4:
-    resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
-    dev: true
 
-  /delayed-stream@1.0.0:
-    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
-    engines: {node: '>=0.4.0'}
-    dev: true
-
-  /depd@2.0.0:
-    resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
-    engines: {node: '>= 0.8'}
-    dev: true
-
-  /deprecation@2.3.1:
-    resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
-    dev: false
-
-  /dequal@2.0.3:
-    resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
-    engines: {node: '>=6'}
-
-  /destroy@1.2.0:
-    resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
-    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
-    dev: true
+  delayed-stream@1.0.0: {}
 
-  /detect-browser@5.3.0:
-    resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==}
-    dev: false
+  depd@2.0.0: {}
 
-  /detect-indent@6.1.0:
-    resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
-    engines: {node: '>=8'}
-    dev: true
+  deprecation@2.3.1: {}
 
-  /detect-libc@1.0.3:
-    resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
-    engines: {node: '>=0.10'}
-    hasBin: true
-    dev: true
+  dequal@2.0.3: {}
 
-  /detect-newline@3.1.0:
-    resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
-    engines: {node: '>=8'}
-    dev: true
+  destroy@1.2.0: {}
 
-  /detect-node-es@1.1.0:
-    resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
-    dev: true
+  detect-browser@5.3.0: {}
 
-  /detect-package-manager@2.0.1:
-    resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==}
-    engines: {node: '>=12'}
-    dependencies:
-      execa: 5.1.1
-    dev: true
+  detect-libc@1.0.3: {}
 
-  /detect-port@1.6.1:
-    resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==}
-    engines: {node: '>= 4.0.0'}
-    hasBin: true
-    dependencies:
-      address: 1.2.2
-      debug: 4.3.4
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  detect-newline@3.1.0: {}
 
-  /devlop@1.1.0:
-    resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+  devlop@1.1.0:
     dependencies:
       dequal: 2.0.3
 
-  /diff-sequences@27.5.1:
-    resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    dev: true
-
-  /diff-sequences@29.6.3:
-    resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dev: true
+  diff-sequences@27.5.1: {}
 
-  /diff@5.2.0:
-    resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
-    engines: {node: '>=0.3.1'}
-    dev: true
+  diff-sequences@29.6.3: {}
 
-  /dir-glob@3.0.1:
-    resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
-    engines: {node: '>=8'}
+  dir-glob@3.0.1:
     dependencies:
       path-type: 4.0.0
-    dev: true
 
-  /doctrine@3.0.0:
-    resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
-    engines: {node: '>=6.0.0'}
+  doctrine@3.0.0:
     dependencies:
       esutils: 2.0.3
-    dev: true
 
-  /dom-accessibility-api@0.5.16:
-    resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
-    dev: true
+  dom-accessibility-api@0.5.16: {}
 
-  /dom-accessibility-api@0.6.3:
-    resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
-    dev: true
+  dom-accessibility-api@0.6.3: {}
 
-  /dom-serializer@2.0.0:
-    resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+  dom-serializer@2.0.0:
     dependencies:
       domelementtype: 2.3.0
       domhandler: 5.0.3
       entities: 4.5.0
-    dev: true
 
-  /domelementtype@2.3.0:
-    resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
-    dev: true
+  domelementtype@2.3.0: {}
 
-  /domexception@2.0.1:
-    resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==}
-    engines: {node: '>=8'}
-    deprecated: Use your platform's native DOMException instead
+  domexception@2.0.1:
     dependencies:
       webidl-conversions: 5.0.0
-    dev: true
 
-  /domhandler@5.0.3:
-    resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
-    engines: {node: '>= 4'}
+  domhandler@5.0.3:
     dependencies:
       domelementtype: 2.3.0
-    dev: true
 
-  /domutils@3.1.0:
-    resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
+  domutils@3.1.0:
     dependencies:
       dom-serializer: 2.0.0
       domelementtype: 2.3.0
       domhandler: 5.0.3
-    dev: true
 
-  /dotenv-expand@10.0.0:
-    resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==}
-    engines: {node: '>=12'}
-    dev: true
-
-  /dotenv@16.4.5:
-    resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==}
-    engines: {node: '>=12'}
-    dev: true
+  dotenv@16.4.5: {}
 
-  /duplexer@0.1.2:
-    resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
-    dev: true
-
-  /duplexify@3.7.1:
-    resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==}
-    dependencies:
-      end-of-stream: 1.4.4
-      inherits: 2.0.4
-      readable-stream: 2.3.7
-      stream-shift: 1.0.3
-    dev: true
+  duplexer@0.1.2: {}
 
-  /eastasianwidth@0.2.0:
-    resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
-    dev: true
+  eastasianwidth@0.2.0: {}
 
-  /ecdsa-sig-formatter@1.0.11:
-    resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
+  ecdsa-sig-formatter@1.0.11:
     dependencies:
       safe-buffer: 5.2.1
-    dev: false
 
-  /ee-first@1.1.1:
-    resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
-    dev: true
+  ee-first@1.1.1: {}
 
-  /ejs@3.1.10:
-    resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==}
-    engines: {node: '>=0.10.0'}
-    hasBin: true
+  ejs@3.1.10:
     dependencies:
-      jake: 10.8.7
-    dev: true
+      jake: 10.9.2
 
-  /electron-to-chromium@1.4.708:
-    resolution: {integrity: sha512-iWgEEvREL4GTXXHKohhh33+6Y8XkPI5eHihDmm8zUk5Zo7HICEW+wI/j5kJ2tbuNUCXJ/sNXa03ajW635DiJXA==}
-    dev: true
+  electron-to-chromium@1.5.33: {}
 
-  /emittery@0.8.1:
-    resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==}
-    engines: {node: '>=10'}
-    dev: true
+  emittery@0.8.1: {}
 
-  /emoji-regex@10.3.0:
-    resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==}
-    dev: false
+  emoji-regex@10.4.0: {}
 
-  /emoji-regex@8.0.0:
-    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
-    dev: true
+  emoji-regex@8.0.0: {}
 
-  /emoji-regex@9.2.2:
-    resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
-    dev: true
+  emoji-regex@9.2.2: {}
 
-  /encodeurl@1.0.2:
-    resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
-    engines: {node: '>= 0.8'}
-    dev: true
+  encodeurl@1.0.2: {}
 
-  /end-of-stream@1.4.4:
-    resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
-    dependencies:
-      once: 1.4.0
-    dev: true
+  encodeurl@2.0.0: {}
 
-  /enhanced-resolve-jest@1.1.0:
-    resolution: {integrity: sha512-GM7yVsiLIaunYkCqnGRPO4kQbT6hPSgkyOFKTseWboPMjZ2tlpQYh2ttLuE8ORkR72Wb1f9SJBbnPu0AjcTzgg==}
+  enhanced-resolve-jest@1.1.0:
     dependencies:
       enhanced-resolve: 4.5.0
       tslib: 1.14.1
-    dev: true
 
-  /enhanced-resolve@4.5.0:
-    resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==}
-    engines: {node: '>=6.9.0'}
+  enhanced-resolve@4.5.0:
     dependencies:
       graceful-fs: 4.2.11
       memory-fs: 0.5.0
       tapable: 1.1.3
-    dev: true
-
-  /entities@4.5.0:
-    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
-    engines: {node: '>=0.12'}
 
-  /envinfo@7.13.0:
-    resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==}
-    engines: {node: '>=4'}
-    hasBin: true
-    dev: true
+  entities@4.5.0: {}
 
-  /errno@0.1.8:
-    resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
-    hasBin: true
+  errno@0.1.8:
     dependencies:
       prr: 1.0.1
-    dev: true
 
-  /error-ex@1.3.2:
-    resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+  error-ex@1.3.2:
     dependencies:
       is-arrayish: 0.2.1
-    dev: true
-
-  /error-stack-parser-es@0.1.1:
-    resolution: {integrity: sha512-g/9rfnvnagiNf+DRMHEVGuGuIBlCIMDFoTA616HaP2l9PlCjGjVhD98PNbVSJvmK4TttqT5mV5tInMhoFgi+aA==}
-    dev: true
 
-  /es-abstract@1.21.2:
-    resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      array-buffer-byte-length: 1.0.0
-      available-typed-arrays: 1.0.7
-      call-bind: 1.0.7
-      es-set-tostringtag: 2.0.1
-      es-to-primitive: 1.2.1
-      function.prototype.name: 1.1.5
-      get-intrinsic: 1.2.4
-      get-symbol-description: 1.0.0
-      globalthis: 1.0.3
-      gopd: 1.0.1
-      has: 1.0.3
-      has-property-descriptors: 1.0.2
-      has-proto: 1.0.3
-      has-symbols: 1.0.3
-      internal-slot: 1.0.5
-      is-array-buffer: 3.0.2
-      is-callable: 1.2.7
-      is-negative-zero: 2.0.2
-      is-regex: 1.1.4
-      is-shared-array-buffer: 1.0.2
-      is-string: 1.0.7
-      is-typed-array: 1.1.10
-      is-weakref: 1.0.2
-      object-inspect: 1.13.1
-      object-keys: 1.1.1
-      object.assign: 4.1.5
-      regexp.prototype.flags: 1.5.2
-      safe-regex-test: 1.0.0
-      string.prototype.trim: 1.2.7
-      string.prototype.trimend: 1.0.6
-      string.prototype.trimstart: 1.0.6
-      typed-array-length: 1.0.4
-      unbox-primitive: 1.0.2
-      which-typed-array: 1.1.15
-    dev: true
+  error-stack-parser-es@0.1.5: {}
 
-  /es-abstract@1.23.1:
-    resolution: {integrity: sha512-r+YVn6hTqQb+P5kK0u3KeDqrmhHKm+OhU/Mw4jSL4eQtOxXmp75fXIUUb3sUqFZOlb/YtW5JRaIfEC3UyjYUZQ==}
-    engines: {node: '>= 0.4'}
+  es-abstract@1.23.3:
     dependencies:
       array-buffer-byte-length: 1.0.1
       arraybuffer.prototype.slice: 1.0.3
@@ -9368,7 +10914,7 @@ packages:
       function.prototype.name: 1.1.6
       get-intrinsic: 1.2.4
       get-symbol-description: 1.0.2
-      globalthis: 1.0.3
+      globalthis: 1.0.4
       gopd: 1.0.1
       has-property-descriptors: 1.0.2
       has-proto: 1.0.3
@@ -9384,37 +10930,29 @@ packages:
       is-string: 1.0.7
       is-typed-array: 1.1.13
       is-weakref: 1.0.2
-      object-inspect: 1.13.1
+      object-inspect: 1.13.2
       object-keys: 1.1.1
       object.assign: 4.1.5
-      regexp.prototype.flags: 1.5.2
+      regexp.prototype.flags: 1.5.3
       safe-array-concat: 1.1.2
       safe-regex-test: 1.0.3
       string.prototype.trim: 1.2.9
       string.prototype.trimend: 1.0.8
-      string.prototype.trimstart: 1.0.7
+      string.prototype.trimstart: 1.0.8
       typed-array-buffer: 1.0.2
       typed-array-byte-length: 1.0.1
       typed-array-byte-offset: 1.0.2
-      typed-array-length: 1.0.5
+      typed-array-length: 1.0.6
       unbox-primitive: 1.0.2
       which-typed-array: 1.1.15
-    dev: true
 
-  /es-define-property@1.0.0:
-    resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
-    engines: {node: '>= 0.4'}
+  es-define-property@1.0.0:
     dependencies:
       get-intrinsic: 1.2.4
-    dev: true
 
-  /es-errors@1.3.0:
-    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
-    engines: {node: '>= 0.4'}
-    dev: true
+  es-errors@1.3.0: {}
 
-  /es-get-iterator@1.1.3:
-    resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
+  es-get-iterator@1.1.3:
     dependencies:
       call-bind: 1.0.7
       get-intrinsic: 1.2.4
@@ -9425,97 +10963,35 @@ packages:
       is-string: 1.0.7
       isarray: 2.0.5
       stop-iteration-iterator: 1.0.0
-    dev: true
 
-  /es-module-lexer@1.5.3:
-    resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==}
-    dev: true
-
-  /es-object-atoms@1.0.0:
-    resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
-    engines: {node: '>= 0.4'}
+  es-object-atoms@1.0.0:
     dependencies:
       es-errors: 1.3.0
-    dev: true
 
-  /es-set-tostringtag@2.0.1:
-    resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==}
-    engines: {node: '>= 0.4'}
+  es-set-tostringtag@2.0.3:
     dependencies:
       get-intrinsic: 1.2.4
-      has: 1.0.3
       has-tostringtag: 1.0.2
-    dev: true
+      hasown: 2.0.2
 
-  /es-set-tostringtag@2.0.3:
-    resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
-    engines: {node: '>= 0.4'}
+  es-shim-unscopables@1.0.2:
     dependencies:
-      get-intrinsic: 1.2.4
-      has-tostringtag: 1.0.2
       hasown: 2.0.2
-    dev: true
 
-  /es-to-primitive@1.2.1:
-    resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
-    engines: {node: '>= 0.4'}
+  es-to-primitive@1.2.1:
     dependencies:
       is-callable: 1.2.7
       is-date-object: 1.0.5
       is-symbol: 1.0.4
-    dev: true
-
-  /esbuild-plugin-alias@0.2.1:
-    resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==}
-    dev: true
 
-  /esbuild-register@3.5.0(esbuild@0.20.2):
-    resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==}
-    peerDependencies:
-      esbuild: '>=0.12 <1'
+  esbuild-register@3.6.0(esbuild@0.23.1):
     dependencies:
-      debug: 4.3.4
-      esbuild: 0.20.2
+      debug: 4.3.7
+      esbuild: 0.23.1
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /esbuild@0.19.12:
-    resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
-    engines: {node: '>=12'}
-    hasBin: true
-    requiresBuild: true
-    optionalDependencies:
-      '@esbuild/aix-ppc64': 0.19.12
-      '@esbuild/android-arm': 0.19.12
-      '@esbuild/android-arm64': 0.19.12
-      '@esbuild/android-x64': 0.19.12
-      '@esbuild/darwin-arm64': 0.19.12
-      '@esbuild/darwin-x64': 0.19.12
-      '@esbuild/freebsd-arm64': 0.19.12
-      '@esbuild/freebsd-x64': 0.19.12
-      '@esbuild/linux-arm': 0.19.12
-      '@esbuild/linux-arm64': 0.19.12
-      '@esbuild/linux-ia32': 0.19.12
-      '@esbuild/linux-loong64': 0.19.12
-      '@esbuild/linux-mips64el': 0.19.12
-      '@esbuild/linux-ppc64': 0.19.12
-      '@esbuild/linux-riscv64': 0.19.12
-      '@esbuild/linux-s390x': 0.19.12
-      '@esbuild/linux-x64': 0.19.12
-      '@esbuild/netbsd-x64': 0.19.12
-      '@esbuild/openbsd-x64': 0.19.12
-      '@esbuild/sunos-x64': 0.19.12
-      '@esbuild/win32-arm64': 0.19.12
-      '@esbuild/win32-ia32': 0.19.12
-      '@esbuild/win32-x64': 0.19.12
-    dev: true
-
-  /esbuild@0.20.2:
-    resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==}
-    engines: {node: '>=12'}
-    hasBin: true
-    requiresBuild: true
+  esbuild@0.20.2:
     optionalDependencies:
       '@esbuild/aix-ppc64': 0.20.2
       '@esbuild/android-arm': 0.20.2
@@ -9540,140 +11016,187 @@ packages:
       '@esbuild/win32-arm64': 0.20.2
       '@esbuild/win32-ia32': 0.20.2
       '@esbuild/win32-x64': 0.20.2
-    dev: true
-
-  /escalade@3.1.2:
-    resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
-    engines: {node: '>=6'}
-    dev: true
-
-  /escape-html@1.0.3:
-    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
-    dev: true
-
-  /escape-string-regexp@1.0.5:
-    resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
-    engines: {node: '>=0.8.0'}
-    dev: true
-
-  /escape-string-regexp@2.0.0:
-    resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /escape-string-regexp@4.0.0:
-    resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
-    engines: {node: '>=10'}
-    dev: true
-
-  /escape-string-regexp@5.0.0:
-    resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
-    engines: {node: '>=12'}
-    dev: false
 
-  /escodegen@2.0.0:
-    resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==}
-    engines: {node: '>=6.0'}
-    hasBin: true
+  esbuild@0.21.5:
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.21.5
+      '@esbuild/android-arm': 0.21.5
+      '@esbuild/android-arm64': 0.21.5
+      '@esbuild/android-x64': 0.21.5
+      '@esbuild/darwin-arm64': 0.21.5
+      '@esbuild/darwin-x64': 0.21.5
+      '@esbuild/freebsd-arm64': 0.21.5
+      '@esbuild/freebsd-x64': 0.21.5
+      '@esbuild/linux-arm': 0.21.5
+      '@esbuild/linux-arm64': 0.21.5
+      '@esbuild/linux-ia32': 0.21.5
+      '@esbuild/linux-loong64': 0.21.5
+      '@esbuild/linux-mips64el': 0.21.5
+      '@esbuild/linux-ppc64': 0.21.5
+      '@esbuild/linux-riscv64': 0.21.5
+      '@esbuild/linux-s390x': 0.21.5
+      '@esbuild/linux-x64': 0.21.5
+      '@esbuild/netbsd-x64': 0.21.5
+      '@esbuild/openbsd-x64': 0.21.5
+      '@esbuild/sunos-x64': 0.21.5
+      '@esbuild/win32-arm64': 0.21.5
+      '@esbuild/win32-ia32': 0.21.5
+      '@esbuild/win32-x64': 0.21.5
+
+  esbuild@0.23.1:
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.23.1
+      '@esbuild/android-arm': 0.23.1
+      '@esbuild/android-arm64': 0.23.1
+      '@esbuild/android-x64': 0.23.1
+      '@esbuild/darwin-arm64': 0.23.1
+      '@esbuild/darwin-x64': 0.23.1
+      '@esbuild/freebsd-arm64': 0.23.1
+      '@esbuild/freebsd-x64': 0.23.1
+      '@esbuild/linux-arm': 0.23.1
+      '@esbuild/linux-arm64': 0.23.1
+      '@esbuild/linux-ia32': 0.23.1
+      '@esbuild/linux-loong64': 0.23.1
+      '@esbuild/linux-mips64el': 0.23.1
+      '@esbuild/linux-ppc64': 0.23.1
+      '@esbuild/linux-riscv64': 0.23.1
+      '@esbuild/linux-s390x': 0.23.1
+      '@esbuild/linux-x64': 0.23.1
+      '@esbuild/netbsd-x64': 0.23.1
+      '@esbuild/openbsd-arm64': 0.23.1
+      '@esbuild/openbsd-x64': 0.23.1
+      '@esbuild/sunos-x64': 0.23.1
+      '@esbuild/win32-arm64': 0.23.1
+      '@esbuild/win32-ia32': 0.23.1
+      '@esbuild/win32-x64': 0.23.1
+
+  escalade@3.1.2: {}
+
+  escalade@3.2.0: {}
+
+  escape-html@1.0.3: {}
+
+  escape-string-regexp@1.0.5: {}
+
+  escape-string-regexp@2.0.0: {}
+
+  escape-string-regexp@4.0.0: {}
+
+  escape-string-regexp@5.0.0: {}
+
+  escodegen@2.1.0:
     dependencies:
       esprima: 4.0.1
       estraverse: 5.3.0
       esutils: 2.0.3
-      optionator: 0.8.3
     optionalDependencies:
       source-map: 0.6.1
-    dev: true
 
-  /eslint-config-prettier@8.10.0(eslint@8.57.0):
-    resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==}
-    hasBin: true
-    peerDependencies:
-      eslint: '>=7.0.0'
+  eslint-config-prettier@8.10.0(eslint@8.57.1):
     dependencies:
-      eslint: 8.57.0
-    dev: true
+      eslint: 8.57.1
 
-  /eslint-plugin-solid@0.12.1(eslint@8.57.0)(typescript@5.4.2):
-    resolution: {integrity: sha512-fM0sEg9PcS1mcNbWklwc+W/lOv1/XyEwXf53HmFFy4GOA8E3u41h8JW+hc+Vv1m3kh01umKoTalOTET08zKdAQ==}
-    engines: {node: '>=12.0.0'}
-    peerDependencies:
-      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+  eslint-config-prettier@8.10.0(eslint@9.12.0):
+    dependencies:
+      eslint: 9.12.0
+
+  eslint-plugin-prettier@5.2.1(eslint-config-prettier@8.10.0(eslint@9.12.0))(eslint@9.12.0)(prettier@3.3.3):
+    dependencies:
+      eslint: 9.12.0
+      prettier: 3.3.3
+      prettier-linter-helpers: 1.0.0
+      synckit: 0.9.2
+    optionalDependencies:
+      eslint-config-prettier: 8.10.0(eslint@9.12.0)
+
+  eslint-plugin-promise@7.1.0(eslint@9.12.0):
+    dependencies:
+      eslint: 9.12.0
+
+  eslint-plugin-simple-import-sort@12.1.1(eslint@9.12.0):
+    dependencies:
+      eslint: 9.12.0
+
+  eslint-plugin-solid@0.12.1(eslint@8.57.1)(typescript@5.6.3):
     dependencies:
-      '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2)
-      eslint: 8.57.0
+      '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3)
+      eslint: 8.57.1
       is-html: 2.0.0
-      jsx-ast-utils: 3.3.3
+      jsx-ast-utils: 3.3.5
       kebab-case: 1.0.2
       known-css-properties: 0.24.0
       style-to-object: 0.3.0
     transitivePeerDependencies:
       - supports-color
       - typescript
-    dev: true
 
-  /eslint-plugin-spellcheck@0.0.20(eslint@8.57.0):
-    resolution: {integrity: sha512-GJa6vgzWAYqe0elKADAsiBRrhvqBnKyt7tpFSqlCZJsK2W9+K80oMyHhKolA7vJ13H5RCGs5/KCN+mKUyKoAiA==}
-    peerDependencies:
-      eslint: '>=0.8.0'
+  eslint-plugin-solid@0.14.3(eslint@9.12.0)(typescript@5.6.3):
+    dependencies:
+      '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3)
+      eslint: 9.12.0
+      estraverse: 5.3.0
+      is-html: 2.0.0
+      kebab-case: 1.0.2
+      known-css-properties: 0.30.0
+      style-to-object: 1.0.8
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
+  eslint-plugin-spellcheck@0.0.20(eslint@8.57.1):
     dependencies:
-      eslint: 8.57.0
-      globals: 13.17.0
+      eslint: 8.57.1
+      globals: 13.24.0
       hunspell-spellchecker: 1.0.2
       lodash: 4.17.21
-    dev: true
 
-  /eslint-scope@5.1.1:
-    resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
-    engines: {node: '>=8.0.0'}
+  eslint-scope@5.1.1:
     dependencies:
       esrecurse: 4.3.0
       estraverse: 4.3.0
-    dev: true
 
-  /eslint-scope@7.2.2:
-    resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+  eslint-scope@7.2.2:
     dependencies:
       esrecurse: 4.3.0
       estraverse: 5.3.0
-    dev: true
 
-  /eslint-visitor-keys@3.4.3:
-    resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    dev: true
+  eslint-scope@8.1.0:
+    dependencies:
+      esrecurse: 4.3.0
+      estraverse: 5.3.0
 
-  /eslint@8.57.0:
-    resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    hasBin: true
+  eslint-visitor-keys@3.4.3: {}
+
+  eslint-visitor-keys@4.1.0: {}
+
+  eslint@8.57.1:
     dependencies:
-      '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
-      '@eslint-community/regexpp': 4.10.0
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1)
+      '@eslint-community/regexpp': 4.11.1
       '@eslint/eslintrc': 2.1.4
-      '@eslint/js': 8.57.0
-      '@humanwhocodes/config-array': 0.11.14
+      '@eslint/js': 8.57.1
+      '@humanwhocodes/config-array': 0.13.0
       '@humanwhocodes/module-importer': 1.0.1
       '@nodelib/fs.walk': 1.2.8
       '@ungap/structured-clone': 1.2.0
       ajv: 6.12.6
       chalk: 4.1.2
       cross-spawn: 7.0.3
-      debug: 4.3.4
+      debug: 4.3.7
       doctrine: 3.0.0
       escape-string-regexp: 4.0.0
       eslint-scope: 7.2.2
       eslint-visitor-keys: 3.4.3
       espree: 9.6.1
-      esquery: 1.5.0
+      esquery: 1.6.0
       esutils: 2.0.3
       fast-deep-equal: 3.1.3
       file-entry-cache: 6.0.1
       find-up: 5.0.0
       glob-parent: 6.0.2
-      globals: 13.20.0
+      globals: 13.24.0
       graphemer: 1.4.0
-      ignore: 5.3.1
+      ignore: 5.3.2
       imurmurhash: 0.1.4
       is-glob: 4.0.3
       is-path-inside: 3.0.3
@@ -9683,78 +11206,91 @@ packages:
       lodash.merge: 4.6.2
       minimatch: 3.1.2
       natural-compare: 1.4.0
-      optionator: 0.9.3
+      optionator: 0.9.4
       strip-ansi: 6.0.1
       text-table: 0.2.0
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /espree@9.6.1:
-    resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+  eslint@9.12.0:
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0)
+      '@eslint-community/regexpp': 4.11.1
+      '@eslint/config-array': 0.18.0
+      '@eslint/core': 0.6.0
+      '@eslint/eslintrc': 3.1.0
+      '@eslint/js': 9.12.0
+      '@eslint/plugin-kit': 0.2.0
+      '@humanfs/node': 0.16.5
+      '@humanwhocodes/module-importer': 1.0.1
+      '@humanwhocodes/retry': 0.3.1
+      '@types/estree': 1.0.6
+      '@types/json-schema': 7.0.15
+      ajv: 6.12.6
+      chalk: 4.1.2
+      cross-spawn: 7.0.3
+      debug: 4.3.7
+      escape-string-regexp: 4.0.0
+      eslint-scope: 8.1.0
+      eslint-visitor-keys: 4.1.0
+      espree: 10.2.0
+      esquery: 1.6.0
+      esutils: 2.0.3
+      fast-deep-equal: 3.1.3
+      file-entry-cache: 8.0.0
+      find-up: 5.0.0
+      glob-parent: 6.0.2
+      ignore: 5.3.2
+      imurmurhash: 0.1.4
+      is-glob: 4.0.3
+      json-stable-stringify-without-jsonify: 1.0.1
+      lodash.merge: 4.6.2
+      minimatch: 3.1.2
+      natural-compare: 1.4.0
+      optionator: 0.9.4
+      text-table: 0.2.0
+    transitivePeerDependencies:
+      - supports-color
+
+  espree@10.2.0:
     dependencies:
-      acorn: 8.11.3
-      acorn-jsx: 5.3.2(acorn@8.11.3)
+      acorn: 8.12.1
+      acorn-jsx: 5.3.2(acorn@8.12.1)
+      eslint-visitor-keys: 4.1.0
+
+  espree@9.6.1:
+    dependencies:
+      acorn: 8.12.1
+      acorn-jsx: 5.3.2(acorn@8.12.1)
       eslint-visitor-keys: 3.4.3
-    dev: true
 
-  /esprima@4.0.1:
-    resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
-    engines: {node: '>=4'}
-    hasBin: true
-    dev: true
+  esprima@4.0.1: {}
 
-  /esquery@1.5.0:
-    resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
-    engines: {node: '>=0.10'}
+  esquery@1.6.0:
     dependencies:
       estraverse: 5.3.0
-    dev: true
 
-  /esrecurse@4.3.0:
-    resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
-    engines: {node: '>=4.0'}
+  esrecurse@4.3.0:
     dependencies:
       estraverse: 5.3.0
-    dev: true
 
-  /estraverse@4.3.0:
-    resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
-    engines: {node: '>=4.0'}
-    dev: true
+  estraverse@4.3.0: {}
 
-  /estraverse@5.3.0:
-    resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
-    engines: {node: '>=4.0'}
-    dev: true
+  estraverse@5.3.0: {}
 
-  /estree-walker@1.0.1:
-    resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==}
-    dev: true
+  estree-walker@1.0.1: {}
 
-  /estree-walker@2.0.2:
-    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
-    dev: true
+  estree-walker@2.0.2: {}
 
-  /estree-walker@3.0.3:
-    resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+  estree-walker@3.0.3:
     dependencies:
-      '@types/estree': 1.0.5
-    dev: true
+      '@types/estree': 1.0.6
 
-  /esutils@2.0.3:
-    resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
-    engines: {node: '>=0.10.0'}
-    dev: true
+  esutils@2.0.3: {}
 
-  /etag@1.8.1:
-    resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
-    engines: {node: '>= 0.6'}
-    dev: true
+  etag@1.8.1: {}
 
-  /event-stream@3.3.4:
-    resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==}
+  event-stream@3.3.4:
     dependencies:
       duplexer: 0.1.2
       from: 0.1.7
@@ -9763,15 +11299,10 @@ packages:
       split: 0.3.3
       stream-combiner: 0.0.4
       through: 2.3.8
-    dev: true
 
-  /eventemitter3@5.0.1:
-    resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
-    dev: false
+  eventemitter3@5.0.1: {}
 
-  /execa@5.1.1:
-    resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
-    engines: {node: '>=10'}
+  execa@5.1.1:
     dependencies:
       cross-spawn: 7.0.3
       get-stream: 6.0.1
@@ -9782,68 +11313,44 @@ packages:
       onetime: 5.1.2
       signal-exit: 3.0.7
       strip-final-newline: 2.0.0
-    dev: true
-
-  /execa@8.0.1:
-    resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
-    engines: {node: '>=16.17'}
-    dependencies:
-      cross-spawn: 7.0.3
-      get-stream: 8.0.1
-      human-signals: 5.0.0
-      is-stream: 3.0.0
-      merge-stream: 2.0.0
-      npm-run-path: 5.3.0
-      onetime: 6.0.0
-      signal-exit: 4.1.0
-      strip-final-newline: 3.0.0
-    dev: true
 
-  /exit@0.1.2:
-    resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
-    engines: {node: '>= 0.8.0'}
-    dev: true
+  exit@0.1.2: {}
 
-  /expect@27.5.1:
-    resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  expect@27.5.1:
     dependencies:
       '@jest/types': 27.5.1
       jest-get-type: 27.5.1
       jest-matcher-utils: 27.5.1
       jest-message-util: 27.5.1
-    dev: true
 
-  /express@4.19.2:
-    resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==}
-    engines: {node: '>= 0.10.0'}
+  express@4.21.1:
     dependencies:
       accepts: 1.3.8
       array-flatten: 1.1.1
-      body-parser: 1.20.2
+      body-parser: 1.20.3
       content-disposition: 0.5.4
       content-type: 1.0.5
-      cookie: 0.6.0
+      cookie: 0.7.1
       cookie-signature: 1.0.6
       debug: 2.6.9
       depd: 2.0.0
-      encodeurl: 1.0.2
+      encodeurl: 2.0.0
       escape-html: 1.0.3
       etag: 1.8.1
-      finalhandler: 1.2.0
+      finalhandler: 1.3.1
       fresh: 0.5.2
       http-errors: 2.0.0
-      merge-descriptors: 1.0.1
+      merge-descriptors: 1.0.3
       methods: 1.1.2
       on-finished: 2.4.1
       parseurl: 1.3.3
-      path-to-regexp: 0.1.7
+      path-to-regexp: 0.1.10
       proxy-addr: 2.0.7
-      qs: 6.11.0
+      qs: 6.13.0
       range-parser: 1.2.1
       safe-buffer: 5.2.1
-      send: 0.18.0
-      serve-static: 1.15.0
+      send: 0.19.0
+      serve-static: 1.16.2
       setprototypeof: 1.2.0
       statuses: 2.0.1
       type-is: 1.6.18
@@ -9851,91 +11358,63 @@ packages:
       vary: 1.1.2
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /extend@3.0.2:
-    resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+  extend@3.0.2: {}
 
-  /fast-deep-equal@3.1.3:
-    resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+  fast-deep-equal@3.1.3: {}
 
-  /fast-glob@3.3.2:
-    resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
-    engines: {node: '>=8.6.0'}
+  fast-diff@1.3.0: {}
+
+  fast-glob@3.3.2:
     dependencies:
       '@nodelib/fs.stat': 2.0.5
       '@nodelib/fs.walk': 1.2.8
       glob-parent: 5.1.2
       merge2: 1.4.1
-      micromatch: 4.0.5
-    dev: true
+      micromatch: 4.0.8
 
-  /fast-json-stable-stringify@2.1.0:
-    resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
-    dev: true
+  fast-json-stable-stringify@2.1.0: {}
 
-  /fast-levenshtein@2.0.6:
-    resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
-    dev: true
+  fast-levenshtein@2.0.6: {}
+
+  fast-uri@3.0.2: {}
 
-  /fastq@1.13.0:
-    resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
+  fastq@1.17.1:
     dependencies:
       reusify: 1.0.4
-    dev: true
 
-  /fb-watchman@2.0.2:
-    resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+  fb-watchman@2.0.2:
     dependencies:
       bser: 2.1.1
-    dev: true
 
-  /fetch-retry@5.0.6:
-    resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==}
-    dev: true
+  fdir@6.4.0(picomatch@4.0.2):
+    optionalDependencies:
+      picomatch: 4.0.2
 
-  /file-entry-cache@6.0.1:
-    resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
-    engines: {node: ^10.12.0 || >=12.0.0}
+  file-entry-cache@6.0.1:
     dependencies:
-      flat-cache: 3.0.4
-    dev: true
-
-  /file-size@1.0.0:
-    resolution: {integrity: sha512-tLIdonWTpABkU6Axg2yGChYdrOsy4V8xcm0IcyAP8fSsu6jiXLm5pgs083e4sq5fzNRZuAYolUbZyYmPvCKfwQ==}
-    dev: true
+      flat-cache: 3.2.0
 
-  /file-system-cache@2.3.0:
-    resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==}
+  file-entry-cache@8.0.0:
     dependencies:
-      fs-extra: 11.1.1
-      ramda: 0.29.0
-    dev: true
+      flat-cache: 4.0.1
 
-  /filelist@1.0.4:
-    resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
+  file-size@1.0.0: {}
+
+  filelist@1.0.4:
     dependencies:
       minimatch: 5.1.6
-    dev: true
 
-  /filesize@10.1.0:
-    resolution: {integrity: sha512-GTLKYyBSDz3nPhlLVPjPWZCnhkd9TrrRArNcy8Z+J2cqScB7h2McAzR6NBX6nYOoWafql0roY8hrocxnZBv9CQ==}
-    engines: {node: '>= 10.4.0'}
-    dev: true
+  filesize@10.1.6: {}
 
-  /fill-range@7.0.1:
-    resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
-    engines: {node: '>=8'}
+  fill-range@7.1.1:
     dependencies:
       to-regex-range: 5.0.1
-    dev: true
 
-  /finalhandler@1.2.0:
-    resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
-    engines: {node: '>= 0.8'}
+  finalhandler@1.3.1:
     dependencies:
       debug: 2.6.9
-      encodeurl: 1.0.2
+      encodeurl: 2.0.0
       escape-html: 1.0.3
       on-finished: 2.4.1
       parseurl: 1.3.3
@@ -9943,334 +11422,134 @@ packages:
       unpipe: 1.0.0
     transitivePeerDependencies:
       - supports-color
-    dev: true
-
-  /find-cache-dir@2.1.0:
-    resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==}
-    engines: {node: '>=6'}
-    dependencies:
-      commondir: 1.0.1
-      make-dir: 2.1.0
-      pkg-dir: 3.0.0
-    dev: true
-
-  /find-cache-dir@3.3.2:
-    resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
-    engines: {node: '>=8'}
-    dependencies:
-      commondir: 1.0.1
-      make-dir: 3.1.0
-      pkg-dir: 4.2.0
-    dev: true
-
-  /find-up@3.0.0:
-    resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
-    engines: {node: '>=6'}
-    dependencies:
-      locate-path: 3.0.0
-    dev: true
 
-  /find-up@4.1.0:
-    resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
-    engines: {node: '>=8'}
+  find-up@4.1.0:
     dependencies:
       locate-path: 5.0.0
       path-exists: 4.0.0
-    dev: true
 
-  /find-up@5.0.0:
-    resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
-    engines: {node: '>=10'}
+  find-up@5.0.0:
     dependencies:
       locate-path: 6.0.0
       path-exists: 4.0.0
-    dev: true
 
-  /find-yarn-workspace-root2@1.2.16:
-    resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==}
+  flat-cache@3.2.0:
     dependencies:
-      micromatch: 4.0.5
-      pkg-dir: 4.2.0
-    dev: true
-
-  /flat-cache@3.0.4:
-    resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
-    engines: {node: ^10.12.0 || >=12.0.0}
-    dependencies:
-      flatted: 3.2.7
+      flatted: 3.3.1
+      keyv: 4.5.4
       rimraf: 3.0.2
-    dev: true
 
-  /flatted@3.2.7:
-    resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
-    dev: true
+  flat-cache@4.0.1:
+    dependencies:
+      flatted: 3.3.1
+      keyv: 4.5.4
 
-  /flow-parser@0.237.2:
-    resolution: {integrity: sha512-mvI/kdfr3l1waaPbThPA8dJa77nHXrfZIun+SWvFwSwDjmeByU7mGJGRmv1+7guU6ccyLV8e1lqZA1lD4iMGnQ==}
-    engines: {node: '>=0.4.0'}
-    dev: true
+  flatted@3.3.1: {}
 
-  /follow-redirects@1.15.2:
-    resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
-    engines: {node: '>=4.0'}
-    peerDependencies:
-      debug: '*'
-    peerDependenciesMeta:
-      debug:
-        optional: true
-    dev: false
+  follow-redirects@1.15.9: {}
 
-  /for-each@0.3.3:
-    resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+  for-each@0.3.3:
     dependencies:
       is-callable: 1.2.7
-    dev: true
 
-  /foreground-child@3.1.1:
-    resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==}
-    engines: {node: '>=14'}
+  foreground-child@3.3.0:
     dependencies:
       cross-spawn: 7.0.3
       signal-exit: 4.1.0
-    dev: true
 
-  /form-data@3.0.1:
-    resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==}
-    engines: {node: '>= 6'}
+  form-data@3.0.1:
     dependencies:
       asynckit: 0.4.0
       combined-stream: 1.0.8
       mime-types: 2.1.35
-    dev: true
 
-  /form-data@4.0.0:
-    resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
-    engines: {node: '>= 6'}
+  form-data@4.0.0:
     dependencies:
       asynckit: 0.4.0
       combined-stream: 1.0.8
       mime-types: 2.1.35
-    dev: true
-
-  /forwarded@0.2.0:
-    resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
-    engines: {node: '>= 0.6'}
-    dev: true
-
-  /fresh@0.5.2:
-    resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
-    engines: {node: '>= 0.6'}
-    dev: true
 
-  /from@0.1.7:
-    resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==}
-    dev: true
+  forwarded@0.2.0: {}
 
-  /fromentries@1.3.2:
-    resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==}
-    dev: false
+  fresh@0.5.2: {}
 
-  /fs-constants@1.0.0:
-    resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
-    dev: true
+  from@0.1.7: {}
 
-  /fs-extra@11.1.1:
-    resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==}
-    engines: {node: '>=14.14'}
-    dependencies:
-      graceful-fs: 4.2.11
-      jsonfile: 6.1.0
-      universalify: 2.0.1
-    dev: true
+  fromentries@1.3.2: {}
 
-  /fs-extra@11.2.0:
-    resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
-    engines: {node: '>=14.14'}
+  fs-extra@11.2.0:
     dependencies:
       graceful-fs: 4.2.11
       jsonfile: 6.1.0
       universalify: 2.0.1
-    dev: true
 
-  /fs-extra@9.1.0:
-    resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
-    engines: {node: '>=10'}
+  fs-extra@9.1.0:
     dependencies:
       at-least-node: 1.0.0
       graceful-fs: 4.2.11
       jsonfile: 6.1.0
       universalify: 2.0.1
-    dev: true
-
-  /fs-minipass@2.1.0:
-    resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
-    engines: {node: '>= 8'}
-    dependencies:
-      minipass: 3.3.6
-    dev: true
 
-  /fs.realpath@1.0.0:
-    resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
-    dev: true
+  fs.realpath@1.0.0: {}
 
-  /fsevents@2.3.3:
-    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
-    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
-    os: [darwin]
-    requiresBuild: true
-    dev: true
+  fsevents@2.3.3:
     optional: true
 
-  /function-bind@1.1.2:
-    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
-    dev: true
-
-  /function.prototype.name@1.1.5:
-    resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.7
-      define-properties: 1.2.1
-      es-abstract: 1.21.2
-      functions-have-names: 1.2.3
-    dev: true
+  function-bind@1.1.2: {}
 
-  /function.prototype.name@1.1.6:
-    resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
-    engines: {node: '>= 0.4'}
+  function.prototype.name@1.1.6:
     dependencies:
       call-bind: 1.0.7
       define-properties: 1.2.1
-      es-abstract: 1.23.1
+      es-abstract: 1.23.3
       functions-have-names: 1.2.3
-    dev: true
-
-  /functions-have-names@1.2.3:
-    resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
-    dev: true
 
-  /gensync@1.0.0-beta.2:
-    resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
-    engines: {node: '>=6.9.0'}
-    dev: true
+  functions-have-names@1.2.3: {}
 
-  /get-caller-file@2.0.5:
-    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
-    engines: {node: 6.* || 8.* || >= 10.*}
-    dev: true
+  gensync@1.0.0-beta.2: {}
 
-  /get-func-name@2.0.2:
-    resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
-    dev: true
+  get-caller-file@2.0.5: {}
 
-  /get-intrinsic@1.2.4:
-    resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
-    engines: {node: '>= 0.4'}
+  get-intrinsic@1.2.4:
     dependencies:
       es-errors: 1.3.0
       function-bind: 1.1.2
       has-proto: 1.0.3
       has-symbols: 1.0.3
       hasown: 2.0.2
-    dev: true
-
-  /get-nonce@1.0.1:
-    resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
-    engines: {node: '>=6'}
-    dev: true
-
-  /get-npm-tarball-url@2.1.0:
-    resolution: {integrity: sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==}
-    engines: {node: '>=12.17'}
-    dev: true
-
-  /get-own-enumerable-property-symbols@3.0.2:
-    resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==}
-    dev: true
 
-  /get-package-type@0.1.0:
-    resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
-    engines: {node: '>=8.0.0'}
-    dev: true
-
-  /get-stream@6.0.1:
-    resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
-    engines: {node: '>=10'}
-    dev: true
+  get-own-enumerable-property-symbols@3.0.2: {}
 
-  /get-stream@8.0.1:
-    resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
-    engines: {node: '>=16'}
-    dev: true
+  get-package-type@0.1.0: {}
 
-  /get-symbol-description@1.0.0:
-    resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.7
-      get-intrinsic: 1.2.4
-    dev: true
+  get-stream@6.0.1: {}
 
-  /get-symbol-description@1.0.2:
-    resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
-    engines: {node: '>= 0.4'}
+  get-symbol-description@1.0.2:
     dependencies:
       call-bind: 1.0.7
       es-errors: 1.3.0
       get-intrinsic: 1.2.4
-    dev: true
-
-  /giget@1.2.3:
-    resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==}
-    hasBin: true
-    dependencies:
-      citty: 0.1.6
-      consola: 3.2.3
-      defu: 6.1.4
-      node-fetch-native: 1.6.4
-      nypm: 0.3.8
-      ohash: 1.1.3
-      pathe: 1.1.2
-      tar: 6.2.1
-    dev: true
 
-  /github-slugger@2.0.0:
-    resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
-    dev: true
+  github-slugger@2.0.0: {}
 
-  /glob-parent@5.1.2:
-    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
-    engines: {node: '>= 6'}
+  glob-parent@5.1.2:
     dependencies:
       is-glob: 4.0.3
-    dev: true
 
-  /glob-parent@6.0.2:
-    resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
-    engines: {node: '>=10.13.0'}
+  glob-parent@6.0.2:
     dependencies:
       is-glob: 4.0.3
-    dev: true
-
-  /glob-to-regexp@0.4.1:
-    resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
-    dev: true
 
-  /glob@10.4.1:
-    resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==}
-    engines: {node: '>=16 || 14 >=14.18'}
-    hasBin: true
+  glob@10.4.5:
     dependencies:
-      foreground-child: 3.1.1
-      jackspeak: 3.4.0
-      minimatch: 9.0.4
+      foreground-child: 3.3.0
+      jackspeak: 3.4.3
+      minimatch: 9.0.5
       minipass: 7.1.2
+      package-json-from-dist: 1.0.1
       path-scurry: 1.11.1
-    dev: true
 
-  /glob@7.2.3:
-    resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
-    deprecated: Glob versions prior to v9 are no longer supported
+  glob@7.2.3:
     dependencies:
       fs.realpath: 1.0.0
       inflight: 1.0.6
@@ -10278,984 +11557,472 @@ packages:
       minimatch: 3.1.2
       once: 1.4.0
       path-is-absolute: 1.0.1
-    dev: true
 
-  /globals@11.12.0:
-    resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
-    engines: {node: '>=4'}
-    dev: true
+  globals@11.12.0: {}
 
-  /globals@13.17.0:
-    resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==}
-    engines: {node: '>=8'}
+  globals@13.24.0:
     dependencies:
       type-fest: 0.20.2
-    dev: true
 
-  /globals@13.20.0:
-    resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
-    engines: {node: '>=8'}
-    dependencies:
-      type-fest: 0.20.2
-    dev: true
+  globals@14.0.0: {}
 
-  /globalthis@1.0.3:
-    resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
-    engines: {node: '>= 0.4'}
+  globalthis@1.0.4:
     dependencies:
       define-properties: 1.2.1
-    dev: true
+      gopd: 1.0.1
 
-  /globby@11.1.0:
-    resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
-    engines: {node: '>=10'}
+  globby@11.1.0:
     dependencies:
       array-union: 2.1.0
       dir-glob: 3.0.1
       fast-glob: 3.3.2
-      ignore: 5.3.1
+      ignore: 5.3.2
       merge2: 1.4.1
       slash: 3.0.0
-    dev: true
-
-  /globby@14.0.1:
-    resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==}
-    engines: {node: '>=18'}
-    dependencies:
-      '@sindresorhus/merge-streams': 2.3.0
-      fast-glob: 3.3.2
-      ignore: 5.3.1
-      path-type: 5.0.0
-      slash: 5.1.0
-      unicorn-magic: 0.1.0
-    dev: true
 
-  /goober@2.1.14(csstype@3.1.3):
-    resolution: {integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==}
-    peerDependencies:
-      csstype: ^3.0.10
+  goober@2.1.15(csstype@3.1.3):
     dependencies:
       csstype: 3.1.3
-    dev: false
 
-  /gopd@1.0.1:
-    resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+  gopd@1.0.1:
     dependencies:
       get-intrinsic: 1.2.4
-    dev: true
-
-  /graceful-fs@4.2.11:
-    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
-    dev: true
 
-  /graphemer@1.4.0:
-    resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
-    dev: true
+  graceful-fs@4.2.11: {}
 
-  /gunzip-maybe@1.4.2:
-    resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==}
-    hasBin: true
-    dependencies:
-      browserify-zlib: 0.1.4
-      is-deflate: 1.0.0
-      is-gzip: 1.0.0
-      peek-stream: 1.1.3
-      pumpify: 1.5.1
-      through2: 2.0.5
-    dev: true
-
-  /handlebars@4.7.8:
-    resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==}
-    engines: {node: '>=0.4.7'}
-    hasBin: true
-    dependencies:
-      minimist: 1.2.8
-      neo-async: 2.6.2
-      source-map: 0.6.1
-      wordwrap: 1.0.0
-    optionalDependencies:
-      uglify-js: 3.17.4
-    dev: true
+  graphemer@1.4.0: {}
 
-  /has-bigints@1.0.2:
-    resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
-    dev: true
+  has-bigints@1.0.2: {}
 
-  /has-flag@3.0.0:
-    resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
-    engines: {node: '>=4'}
-    dev: true
+  has-flag@3.0.0: {}
 
-  /has-flag@4.0.0:
-    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
-    engines: {node: '>=8'}
-    dev: true
+  has-flag@4.0.0: {}
 
-  /has-property-descriptors@1.0.2:
-    resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+  has-property-descriptors@1.0.2:
     dependencies:
       es-define-property: 1.0.0
-    dev: true
 
-  /has-proto@1.0.3:
-    resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
-    engines: {node: '>= 0.4'}
-    dev: true
+  has-proto@1.0.3: {}
 
-  /has-symbols@1.0.3:
-    resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
-    engines: {node: '>= 0.4'}
-    dev: true
+  has-symbols@1.0.3: {}
 
-  /has-tostringtag@1.0.2:
-    resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
-    engines: {node: '>= 0.4'}
+  has-tostringtag@1.0.2:
     dependencies:
       has-symbols: 1.0.3
-    dev: true
-
-  /has@1.0.3:
-    resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
-    engines: {node: '>= 0.4.0'}
-    dependencies:
-      function-bind: 1.1.2
-    dev: true
 
-  /hasown@2.0.2:
-    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
-    engines: {node: '>= 0.4'}
+  hasown@2.0.2:
     dependencies:
       function-bind: 1.1.2
-    dev: true
 
-  /hast-util-from-dom@5.0.0:
-    resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==}
+  hast-util-from-dom@5.0.0:
     dependencies:
       '@types/hast': 3.0.4
       hastscript: 8.0.0
       web-namespaces: 2.0.1
-    dev: false
 
-  /hast-util-from-html-isomorphic@2.0.0:
-    resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==}
+  hast-util-from-html-isomorphic@2.0.0:
     dependencies:
       '@types/hast': 3.0.4
       hast-util-from-dom: 5.0.0
-      hast-util-from-html: 2.0.1
+      hast-util-from-html: 2.0.3
       unist-util-remove-position: 5.0.0
-    dev: false
 
-  /hast-util-from-html@2.0.1:
-    resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==}
+  hast-util-from-html@2.0.3:
     dependencies:
       '@types/hast': 3.0.4
       devlop: 1.1.0
       hast-util-from-parse5: 8.0.1
       parse5: 7.1.2
-      vfile: 6.0.1
+      vfile: 6.0.3
       vfile-message: 4.0.2
-    dev: false
 
-  /hast-util-from-parse5@8.0.1:
-    resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==}
+  hast-util-from-parse5@8.0.1:
     dependencies:
       '@types/hast': 3.0.4
-      '@types/unist': 3.0.2
+      '@types/unist': 3.0.3
       devlop: 1.1.0
       hastscript: 8.0.0
-      property-information: 6.4.1
-      vfile: 6.0.1
-      vfile-location: 5.0.2
+      property-information: 6.5.0
+      vfile: 6.0.3
+      vfile-location: 5.0.3
       web-namespaces: 2.0.1
 
-  /hast-util-heading-rank@3.0.0:
-    resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==}
-    dependencies:
-      '@types/hast': 3.0.4
-    dev: true
-
-  /hast-util-is-element@3.0.0:
-    resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
+  hast-util-heading-rank@3.0.0:
     dependencies:
       '@types/hast': 3.0.4
 
-  /hast-util-parse-selector@4.0.0:
-    resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
+  hast-util-is-element@3.0.0:
     dependencies:
       '@types/hast': 3.0.4
 
-  /hast-util-raw@9.0.2:
-    resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==}
+  hast-util-parse-selector@4.0.0:
     dependencies:
       '@types/hast': 3.0.4
-      '@types/unist': 3.0.2
-      '@ungap/structured-clone': 1.2.0
-      hast-util-from-parse5: 8.0.1
-      hast-util-to-parse5: 8.0.0
-      html-void-elements: 3.0.0
-      mdast-util-to-hast: 13.1.0
-      parse5: 7.1.2
-      unist-util-position: 5.0.0
-      unist-util-visit: 5.0.0
-      vfile: 6.0.1
-      web-namespaces: 2.0.1
-      zwitch: 2.0.4
-    dev: true
 
-  /hast-util-to-html@9.0.0:
-    resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==}
+  hast-util-to-html@9.0.3:
     dependencies:
       '@types/hast': 3.0.4
-      '@types/unist': 3.0.2
+      '@types/unist': 3.0.3
       ccount: 2.0.1
       comma-separated-tokens: 2.0.3
-      hast-util-raw: 9.0.2
       hast-util-whitespace: 3.0.0
       html-void-elements: 3.0.0
-      mdast-util-to-hast: 13.1.0
-      property-information: 6.4.1
+      mdast-util-to-hast: 13.2.0
+      property-information: 6.5.0
       space-separated-tokens: 2.0.2
-      stringify-entities: 4.0.3
+      stringify-entities: 4.0.4
       zwitch: 2.0.4
-    dev: true
 
-  /hast-util-to-parse5@8.0.0:
-    resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
+  hast-util-to-string@3.0.1:
     dependencies:
       '@types/hast': 3.0.4
-      comma-separated-tokens: 2.0.3
-      devlop: 1.1.0
-      property-information: 6.4.1
-      space-separated-tokens: 2.0.2
-      web-namespaces: 2.0.1
-      zwitch: 2.0.4
-    dev: true
-
-  /hast-util-to-string@3.0.0:
-    resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==}
-    dependencies:
-      '@types/hast': 3.0.4
-    dev: true
 
-  /hast-util-to-text@4.0.0:
-    resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==}
+  hast-util-to-text@4.0.2:
     dependencies:
       '@types/hast': 3.0.4
-      '@types/unist': 3.0.2
+      '@types/unist': 3.0.3
       hast-util-is-element: 3.0.0
       unist-util-find-after: 5.0.0
-    dev: false
 
-  /hast-util-whitespace@3.0.0:
-    resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+  hast-util-whitespace@3.0.0:
     dependencies:
       '@types/hast': 3.0.4
-    dev: true
-
-  /hast@1.0.0:
-    resolution: {integrity: sha512-vFUqlRV5C+xqP76Wwq2SrM0kipnmpxJm7OfvVXpB35Fp+Fn4MV+ozr+JZr5qFvyR1q/U+Foim2x+3P+x9S1PLA==}
-    deprecated: Renamed to rehype
-    dev: false
 
-  /hastscript@8.0.0:
-    resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
+  hastscript@8.0.0:
     dependencies:
       '@types/hast': 3.0.4
       comma-separated-tokens: 2.0.3
       hast-util-parse-selector: 4.0.0
-      property-information: 6.4.1
+      property-information: 6.5.0
       space-separated-tokens: 2.0.2
 
-  /hey-listen@1.0.8:
-    resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==}
-    dev: false
-
-  /highlight.js@11.9.0:
-    resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==}
-    engines: {node: '>=12.0.0'}
-    dev: false
+  hey-listen@1.0.8: {}
 
-  /hookable@5.5.3:
-    resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
-    dev: true
+  highlight.js@11.9.0: {}
 
-  /hosted-git-info@2.8.9:
-    resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
-    dev: true
+  hookable@5.5.3: {}
 
-  /html-encoding-sniffer@2.0.1:
-    resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==}
-    engines: {node: '>=10'}
+  html-encoding-sniffer@2.0.1:
     dependencies:
       whatwg-encoding: 1.0.5
-    dev: true
 
-  /html-encoding-sniffer@4.0.0:
-    resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
-    engines: {node: '>=18'}
+  html-encoding-sniffer@4.0.0:
     dependencies:
       whatwg-encoding: 3.1.1
-    dev: true
 
-  /html-entities@2.3.3:
-    resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==}
-    dev: true
+  html-entities@2.3.3: {}
 
-  /html-escaper@2.0.2:
-    resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
-    dev: true
+  html-escaper@2.0.2: {}
 
-  /html-tags@3.2.0:
-    resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==}
-    engines: {node: '>=8'}
-    dev: true
+  html-tags@3.3.1: {}
 
-  /html-void-elements@3.0.0:
-    resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
-    dev: true
+  html-void-elements@3.0.0: {}
 
-  /http-errors@2.0.0:
-    resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
-    engines: {node: '>= 0.8'}
+  http-errors@2.0.0:
     dependencies:
       depd: 2.0.0
       inherits: 2.0.4
       setprototypeof: 1.2.0
       statuses: 2.0.1
       toidentifier: 1.0.1
-    dev: true
 
-  /http-proxy-agent@4.0.1:
-    resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==}
-    engines: {node: '>= 6'}
+  http-proxy-agent@4.0.1:
     dependencies:
       '@tootallnate/once': 1.1.2
       agent-base: 6.0.2
-      debug: 4.3.4
+      debug: 4.3.7
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /http-proxy-agent@7.0.2:
-    resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
-    engines: {node: '>= 14'}
+  http-proxy-agent@7.0.2:
     dependencies:
-      agent-base: 7.1.0
-      debug: 4.3.4
+      agent-base: 7.1.1
+      debug: 4.3.7
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /https-proxy-agent@5.0.1:
-    resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
-    engines: {node: '>= 6'}
+  https-proxy-agent@5.0.1:
     dependencies:
       agent-base: 6.0.2
-      debug: 4.3.4
+      debug: 4.3.7
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /https-proxy-agent@7.0.4:
-    resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==}
-    engines: {node: '>= 14'}
+  https-proxy-agent@7.0.5:
     dependencies:
-      agent-base: 7.1.0
-      debug: 4.3.4
+      agent-base: 7.1.1
+      debug: 4.3.7
     transitivePeerDependencies:
       - supports-color
-    dev: true
-
-  /human-signals@2.1.0:
-    resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
-    engines: {node: '>=10.17.0'}
-    dev: true
 
-  /human-signals@5.0.0:
-    resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
-    engines: {node: '>=16.17.0'}
-    dev: true
+  human-signals@2.1.0: {}
 
-  /hunspell-spellchecker@1.0.2:
-    resolution: {integrity: sha512-4DwmFAvlz+ChsqLDsZT2cwBsYNXh+oWboemxXtafwKIyItq52xfR4e4kr017sLAoPaSYVofSOvPUfmOAhXyYvw==}
-    hasBin: true
-    dev: true
+  hunspell-spellchecker@1.0.2: {}
 
-  /iconv-lite@0.4.24:
-    resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
-    engines: {node: '>=0.10.0'}
+  iconv-lite@0.4.24:
     dependencies:
       safer-buffer: 2.1.2
-    dev: true
 
-  /iconv-lite@0.6.3:
-    resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
-    engines: {node: '>=0.10.0'}
+  iconv-lite@0.6.3:
     dependencies:
       safer-buffer: 2.1.2
-    dev: true
-
-  /idb@7.1.1:
-    resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==}
-    dev: true
 
-  /ieee754@1.2.1:
-    resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
-    dev: true
+  idb@7.1.1: {}
 
-  /ignore@5.2.0:
-    resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==}
-    engines: {node: '>= 4'}
-    dev: true
-
-  /ignore@5.3.1:
-    resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
-    engines: {node: '>= 4'}
-    dev: true
+  ignore@5.3.2: {}
 
-  /immediate@3.0.6:
-    resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
-    dev: false
+  immediate@3.0.6: {}
 
-  /import-fresh@3.3.0:
-    resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
-    engines: {node: '>=6'}
+  import-fresh@3.3.0:
     dependencies:
       parent-module: 1.0.1
       resolve-from: 4.0.0
-    dev: true
 
-  /import-local@3.1.0:
-    resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
-    engines: {node: '>=8'}
-    hasBin: true
+  import-local@3.2.0:
     dependencies:
       pkg-dir: 4.2.0
       resolve-cwd: 3.0.0
-    dev: true
 
-  /imurmurhash@0.1.4:
-    resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
-    engines: {node: '>=0.8.19'}
-    dev: true
+  imurmurhash@0.1.4: {}
 
-  /indent-string@4.0.0:
-    resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
-    engines: {node: '>=8'}
+  indent-string@4.0.0: {}
 
-  /inflight@1.0.6:
-    resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
-    deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+  inflight@1.0.6:
     dependencies:
       once: 1.4.0
       wrappy: 1.0.2
-    dev: true
 
-  /inherits@2.0.4:
-    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-    dev: true
+  inherits@2.0.4: {}
 
-  /inline-style-parser@0.1.1:
-    resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
+  inline-style-parser@0.1.1: {}
 
-  /internal-slot@1.0.5:
-    resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      get-intrinsic: 1.2.4
-      has: 1.0.3
-      side-channel: 1.0.6
-    dev: true
+  inline-style-parser@0.2.4: {}
 
-  /internal-slot@1.0.7:
-    resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
-    engines: {node: '>= 0.4'}
+  internal-slot@1.0.7:
     dependencies:
       es-errors: 1.3.0
       hasown: 2.0.2
       side-channel: 1.0.6
-    dev: true
-
-  /invariant@2.2.4:
-    resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
-    dependencies:
-      loose-envify: 1.4.0
-    dev: true
-
-  /ip@2.0.1:
-    resolution: {integrity: sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==}
-    dev: true
 
-  /ipaddr.js@1.9.1:
-    resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
-    engines: {node: '>= 0.10'}
-    dev: true
+  ipaddr.js@1.9.1: {}
 
-  /is-absolute-url@4.0.1:
-    resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==}
-    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-    dev: true
+  is-absolute-url@4.0.1: {}
 
-  /is-arguments@1.1.1:
-    resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
-    engines: {node: '>= 0.4'}
+  is-arguments@1.1.1:
     dependencies:
       call-bind: 1.0.7
       has-tostringtag: 1.0.2
-    dev: true
-
-  /is-array-buffer@3.0.2:
-    resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
-    dependencies:
-      call-bind: 1.0.7
-      get-intrinsic: 1.2.4
-      is-typed-array: 1.1.10
-    dev: true
 
-  /is-array-buffer@3.0.4:
-    resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
-    engines: {node: '>= 0.4'}
+  is-array-buffer@3.0.4:
     dependencies:
       call-bind: 1.0.7
       get-intrinsic: 1.2.4
-    dev: true
 
-  /is-arrayish@0.2.1:
-    resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
-    dev: true
+  is-arrayish@0.2.1: {}
 
-  /is-bigint@1.0.4:
-    resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+  is-bigint@1.0.4:
     dependencies:
       has-bigints: 1.0.2
-    dev: true
 
-  /is-binary-path@2.1.0:
-    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
-    engines: {node: '>=8'}
+  is-binary-path@2.1.0:
     dependencies:
       binary-extensions: 2.3.0
-    dev: true
 
-  /is-boolean-object@1.1.2:
-    resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
-    engines: {node: '>= 0.4'}
+  is-boolean-object@1.1.2:
     dependencies:
       call-bind: 1.0.7
       has-tostringtag: 1.0.2
-    dev: true
 
-  /is-callable@1.2.7:
-    resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
-    engines: {node: '>= 0.4'}
-    dev: true
+  is-callable@1.2.7: {}
 
-  /is-core-module@2.13.1:
-    resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
+  is-core-module@2.15.1:
     dependencies:
       hasown: 2.0.2
-    dev: true
 
-  /is-data-view@1.0.1:
-    resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
-    engines: {node: '>= 0.4'}
+  is-data-view@1.0.1:
     dependencies:
       is-typed-array: 1.1.13
-    dev: true
 
-  /is-date-object@1.0.5:
-    resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
-    engines: {node: '>= 0.4'}
+  is-date-object@1.0.5:
     dependencies:
       has-tostringtag: 1.0.2
-    dev: true
 
-  /is-deflate@1.0.0:
-    resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==}
-    dev: true
-
-  /is-docker@2.2.1:
-    resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
-    engines: {node: '>=8'}
-    hasBin: true
-    dev: true
+  is-docker@2.2.1: {}
 
-  /is-docker@3.0.0:
-    resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
-    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-    hasBin: true
-    dev: true
+  is-docker@3.0.0: {}
 
-  /is-extglob@2.1.1:
-    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
-    engines: {node: '>=0.10.0'}
-    dev: true
+  is-extglob@2.1.1: {}
 
-  /is-fullwidth-code-point@3.0.0:
-    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
-    engines: {node: '>=8'}
-    dev: true
+  is-fullwidth-code-point@3.0.0: {}
 
-  /is-generator-fn@2.1.0:
-    resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
-    engines: {node: '>=6'}
-    dev: true
+  is-generator-fn@2.1.0: {}
 
-  /is-generator-function@1.0.10:
-    resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
-    engines: {node: '>= 0.4'}
+  is-generator-function@1.0.10:
     dependencies:
       has-tostringtag: 1.0.2
-    dev: true
 
-  /is-glob@4.0.3:
-    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
-    engines: {node: '>=0.10.0'}
+  is-glob@4.0.3:
     dependencies:
       is-extglob: 2.1.1
-    dev: true
-
-  /is-gzip@1.0.0:
-    resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-html@2.0.0:
-    resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==}
-    engines: {node: '>=8'}
-    dependencies:
-      html-tags: 3.2.0
-    dev: true
-
-  /is-inside-container@1.0.0:
-    resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
-    engines: {node: '>=14.16'}
-    hasBin: true
-    dependencies:
-      is-docker: 3.0.0
-    dev: true
-
-  /is-interactive@1.0.0:
-    resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /is-map@2.0.3:
-    resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
-    engines: {node: '>= 0.4'}
-    dev: true
 
-  /is-module@1.0.0:
-    resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
-    dev: true
+  is-html@2.0.0:
+    dependencies:
+      html-tags: 3.3.1
 
-  /is-nan@1.3.2:
-    resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==}
-    engines: {node: '>= 0.4'}
+  is-inside-container@1.0.0:
     dependencies:
-      call-bind: 1.0.7
-      define-properties: 1.2.1
-    dev: true
+      is-docker: 3.0.0
 
-  /is-negative-zero@2.0.2:
-    resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
-    engines: {node: '>= 0.4'}
-    dev: true
+  is-map@2.0.3: {}
 
-  /is-negative-zero@2.0.3:
-    resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
-    engines: {node: '>= 0.4'}
-    dev: true
+  is-module@1.0.0: {}
 
-  /is-number-object@1.0.7:
-    resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
-    engines: {node: '>= 0.4'}
+  is-negative-zero@2.0.3: {}
+
+  is-number-object@1.0.7:
     dependencies:
       has-tostringtag: 1.0.2
-    dev: true
 
-  /is-number@7.0.0:
-    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
-    engines: {node: '>=0.12.0'}
-    dev: true
-
-  /is-obj@1.0.1:
-    resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==}
-    engines: {node: '>=0.10.0'}
-    dev: true
+  is-number@7.0.0: {}
 
-  /is-path-inside@3.0.3:
-    resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
-    engines: {node: '>=8'}
-    dev: true
+  is-obj@1.0.1: {}
 
-  /is-plain-obj@4.1.0:
-    resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
-    engines: {node: '>=12'}
+  is-path-inside@3.0.3: {}
 
-  /is-plain-object@2.0.4:
-    resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      isobject: 3.0.1
-    dev: true
+  is-plain-obj@4.1.0: {}
 
-  /is-plain-object@5.0.0:
-    resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
-    engines: {node: '>=0.10.0'}
-    dev: false
+  is-plain-object@5.0.0: {}
 
-  /is-potential-custom-element-name@1.0.1:
-    resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
-    dev: true
+  is-potential-custom-element-name@1.0.1: {}
 
-  /is-regex@1.1.4:
-    resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
-    engines: {node: '>= 0.4'}
+  is-regex@1.1.4:
     dependencies:
       call-bind: 1.0.7
       has-tostringtag: 1.0.2
-    dev: true
 
-  /is-regexp@1.0.0:
-    resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-set@2.0.3:
-    resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
-    engines: {node: '>= 0.4'}
-    dev: true
+  is-regexp@1.0.0: {}
 
-  /is-shared-array-buffer@1.0.2:
-    resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
-    dependencies:
-      call-bind: 1.0.7
-    dev: true
+  is-set@2.0.3: {}
 
-  /is-shared-array-buffer@1.0.3:
-    resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
-    engines: {node: '>= 0.4'}
+  is-shared-array-buffer@1.0.3:
     dependencies:
       call-bind: 1.0.7
-    dev: true
-
-  /is-stream@2.0.1:
-    resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
-    engines: {node: '>=8'}
-    dev: true
 
-  /is-stream@3.0.0:
-    resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
-    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-    dev: true
+  is-stream@2.0.1: {}
 
-  /is-string@1.0.7:
-    resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
-    engines: {node: '>= 0.4'}
+  is-string@1.0.7:
     dependencies:
       has-tostringtag: 1.0.2
-    dev: true
 
-  /is-symbol@1.0.4:
-    resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
-    engines: {node: '>= 0.4'}
+  is-symbol@1.0.4:
     dependencies:
       has-symbols: 1.0.3
-    dev: true
-
-  /is-typed-array@1.1.10:
-    resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      available-typed-arrays: 1.0.7
-      call-bind: 1.0.7
-      for-each: 0.3.3
-      gopd: 1.0.1
-      has-tostringtag: 1.0.2
-    dev: true
 
-  /is-typed-array@1.1.13:
-    resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
-    engines: {node: '>= 0.4'}
+  is-typed-array@1.1.13:
     dependencies:
       which-typed-array: 1.1.15
-    dev: true
-
-  /is-typedarray@1.0.0:
-    resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
-    dev: true
 
-  /is-unicode-supported@0.1.0:
-    resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
-    engines: {node: '>=10'}
-    dev: true
+  is-typedarray@1.0.0: {}
 
-  /is-weakmap@2.0.2:
-    resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
-    engines: {node: '>= 0.4'}
-    dev: true
+  is-weakmap@2.0.2: {}
 
-  /is-weakref@1.0.2:
-    resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+  is-weakref@1.0.2:
     dependencies:
       call-bind: 1.0.7
-    dev: true
 
-  /is-weakset@2.0.3:
-    resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
-    engines: {node: '>= 0.4'}
+  is-weakset@2.0.3:
     dependencies:
       call-bind: 1.0.7
       get-intrinsic: 1.2.4
-    dev: true
 
-  /is-what@4.1.16:
-    resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==}
-    engines: {node: '>=12.13'}
-    dev: true
+  is-what@4.1.16: {}
 
-  /is-wsl@2.2.0:
-    resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
-    engines: {node: '>=8'}
+  is-wsl@2.2.0:
     dependencies:
       is-docker: 2.2.1
-    dev: true
 
-  /is-wsl@3.1.0:
-    resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
-    engines: {node: '>=16'}
+  is-wsl@3.1.0:
     dependencies:
       is-inside-container: 1.0.0
-    dev: true
-
-  /isarray@1.0.0:
-    resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
-    dev: true
 
-  /isarray@2.0.5:
-    resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
-    dev: true
+  isarray@1.0.0: {}
 
-  /isexe@2.0.0:
-    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-    dev: true
+  isarray@2.0.5: {}
 
-  /isobject@3.0.1:
-    resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
-    engines: {node: '>=0.10.0'}
-    dev: true
+  isexe@2.0.0: {}
 
-  /isomorphic-ws@5.0.0(ws@8.16.0):
-    resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==}
-    peerDependencies:
-      ws: '*'
+  isomorphic-ws@5.0.0(ws@8.18.0):
     dependencies:
-      ws: 8.16.0
-    dev: false
+      ws: 8.18.0
 
-  /istanbul-lib-coverage@3.2.2:
-    resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
-    engines: {node: '>=8'}
-    dev: true
+  istanbul-lib-coverage@3.2.2: {}
 
-  /istanbul-lib-instrument@5.2.1:
-    resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
-    engines: {node: '>=8'}
+  istanbul-lib-instrument@5.2.1:
     dependencies:
-      '@babel/core': 7.24.7
-      '@babel/parser': 7.24.7
+      '@babel/core': 7.25.7
+      '@babel/parser': 7.25.7
       '@istanbuljs/schema': 0.1.3
       istanbul-lib-coverage: 3.2.2
       semver: 6.3.1
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /istanbul-lib-report@3.0.1:
-    resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
-    engines: {node: '>=10'}
+  istanbul-lib-report@3.0.1:
     dependencies:
       istanbul-lib-coverage: 3.2.2
       make-dir: 4.0.0
       supports-color: 7.2.0
-    dev: true
 
-  /istanbul-lib-source-maps@4.0.1:
-    resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
-    engines: {node: '>=10'}
+  istanbul-lib-source-maps@4.0.1:
     dependencies:
-      debug: 4.3.4
+      debug: 4.3.7
       istanbul-lib-coverage: 3.2.2
       source-map: 0.6.1
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /istanbul-lib-source-maps@5.0.4:
-    resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==}
-    engines: {node: '>=10'}
+  istanbul-lib-source-maps@5.0.6:
     dependencies:
       '@jridgewell/trace-mapping': 0.3.25
-      debug: 4.3.4
+      debug: 4.3.7
       istanbul-lib-coverage: 3.2.2
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /istanbul-reports@3.1.7:
-    resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
-    engines: {node: '>=8'}
+  istanbul-reports@3.1.7:
     dependencies:
       html-escaper: 2.0.2
       istanbul-lib-report: 3.0.1
-    dev: true
 
-  /jackspeak@3.4.0:
-    resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==}
-    engines: {node: '>=14'}
+  jackspeak@3.4.3:
     dependencies:
       '@isaacs/cliui': 8.0.2
     optionalDependencies:
       '@pkgjs/parseargs': 0.11.0
-    dev: true
 
-  /jake@10.8.7:
-    resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==}
-    engines: {node: '>=10'}
-    hasBin: true
+  jake@10.9.2:
     dependencies:
-      async: 3.2.5
+      async: 3.2.6
       chalk: 4.1.2
       filelist: 1.0.4
       minimatch: 3.1.2
-    dev: true
 
-  /javascript-natural-sort@0.7.1:
-    resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==}
-    dev: true
+  javascript-natural-sort@0.7.1: {}
 
-  /javascript-stringify@2.1.0:
-    resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==}
-    dev: true
+  javascript-stringify@2.1.0: {}
 
-  /jest-changed-files@27.5.1:
-    resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-changed-files@27.5.1:
     dependencies:
       '@jest/types': 27.5.1
       execa: 5.1.1
-      throat: 6.0.1
-    dev: true
+      throat: 6.0.2
 
-  /jest-circus@27.5.1:
-    resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-circus@27.5.1:
     dependencies:
       '@jest/environment': 27.5.1
       '@jest/test-result': 27.5.1
       '@jest/types': 27.5.1
-      '@types/node': 20.12.2
+      '@types/node': 20.16.11
       chalk: 4.1.2
       co: 4.6.0
       dedent: 0.7.0
@@ -11270,20 +12037,11 @@ packages:
       pretty-format: 27.5.1
       slash: 3.0.0
       stack-utils: 2.0.6
-      throat: 6.0.1
+      throat: 6.0.2
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /jest-cli@27.5.1:
-    resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    hasBin: true
-    peerDependencies:
-      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
-    peerDependenciesMeta:
-      node-notifier:
-        optional: true
+  jest-cli@27.5.1:
     dependencies:
       '@jest/core': 27.5.1
       '@jest/test-result': 27.5.1
@@ -11291,7 +12049,7 @@ packages:
       chalk: 4.1.2
       exit: 0.1.2
       graceful-fs: 4.2.11
-      import-local: 3.1.0
+      import-local: 3.2.0
       jest-config: 27.5.1
       jest-util: 27.5.1
       jest-validate: 27.5.1
@@ -11303,24 +12061,16 @@ packages:
       - supports-color
       - ts-node
       - utf-8-validate
-    dev: true
 
-  /jest-config@27.5.1:
-    resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    peerDependencies:
-      ts-node: '>=9.0.0'
-    peerDependenciesMeta:
-      ts-node:
-        optional: true
+  jest-config@27.5.1:
     dependencies:
-      '@babel/core': 7.24.0
+      '@babel/core': 7.25.7
       '@jest/test-sequencer': 27.5.1
       '@jest/types': 27.5.1
-      babel-jest: 27.5.1(@babel/core@7.24.0)
+      babel-jest: 27.5.1(@babel/core@7.25.7)
       chalk: 4.1.2
-      ci-info: 3.8.0
-      deepmerge: 4.2.2
+      ci-info: 3.9.0
+      deepmerge: 4.3.1
       glob: 7.2.3
       graceful-fs: 4.2.11
       jest-circus: 27.5.1
@@ -11333,7 +12083,7 @@ packages:
       jest-runner: 27.5.1
       jest-util: 27.5.1
       jest-validate: 27.5.1
-      micromatch: 4.0.5
+      micromatch: 4.0.8
       parse-json: 5.2.0
       pretty-format: 27.5.1
       slash: 3.0.0
@@ -11343,44 +12093,39 @@ packages:
       - canvas
       - supports-color
       - utf-8-validate
-    dev: true
 
-  /jest-diff@27.5.1:
-    resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-diff@27.5.1:
     dependencies:
       chalk: 4.1.2
       diff-sequences: 27.5.1
       jest-get-type: 27.5.1
       pretty-format: 27.5.1
-    dev: true
 
-  /jest-docblock@27.5.1:
-    resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-diff@29.7.0:
+    dependencies:
+      chalk: 4.1.2
+      diff-sequences: 29.6.3
+      jest-get-type: 29.6.3
+      pretty-format: 29.7.0
+
+  jest-docblock@27.5.1:
     dependencies:
       detect-newline: 3.1.0
-    dev: true
 
-  /jest-each@27.5.1:
-    resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-each@27.5.1:
     dependencies:
       '@jest/types': 27.5.1
       chalk: 4.1.2
       jest-get-type: 27.5.1
       jest-util: 27.5.1
       pretty-format: 27.5.1
-    dev: true
 
-  /jest-environment-jsdom@27.5.1:
-    resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-environment-jsdom@27.5.1:
     dependencies:
       '@jest/environment': 27.5.1
       '@jest/fake-timers': 27.5.1
       '@jest/types': 27.5.1
-      '@types/node': 20.12.2
+      '@types/node': 20.16.11
       jest-mock: 27.5.1
       jest-util: 27.5.1
       jsdom: 16.7.0
@@ -11389,32 +12134,25 @@ packages:
       - canvas
       - supports-color
       - utf-8-validate
-    dev: true
 
-  /jest-environment-node@27.5.1:
-    resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-environment-node@27.5.1:
     dependencies:
       '@jest/environment': 27.5.1
       '@jest/fake-timers': 27.5.1
       '@jest/types': 27.5.1
-      '@types/node': 20.12.2
+      '@types/node': 20.16.11
       jest-mock: 27.5.1
       jest-util: 27.5.1
-    dev: true
 
-  /jest-get-type@27.5.1:
-    resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    dev: true
+  jest-get-type@27.5.1: {}
 
-  /jest-haste-map@27.5.1:
-    resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-get-type@29.6.3: {}
+
+  jest-haste-map@27.5.1:
     dependencies:
       '@jest/types': 27.5.1
-      '@types/graceful-fs': 4.1.5
-      '@types/node': 20.12.2
+      '@types/graceful-fs': 4.1.9
+      '@types/node': 20.16.11
       anymatch: 3.1.3
       fb-watchman: 2.0.2
       graceful-fs: 4.2.11
@@ -11422,21 +12160,18 @@ packages:
       jest-serializer: 27.5.1
       jest-util: 27.5.1
       jest-worker: 27.5.1
-      micromatch: 4.0.5
+      micromatch: 4.0.8
       walker: 1.0.8
     optionalDependencies:
       fsevents: 2.3.3
-    dev: true
 
-  /jest-jasmine2@27.5.1:
-    resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-jasmine2@27.5.1:
     dependencies:
       '@jest/environment': 27.5.1
       '@jest/source-map': 27.5.1
       '@jest/test-result': 27.5.1
       '@jest/types': 27.5.1
-      '@types/node': 20.12.2
+      '@types/node': 20.16.11
       chalk: 4.1.2
       co: 4.6.0
       expect: 27.5.1
@@ -11448,83 +12183,54 @@ packages:
       jest-snapshot: 27.5.1
       jest-util: 27.5.1
       pretty-format: 27.5.1
-      throat: 6.0.1
+      throat: 6.0.2
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /jest-leak-detector@27.5.1:
-    resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-leak-detector@27.5.1:
     dependencies:
       jest-get-type: 27.5.1
       pretty-format: 27.5.1
-    dev: true
 
-  /jest-matcher-utils@27.5.1:
-    resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-matcher-utils@27.5.1:
     dependencies:
       chalk: 4.1.2
       jest-diff: 27.5.1
       jest-get-type: 27.5.1
       pretty-format: 27.5.1
-    dev: true
 
-  /jest-message-util@27.5.1:
-    resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-message-util@27.5.1:
     dependencies:
-      '@babel/code-frame': 7.24.7
+      '@babel/code-frame': 7.25.7
       '@jest/types': 27.5.1
-      '@types/stack-utils': 2.0.1
+      '@types/stack-utils': 2.0.3
       chalk: 4.1.2
       graceful-fs: 4.2.11
-      micromatch: 4.0.5
+      micromatch: 4.0.8
       pretty-format: 27.5.1
       slash: 3.0.0
       stack-utils: 2.0.6
-    dev: true
 
-  /jest-mock@27.5.1:
-    resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-mock@27.5.1:
     dependencies:
       '@jest/types': 27.5.1
-      '@types/node': 20.12.2
-    dev: true
+      '@types/node': 20.16.11
 
-  /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1):
-    resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
-    engines: {node: '>=6'}
-    peerDependencies:
-      jest-resolve: '*'
-    peerDependenciesMeta:
-      jest-resolve:
-        optional: true
-    dependencies:
+  jest-pnp-resolver@1.2.3(jest-resolve@27.5.1):
+    optionalDependencies:
       jest-resolve: 27.5.1
-    dev: true
 
-  /jest-regex-util@27.5.1:
-    resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    dev: true
+  jest-regex-util@27.5.1: {}
 
-  /jest-resolve-dependencies@27.5.1:
-    resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-resolve-dependencies@27.5.1:
     dependencies:
       '@jest/types': 27.5.1
       jest-regex-util: 27.5.1
       jest-snapshot: 27.5.1
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /jest-resolve@27.5.1:
-    resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-resolve@27.5.1:
     dependencies:
       '@jest/types': 27.5.1
       chalk: 4.1.2
@@ -11534,20 +12240,17 @@ packages:
       jest-util: 27.5.1
       jest-validate: 27.5.1
       resolve: 1.22.8
-      resolve.exports: 1.1.0
+      resolve.exports: 1.1.1
       slash: 3.0.0
-    dev: true
 
-  /jest-runner@27.5.1:
-    resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-runner@27.5.1:
     dependencies:
       '@jest/console': 27.5.1
       '@jest/environment': 27.5.1
       '@jest/test-result': 27.5.1
       '@jest/transform': 27.5.1
       '@jest/types': 27.5.1
-      '@types/node': 20.12.2
+      '@types/node': 20.16.11
       chalk: 4.1.2
       emittery: 0.8.1
       graceful-fs: 4.2.11
@@ -11562,17 +12265,14 @@ packages:
       jest-util: 27.5.1
       jest-worker: 27.5.1
       source-map-support: 0.5.21
-      throat: 6.0.1
+      throat: 6.0.2
     transitivePeerDependencies:
       - bufferutil
       - canvas
       - supports-color
       - utf-8-validate
-    dev: true
 
-  /jest-runtime@27.5.1:
-    resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-runtime@27.5.1:
     dependencies:
       '@jest/environment': 27.5.1
       '@jest/fake-timers': 27.5.1
@@ -11582,8 +12282,8 @@ packages:
       '@jest/transform': 27.5.1
       '@jest/types': 27.5.1
       chalk: 4.1.2
-      cjs-module-lexer: 1.2.2
-      collect-v8-coverage: 1.0.1
+      cjs-module-lexer: 1.4.1
+      collect-v8-coverage: 1.0.2
       execa: 5.1.1
       glob: 7.2.3
       graceful-fs: 4.2.11
@@ -11598,30 +12298,24 @@ packages:
       strip-bom: 4.0.0
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /jest-serializer@27.5.1:
-    resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-serializer@27.5.1:
     dependencies:
-      '@types/node': 20.12.2
+      '@types/node': 20.16.11
       graceful-fs: 4.2.11
-    dev: true
 
-  /jest-snapshot@27.5.1:
-    resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-snapshot@27.5.1:
     dependencies:
-      '@babel/core': 7.24.0
-      '@babel/generator': 7.24.7
-      '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.0)
-      '@babel/traverse': 7.24.7
-      '@babel/types': 7.24.7
+      '@babel/core': 7.25.7
+      '@babel/generator': 7.25.7
+      '@babel/plugin-syntax-typescript': 7.25.7(@babel/core@7.25.7)
+      '@babel/traverse': 7.25.7
+      '@babel/types': 7.25.7
       '@jest/transform': 27.5.1
       '@jest/types': 27.5.1
-      '@types/babel__traverse': 7.20.5
-      '@types/prettier': 2.7.1
-      babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.0)
+      '@types/babel__traverse': 7.20.6
+      '@types/prettier': 2.7.3
+      babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.7)
       chalk: 4.1.2
       expect: 27.5.1
       graceful-fs: 4.2.11
@@ -11633,26 +12327,20 @@ packages:
       jest-util: 27.5.1
       natural-compare: 1.4.0
       pretty-format: 27.5.1
-      semver: 7.5.4
+      semver: 7.6.3
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /jest-util@27.5.1:
-    resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-util@27.5.1:
     dependencies:
       '@jest/types': 27.5.1
-      '@types/node': 20.12.2
+      '@types/node': 20.16.11
       chalk: 4.1.2
-      ci-info: 3.5.0
+      ci-info: 3.9.0
       graceful-fs: 4.2.11
       picomatch: 2.3.1
-    dev: true
 
-  /jest-validate@27.5.1:
-    resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-validate@27.5.1:
     dependencies:
       '@jest/types': 27.5.1
       camelcase: 6.3.0
@@ -11660,51 +12348,27 @@ packages:
       jest-get-type: 27.5.1
       leven: 3.1.0
       pretty-format: 27.5.1
-    dev: true
 
-  /jest-watcher@27.5.1:
-    resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  jest-watcher@27.5.1:
     dependencies:
       '@jest/test-result': 27.5.1
       '@jest/types': 27.5.1
-      '@types/node': 20.12.2
+      '@types/node': 20.16.11
       ansi-escapes: 4.3.2
       chalk: 4.1.2
       jest-util: 27.5.1
       string-length: 4.0.2
-    dev: true
-
-  /jest-worker@26.6.2:
-    resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
-    engines: {node: '>= 10.13.0'}
-    dependencies:
-      '@types/node': 20.12.2
-      merge-stream: 2.0.0
-      supports-color: 7.2.0
-    dev: true
 
-  /jest-worker@27.5.1:
-    resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
-    engines: {node: '>= 10.13.0'}
+  jest-worker@27.5.1:
     dependencies:
-      '@types/node': 20.12.2
+      '@types/node': 20.16.11
       merge-stream: 2.0.0
       supports-color: 8.1.1
-    dev: true
 
-  /jest@27.5.1:
-    resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-    hasBin: true
-    peerDependencies:
-      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
-    peerDependenciesMeta:
-      node-notifier:
-        optional: true
+  jest@27.5.1:
     dependencies:
       '@jest/core': 27.5.1
-      import-local: 3.1.0
+      import-local: 3.2.0
       jest-cli: 27.5.1
     transitivePeerDependencies:
       - bufferutil
@@ -11712,205 +12376,113 @@ packages:
       - supports-color
       - ts-node
       - utf-8-validate
-    dev: true
-
-  /js-tokens@4.0.0:
-    resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
-    dev: true
 
-  /js-tokens@8.0.3:
-    resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==}
-    dev: true
+  js-tokens@4.0.0: {}
 
-  /js-yaml@3.14.1:
-    resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
-    hasBin: true
+  js-yaml@3.14.1:
     dependencies:
       argparse: 1.0.10
       esprima: 4.0.1
-    dev: true
 
-  /js-yaml@4.1.0:
-    resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
-    hasBin: true
+  js-yaml@4.1.0:
     dependencies:
       argparse: 2.0.1
-    dev: true
 
-  /jscodeshift@0.15.2(@babel/preset-env@7.24.7):
-    resolution: {integrity: sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==}
-    hasBin: true
-    peerDependencies:
-      '@babel/preset-env': ^7.1.6
-    peerDependenciesMeta:
-      '@babel/preset-env':
-        optional: true
-    dependencies:
-      '@babel/core': 7.24.7
-      '@babel/parser': 7.24.7
-      '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.24.7)
-      '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7)
-      '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.24.7)
-      '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.24.7)
-      '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.24.7)
-      '@babel/preset-env': 7.24.7(@babel/core@7.24.7)
-      '@babel/preset-flow': 7.24.7(@babel/core@7.24.7)
-      '@babel/preset-typescript': 7.24.7(@babel/core@7.24.7)
-      '@babel/register': 7.24.6(@babel/core@7.24.7)
-      babel-core: 7.0.0-bridge.0(@babel/core@7.24.7)
-      chalk: 4.1.2
-      flow-parser: 0.237.2
-      graceful-fs: 4.2.11
-      micromatch: 4.0.5
-      neo-async: 2.6.2
-      node-dir: 0.1.17
-      recast: 0.23.9
-      temp: 0.8.4
-      write-file-atomic: 2.4.3
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
+  jsdoc-type-pratt-parser@4.1.0: {}
 
-  /jsdom@16.7.0:
-    resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      canvas: ^2.5.0
-    peerDependenciesMeta:
-      canvas:
-        optional: true
+  jsdom@16.7.0:
     dependencies:
       abab: 2.0.6
-      acorn: 8.11.3
+      acorn: 8.12.1
       acorn-globals: 6.0.0
       cssom: 0.4.4
       cssstyle: 2.3.0
       data-urls: 2.0.0
       decimal.js: 10.4.3
       domexception: 2.0.1
-      escodegen: 2.0.0
+      escodegen: 2.1.0
       form-data: 3.0.1
       html-encoding-sniffer: 2.0.1
       http-proxy-agent: 4.0.1
       https-proxy-agent: 5.0.1
       is-potential-custom-element-name: 1.0.1
-      nwsapi: 2.2.7
+      nwsapi: 2.2.13
       parse5: 6.0.1
       saxes: 5.0.1
       symbol-tree: 3.2.4
-      tough-cookie: 4.1.3
+      tough-cookie: 4.1.4
       w3c-hr-time: 1.0.2
       w3c-xmlserializer: 2.0.0
       webidl-conversions: 6.1.0
       whatwg-encoding: 1.0.5
       whatwg-mimetype: 2.3.0
       whatwg-url: 8.7.0
-      ws: 7.5.9
+      ws: 7.5.10
       xml-name-validator: 3.0.0
     transitivePeerDependencies:
       - bufferutil
       - supports-color
       - utf-8-validate
-    dev: true
 
-  /jsdom@24.0.0:
-    resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==}
-    engines: {node: '>=18'}
-    peerDependencies:
-      canvas: ^2.11.2
-    peerDependenciesMeta:
-      canvas:
-        optional: true
+  jsdom@25.0.1:
     dependencies:
-      cssstyle: 4.0.1
+      cssstyle: 4.1.0
       data-urls: 5.0.0
       decimal.js: 10.4.3
       form-data: 4.0.0
       html-encoding-sniffer: 4.0.0
       http-proxy-agent: 7.0.2
-      https-proxy-agent: 7.0.4
+      https-proxy-agent: 7.0.5
       is-potential-custom-element-name: 1.0.1
-      nwsapi: 2.2.7
+      nwsapi: 2.2.13
       parse5: 7.1.2
-      rrweb-cssom: 0.6.0
+      rrweb-cssom: 0.7.1
       saxes: 6.0.0
       symbol-tree: 3.2.4
-      tough-cookie: 4.1.3
+      tough-cookie: 5.0.0
       w3c-xmlserializer: 5.0.0
       webidl-conversions: 7.0.0
       whatwg-encoding: 3.1.1
       whatwg-mimetype: 4.0.0
       whatwg-url: 14.0.0
-      ws: 8.16.0
+      ws: 8.18.0
       xml-name-validator: 5.0.0
     transitivePeerDependencies:
       - bufferutil
       - supports-color
       - utf-8-validate
-    dev: true
 
-  /jsesc@0.5.0:
-    resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
-    hasBin: true
-    dev: true
+  jsesc@2.5.2: {}
 
-  /jsesc@2.5.2:
-    resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
-    engines: {node: '>=4'}
-    hasBin: true
-    dev: true
+  jsesc@3.0.2: {}
 
-  /json-parse-even-better-errors@2.3.1:
-    resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
-    dev: true
+  json-buffer@3.0.1: {}
 
-  /json-schema-traverse@0.4.1:
-    resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
-    dev: true
+  json-parse-even-better-errors@2.3.1: {}
 
-  /json-schema-traverse@1.0.0:
-    resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
-    dev: true
+  json-schema-traverse@0.4.1: {}
 
-  /json-schema@0.4.0:
-    resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
-    dev: true
+  json-schema-traverse@1.0.0: {}
 
-  /json-stable-stringify-without-jsonify@1.0.1:
-    resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
-    dev: true
+  json-schema@0.4.0: {}
 
-  /json-stringify-deterministic@1.0.12:
-    resolution: {integrity: sha512-q3PN0lbUdv0pmurkBNdJH3pfFvOTL/Zp0lquqpvcjfKzt6Y0j49EPHAmVHCAS4Ceq/Y+PejWTzyiVpoY71+D6g==}
-    engines: {node: '>= 4'}
-    dev: false
+  json-stable-stringify-without-jsonify@1.0.1: {}
 
-  /json5@2.2.3:
-    resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
-    engines: {node: '>=6'}
-    hasBin: true
-    dev: true
+  json-stringify-deterministic@1.0.12: {}
 
-  /jsonc-parser@3.2.1:
-    resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==}
-    dev: true
+  json5@2.2.3: {}
 
-  /jsonfile@6.1.0:
-    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+  jsonc-parser@3.3.1: {}
+
+  jsonfile@6.1.0:
     dependencies:
       universalify: 2.0.1
     optionalDependencies:
       graceful-fs: 4.2.11
-    dev: true
 
-  /jsonpointer@5.0.1:
-    resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==}
-    engines: {node: '>=0.10.0'}
-    dev: true
+  jsonpointer@5.0.1: {}
 
-  /jsonwebtoken@9.0.2:
-    resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==}
-    engines: {node: '>=12', npm: '>=6'}
+  jsonwebtoken@9.0.2:
     dependencies:
       jws: 3.2.2
       lodash.includes: 4.3.0
@@ -11921,486 +12493,268 @@ packages:
       lodash.isstring: 4.0.1
       lodash.once: 4.1.1
       ms: 2.1.3
-      semver: 7.5.4
-    dev: false
+      semver: 7.6.3
 
-  /jsx-ast-utils@3.3.3:
-    resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
-    engines: {node: '>=4.0'}
+  jsx-ast-utils@3.3.5:
     dependencies:
-      array-includes: 3.1.6
-      object.assign: 4.1.4
-    dev: true
+      array-includes: 3.1.8
+      array.prototype.flat: 1.3.2
+      object.assign: 4.1.5
+      object.values: 1.2.0
 
-  /jwa@1.4.1:
-    resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==}
+  jwa@1.4.1:
     dependencies:
       buffer-equal-constant-time: 1.0.1
       ecdsa-sig-formatter: 1.0.11
       safe-buffer: 5.2.1
-    dev: false
 
-  /jws@3.2.2:
-    resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
+  jws@3.2.2:
     dependencies:
       jwa: 1.4.1
       safe-buffer: 5.2.1
-    dev: false
-
-  /katex@0.16.9:
-    resolution: {integrity: sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==}
-    hasBin: true
-    dependencies:
-      commander: 8.3.0
-    dev: false
-
-  /kebab-case@1.0.2:
-    resolution: {integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==}
-    dev: true
-
-  /kind-of@6.0.3:
-    resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /kleur@3.0.3:
-    resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
-    engines: {node: '>=6'}
-    dev: true
-
-  /kleur@4.1.5:
-    resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
-    engines: {node: '>=6'}
-    dev: true
-
-  /known-css-properties@0.24.0:
-    resolution: {integrity: sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA==}
-    dev: true
 
-  /lazy-universal-dotenv@4.0.0:
-    resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==}
-    engines: {node: '>=14.0.0'}
+  katex@0.16.11:
     dependencies:
-      app-root-dir: 1.0.2
-      dotenv: 16.4.5
-      dotenv-expand: 10.0.0
-    dev: true
+      commander: 8.3.0
 
-  /leven@3.1.0:
-    resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
-    engines: {node: '>=6'}
-    dev: true
+  kebab-case@1.0.2: {}
 
-  /levn@0.3.0:
-    resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==}
-    engines: {node: '>= 0.8.0'}
+  keyv@4.5.4:
     dependencies:
-      prelude-ls: 1.1.2
-      type-check: 0.3.2
-    dev: true
+      json-buffer: 3.0.1
 
-  /levn@0.4.1:
-    resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
-    engines: {node: '>= 0.8.0'}
+  kleur@3.0.3: {}
+
+  kleur@4.1.5: {}
+
+  known-css-properties@0.24.0: {}
+
+  known-css-properties@0.30.0: {}
+
+  leven@3.1.0: {}
+
+  levn@0.4.1:
     dependencies:
       prelude-ls: 1.2.1
       type-check: 0.4.0
-    dev: true
 
-  /lie@3.1.1:
-    resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==}
+  lie@3.1.1:
     dependencies:
       immediate: 3.0.6
-    dev: false
 
-  /lightningcss-darwin-arm64@1.23.0:
-    resolution: {integrity: sha512-kl4Pk3Q2lnE6AJ7Qaij47KNEfY2/UXRZBT/zqGA24B8qwkgllr/j7rclKOf1axcslNXvvUdztjo4Xqh39Yq1aA==}
-    engines: {node: '>= 12.0.0'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
+  lightningcss-darwin-arm64@1.25.1:
     optional: true
 
-  /lightningcss-darwin-x64@1.23.0:
-    resolution: {integrity: sha512-KeRFCNoYfDdcolcFXvokVw+PXCapd2yHS1Diko1z1BhRz/nQuD5XyZmxjWdhmhN/zj5sH8YvWsp0/lPLVzqKpg==}
-    engines: {node: '>= 12.0.0'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
+  lightningcss-darwin-arm64@1.27.0:
     optional: true
 
-  /lightningcss-freebsd-x64@1.23.0:
-    resolution: {integrity: sha512-xhnhf0bWPuZxcqknvMDRFFo2TInrmQRWZGB0f6YoAsZX8Y+epfjHeeOIGCfAmgF0DgZxHwYc8mIR5tQU9/+ROA==}
-    engines: {node: '>= 12.0.0'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
+  lightningcss-darwin-x64@1.25.1:
     optional: true
 
-  /lightningcss-linux-arm-gnueabihf@1.23.0:
-    resolution: {integrity: sha512-fBamf/bULvmWft9uuX+bZske236pUZEoUlaHNBjnueaCTJ/xd8eXgb0cEc7S5o0Nn6kxlauMBnqJpF70Bgq3zg==}
-    engines: {node: '>= 12.0.0'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
+  lightningcss-darwin-x64@1.27.0:
     optional: true
 
-  /lightningcss-linux-arm64-gnu@1.23.0:
-    resolution: {integrity: sha512-RS7sY77yVLOmZD6xW2uEHByYHhQi5JYWmgVumYY85BfNoVI3DupXSlzbw+b45A9NnVKq45+oXkiN6ouMMtTwfg==}
-    engines: {node: '>= 12.0.0'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
+  lightningcss-freebsd-x64@1.25.1:
     optional: true
 
-  /lightningcss-linux-arm64-musl@1.23.0:
-    resolution: {integrity: sha512-cU00LGb6GUXCwof6ACgSMKo3q7XYbsyTj0WsKHLi1nw7pV0NCq8nFTn6ZRBYLoKiV8t+jWl0Hv8KkgymmK5L5g==}
-    engines: {node: '>= 12.0.0'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
+  lightningcss-freebsd-x64@1.27.0:
     optional: true
 
-  /lightningcss-linux-x64-gnu@1.23.0:
-    resolution: {integrity: sha512-q4jdx5+5NfB0/qMbXbOmuC6oo7caPnFghJbIAV90cXZqgV8Am3miZhC4p+sQVdacqxfd+3nrle4C8icR3p1AYw==}
-    engines: {node: '>= 12.0.0'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
+  lightningcss-linux-arm-gnueabihf@1.25.1:
     optional: true
 
-  /lightningcss-linux-x64-musl@1.23.0:
-    resolution: {integrity: sha512-G9Ri3qpmF4qef2CV/80dADHKXRAQeQXpQTLx7AiQrBYQHqBjB75oxqj06FCIe5g4hNCqLPnM9fsO4CyiT1sFSQ==}
-    engines: {node: '>= 12.0.0'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
+  lightningcss-linux-arm-gnueabihf@1.27.0:
     optional: true
 
-  /lightningcss-win32-x64-msvc@1.23.0:
-    resolution: {integrity: sha512-1rcBDJLU+obPPJM6qR5fgBUiCdZwZLafZM5f9kwjFLkb/UBNIzmae39uCSmh71nzPCTXZqHbvwu23OWnWEz+eg==}
-    engines: {node: '>= 12.0.0'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
+  lightningcss-linux-arm64-gnu@1.25.1:
     optional: true
 
-  /lightningcss@1.23.0:
-    resolution: {integrity: sha512-SEArWKMHhqn/0QzOtclIwH5pXIYQOUEkF8DgICd/105O+GCgd7jxjNod/QPnBCSWvpRHQBGVz5fQ9uScby03zA==}
-    engines: {node: '>= 12.0.0'}
+  lightningcss-linux-arm64-gnu@1.27.0:
+    optional: true
+
+  lightningcss-linux-arm64-musl@1.25.1:
+    optional: true
+
+  lightningcss-linux-arm64-musl@1.27.0:
+    optional: true
+
+  lightningcss-linux-x64-gnu@1.25.1:
+    optional: true
+
+  lightningcss-linux-x64-gnu@1.27.0:
+    optional: true
+
+  lightningcss-linux-x64-musl@1.25.1:
+    optional: true
+
+  lightningcss-linux-x64-musl@1.27.0:
+    optional: true
+
+  lightningcss-win32-arm64-msvc@1.27.0:
+    optional: true
+
+  lightningcss-win32-x64-msvc@1.25.1:
+    optional: true
+
+  lightningcss-win32-x64-msvc@1.27.0:
+    optional: true
+
+  lightningcss@1.25.1:
     dependencies:
       detect-libc: 1.0.3
     optionalDependencies:
-      lightningcss-darwin-arm64: 1.23.0
-      lightningcss-darwin-x64: 1.23.0
-      lightningcss-freebsd-x64: 1.23.0
-      lightningcss-linux-arm-gnueabihf: 1.23.0
-      lightningcss-linux-arm64-gnu: 1.23.0
-      lightningcss-linux-arm64-musl: 1.23.0
-      lightningcss-linux-x64-gnu: 1.23.0
-      lightningcss-linux-x64-musl: 1.23.0
-      lightningcss-win32-x64-msvc: 1.23.0
-    dev: true
-
-  /lines-and-columns@1.2.4:
-    resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
-    dev: true
+      lightningcss-darwin-arm64: 1.25.1
+      lightningcss-darwin-x64: 1.25.1
+      lightningcss-freebsd-x64: 1.25.1
+      lightningcss-linux-arm-gnueabihf: 1.25.1
+      lightningcss-linux-arm64-gnu: 1.25.1
+      lightningcss-linux-arm64-musl: 1.25.1
+      lightningcss-linux-x64-gnu: 1.25.1
+      lightningcss-linux-x64-musl: 1.25.1
+      lightningcss-win32-x64-msvc: 1.25.1
+
+  lightningcss@1.27.0:
+    dependencies:
+      detect-libc: 1.0.3
+    optionalDependencies:
+      lightningcss-darwin-arm64: 1.27.0
+      lightningcss-darwin-x64: 1.27.0
+      lightningcss-freebsd-x64: 1.27.0
+      lightningcss-linux-arm-gnueabihf: 1.27.0
+      lightningcss-linux-arm64-gnu: 1.27.0
+      lightningcss-linux-arm64-musl: 1.27.0
+      lightningcss-linux-x64-gnu: 1.27.0
+      lightningcss-linux-x64-musl: 1.27.0
+      lightningcss-win32-arm64-msvc: 1.27.0
+      lightningcss-win32-x64-msvc: 1.27.0
+    optional: true
 
-  /lnk@1.1.0:
-    resolution: {integrity: sha512-m3q+8W+stYiJYCBwefzrU+inN9h2KxofWuxhNH1iS+MdG9MIKfDpBtbmmIKstVwussx48PXALwonyzuzZUXjQQ==}
-    engines: {node: '>=4'}
+  lines-and-columns@1.2.4: {}
+
+  lnk@1.1.0:
     dependencies:
       arrify: 1.0.1
       mkdirp: 0.5.6
       pify: 2.3.0
       rimraf: 2.7.1
-    dev: true
-
-  /load-yaml-file@0.2.0:
-    resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==}
-    engines: {node: '>=6'}
-    dependencies:
-      graceful-fs: 4.2.11
-      js-yaml: 3.14.1
-      pify: 4.0.1
-      strip-bom: 3.0.0
-    dev: true
-
-  /local-pkg@0.5.0:
-    resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
-    engines: {node: '>=14'}
-    dependencies:
-      mlly: 1.6.1
-      pkg-types: 1.0.3
-    dev: true
 
-  /localforage@1.10.0:
-    resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==}
+  localforage@1.10.0:
     dependencies:
       lie: 3.1.1
-    dev: false
-
-  /locate-path@3.0.0:
-    resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
-    engines: {node: '>=6'}
-    dependencies:
-      p-locate: 3.0.0
-      path-exists: 3.0.0
-    dev: true
 
-  /locate-path@5.0.0:
-    resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
-    engines: {node: '>=8'}
+  locate-path@5.0.0:
     dependencies:
       p-locate: 4.1.0
-    dev: true
 
-  /locate-path@6.0.0:
-    resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
-    engines: {node: '>=10'}
+  locate-path@6.0.0:
     dependencies:
       p-locate: 5.0.0
-    dev: true
-
-  /lodash.debounce@4.0.8:
-    resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
-    dev: true
 
-  /lodash.defaultsdeep@4.6.1:
-    resolution: {integrity: sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==}
-    dev: false
+  lodash.debounce@4.0.8: {}
 
-  /lodash.includes@4.3.0:
-    resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
-    dev: false
+  lodash.defaultsdeep@4.6.1: {}
 
-  /lodash.isboolean@3.0.3:
-    resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==}
-    dev: false
+  lodash.includes@4.3.0: {}
 
-  /lodash.isequal@4.5.0:
-    resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
-    dev: false
+  lodash.isboolean@3.0.3: {}
 
-  /lodash.isinteger@4.0.4:
-    resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==}
-    dev: false
+  lodash.isequal@4.5.0: {}
 
-  /lodash.isnumber@3.0.3:
-    resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==}
-    dev: false
+  lodash.isinteger@4.0.4: {}
 
-  /lodash.isplainobject@4.0.6:
-    resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
-    dev: false
+  lodash.isnumber@3.0.3: {}
 
-  /lodash.isstring@4.0.1:
-    resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
-    dev: false
+  lodash.isplainobject@4.0.6: {}
 
-  /lodash.memoize@4.1.2:
-    resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
-    dev: true
+  lodash.isstring@4.0.1: {}
 
-  /lodash.merge@4.6.2:
-    resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
-    dev: true
+  lodash.memoize@4.1.2: {}
 
-  /lodash.once@4.1.1:
-    resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
-    dev: false
+  lodash.merge@4.6.2: {}
 
-  /lodash.sortby@4.7.0:
-    resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==}
-    dev: true
+  lodash.once@4.1.1: {}
 
-  /lodash.uniq@4.5.0:
-    resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
-    dev: true
+  lodash.sortby@4.7.0: {}
 
-  /lodash@4.17.21:
-    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
-    dev: true
+  lodash.uniq@4.5.0: {}
 
-  /log-symbols@4.1.0:
-    resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
-    engines: {node: '>=10'}
-    dependencies:
-      chalk: 4.1.2
-      is-unicode-supported: 0.1.0
-    dev: true
+  lodash@4.17.21: {}
 
-  /long@5.2.3:
-    resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==}
-    dev: false
+  long@5.2.3: {}
 
-  /longest-streak@3.1.0:
-    resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
-    dev: false
+  longest-streak@3.1.0: {}
 
-  /look-it-up@2.1.0:
-    resolution: {integrity: sha512-nMoGWW2HurtuJf6XAL56FWTDCWLOTSsanrgwOyaR5Y4e3zfG5N/0cU5xWZSEU3tBxhQugRbV1xL9jb+ug7yZww==}
-    dev: true
+  look-it-up@2.1.0: {}
 
-  /loose-envify@1.4.0:
-    resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
-    hasBin: true
+  loose-envify@1.4.0:
     dependencies:
       js-tokens: 4.0.0
-    dev: true
 
-  /loupe@2.3.7:
-    resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
-    dependencies:
-      get-func-name: 2.0.2
-    dev: true
+  loupe@3.1.2: {}
 
-  /lowlight@3.1.0:
-    resolution: {integrity: sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ==}
+  lowlight@3.1.0:
     dependencies:
       '@types/hast': 3.0.4
       devlop: 1.1.0
       highlight.js: 11.9.0
-    dev: false
 
-  /lru-cache@10.2.2:
-    resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==}
-    engines: {node: 14 || >=16.14}
-    dev: true
+  lru-cache@10.4.3: {}
 
-  /lru-cache@5.1.1:
-    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+  lru-cache@5.1.1:
     dependencies:
       yallist: 3.1.1
-    dev: true
-
-  /lru-cache@6.0.0:
-    resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
-    engines: {node: '>=10'}
-    dependencies:
-      yallist: 4.0.0
 
-  /lru-cache@9.1.2:
-    resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==}
-    engines: {node: 14 || >=16.14}
-    dev: false
+  lru-cache@9.1.2: {}
 
-  /lunr@2.3.9:
-    resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==}
-    dev: true
+  lunr@2.3.9: {}
 
-  /lz-string@1.5.0:
-    resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
-    hasBin: true
-    dev: true
+  lz-string@1.5.0: {}
 
-  /magic-string@0.25.9:
-    resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
+  magic-string@0.25.9:
     dependencies:
       sourcemap-codec: 1.4.8
-    dev: true
-
-  /magic-string@0.30.8:
-    resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==}
-    engines: {node: '>=12'}
-    dependencies:
-      '@jridgewell/sourcemap-codec': 1.4.15
-    dev: true
-
-  /magicast@0.3.4:
-    resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==}
-    dependencies:
-      '@babel/parser': 7.24.7
-      '@babel/types': 7.24.7
-      source-map-js: 1.2.0
-    dev: true
 
-  /make-dir@2.1.0:
-    resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
-    engines: {node: '>=6'}
+  magic-string@0.30.11:
     dependencies:
-      pify: 4.0.1
-      semver: 5.7.2
-    dev: true
+      '@jridgewell/sourcemap-codec': 1.5.0
 
-  /make-dir@3.1.0:
-    resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
-    engines: {node: '>=8'}
+  magicast@0.3.5:
     dependencies:
-      semver: 6.3.1
-    dev: true
+      '@babel/parser': 7.25.7
+      '@babel/types': 7.25.7
+      source-map-js: 1.2.1
 
-  /make-dir@4.0.0:
-    resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
-    engines: {node: '>=10'}
+  make-dir@4.0.0:
     dependencies:
-      semver: 7.5.4
-    dev: true
+      semver: 7.6.3
 
-  /makeerror@1.0.12:
-    resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+  makeerror@1.0.12:
     dependencies:
       tmpl: 1.0.5
-    dev: true
 
-  /map-or-similar@1.5.0:
-    resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==}
-    dev: true
+  map-or-similar@1.5.0: {}
 
-  /map-stream@0.1.0:
-    resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==}
-    dev: true
+  map-stream@0.1.0: {}
 
-  /markdown-table@3.0.3:
-    resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
-    dev: false
+  markdown-table@3.0.3: {}
 
-  /markdown-to-jsx@7.4.7(react@18.3.1):
-    resolution: {integrity: sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==}
-    engines: {node: '>= 10'}
-    peerDependencies:
-      react: '>= 0.14.0'
+  markdown-to-jsx@7.5.0(react@18.3.1):
     dependencies:
       react: 18.3.1
-    dev: true
-
-  /marked@4.3.0:
-    resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==}
-    engines: {node: '>= 12'}
-    hasBin: true
-    dev: true
 
-  /mdast-util-definitions@5.1.2:
-    resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==}
-    dependencies:
-      '@types/mdast': 3.0.15
-      '@types/unist': 2.0.10
-      unist-util-visit: 4.1.2
-    dev: false
+  marked@4.3.0: {}
 
-  /mdast-util-find-and-replace@3.0.1:
-    resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==}
+  mdast-util-find-and-replace@3.0.1:
     dependencies:
-      '@types/mdast': 4.0.3
+      '@types/mdast': 4.0.4
       escape-string-regexp: 5.0.0
       unist-util-is: 6.0.0
       unist-util-visit-parents: 6.0.1
-    dev: false
 
-  /mdast-util-from-markdown@2.0.0:
-    resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==}
+  mdast-util-from-markdown@2.0.1:
     dependencies:
-      '@types/mdast': 4.0.3
-      '@types/unist': 3.0.2
+      '@types/mdast': 4.0.4
+      '@types/unist': 3.0.3
       decode-named-character-reference: 1.0.2
       devlop: 1.1.0
       mdast-util-to-string: 4.0.0
@@ -12413,68 +12767,56 @@ packages:
       unist-util-stringify-position: 4.0.0
     transitivePeerDependencies:
       - supports-color
-    dev: false
 
-  /mdast-util-gfm-autolink-literal@2.0.0:
-    resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==}
+  mdast-util-gfm-autolink-literal@2.0.1:
     dependencies:
-      '@types/mdast': 4.0.3
+      '@types/mdast': 4.0.4
       ccount: 2.0.1
       devlop: 1.1.0
       mdast-util-find-and-replace: 3.0.1
       micromark-util-character: 2.1.0
-    dev: false
 
-  /mdast-util-gfm-footnote@2.0.0:
-    resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==}
+  mdast-util-gfm-footnote@2.0.0:
     dependencies:
-      '@types/mdast': 4.0.3
+      '@types/mdast': 4.0.4
       devlop: 1.1.0
-      mdast-util-from-markdown: 2.0.0
+      mdast-util-from-markdown: 2.0.1
       mdast-util-to-markdown: 2.1.0
       micromark-util-normalize-identifier: 2.0.0
     transitivePeerDependencies:
       - supports-color
-    dev: false
 
-  /mdast-util-gfm-strikethrough@2.0.0:
-    resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+  mdast-util-gfm-strikethrough@2.0.0:
     dependencies:
-      '@types/mdast': 4.0.3
-      mdast-util-from-markdown: 2.0.0
+      '@types/mdast': 4.0.4
+      mdast-util-from-markdown: 2.0.1
       mdast-util-to-markdown: 2.1.0
     transitivePeerDependencies:
       - supports-color
-    dev: false
 
-  /mdast-util-gfm-table@2.0.0:
-    resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
+  mdast-util-gfm-table@2.0.0:
     dependencies:
-      '@types/mdast': 4.0.3
+      '@types/mdast': 4.0.4
       devlop: 1.1.0
       markdown-table: 3.0.3
-      mdast-util-from-markdown: 2.0.0
+      mdast-util-from-markdown: 2.0.1
       mdast-util-to-markdown: 2.1.0
     transitivePeerDependencies:
       - supports-color
-    dev: false
 
-  /mdast-util-gfm-task-list-item@2.0.0:
-    resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
+  mdast-util-gfm-task-list-item@2.0.0:
     dependencies:
-      '@types/mdast': 4.0.3
+      '@types/mdast': 4.0.4
       devlop: 1.1.0
-      mdast-util-from-markdown: 2.0.0
+      mdast-util-from-markdown: 2.0.1
       mdast-util-to-markdown: 2.1.0
     transitivePeerDependencies:
       - supports-color
-    dev: false
 
-  /mdast-util-gfm@3.0.0:
-    resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==}
+  mdast-util-gfm@3.0.0:
     dependencies:
-      mdast-util-from-markdown: 2.0.0
-      mdast-util-gfm-autolink-literal: 2.0.0
+      mdast-util-from-markdown: 2.0.1
+      mdast-util-gfm-autolink-literal: 2.0.1
       mdast-util-gfm-footnote: 2.0.0
       mdast-util-gfm-strikethrough: 2.0.0
       mdast-util-gfm-table: 2.0.0
@@ -12482,139 +12824,86 @@ packages:
       mdast-util-to-markdown: 2.1.0
     transitivePeerDependencies:
       - supports-color
-    dev: false
 
-  /mdast-util-math@3.0.0:
-    resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==}
+  mdast-util-math@3.0.0:
     dependencies:
       '@types/hast': 3.0.4
-      '@types/mdast': 4.0.3
+      '@types/mdast': 4.0.4
       devlop: 1.1.0
       longest-streak: 3.1.0
-      mdast-util-from-markdown: 2.0.0
+      mdast-util-from-markdown: 2.0.1
       mdast-util-to-markdown: 2.1.0
       unist-util-remove-position: 5.0.0
     transitivePeerDependencies:
       - supports-color
-    dev: false
 
-  /mdast-util-newline-to-break@2.0.0:
-    resolution: {integrity: sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==}
+  mdast-util-newline-to-break@2.0.0:
     dependencies:
-      '@types/mdast': 4.0.3
+      '@types/mdast': 4.0.4
       mdast-util-find-and-replace: 3.0.1
-    dev: false
 
-  /mdast-util-phrasing@4.1.0:
-    resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+  mdast-util-phrasing@4.1.0:
     dependencies:
-      '@types/mdast': 4.0.3
+      '@types/mdast': 4.0.4
       unist-util-is: 6.0.0
-    dev: false
-
-  /mdast-util-to-hast@12.3.0:
-    resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==}
-    dependencies:
-      '@types/hast': 2.3.10
-      '@types/mdast': 3.0.15
-      mdast-util-definitions: 5.1.2
-      micromark-util-sanitize-uri: 1.2.0
-      trim-lines: 3.0.1
-      unist-util-generated: 2.0.1
-      unist-util-position: 4.0.4
-      unist-util-visit: 4.1.2
-    dev: false
 
-  /mdast-util-to-hast@13.1.0:
-    resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==}
+  mdast-util-to-hast@13.2.0:
     dependencies:
       '@types/hast': 3.0.4
-      '@types/mdast': 4.0.3
+      '@types/mdast': 4.0.4
       '@ungap/structured-clone': 1.2.0
       devlop: 1.1.0
       micromark-util-sanitize-uri: 2.0.0
       trim-lines: 3.0.1
       unist-util-position: 5.0.0
       unist-util-visit: 5.0.0
-      vfile: 6.0.1
+      vfile: 6.0.3
 
-  /mdast-util-to-markdown@2.1.0:
-    resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==}
+  mdast-util-to-markdown@2.1.0:
     dependencies:
-      '@types/mdast': 4.0.3
-      '@types/unist': 3.0.2
+      '@types/mdast': 4.0.4
+      '@types/unist': 3.0.3
       longest-streak: 3.1.0
       mdast-util-phrasing: 4.1.0
       mdast-util-to-string: 4.0.0
       micromark-util-decode-string: 2.0.0
       unist-util-visit: 5.0.0
       zwitch: 2.0.4
-    dev: false
 
-  /mdast-util-to-string@4.0.0:
-    resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+  mdast-util-to-string@4.0.0:
     dependencies:
-      '@types/mdast': 4.0.3
-    dev: false
+      '@types/mdast': 4.0.4
 
-  /mdn-data@2.0.28:
-    resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
-    dev: true
+  mdn-data@2.0.28: {}
 
-  /mdn-data@2.0.30:
-    resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
-    dev: true
+  mdn-data@2.0.30: {}
 
-  /media-typer@0.3.0:
-    resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
-    engines: {node: '>= 0.6'}
-    dev: true
+  media-typer@0.3.0: {}
 
-  /memoizerific@1.11.3:
-    resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==}
+  memoizerific@1.11.3:
     dependencies:
       map-or-similar: 1.5.0
-    dev: true
 
-  /memory-fs@0.5.0:
-    resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==}
-    engines: {node: '>=4.3.0 <5.0.0 || >=5.10'}
+  memory-fs@0.5.0:
     dependencies:
       errno: 0.1.8
-      readable-stream: 2.3.7
-    dev: true
+      readable-stream: 2.3.8
 
-  /merge-anything@5.1.7:
-    resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==}
-    engines: {node: '>=12.13'}
+  merge-anything@5.1.7:
     dependencies:
       is-what: 4.1.16
-    dev: true
 
-  /merge-descriptors@1.0.1:
-    resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
-    dev: true
+  merge-descriptors@1.0.3: {}
 
-  /merge-stream@2.0.0:
-    resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
-    dev: true
+  merge-stream@2.0.0: {}
 
-  /merge2@1.4.1:
-    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
-    engines: {node: '>= 8'}
-    dev: true
+  merge2@1.4.1: {}
 
-  /methods@1.1.2:
-    resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
-    engines: {node: '>= 0.6'}
-    dev: true
+  methods@1.1.2: {}
 
-  /microdiff@1.3.2:
-    resolution: {integrity: sha512-pKy60S2febliZIbwdfEQKTtL5bLNxOyiRRmD400gueYl9XcHyNGxzHSlJWn9IMHwYXT0yohPYL08+bGozVk8cQ==}
-    dev: true
+  microdiff@1.3.2: {}
 
-  /micromark-core-commonmark@2.0.0:
-    resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==}
+  micromark-core-commonmark@2.0.1:
     dependencies:
       decode-named-character-reference: 1.0.2
       devlop: 1.1.0
@@ -12629,35 +12918,29 @@ packages:
       micromark-util-html-tag-name: 2.0.0
       micromark-util-normalize-identifier: 2.0.0
       micromark-util-resolve-all: 2.0.0
-      micromark-util-subtokenize: 2.0.0
+      micromark-util-subtokenize: 2.0.1
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-extension-gfm-autolink-literal@2.0.0:
-    resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==}
+  micromark-extension-gfm-autolink-literal@2.1.0:
     dependencies:
       micromark-util-character: 2.1.0
       micromark-util-sanitize-uri: 2.0.0
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-extension-gfm-footnote@2.0.0:
-    resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==}
+  micromark-extension-gfm-footnote@2.1.0:
     dependencies:
       devlop: 1.1.0
-      micromark-core-commonmark: 2.0.0
+      micromark-core-commonmark: 2.0.1
       micromark-factory-space: 2.0.0
       micromark-util-character: 2.1.0
       micromark-util-normalize-identifier: 2.0.0
       micromark-util-sanitize-uri: 2.0.0
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-extension-gfm-strikethrough@2.0.0:
-    resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==}
+  micromark-extension-gfm-strikethrough@2.1.0:
     dependencies:
       devlop: 1.1.0
       micromark-util-chunked: 2.0.0
@@ -12665,219 +12948,147 @@ packages:
       micromark-util-resolve-all: 2.0.0
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-extension-gfm-table@2.0.0:
-    resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==}
+  micromark-extension-gfm-table@2.1.0:
     dependencies:
       devlop: 1.1.0
       micromark-factory-space: 2.0.0
       micromark-util-character: 2.1.0
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-extension-gfm-tagfilter@2.0.0:
-    resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
+  micromark-extension-gfm-tagfilter@2.0.0:
     dependencies:
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-extension-gfm-task-list-item@2.0.1:
-    resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==}
+  micromark-extension-gfm-task-list-item@2.1.0:
     dependencies:
       devlop: 1.1.0
       micromark-factory-space: 2.0.0
       micromark-util-character: 2.1.0
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-extension-gfm@3.0.0:
-    resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+  micromark-extension-gfm@3.0.0:
     dependencies:
-      micromark-extension-gfm-autolink-literal: 2.0.0
-      micromark-extension-gfm-footnote: 2.0.0
-      micromark-extension-gfm-strikethrough: 2.0.0
-      micromark-extension-gfm-table: 2.0.0
+      micromark-extension-gfm-autolink-literal: 2.1.0
+      micromark-extension-gfm-footnote: 2.1.0
+      micromark-extension-gfm-strikethrough: 2.1.0
+      micromark-extension-gfm-table: 2.1.0
       micromark-extension-gfm-tagfilter: 2.0.0
-      micromark-extension-gfm-task-list-item: 2.0.1
+      micromark-extension-gfm-task-list-item: 2.1.0
       micromark-util-combine-extensions: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-extension-math@3.0.0:
-    resolution: {integrity: sha512-iJ2Q28vBoEovLN5o3GO12CpqorQRYDPT+p4zW50tGwTfJB+iv/VnB6Ini+gqa24K97DwptMBBIvVX6Bjk49oyQ==}
+  micromark-extension-math@3.1.0:
     dependencies:
       '@types/katex': 0.16.7
       devlop: 1.1.0
-      katex: 0.16.9
+      katex: 0.16.11
       micromark-factory-space: 2.0.0
       micromark-util-character: 2.1.0
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-factory-destination@2.0.0:
-    resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==}
+  micromark-factory-destination@2.0.0:
     dependencies:
       micromark-util-character: 2.1.0
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-factory-label@2.0.0:
-    resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==}
+  micromark-factory-label@2.0.0:
     dependencies:
       devlop: 1.1.0
       micromark-util-character: 2.1.0
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-factory-space@2.0.0:
-    resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==}
+  micromark-factory-space@2.0.0:
     dependencies:
       micromark-util-character: 2.1.0
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-factory-title@2.0.0:
-    resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==}
+  micromark-factory-title@2.0.0:
     dependencies:
       micromark-factory-space: 2.0.0
       micromark-util-character: 2.1.0
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-factory-whitespace@2.0.0:
-    resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==}
+  micromark-factory-whitespace@2.0.0:
     dependencies:
       micromark-factory-space: 2.0.0
       micromark-util-character: 2.1.0
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
-
-  /micromark-util-character@1.2.0:
-    resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==}
-    dependencies:
-      micromark-util-symbol: 1.1.0
-      micromark-util-types: 1.1.0
-    dev: false
 
-  /micromark-util-character@2.1.0:
-    resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==}
+  micromark-util-character@2.1.0:
     dependencies:
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
 
-  /micromark-util-chunked@2.0.0:
-    resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==}
+  micromark-util-chunked@2.0.0:
     dependencies:
       micromark-util-symbol: 2.0.0
-    dev: false
 
-  /micromark-util-classify-character@2.0.0:
-    resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==}
+  micromark-util-classify-character@2.0.0:
     dependencies:
       micromark-util-character: 2.1.0
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-util-combine-extensions@2.0.0:
-    resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==}
+  micromark-util-combine-extensions@2.0.0:
     dependencies:
       micromark-util-chunked: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
 
-  /micromark-util-decode-numeric-character-reference@2.0.1:
-    resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==}
+  micromark-util-decode-numeric-character-reference@2.0.1:
     dependencies:
       micromark-util-symbol: 2.0.0
-    dev: false
 
-  /micromark-util-decode-string@2.0.0:
-    resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==}
+  micromark-util-decode-string@2.0.0:
     dependencies:
       decode-named-character-reference: 1.0.2
       micromark-util-character: 2.1.0
       micromark-util-decode-numeric-character-reference: 2.0.1
       micromark-util-symbol: 2.0.0
-    dev: false
-
-  /micromark-util-encode@1.1.0:
-    resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==}
-    dev: false
 
-  /micromark-util-encode@2.0.0:
-    resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==}
+  micromark-util-encode@2.0.0: {}
 
-  /micromark-util-html-tag-name@2.0.0:
-    resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==}
-    dev: false
+  micromark-util-html-tag-name@2.0.0: {}
 
-  /micromark-util-normalize-identifier@2.0.0:
-    resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==}
+  micromark-util-normalize-identifier@2.0.0:
     dependencies:
       micromark-util-symbol: 2.0.0
-    dev: false
 
-  /micromark-util-resolve-all@2.0.0:
-    resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==}
+  micromark-util-resolve-all@2.0.0:
     dependencies:
       micromark-util-types: 2.0.0
-    dev: false
-
-  /micromark-util-sanitize-uri@1.2.0:
-    resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==}
-    dependencies:
-      micromark-util-character: 1.2.0
-      micromark-util-encode: 1.1.0
-      micromark-util-symbol: 1.1.0
-    dev: false
 
-  /micromark-util-sanitize-uri@2.0.0:
-    resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==}
+  micromark-util-sanitize-uri@2.0.0:
     dependencies:
       micromark-util-character: 2.1.0
       micromark-util-encode: 2.0.0
       micromark-util-symbol: 2.0.0
 
-  /micromark-util-subtokenize@2.0.0:
-    resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==}
+  micromark-util-subtokenize@2.0.1:
     dependencies:
       devlop: 1.1.0
       micromark-util-chunked: 2.0.0
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
-    dev: false
-
-  /micromark-util-symbol@1.1.0:
-    resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==}
-    dev: false
-
-  /micromark-util-symbol@2.0.0:
-    resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==}
 
-  /micromark-util-types@1.1.0:
-    resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==}
-    dev: false
+  micromark-util-symbol@2.0.0: {}
 
-  /micromark-util-types@2.0.0:
-    resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==}
+  micromark-util-types@2.0.0: {}
 
-  /micromark@4.0.0:
-    resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==}
+  micromark@4.0.0:
     dependencies:
       '@types/debug': 4.1.12
-      debug: 4.3.4
+      debug: 4.3.7
       decode-named-character-reference: 1.0.2
       devlop: 1.1.0
-      micromark-core-commonmark: 2.0.0
+      micromark-core-commonmark: 2.0.1
       micromark-factory-space: 2.0.0
       micromark-util-character: 2.1.0
       micromark-util-chunked: 2.0.0
@@ -12887,308 +13098,123 @@ packages:
       micromark-util-normalize-identifier: 2.0.0
       micromark-util-resolve-all: 2.0.0
       micromark-util-sanitize-uri: 2.0.0
-      micromark-util-subtokenize: 2.0.0
+      micromark-util-subtokenize: 2.0.1
       micromark-util-symbol: 2.0.0
       micromark-util-types: 2.0.0
     transitivePeerDependencies:
       - supports-color
-    dev: false
 
-  /micromatch@4.0.5:
-    resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
-    engines: {node: '>=8.6'}
+  micromatch@4.0.8:
     dependencies:
-      braces: 3.0.2
+      braces: 3.0.3
       picomatch: 2.3.1
-    dev: true
 
-  /mime-db@1.52.0:
-    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
-    engines: {node: '>= 0.6'}
-    dev: true
+  mime-db@1.52.0: {}
 
-  /mime-types@2.1.35:
-    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
-    engines: {node: '>= 0.6'}
+  mime-types@2.1.35:
     dependencies:
       mime-db: 1.52.0
-    dev: true
-
-  /mime@1.6.0:
-    resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
-    engines: {node: '>=4'}
-    hasBin: true
-    dev: true
 
-  /mimic-fn@2.1.0:
-    resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
-    engines: {node: '>=6'}
-    dev: true
+  mime@1.6.0: {}
 
-  /mimic-fn@4.0.0:
-    resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
-    engines: {node: '>=12'}
-    dev: true
+  mimic-fn@2.1.0: {}
 
-  /min-indent@1.0.1:
-    resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
-    engines: {node: '>=4'}
-    dev: true
+  min-indent@1.0.1: {}
 
-  /minimatch@3.1.2:
-    resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+  minimatch@3.1.2:
     dependencies:
       brace-expansion: 1.1.11
-    dev: true
 
-  /minimatch@5.1.6:
-    resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
-    engines: {node: '>=10'}
+  minimatch@5.1.6:
     dependencies:
       brace-expansion: 2.0.1
-    dev: true
 
-  /minimatch@9.0.4:
-    resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==}
-    engines: {node: '>=16 || 14 >=14.17'}
+  minimatch@9.0.5:
     dependencies:
       brace-expansion: 2.0.1
-    dev: true
-
-  /minimist@1.2.8:
-    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
-    dev: true
-
-  /minipass@3.3.6:
-    resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
-    engines: {node: '>=8'}
-    dependencies:
-      yallist: 4.0.0
-    dev: true
-
-  /minipass@5.0.0:
-    resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /minipass@7.1.2:
-    resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
-    engines: {node: '>=16 || 14 >=14.17'}
-    dev: true
 
-  /minizlib@2.1.2:
-    resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
-    engines: {node: '>= 8'}
-    dependencies:
-      minipass: 3.3.6
-      yallist: 4.0.0
-    dev: true
+  minimist@1.2.8: {}
 
-  /mkdirp-classic@0.5.3:
-    resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
-    dev: true
+  minipass@7.1.2: {}
 
-  /mkdirp@0.5.6:
-    resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
-    hasBin: true
+  mkdirp@0.5.6:
     dependencies:
       minimist: 1.2.8
-    dev: true
-
-  /mkdirp@1.0.4:
-    resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
-    engines: {node: '>=10'}
-    hasBin: true
-    dev: true
 
-  /mkdirp@3.0.1:
-    resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==}
-    engines: {node: '>=10'}
-    hasBin: true
-    dev: true
+  mkdirp@3.0.1: {}
 
-  /mlly@1.6.1:
-    resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==}
+  mlly@1.7.2:
     dependencies:
-      acorn: 8.11.3
+      acorn: 8.12.1
       pathe: 1.1.2
-      pkg-types: 1.0.3
-      ufo: 1.5.1
-    dev: true
-
-  /mrmime@2.0.0:
-    resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
-    engines: {node: '>=10'}
-    dev: true
+      pkg-types: 1.2.1
+      ufo: 1.5.4
 
-  /ms@2.0.0:
-    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
-    dev: true
-
-  /ms@2.1.2:
-    resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
-
-  /ms@2.1.3:
-    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+  mrmime@2.0.0: {}
 
-  /nanoid@3.3.7:
-    resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
-    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
-    hasBin: true
-    dev: true
+  ms@2.0.0: {}
 
-  /natural-compare-lite@1.4.0:
-    resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
-    dev: true
+  ms@2.1.3: {}
 
-  /natural-compare@1.4.0:
-    resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
-    dev: true
+  nanoid@3.3.7: {}
 
-  /negotiator@0.6.3:
-    resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
-    engines: {node: '>= 0.6'}
-    dev: true
+  natural-compare-lite@1.4.0: {}
 
-  /neo-async@2.6.2:
-    resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
-    dev: true
+  natural-compare@1.4.0: {}
 
-  /node-cleanup@2.1.2:
-    resolution: {integrity: sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==}
-    dev: true
+  negotiator@0.6.3: {}
 
-  /node-dir@0.1.17:
-    resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==}
-    engines: {node: '>= 0.10.5'}
-    dependencies:
-      minimatch: 3.1.2
-    dev: true
+  node-cleanup@2.1.2: {}
 
-  /node-eval@2.0.0:
-    resolution: {integrity: sha512-Ap+L9HznXAVeJj3TJ1op6M6bg5xtTq8L5CU/PJxtkhea/DrIxdTknGKIECKd/v/Lgql95iuMAYvIzBNd0pmcMg==}
-    engines: {node: '>= 4'}
+  node-eval@2.0.0:
     dependencies:
       path-is-absolute: 1.0.1
-    dev: true
 
-  /node-fetch-native@1.6.4:
-    resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==}
-    dev: true
-
-  /node-fetch@2.7.0:
-    resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
-    engines: {node: 4.x || >=6.0.0}
-    peerDependencies:
-      encoding: ^0.1.0
-    peerDependenciesMeta:
-      encoding:
-        optional: true
+  node-fetch@2.7.0:
     dependencies:
       whatwg-url: 5.0.0
 
-  /node-int64@0.4.0:
-    resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
-    dev: true
-
-  /node-releases@2.0.14:
-    resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
-    dev: true
+  node-int64@0.4.0: {}
 
-  /normalize-package-data@2.5.0:
-    resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
-    dependencies:
-      hosted-git-info: 2.8.9
-      resolve: 1.22.8
-      semver: 5.7.2
-      validate-npm-package-license: 3.0.4
-    dev: true
+  node-releases@2.0.18: {}
 
-  /normalize-path@3.0.0:
-    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
-    engines: {node: '>=0.10.0'}
-    dev: true
+  normalize-path@3.0.0: {}
 
-  /npm-run-path@4.0.1:
-    resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
-    engines: {node: '>=8'}
+  npm-run-path@4.0.1:
     dependencies:
       path-key: 3.1.1
-    dev: true
 
-  /npm-run-path@5.3.0:
-    resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
-    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-    dependencies:
-      path-key: 4.0.0
-    dev: true
-
-  /nth-check@2.1.1:
-    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+  nth-check@2.1.1:
     dependencies:
       boolbase: 1.0.0
 
-  /nwsapi@2.2.7:
-    resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==}
-    dev: true
+  nwsapi@2.2.13: {}
 
-  /nypm@0.3.8:
-    resolution: {integrity: sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==}
-    engines: {node: ^14.16.0 || >=16.10.0}
-    hasBin: true
-    dependencies:
-      citty: 0.1.6
-      consola: 3.2.3
-      execa: 8.0.1
-      pathe: 1.1.2
-      ufo: 1.5.1
-    dev: true
-
-  /object-inspect@1.13.1:
-    resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
-    dev: true
+  object-inspect@1.13.2: {}
 
-  /object-is@1.1.6:
-    resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
-    engines: {node: '>= 0.4'}
+  object-is@1.1.6:
     dependencies:
       call-bind: 1.0.7
       define-properties: 1.2.1
-    dev: true
 
-  /object-keys@1.1.1:
-    resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
-    engines: {node: '>= 0.4'}
-    dev: true
+  object-keys@1.1.1: {}
 
-  /object-path@0.11.8:
-    resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==}
-    engines: {node: '>= 10.12.0'}
-    dev: true
+  object-path@0.11.8: {}
 
-  /object.assign@4.1.4:
-    resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
-    engines: {node: '>= 0.4'}
+  object.assign@4.1.5:
     dependencies:
       call-bind: 1.0.7
-      define-properties: 1.2.0
+      define-properties: 1.2.1
       has-symbols: 1.0.3
       object-keys: 1.1.1
-    dev: true
 
-  /object.assign@4.1.5:
-    resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
-    engines: {node: '>= 0.4'}
+  object.values@1.2.0:
     dependencies:
       call-bind: 1.0.7
       define-properties: 1.2.1
-      has-symbols: 1.0.3
-      object-keys: 1.1.1
-    dev: true
+      es-object-atoms: 1.0.0
 
-  /octokit@2.1.0:
-    resolution: {integrity: sha512-Pxi6uKTjBRZWgAwsw1NgHdRlL+QASCN35OYS7X79o7PtBME0CLXEroZmPtEwlWZbPTP+iDbEy2wCbSOgm0uGIQ==}
-    engines: {node: '>= 14'}
+  octokit@2.1.0:
     dependencies:
       '@octokit/app': 13.1.8
       '@octokit/core': 4.2.4
@@ -13201,731 +13227,302 @@ packages:
       '@octokit/types': 9.3.2
     transitivePeerDependencies:
       - encoding
-    dev: false
-
-  /ohash@1.1.3:
-    resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==}
-    dev: true
 
-  /on-finished@2.4.1:
-    resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
-    engines: {node: '>= 0.8'}
+  on-finished@2.4.1:
     dependencies:
       ee-first: 1.1.1
-    dev: true
-
-  /on-headers@1.0.2:
-    resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==}
-    engines: {node: '>= 0.8'}
-    dev: true
 
-  /once@1.4.0:
-    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+  once@1.4.0:
     dependencies:
       wrappy: 1.0.2
 
-  /onetime@5.1.2:
-    resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
-    engines: {node: '>=6'}
+  onetime@5.1.2:
     dependencies:
       mimic-fn: 2.1.0
-    dev: true
 
-  /onetime@6.0.0:
-    resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
-    engines: {node: '>=12'}
+  oniguruma-to-js@0.4.3:
     dependencies:
-      mimic-fn: 4.0.0
-    dev: true
+      regex: 4.3.3
 
-  /open@10.1.0:
-    resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==}
-    engines: {node: '>=18'}
+  open@10.1.0:
     dependencies:
       default-browser: 5.2.1
       define-lazy-prop: 3.0.0
       is-inside-container: 1.0.0
       is-wsl: 3.1.0
-    dev: true
 
-  /open@8.4.2:
-    resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
-    engines: {node: '>=12'}
+  open@8.4.2:
     dependencies:
       define-lazy-prop: 2.0.0
       is-docker: 2.2.1
       is-wsl: 2.2.0
-    dev: true
 
-  /optionator@0.8.3:
-    resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      deep-is: 0.1.4
-      fast-levenshtein: 2.0.6
-      levn: 0.3.0
-      prelude-ls: 1.1.2
-      type-check: 0.3.2
-      word-wrap: 1.2.3
-    dev: true
-
-  /optionator@0.9.3:
-    resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
-    engines: {node: '>= 0.8.0'}
+  optionator@0.9.4:
     dependencies:
-      '@aashutoshrathi/word-wrap': 1.2.6
       deep-is: 0.1.4
       fast-levenshtein: 2.0.6
       levn: 0.4.1
       prelude-ls: 1.2.1
       type-check: 0.4.0
-    dev: true
-
-  /ora@5.4.1:
-    resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
-    engines: {node: '>=10'}
-    dependencies:
-      bl: 4.1.0
-      chalk: 4.1.2
-      cli-cursor: 3.1.0
-      cli-spinners: 2.9.2
-      is-interactive: 1.0.0
-      is-unicode-supported: 0.1.0
-      log-symbols: 4.1.0
-      strip-ansi: 6.0.1
-      wcwidth: 1.0.1
-    dev: true
+      word-wrap: 1.2.5
 
-  /outdent@0.8.0:
-    resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==}
-    dev: true
+  outdent@0.8.0: {}
 
-  /p-limit@2.3.0:
-    resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
-    engines: {node: '>=6'}
+  p-limit@2.3.0:
     dependencies:
       p-try: 2.2.0
-    dev: true
 
-  /p-limit@3.1.0:
-    resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
-    engines: {node: '>=10'}
+  p-limit@3.1.0:
     dependencies:
       yocto-queue: 0.1.0
-    dev: true
-
-  /p-limit@5.0.0:
-    resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==}
-    engines: {node: '>=18'}
-    dependencies:
-      yocto-queue: 1.0.0
-    dev: true
-
-  /p-locate@3.0.0:
-    resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
-    engines: {node: '>=6'}
-    dependencies:
-      p-limit: 2.3.0
-    dev: true
 
-  /p-locate@4.1.0:
-    resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
-    engines: {node: '>=8'}
+  p-locate@4.1.0:
     dependencies:
       p-limit: 2.3.0
-    dev: true
 
-  /p-locate@5.0.0:
-    resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
-    engines: {node: '>=10'}
+  p-locate@5.0.0:
     dependencies:
       p-limit: 3.1.0
-    dev: true
 
-  /p-try@2.2.0:
-    resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
-    engines: {node: '>=6'}
-    dev: true
+  p-try@2.2.0: {}
 
-  /pako@0.2.9:
-    resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==}
-    dev: true
+  package-json-from-dist@1.0.1: {}
 
-  /parent-module@1.0.1:
-    resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
-    engines: {node: '>=6'}
+  package-manager-detector@0.1.0: {}
+
+  parent-module@1.0.1:
     dependencies:
       callsites: 3.1.0
-    dev: true
 
-  /parse-json@5.2.0:
-    resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
-    engines: {node: '>=8'}
+  parse-json@5.2.0:
     dependencies:
-      '@babel/code-frame': 7.24.7
+      '@babel/code-frame': 7.25.7
       error-ex: 1.3.2
       json-parse-even-better-errors: 2.3.1
       lines-and-columns: 1.2.4
-    dev: true
 
-  /parse5@6.0.1:
-    resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
-    dev: true
+  parse5@6.0.1: {}
 
-  /parse5@7.1.2:
-    resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
+  parse5@7.1.2:
     dependencies:
       entities: 4.5.0
 
-  /parseurl@1.3.3:
-    resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
-    engines: {node: '>= 0.8'}
-    dev: true
-
-  /path-browserify@1.0.1:
-    resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
-    dev: true
-
-  /path-exists@3.0.0:
-    resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
-    engines: {node: '>=4'}
-    dev: true
+  parseurl@1.3.3: {}
 
-  /path-exists@4.0.0:
-    resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
-    engines: {node: '>=8'}
-    dev: true
+  path-browserify@1.0.1: {}
 
-  /path-is-absolute@1.0.1:
-    resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
-    engines: {node: '>=0.10.0'}
-    dev: true
+  path-exists@4.0.0: {}
 
-  /path-key@3.1.1:
-    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
-    engines: {node: '>=8'}
-    dev: true
+  path-is-absolute@1.0.1: {}
 
-  /path-key@4.0.0:
-    resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
-    engines: {node: '>=12'}
-    dev: true
+  path-key@3.1.1: {}
 
-  /path-parse@1.0.7:
-    resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
-    dev: true
+  path-parse@1.0.7: {}
 
-  /path-scurry@1.11.1:
-    resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
-    engines: {node: '>=16 || 14 >=14.18'}
+  path-scurry@1.11.1:
     dependencies:
-      lru-cache: 10.2.2
+      lru-cache: 10.4.3
       minipass: 7.1.2
-    dev: true
-
-  /path-to-regexp@0.1.7:
-    resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
-    dev: true
 
-  /path-type@4.0.0:
-    resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
-    engines: {node: '>=8'}
-    dev: true
+  path-to-regexp@0.1.10: {}
 
-  /path-type@5.0.0:
-    resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==}
-    engines: {node: '>=12'}
-    dev: true
+  path-type@4.0.0: {}
 
-  /pathe@1.1.2:
-    resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
-    dev: true
+  pathe@1.1.2: {}
 
-  /pathval@1.1.1:
-    resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
-    dev: true
+  pathval@2.0.0: {}
 
-  /pause-stream@0.0.11:
-    resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==}
+  pause-stream@0.0.11:
     dependencies:
       through: 2.3.8
-    dev: true
-
-  /peek-stream@1.1.3:
-    resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==}
-    dependencies:
-      buffer-from: 1.1.2
-      duplexify: 3.7.1
-      through2: 2.0.5
-    dev: true
 
-  /perfect-debounce@1.0.0:
-    resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
-    dev: true
-
-  /picocolors@1.0.0:
-    resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
-    dev: true
-
-  /picomatch@2.3.1:
-    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
-    engines: {node: '>=8.6'}
-    dev: true
+  perfect-debounce@1.0.0: {}
 
-  /pify@2.3.0:
-    resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
-    engines: {node: '>=0.10.0'}
-    dev: true
+  picocolors@1.1.0: {}
 
-  /pify@4.0.1:
-    resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
-    engines: {node: '>=6'}
-    dev: true
+  picomatch@2.3.1: {}
 
-  /pirates@4.0.5:
-    resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
-    engines: {node: '>= 6'}
-    dev: true
+  picomatch@4.0.2: {}
 
-  /pirates@4.0.6:
-    resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
-    engines: {node: '>= 6'}
-    dev: true
+  pify@2.3.0: {}
 
-  /pkg-dir@3.0.0:
-    resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==}
-    engines: {node: '>=6'}
-    dependencies:
-      find-up: 3.0.0
-    dev: true
+  pirates@4.0.6: {}
 
-  /pkg-dir@4.2.0:
-    resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
-    engines: {node: '>=8'}
+  pkg-dir@4.2.0:
     dependencies:
       find-up: 4.1.0
-    dev: true
 
-  /pkg-dir@5.0.0:
-    resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==}
-    engines: {node: '>=10'}
+  pkg-types@1.0.3:
     dependencies:
-      find-up: 5.0.0
-    dev: true
+      jsonc-parser: 3.3.1
+      mlly: 1.7.2
+      pathe: 1.1.2
 
-  /pkg-types@1.0.3:
-    resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
+  pkg-types@1.2.1:
     dependencies:
-      jsonc-parser: 3.2.1
-      mlly: 1.6.1
+      confbox: 0.1.8
+      mlly: 1.7.2
       pathe: 1.1.2
-    dev: true
 
-  /pluralize@8.0.0:
-    resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
-    engines: {node: '>=4'}
-    dev: true
+  pluralize@8.0.0: {}
 
-  /polished@4.3.1:
-    resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==}
-    engines: {node: '>=10'}
+  polished@4.3.1:
     dependencies:
-      '@babel/runtime': 7.24.0
-    dev: true
+      '@babel/runtime': 7.25.7
 
-  /possible-typed-array-names@1.0.0:
-    resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
-    engines: {node: '>= 0.4'}
-    dev: true
+  possible-typed-array-names@1.0.0: {}
 
-  /postcss-discard-duplicates@6.0.1(postcss@8.4.35):
-    resolution: {integrity: sha512-1hvUs76HLYR8zkScbwyJ8oJEugfPV+WchpnA+26fpJ7Smzs51CzGBHC32RS03psuX/2l0l0UKh2StzNxOrKCYg==}
-    engines: {node: ^14 || ^16 || >=18.0}
-    peerDependencies:
-      postcss: ^8.4.31
+  postcss-discard-duplicates@7.0.1(postcss@8.4.47):
     dependencies:
-      postcss: 8.4.35
-    dev: true
+      postcss: 8.4.47
 
-  /postcss-discard-empty@6.0.1(postcss@8.4.35):
-    resolution: {integrity: sha512-yitcmKwmVWtNsrrRqGJ7/C0YRy53i0mjexBDQ9zYxDwTWVBgbU4+C9jIZLmQlTDT9zhml+u0OMFJh8+31krmOg==}
-    engines: {node: ^14 || ^16 || >=18.0}
-    peerDependencies:
-      postcss: ^8.4.31
+  postcss-discard-empty@7.0.0(postcss@8.4.47):
     dependencies:
-      postcss: 8.4.35
-    dev: true
+      postcss: 8.4.47
 
-  /postcss-merge-rules@6.0.3(postcss@8.4.35):
-    resolution: {integrity: sha512-yfkDqSHGohy8sGYIJwBmIGDv4K4/WrJPX355XrxQb/CSsT4Kc/RxDi6akqn5s9bap85AWgv21ArcUWwWdGNSHA==}
-    engines: {node: ^14 || ^16 || >=18.0}
-    peerDependencies:
-      postcss: ^8.4.31
+  postcss-merge-rules@7.0.2(postcss@8.4.47):
     dependencies:
-      browserslist: 4.23.0
+      browserslist: 4.23.3
       caniuse-api: 3.0.0
-      cssnano-utils: 4.0.2(postcss@8.4.35)
-      postcss: 8.4.35
-      postcss-selector-parser: 6.0.15
-    dev: true
+      cssnano-utils: 5.0.0(postcss@8.4.47)
+      postcss: 8.4.47
+      postcss-selector-parser: 6.1.1
 
-  /postcss-minify-selectors@6.0.2(postcss@8.4.35):
-    resolution: {integrity: sha512-0b+m+w7OAvZejPQdN2GjsXLv5o0jqYHX3aoV0e7RBKPCsB7TYG5KKWBFhGnB/iP3213Ts8c5H4wLPLMm7z28Sg==}
-    engines: {node: ^14 || ^16 || >=18.0}
-    peerDependencies:
-      postcss: ^8.4.31
+  postcss-minify-selectors@7.0.2(postcss@8.4.47):
     dependencies:
-      postcss: 8.4.35
-      postcss-selector-parser: 6.0.15
-    dev: true
+      cssesc: 3.0.0
+      postcss: 8.4.47
+      postcss-selector-parser: 6.1.1
 
-  /postcss-nested@6.0.1(postcss@8.4.35):
-    resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
-    engines: {node: '>=12.0'}
-    peerDependencies:
-      postcss: ^8.2.14
+  postcss-nested@6.0.1(postcss@8.4.47):
     dependencies:
-      postcss: 8.4.35
-      postcss-selector-parser: 6.0.15
-    dev: true
+      postcss: 8.4.47
+      postcss-selector-parser: 6.1.1
 
-  /postcss-normalize-whitespace@6.0.1(postcss@8.4.35):
-    resolution: {integrity: sha512-76i3NpWf6bB8UHlVuLRxG4zW2YykF9CTEcq/9LGAiz2qBuX5cBStadkk0jSkg9a9TCIXbMQz7yzrygKoCW9JuA==}
-    engines: {node: ^14 || ^16 || >=18.0}
-    peerDependencies:
-      postcss: ^8.4.31
+  postcss-normalize-whitespace@7.0.0(postcss@8.4.47):
     dependencies:
-      postcss: 8.4.35
+      postcss: 8.4.47
       postcss-value-parser: 4.2.0
-    dev: true
 
-  /postcss-selector-parser@6.0.15:
-    resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==}
-    engines: {node: '>=4'}
+  postcss-selector-parser@6.1.1:
     dependencies:
       cssesc: 3.0.0
       util-deprecate: 1.0.2
-    dev: true
 
-  /postcss-value-parser@4.2.0:
-    resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
-    dev: true
+  postcss-value-parser@4.2.0: {}
 
-  /postcss@8.4.35:
-    resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==}
-    engines: {node: ^10 || ^12 || >=14}
+  postcss@8.4.47:
     dependencies:
       nanoid: 3.3.7
-      picocolors: 1.0.0
-      source-map-js: 1.2.0
-    dev: true
+      picocolors: 1.1.0
+      source-map-js: 1.2.1
 
-  /preferred-pm@3.1.2:
-    resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==}
-    engines: {node: '>=10'}
+  prelude-ls@1.2.1: {}
+
+  prettier-config-standard@7.0.0(prettier@3.3.3):
     dependencies:
-      find-up: 5.0.0
-      find-yarn-workspace-root2: 1.2.16
-      path-exists: 4.0.0
-      which-pm: 2.0.0
-    dev: true
+      prettier: 3.3.3
 
-  /prelude-ls@1.1.2:
-    resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==}
-    engines: {node: '>= 0.8.0'}
-    dev: true
+  prettier-linter-helpers@1.0.0:
+    dependencies:
+      fast-diff: 1.3.0
 
-  /prelude-ls@1.2.1:
-    resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
-    engines: {node: '>= 0.8.0'}
-    dev: true
+  prettier@2.8.8: {}
 
-  /prettier@2.8.8:
-    resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
-    engines: {node: '>=10.13.0'}
-    hasBin: true
-    dev: true
+  prettier@3.2.5: {}
 
-  /prettier@3.2.5:
-    resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==}
-    engines: {node: '>=14'}
-    hasBin: true
-    dev: true
+  prettier@3.3.3: {}
 
-  /pretty-bytes@5.6.0:
-    resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
-    engines: {node: '>=6'}
-    dev: true
+  pretty-bytes@5.6.0: {}
 
-  /pretty-bytes@6.1.1:
-    resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==}
-    engines: {node: ^14.13.1 || >=16.0.0}
-    dev: true
+  pretty-bytes@6.1.1: {}
 
-  /pretty-format@27.5.1:
-    resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
-    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+  pretty-format@27.5.1:
     dependencies:
       ansi-regex: 5.0.1
       ansi-styles: 5.2.0
       react-is: 17.0.2
-    dev: true
 
-  /pretty-format@29.7.0:
-    resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+  pretty-format@29.7.0:
     dependencies:
       '@jest/schemas': 29.6.3
       ansi-styles: 5.2.0
-      react-is: 18.2.0
-    dev: true
-
-  /pretty-hrtime@1.0.3:
-    resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==}
-    engines: {node: '>= 0.8'}
-    dev: true
+      react-is: 18.3.1
 
-  /prismjs@1.29.0:
-    resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
-    engines: {node: '>=6'}
-    dev: false
+  prismjs@1.29.0: {}
 
-  /process-nextick-args@2.0.1:
-    resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
-    dev: true
+  process-nextick-args@2.0.1: {}
 
-  /process@0.11.10:
-    resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
-    engines: {node: '>= 0.6.0'}
-    dev: true
+  process@0.11.10: {}
 
-  /prompts@2.4.2:
-    resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
-    engines: {node: '>= 6'}
+  prompts@2.4.2:
     dependencies:
       kleur: 3.0.3
       sisteransi: 1.0.5
-    dev: true
 
-  /property-information@6.4.1:
-    resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==}
+  property-information@6.5.0: {}
 
-  /proxy-addr@2.0.7:
-    resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
-    engines: {node: '>= 0.10'}
+  proxy-addr@2.0.7:
     dependencies:
       forwarded: 0.2.0
       ipaddr.js: 1.9.1
-    dev: true
 
-  /prr@1.0.1:
-    resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
-    dev: true
+  prr@1.0.1: {}
 
-  /ps-tree@1.2.0:
-    resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==}
-    engines: {node: '>= 0.10'}
-    hasBin: true
+  ps-tree@1.2.0:
     dependencies:
       event-stream: 3.3.4
-    dev: true
-
-  /psl@1.9.0:
-    resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
-    dev: true
-
-  /pump@2.0.1:
-    resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==}
-    dependencies:
-      end-of-stream: 1.4.4
-      once: 1.4.0
-    dev: true
-
-  /pump@3.0.0:
-    resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
-    dependencies:
-      end-of-stream: 1.4.4
-      once: 1.4.0
-    dev: true
 
-  /pumpify@1.5.1:
-    resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==}
-    dependencies:
-      duplexify: 3.7.1
-      inherits: 2.0.4
-      pump: 2.0.1
-    dev: true
-
-  /punycode@2.3.1:
-    resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
-    engines: {node: '>=6'}
-    dev: true
+  psl@1.9.0: {}
 
-  /qs@6.11.0:
-    resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
-    engines: {node: '>=0.6'}
-    dependencies:
-      side-channel: 1.0.6
-    dev: true
+  punycode@2.3.1: {}
 
-  /qs@6.12.1:
-    resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==}
-    engines: {node: '>=0.6'}
+  qs@6.13.0:
     dependencies:
       side-channel: 1.0.6
-    dev: true
-
-  /querystringify@2.2.0:
-    resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
-    dev: true
 
-  /queue-microtask@1.2.3:
-    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
-    dev: true
+  querystringify@2.2.0: {}
 
-  /ramda@0.29.0:
-    resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==}
-    dev: true
+  queue-microtask@1.2.3: {}
 
-  /randombytes@2.1.0:
-    resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+  randombytes@2.1.0:
     dependencies:
       safe-buffer: 5.2.1
-    dev: true
 
-  /range-parser@1.2.1:
-    resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
-    engines: {node: '>= 0.6'}
-    dev: true
+  range-parser@1.2.1: {}
 
-  /raw-body@2.5.2:
-    resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
-    engines: {node: '>= 0.8'}
+  raw-body@2.5.2:
     dependencies:
       bytes: 3.1.2
       http-errors: 2.0.0
       iconv-lite: 0.4.24
       unpipe: 1.0.0
-    dev: true
-
-  /react-colorful@5.6.1(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==}
-    peerDependencies:
-      react: '>=16.8.0'
-      react-dom: '>=16.8.0'
-    dependencies:
-      react: 18.3.1
-      react-dom: 18.3.1(react@18.3.1)
-    dev: true
-
-  /react-confetti@6.1.0(react@18.3.1):
-    resolution: {integrity: sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==}
-    engines: {node: '>=10.18'}
-    peerDependencies:
-      react: ^16.3.0 || ^17.0.1 || ^18.0.0
-    dependencies:
-      react: 18.3.1
-      tween-functions: 1.2.0
-    dev: true
-
-  /react-dom@18.3.1(react@18.3.1):
-    resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
-    peerDependencies:
-      react: ^18.3.1
-    dependencies:
-      loose-envify: 1.4.0
-      react: 18.3.1
-      scheduler: 0.23.2
-    dev: true
-
-  /react-is@17.0.2:
-    resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
-    dev: true
-
-  /react-is@18.2.0:
-    resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
-    dev: true
-
-  /react-remove-scroll-bar@2.3.6(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
-    dependencies:
-      '@types/react': 18.3.3
-      react: 18.3.1
-      react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1)
-      tslib: 2.6.2
-    dev: true
 
-  /react-remove-scroll@2.5.5(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
+  react-colorful@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
     dependencies:
-      '@types/react': 18.3.3
       react: 18.3.1
-      react-remove-scroll-bar: 2.3.6(@types/react@18.3.3)(react@18.3.1)
-      react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1)
-      tslib: 2.6.2
-      use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1)
-      use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1)
-    dev: true
-
-  /react-style-singleton@2.2.1(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
+      react-dom: 18.3.1(react@18.3.1)
+
+  react-confetti@6.1.0(react@18.3.1):
     dependencies:
-      '@types/react': 18.3.3
-      get-nonce: 1.0.1
-      invariant: 2.2.4
       react: 18.3.1
-      tslib: 2.6.2
-    dev: true
+      tween-functions: 1.2.0
 
-  /react@18.3.1:
-    resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
-    engines: {node: '>=0.10.0'}
+  react-dom@18.3.1(react@18.3.1):
     dependencies:
       loose-envify: 1.4.0
-    dev: true
+      react: 18.3.1
+      scheduler: 0.23.2
 
-  /read-pkg-up@7.0.1:
-    resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
-    engines: {node: '>=8'}
-    dependencies:
-      find-up: 4.1.0
-      read-pkg: 5.2.0
-      type-fest: 0.8.1
-    dev: true
+  react-is@17.0.2: {}
 
-  /read-pkg@5.2.0:
-    resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
-    engines: {node: '>=8'}
+  react-is@18.3.1: {}
+
+  react@18.3.1:
     dependencies:
-      '@types/normalize-package-data': 2.4.4
-      normalize-package-data: 2.5.0
-      parse-json: 5.2.0
-      type-fest: 0.6.0
-    dev: true
+      loose-envify: 1.4.0
 
-  /readable-stream@2.3.7:
-    resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==}
+  readable-stream@2.3.8:
     dependencies:
       core-util-is: 1.0.3
       inherits: 2.0.4
@@ -13934,124 +13531,61 @@ packages:
       safe-buffer: 5.1.2
       string_decoder: 1.1.1
       util-deprecate: 1.0.2
-    dev: true
 
-  /readable-stream@3.6.2:
-    resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
-    engines: {node: '>= 6'}
-    dependencies:
-      inherits: 2.0.4
-      string_decoder: 1.1.1
-      util-deprecate: 1.0.2
-    dev: true
-
-  /readdirp@3.6.0:
-    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
-    engines: {node: '>=8.10.0'}
+  readdirp@3.6.0:
     dependencies:
       picomatch: 2.3.1
-    dev: true
 
-  /recast@0.23.9:
-    resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==}
-    engines: {node: '>= 4'}
+  recast@0.23.9:
     dependencies:
       ast-types: 0.16.1
       esprima: 4.0.1
       source-map: 0.6.1
       tiny-invariant: 1.3.3
-      tslib: 2.6.2
-    dev: true
+      tslib: 2.7.0
 
-  /redent@3.0.0:
-    resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
-    engines: {node: '>=8'}
+  redent@3.0.0:
     dependencies:
       indent-string: 4.0.0
       strip-indent: 3.0.0
-    dev: true
-
-  /regenerate-unicode-properties@10.1.0:
-    resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==}
-    engines: {node: '>=4'}
-    dependencies:
-      regenerate: 1.4.2
-    dev: true
 
-  /regenerate-unicode-properties@10.1.1:
-    resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==}
-    engines: {node: '>=4'}
+  regenerate-unicode-properties@10.2.0:
     dependencies:
       regenerate: 1.4.2
-    dev: true
 
-  /regenerate@1.4.2:
-    resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
-    dev: true
+  regenerate@1.4.2: {}
 
-  /regenerator-runtime@0.14.1:
-    resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
-    dev: true
+  regenerator-runtime@0.14.1: {}
 
-  /regenerator-transform@0.15.1:
-    resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==}
+  regenerator-transform@0.15.2:
     dependencies:
-      '@babel/runtime': 7.24.0
-    dev: true
+      '@babel/runtime': 7.25.7
 
-  /regenerator-transform@0.15.2:
-    resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
-    dependencies:
-      '@babel/runtime': 7.24.0
-    dev: true
+  regex@4.3.3: {}
 
-  /regexp.prototype.flags@1.5.2:
-    resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
-    engines: {node: '>= 0.4'}
+  regexp.prototype.flags@1.5.3:
     dependencies:
       call-bind: 1.0.7
       define-properties: 1.2.1
       es-errors: 1.3.0
       set-function-name: 2.0.2
-    dev: true
-
-  /regexpu-core@5.2.2:
-    resolution: {integrity: sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==}
-    engines: {node: '>=4'}
-    dependencies:
-      regenerate: 1.4.2
-      regenerate-unicode-properties: 10.1.0
-      regjsgen: 0.7.1
-      regjsparser: 0.9.1
-      unicode-match-property-ecmascript: 2.0.0
-      unicode-match-property-value-ecmascript: 2.1.0
-    dev: true
 
-  /regexpu-core@5.3.2:
-    resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==}
-    engines: {node: '>=4'}
+  regexpu-core@6.1.1:
     dependencies:
-      '@babel/regjsgen': 0.8.0
       regenerate: 1.4.2
-      regenerate-unicode-properties: 10.1.1
-      regjsparser: 0.9.1
+      regenerate-unicode-properties: 10.2.0
+      regjsgen: 0.8.0
+      regjsparser: 0.11.1
       unicode-match-property-ecmascript: 2.0.0
-      unicode-match-property-value-ecmascript: 2.1.0
-    dev: true
+      unicode-match-property-value-ecmascript: 2.2.0
 
-  /regjsgen@0.7.1:
-    resolution: {integrity: sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==}
-    dev: true
+  regjsgen@0.8.0: {}
 
-  /regjsparser@0.9.1:
-    resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==}
-    hasBin: true
+  regjsparser@0.11.1:
     dependencies:
-      jsesc: 0.5.0
-    dev: true
+      jsesc: 3.0.2
 
-  /rehype-external-links@3.0.0:
-    resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==}
+  rehype-external-links@3.0.0:
     dependencies:
       '@types/hast': 3.0.4
       '@ungap/structured-clone': 1.2.0
@@ -14059,366 +13593,218 @@ packages:
       is-absolute-url: 4.0.1
       space-separated-tokens: 2.0.2
       unist-util-visit: 5.0.0
-    dev: true
 
-  /rehype-highlight@7.0.0:
-    resolution: {integrity: sha512-QtobgRgYoQaK6p1eSr2SD1i61f7bjF2kZHAQHxeCHAuJf7ZUDMvQ7owDq9YTkmar5m5TSUol+2D3bp3KfJf/oA==}
+  rehype-highlight@7.0.0:
     dependencies:
       '@types/hast': 3.0.4
-      hast-util-to-text: 4.0.0
+      hast-util-to-text: 4.0.2
       lowlight: 3.1.0
       unist-util-visit: 5.0.0
-      vfile: 6.0.1
-    dev: false
+      vfile: 6.0.3
 
-  /rehype-katex@7.0.0:
-    resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==}
+  rehype-katex@7.0.1:
     dependencies:
       '@types/hast': 3.0.4
       '@types/katex': 0.16.7
       hast-util-from-html-isomorphic: 2.0.0
-      hast-util-to-text: 4.0.0
-      katex: 0.16.9
+      hast-util-to-text: 4.0.2
+      katex: 0.16.11
       unist-util-visit-parents: 6.0.1
-      vfile: 6.0.1
-    dev: false
+      vfile: 6.0.3
 
-  /rehype-parse@9.0.0:
-    resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==}
+  rehype-parse@9.0.1:
     dependencies:
       '@types/hast': 3.0.4
-      hast-util-from-html: 2.0.1
+      hast-util-from-html: 2.0.3
       unified: 11.0.5
-    dev: false
 
-  /rehype-prism@2.3.2(unified@11.0.4):
-    resolution: {integrity: sha512-UvLT8kwsR7mPpAGtikypFTWV+Y8RkfoKCynLl+pa2MvrR6u4D72FZlVRkvxWa3ZkfMcWqAWekJ7s2J0GEp0v+Q==}
-    peerDependencies:
-      unified: ^10 || ^11
+  rehype-prism@2.3.2(unified@11.0.5):
     dependencies:
       hastscript: 8.0.0
       prismjs: 1.29.0
-      rehype-parse: 9.0.0
-      unified: 11.0.4
+      rehype-parse: 9.0.1
+      unified: 11.0.5
       unist-util-is: 6.0.0
       unist-util-select: 5.1.0
       unist-util-visit: 5.0.0
-    dev: false
 
-  /rehype-slug@6.0.0:
-    resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==}
+  rehype-slug@6.0.0:
     dependencies:
       '@types/hast': 3.0.4
       github-slugger: 2.0.0
       hast-util-heading-rank: 3.0.0
-      hast-util-to-string: 3.0.0
+      hast-util-to-string: 3.0.1
       unist-util-visit: 5.0.0
-    dev: true
 
-  /rehype-stringify@10.0.0:
-    resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==}
+  rehype-stringify@10.0.1:
     dependencies:
       '@types/hast': 3.0.4
-      hast-util-to-html: 9.0.0
-      unified: 11.0.4
-    dev: true
+      hast-util-to-html: 9.0.3
+      unified: 11.0.5
 
-  /remark-breaks@4.0.0:
-    resolution: {integrity: sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==}
+  remark-breaks@4.0.0:
     dependencies:
-      '@types/mdast': 4.0.3
+      '@types/mdast': 4.0.4
       mdast-util-newline-to-break: 2.0.0
-      unified: 11.0.4
-    dev: false
+      unified: 11.0.5
 
-  /remark-gfm@4.0.0:
-    resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==}
+  remark-gfm@4.0.0:
     dependencies:
-      '@types/mdast': 4.0.3
+      '@types/mdast': 4.0.4
       mdast-util-gfm: 3.0.0
       micromark-extension-gfm: 3.0.0
       remark-parse: 11.0.0
       remark-stringify: 11.0.0
-      unified: 11.0.4
+      unified: 11.0.5
     transitivePeerDependencies:
       - supports-color
-    dev: false
 
-  /remark-math@6.0.0:
-    resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==}
+  remark-math@6.0.0:
     dependencies:
-      '@types/mdast': 4.0.3
+      '@types/mdast': 4.0.4
       mdast-util-math: 3.0.0
-      micromark-extension-math: 3.0.0
-      unified: 11.0.4
+      micromark-extension-math: 3.1.0
+      unified: 11.0.5
     transitivePeerDependencies:
       - supports-color
-    dev: false
 
-  /remark-parse@11.0.0:
-    resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
+  remark-parse@11.0.0:
     dependencies:
-      '@types/mdast': 4.0.3
-      mdast-util-from-markdown: 2.0.0
+      '@types/mdast': 4.0.4
+      mdast-util-from-markdown: 2.0.1
       micromark-util-types: 2.0.0
-      unified: 11.0.4
+      unified: 11.0.5
     transitivePeerDependencies:
       - supports-color
-    dev: false
 
-  /remark-rehype@11.1.0:
-    resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==}
+  remark-rehype@11.1.1:
     dependencies:
       '@types/hast': 3.0.4
-      '@types/mdast': 4.0.3
-      mdast-util-to-hast: 13.1.0
-      unified: 11.0.4
-      vfile: 6.0.1
-    dev: false
+      '@types/mdast': 4.0.4
+      mdast-util-to-hast: 13.2.0
+      unified: 11.0.5
+      vfile: 6.0.3
 
-  /remark-stringify@11.0.0:
-    resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+  remark-stringify@11.0.0:
     dependencies:
-      '@types/mdast': 4.0.3
+      '@types/mdast': 4.0.4
       mdast-util-to-markdown: 2.1.0
       unified: 11.0.5
-    dev: false
 
-  /require-directory@2.1.1:
-    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
-    engines: {node: '>=0.10.0'}
-    dev: true
+  require-directory@2.1.1: {}
 
-  /require-from-string@2.0.2:
-    resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
-    engines: {node: '>=0.10.0'}
-    dev: true
+  require-from-string@2.0.2: {}
 
-  /requires-port@1.0.0:
-    resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
-    dev: true
+  requires-port@1.0.0: {}
 
-  /resolve-cwd@3.0.0:
-    resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
-    engines: {node: '>=8'}
+  resolve-cwd@3.0.0:
     dependencies:
       resolve-from: 5.0.0
-    dev: true
 
-  /resolve-from@4.0.0:
-    resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
-    engines: {node: '>=4'}
-    dev: true
+  resolve-from@4.0.0: {}
 
-  /resolve-from@5.0.0:
-    resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
-    engines: {node: '>=8'}
-    dev: true
+  resolve-from@5.0.0: {}
 
-  /resolve.exports@1.1.0:
-    resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==}
-    engines: {node: '>=10'}
-    dev: true
+  resolve.exports@1.1.1: {}
 
-  /resolve@1.22.8:
-    resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
-    hasBin: true
+  resolve@1.22.8:
     dependencies:
-      is-core-module: 2.13.1
+      is-core-module: 2.15.1
       path-parse: 1.0.7
       supports-preserve-symlinks-flag: 1.0.0
-    dev: true
-
-  /restore-cursor@3.1.0:
-    resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
-    engines: {node: '>=8'}
-    dependencies:
-      onetime: 5.1.2
-      signal-exit: 3.0.7
-    dev: true
 
-  /reusify@1.0.4:
-    resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
-    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
-    dev: true
+  reusify@1.0.4: {}
 
-  /revolt-api@0.7.13:
-    resolution: {integrity: sha512-5QxWdgTrfH8IZfLlirnEmn6mBZcMvny6v6EATtOxVVQ3IEdH0dXQ8xkSghmQq0eAYMnwvAJjDu9OKQyJCGC5MA==}
+  revolt-api@0.7.16:
     dependencies:
       axios: 0.26.1
       lodash.defaultsdeep: 4.6.1
     transitivePeerDependencies:
       - debug
-    dev: false
-
-  /rimraf@2.6.3:
-    resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==}
-    deprecated: Rimraf versions prior to v4 are no longer supported
-    hasBin: true
-    dependencies:
-      glob: 7.2.3
-    dev: true
 
-  /rimraf@2.7.1:
-    resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
-    hasBin: true
+  rimraf@2.7.1:
     dependencies:
       glob: 7.2.3
-    dev: true
 
-  /rimraf@3.0.2:
-    resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
-    deprecated: Rimraf versions prior to v4 are no longer supported
-    hasBin: true
+  rimraf@3.0.2:
     dependencies:
       glob: 7.2.3
-    dev: true
-
-  /rollup-plugin-terser@7.0.2(rollup@2.79.1):
-    resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==}
-    deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser
-    peerDependencies:
-      rollup: ^2.0.0
-    dependencies:
-      '@babel/code-frame': 7.24.7
-      jest-worker: 26.6.2
-      rollup: 2.79.1
-      serialize-javascript: 4.0.0
-      terser: 5.29.2
-    dev: true
 
-  /rollup@2.79.1:
-    resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==}
-    engines: {node: '>=10.0.0'}
-    hasBin: true
+  rollup@2.79.2:
     optionalDependencies:
       fsevents: 2.3.3
-    dev: true
 
-  /rollup@4.13.0:
-    resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==}
-    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
-    hasBin: true
+  rollup@4.24.0:
     dependencies:
-      '@types/estree': 1.0.5
+      '@types/estree': 1.0.6
     optionalDependencies:
-      '@rollup/rollup-android-arm-eabi': 4.13.0
-      '@rollup/rollup-android-arm64': 4.13.0
-      '@rollup/rollup-darwin-arm64': 4.13.0
-      '@rollup/rollup-darwin-x64': 4.13.0
-      '@rollup/rollup-linux-arm-gnueabihf': 4.13.0
-      '@rollup/rollup-linux-arm64-gnu': 4.13.0
-      '@rollup/rollup-linux-arm64-musl': 4.13.0
-      '@rollup/rollup-linux-riscv64-gnu': 4.13.0
-      '@rollup/rollup-linux-x64-gnu': 4.13.0
-      '@rollup/rollup-linux-x64-musl': 4.13.0
-      '@rollup/rollup-win32-arm64-msvc': 4.13.0
-      '@rollup/rollup-win32-ia32-msvc': 4.13.0
-      '@rollup/rollup-win32-x64-msvc': 4.13.0
+      '@rollup/rollup-android-arm-eabi': 4.24.0
+      '@rollup/rollup-android-arm64': 4.24.0
+      '@rollup/rollup-darwin-arm64': 4.24.0
+      '@rollup/rollup-darwin-x64': 4.24.0
+      '@rollup/rollup-linux-arm-gnueabihf': 4.24.0
+      '@rollup/rollup-linux-arm-musleabihf': 4.24.0
+      '@rollup/rollup-linux-arm64-gnu': 4.24.0
+      '@rollup/rollup-linux-arm64-musl': 4.24.0
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.24.0
+      '@rollup/rollup-linux-riscv64-gnu': 4.24.0
+      '@rollup/rollup-linux-s390x-gnu': 4.24.0
+      '@rollup/rollup-linux-x64-gnu': 4.24.0
+      '@rollup/rollup-linux-x64-musl': 4.24.0
+      '@rollup/rollup-win32-arm64-msvc': 4.24.0
+      '@rollup/rollup-win32-ia32-msvc': 4.24.0
+      '@rollup/rollup-win32-x64-msvc': 4.24.0
       fsevents: 2.3.3
-    dev: true
 
-  /rrweb-cssom@0.6.0:
-    resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==}
-    dev: true
+  rrweb-cssom@0.7.1: {}
 
-  /run-applescript@7.0.0:
-    resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==}
-    engines: {node: '>=18'}
-    dev: true
+  run-applescript@7.0.0: {}
 
-  /run-parallel@1.2.0:
-    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+  run-parallel@1.2.0:
     dependencies:
       queue-microtask: 1.2.3
-    dev: true
 
-  /rxjs@7.8.1:
-    resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
-    requiresBuild: true
+  rxjs@7.8.1:
     dependencies:
-      tslib: 2.6.2
-    dev: true
+      tslib: 2.7.0
     optional: true
 
-  /safe-array-concat@1.1.2:
-    resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
-    engines: {node: '>=0.4'}
+  safe-array-concat@1.1.2:
     dependencies:
       call-bind: 1.0.7
       get-intrinsic: 1.2.4
       has-symbols: 1.0.3
       isarray: 2.0.5
-    dev: true
-
-  /safe-buffer@5.1.2:
-    resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
-    dev: true
 
-  /safe-buffer@5.2.1:
-    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+  safe-buffer@5.1.2: {}
 
-  /safe-regex-test@1.0.0:
-    resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
-    dependencies:
-      call-bind: 1.0.7
-      get-intrinsic: 1.2.4
-      is-regex: 1.1.4
-    dev: true
+  safe-buffer@5.2.1: {}
 
-  /safe-regex-test@1.0.3:
-    resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
-    engines: {node: '>= 0.4'}
+  safe-regex-test@1.0.3:
     dependencies:
       call-bind: 1.0.7
       es-errors: 1.3.0
       is-regex: 1.1.4
-    dev: true
 
-  /safer-buffer@2.1.2:
-    resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
-    dev: true
+  safer-buffer@2.1.2: {}
 
-  /saxes@5.0.1:
-    resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==}
-    engines: {node: '>=10'}
+  saxes@5.0.1:
     dependencies:
       xmlchars: 2.2.0
-    dev: true
 
-  /saxes@6.0.0:
-    resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
-    engines: {node: '>=v12.22.7'}
+  saxes@6.0.0:
     dependencies:
       xmlchars: 2.2.0
-    dev: true
 
-  /scheduler@0.23.2:
-    resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+  scheduler@0.23.2:
     dependencies:
       loose-envify: 1.4.0
-    dev: true
-
-  /semver@5.7.2:
-    resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
-    hasBin: true
-    dev: true
 
-  /semver@6.3.1:
-    resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
-    hasBin: true
-    dev: true
+  semver@6.3.1: {}
 
-  /semver@7.5.4:
-    resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
-    engines: {node: '>=10'}
-    hasBin: true
-    dependencies:
-      lru-cache: 6.0.0
+  semver@7.6.3: {}
 
-  /send@0.18.0:
-    resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
-    engines: {node: '>= 0.8.0'}
+  send@0.19.0:
     dependencies:
       debug: 2.6.9
       depd: 2.0.0
@@ -14435,41 +13821,27 @@ packages:
       statuses: 2.0.1
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /serialize-javascript@4.0.0:
-    resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==}
+  serialize-javascript@6.0.2:
     dependencies:
       randombytes: 2.1.0
-    dev: true
 
-  /seroval-plugins@1.0.5(seroval@1.0.5):
-    resolution: {integrity: sha512-8+pDC1vOedPXjKG7oz8o+iiHrtF2WswaMQJ7CKFpccvSYfrzmvKY9zOJWCg+881722wIHfwkdnRmiiDm9ym+zQ==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      seroval: ^1.0
+  seroval-plugins@1.1.1(seroval@1.1.1):
     dependencies:
-      seroval: 1.0.5
+      seroval: 1.1.1
 
-  /seroval@1.0.5:
-    resolution: {integrity: sha512-TM+Z11tHHvQVQKeNlOUonOWnsNM+2IBwZ4vwoi4j3zKzIpc5IDw8WPwCfcc8F17wy6cBcJGbZbFOR0UCuTZHQA==}
-    engines: {node: '>=10'}
+  seroval@1.1.1: {}
 
-  /serve-static@1.15.0:
-    resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
-    engines: {node: '>= 0.8.0'}
+  serve-static@1.16.2:
     dependencies:
-      encodeurl: 1.0.2
+      encodeurl: 2.0.0
       escape-html: 1.0.3
       parseurl: 1.3.3
-      send: 0.18.0
+      send: 0.19.0
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /set-function-length@1.2.2:
-    resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
-    engines: {node: '>= 0.4'}
+  set-function-length@1.2.2:
     dependencies:
       define-data-property: 1.1.4
       es-errors: 1.3.0
@@ -14477,587 +13849,319 @@ packages:
       get-intrinsic: 1.2.4
       gopd: 1.0.1
       has-property-descriptors: 1.0.2
-    dev: true
 
-  /set-function-name@2.0.2:
-    resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
-    engines: {node: '>= 0.4'}
+  set-function-name@2.0.2:
     dependencies:
       define-data-property: 1.1.4
       es-errors: 1.3.0
       functions-have-names: 1.2.3
       has-property-descriptors: 1.0.2
-    dev: true
 
-  /setprototypeof@1.2.0:
-    resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
-    dev: true
-
-  /shallow-clone@3.0.1:
-    resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==}
-    engines: {node: '>=8'}
-    dependencies:
-      kind-of: 6.0.3
-    dev: true
+  setprototypeof@1.2.0: {}
 
-  /shebang-command@2.0.0:
-    resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
-    engines: {node: '>=8'}
+  shebang-command@2.0.0:
     dependencies:
       shebang-regex: 3.0.0
-    dev: true
 
-  /shebang-regex@3.0.0:
-    resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
-    engines: {node: '>=8'}
-    dev: true
+  shebang-regex@3.0.0: {}
 
-  /shiki@0.14.1:
-    resolution: {integrity: sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==}
+  shiki@0.14.7:
     dependencies:
-      ansi-sequence-parser: 1.1.0
-      jsonc-parser: 3.2.1
+      ansi-sequence-parser: 1.1.1
+      jsonc-parser: 3.3.1
       vscode-oniguruma: 1.7.0
       vscode-textmate: 8.0.0
-    dev: true
 
-  /shiki@1.9.0:
-    resolution: {integrity: sha512-i6//Lqgn7+7nZA0qVjoYH0085YdNk4MC+tJV4bo+HgjgRMJ0JmkLZzFAuvVioJqLkcGDK5GAMpghZEZkCnwxpQ==}
+  shiki@1.22.0:
     dependencies:
-      '@shikijs/core': 1.9.0
-    dev: false
+      '@shikijs/core': 1.22.0
+      '@shikijs/engine-javascript': 1.22.0
+      '@shikijs/engine-oniguruma': 1.22.0
+      '@shikijs/types': 1.22.0
+      '@shikijs/vscode-textmate': 9.3.0
+      '@types/hast': 3.0.4
 
-  /side-channel@1.0.6:
-    resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
-    engines: {node: '>= 0.4'}
+  side-channel@1.0.6:
     dependencies:
       call-bind: 1.0.7
       es-errors: 1.3.0
       get-intrinsic: 1.2.4
-      object-inspect: 1.13.1
-    dev: true
+      object-inspect: 1.13.2
 
-  /siginfo@2.0.0:
-    resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
-    dev: true
+  siginfo@2.0.0: {}
 
-  /signal-exit@3.0.7:
-    resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
-    dev: true
+  signal-exit@3.0.7: {}
 
-  /signal-exit@4.1.0:
-    resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
-    engines: {node: '>=14'}
-    dev: true
+  signal-exit@4.1.0: {}
 
-  /sirv@2.0.4:
-    resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
-    engines: {node: '>= 10'}
+  sirv@2.0.4:
     dependencies:
-      '@polka/url': 1.0.0-next.25
+      '@polka/url': 1.0.0-next.28
       mrmime: 2.0.0
       totalist: 3.0.1
-    dev: true
 
-  /sisteransi@1.0.5:
-    resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
-    dev: true
+  sisteransi@1.0.5: {}
 
-  /slash@3.0.0:
-    resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
-    engines: {node: '>=8'}
-    dev: true
+  slash@3.0.0: {}
 
-  /slash@5.1.0:
-    resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
-    engines: {node: '>=14.16'}
-    dev: true
+  smob@1.5.0: {}
 
-  /solid-dnd-directive@0.2.0(solid-js@1.8.15):
-    resolution: {integrity: sha512-4aPKidTrwSVBHqeiUPPe218t+HyRp0S4iYNJw7nDsWqP33HHYhAwvAyWVfqlqHBlnA/+A5jdevRvbCOiLV5Qew==}
-    engines: {node: '>=14.16.0', npm: '>=6.14.8'}
-    peerDependencies:
-      solid-js: ^1.0.0
+  solid-devtools@0.30.1(solid-js@1.9.2)(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)):
     dependencies:
-      solid-js: 1.8.15
-      svelte-dnd-action: 0.9.11
-    dev: false
+      '@babel/core': 7.25.7
+      '@babel/plugin-syntax-typescript': 7.25.7(@babel/core@7.25.7)
+      '@babel/types': 7.25.7
+      '@solid-devtools/debugger': 0.23.4(solid-js@1.9.2)
+      '@solid-devtools/shared': 0.13.2(solid-js@1.9.2)
+      solid-js: 1.9.2
+    optionalDependencies:
+      vite: 5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)
+    transitivePeerDependencies:
+      - supports-color
 
-  /solid-floating-ui@0.3.1(@floating-ui/dom@1.6.3)(solid-js@1.8.15):
-    resolution: {integrity: sha512-o/QmGsWPS2Z3KidAxP0nDvN7alI7Kqy0kU+wd85Fz+au5SYcnYm7I6Fk3M60Za35azsPX0U+5fEtqfOuk6Ao0Q==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@floating-ui/dom': ^1.5
-      solid-js: ^1.8
+  solid-dnd-directive@0.2.0(solid-js@1.9.2):
     dependencies:
-      '@floating-ui/dom': 1.6.3
-      solid-js: 1.8.15
-    dev: false
+      solid-js: 1.9.2
+      svelte-dnd-action: 0.9.11
 
-  /solid-hcaptcha@0.4.0(solid-js@1.8.15):
-    resolution: {integrity: sha512-ermYlhU09wPxqNZujVJr6NQI0T/25Ru8rN9a3gGjB83vqpQTapzP3HujmRBDGTF0Ghuy6r0xexhDnOYVTPrxhw==}
-    peerDependencies:
-      solid-js: ^1.6.15 || ^1.7.12
+  solid-floating-ui@0.3.1(@floating-ui/dom@1.6.11)(solid-js@1.9.2):
     dependencies:
-      '@hcaptcha/types': 1.0.3
-      '@solid-primitives/script-loader': 2.1.2(solid-js@1.8.15)
-      solid-js: 1.8.15
-    dev: false
+      '@floating-ui/dom': 1.6.11
+      solid-js: 1.9.2
 
-  /solid-headless@0.13.1(solid-js@1.8.15):
-    resolution: {integrity: sha512-FZJai49YmdBu6oEo8aJGPMQ1Qn8xiW0cnD6vNFDIQWMKJdXEUtDEwz0hTR9aZ7Epq3IkrZs+98E0vNiv1+pZpA==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      solid-js: ^1.2
+  solid-hcaptcha@0.4.0(solid-js@1.9.2):
     dependencies:
-      solid-js: 1.8.15
-      solid-use: 0.6.2(solid-js@1.8.15)
-    dev: false
+      '@hcaptcha/types': 1.0.4
+      '@solid-primitives/script-loader': 2.2.0(solid-js@1.9.2)
+      solid-js: 1.9.2
 
-  /solid-icons@1.1.0(solid-js@1.8.15):
-    resolution: {integrity: sha512-IesTfr/F1ElVwH2E1110s2RPXH4pujKfSs+koT8rwuTAdleO5s26lNSpqJV7D1+QHooJj18mcOiz2PIKs0ic+A==}
-    peerDependencies:
-      solid-js: '*'
+  solid-icons@1.1.0(solid-js@1.9.2):
     dependencies:
-      solid-js: 1.8.15
-    dev: false
+      solid-js: 1.9.2
 
-  /solid-jest@0.2.0(@babel/core@7.24.7)(babel-preset-solid@1.8.15):
-    resolution: {integrity: sha512-1ILtAj+z6bh1vTvaDlcT8501vmkzkVZMk2aiexJy+XWTZ+sb9B7IWedvWadIhOwwL97fiW4eMmN6SrbaHjn12A==}
-    peerDependencies:
-      babel-preset-solid: ^1.0.0
+  solid-jest@0.2.0(@babel/core@7.25.7)(babel-preset-solid@1.9.2(@babel/core@7.25.7)):
     dependencies:
-      '@babel/preset-env': 7.20.2(@babel/core@7.24.7)
-      babel-jest: 27.5.1(@babel/core@7.24.7)
-      babel-preset-solid: 1.8.15(@babel/core@7.24.7)
+      '@babel/preset-env': 7.25.7(@babel/core@7.25.7)
+      babel-jest: 27.5.1(@babel/core@7.25.7)
+      babel-preset-solid: 1.9.2(@babel/core@7.25.7)
       enhanced-resolve-jest: 1.1.0
     transitivePeerDependencies:
       - '@babel/core'
       - supports-color
-    dev: true
 
-  /solid-js@1.8.15:
-    resolution: {integrity: sha512-d0QP/efr3UVcwGgWVPveQQ0IHOH6iU7yUhc2piy8arNG8wxKmvUy1kFxyF8owpmfCWGB87usDKMaVnsNYZm+Vw==}
+  solid-js@1.9.2:
     dependencies:
       csstype: 3.1.3
-      seroval: 1.0.5
-      seroval-plugins: 1.0.5(seroval@1.0.5)
+      seroval: 1.1.1
+      seroval-plugins: 1.1.1(seroval@1.1.1)
 
-  /solid-qr-code@0.1.11(solid-js@1.8.15):
-    resolution: {integrity: sha512-8TpELeuK6OoPz5TfJaycsna63IivaSr6Y34qU79eYDF+SRTowO9os8gpElNvNe2FFROZuMZpf28jgmn9gV20Eg==}
-    engines: {node: '>=18'}
-    peerDependencies:
-      solid-js: ^1.8.0
+  solid-motionone@1.0.2(solid-js@1.9.2):
     dependencies:
-      solid-js: 1.8.15
-    dev: false
+      '@motionone/dom': 10.18.0
+      '@motionone/utils': 10.18.0
+      '@solid-primitives/props': 3.1.11(solid-js@1.9.2)
+      '@solid-primitives/refs': 1.0.8(solid-js@1.9.2)
+      '@solid-primitives/transition-group': 1.0.5(solid-js@1.9.2)
+      csstype: 3.1.3
+      solid-js: 1.9.2
 
-  /solid-refresh@0.6.3(solid-js@1.8.15):
-    resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==}
-    peerDependencies:
-      solid-js: ^1.3
+  solid-qr-code@0.1.11(solid-js@1.9.2):
     dependencies:
-      '@babel/generator': 7.23.6
-      '@babel/helper-module-imports': 7.22.15
-      '@babel/types': 7.24.7
-      solid-js: 1.8.15
-    dev: true
+      solid-js: 1.9.2
 
-  /solid-use@0.6.2(solid-js@1.8.15):
-    resolution: {integrity: sha512-0ShJ5s+4PIN0pJB/BtsQucsZB+xnUeeTGaxErQDu6USn5jygZWXicAtOEvFbI8gv40xE751uY1Tz7Aib9lxL/Q==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      solid-js: ^1.5
+  solid-refresh@0.6.3(solid-js@1.9.2):
     dependencies:
-      solid-js: 1.8.15
-    dev: false
+      '@babel/generator': 7.25.7
+      '@babel/helper-module-imports': 7.25.7
+      '@babel/types': 7.25.7
+      solid-js: 1.9.2
+    transitivePeerDependencies:
+      - supports-color
 
-  /source-map-js@1.2.0:
-    resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
-    engines: {node: '>=0.10.0'}
-    dev: true
+  source-map-js@1.2.1: {}
 
-  /source-map-support@0.5.21:
-    resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+  source-map-support@0.5.21:
     dependencies:
       buffer-from: 1.1.2
       source-map: 0.6.1
-    dev: true
 
-  /source-map@0.5.7:
-    resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
-    engines: {node: '>=0.10.0'}
-    dev: true
+  source-map@0.5.7: {}
 
-  /source-map@0.6.1:
-    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
-    engines: {node: '>=0.10.0'}
-    requiresBuild: true
-    dev: true
+  source-map@0.6.1: {}
 
-  /source-map@0.7.4:
-    resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
-    engines: {node: '>= 8'}
-    dev: true
+  source-map@0.7.4: {}
 
-  /source-map@0.8.0-beta.0:
-    resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
-    engines: {node: '>= 8'}
+  source-map@0.8.0-beta.0:
     dependencies:
       whatwg-url: 7.1.0
-    dev: true
-
-  /sourcemap-codec@1.4.8:
-    resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
-    deprecated: Please use @jridgewell/sourcemap-codec instead
-    dev: true
-
-  /space-separated-tokens@2.0.2:
-    resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
-
-  /spdx-correct@3.2.0:
-    resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
-    dependencies:
-      spdx-expression-parse: 3.0.1
-      spdx-license-ids: 3.0.18
-    dev: true
 
-  /spdx-exceptions@2.5.0:
-    resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
-    dev: true
+  sourcemap-codec@1.4.8: {}
 
-  /spdx-expression-parse@3.0.1:
-    resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
-    dependencies:
-      spdx-exceptions: 2.5.0
-      spdx-license-ids: 3.0.18
-    dev: true
-
-  /spdx-license-ids@3.0.18:
-    resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==}
-    dev: true
+  space-separated-tokens@2.0.2: {}
 
-  /split@0.3.3:
-    resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==}
+  split@0.3.3:
     dependencies:
       through: 2.3.8
-    dev: true
 
-  /sprintf-js@1.0.3:
-    resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
-    dev: true
+  sprintf-js@1.0.3: {}
 
-  /stack-utils@2.0.6:
-    resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
-    engines: {node: '>=10'}
+  stack-utils@2.0.6:
     dependencies:
       escape-string-regexp: 2.0.0
-    dev: true
 
-  /stackback@0.0.2:
-    resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
-    dev: true
+  stackback@0.0.2: {}
 
-  /statuses@2.0.1:
-    resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
-    engines: {node: '>= 0.8'}
-    dev: true
+  statuses@2.0.1: {}
 
-  /std-env@3.7.0:
-    resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==}
-    dev: true
+  std-env@3.7.0: {}
 
-  /stop-iteration-iterator@1.0.0:
-    resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
-    engines: {node: '>= 0.4'}
+  stop-iteration-iterator@1.0.0:
     dependencies:
       internal-slot: 1.0.7
-    dev: true
 
-  /store2@2.14.3:
-    resolution: {integrity: sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==}
-    dev: true
-
-  /storybook-solidjs-vite@1.0.0-beta.2(prettier@3.2.5)(typescript@5.4.2)(vite@5.1.6):
-    resolution: {integrity: sha512-dD+VMYC5fBBQNesVb+mjB0LOkZIf100SQFbjAt9/sDstNUvc5ce3yZwLYXzgcOc7jcSMkrBu/cZNRzEM4YIAyw==}
-    engines: {node: ^14.18 || >=16}
+  storybook-solidjs-vite@1.0.0-beta.2(storybook@8.3.5)(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)):
     dependencies:
-      '@storybook/builder-vite': 8.2.0-alpha.10(prettier@3.2.5)(typescript@5.4.2)(vite@5.1.6)
+      '@storybook/builder-vite': 8.4.0-alpha.6(storybook@8.3.5)(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1))
     transitivePeerDependencies:
-      - '@preact/preset-vite'
-      - encoding
-      - prettier
-      - supports-color
-      - typescript
+      - storybook
       - vite
-      - vite-plugin-glimmerx
-    dev: true
+      - webpack-sources
 
-  /storybook-solidjs@1.0.0-beta.2(babel-preset-solid@1.8.15)(solid-js@1.8.15):
-    resolution: {integrity: sha512-wXjM/uH29IPjgxlPvQVNTM/7iBFNNzjuOugpk7iM2oy+sZl7K70eBjvOqGgX5v35pNHTaA8Ju3BlLdp+O20abg==}
-    engines: {node: '>=16.0.0'}
-    peerDependencies:
-      babel-preset-solid: ^1.6.6
-      solid-js: ^1.6.6
+  storybook-solidjs@1.0.0-beta.2(babel-preset-solid@1.9.2(@babel/core@7.25.7))(solid-js@1.9.2):
     dependencies:
-      babel-preset-solid: 1.8.15(@babel/core@7.24.7)
-      solid-js: 1.8.15
-    dev: true
+      babel-preset-solid: 1.9.2(@babel/core@7.25.7)
+      solid-js: 1.9.2
 
-  /storybook@8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1):
-    resolution: {integrity: sha512-RDesMQOhqa2/Vho58JO+2Q1p8gAk61uTPbncVCxnHDwbj/l/WB6uGmxcElseK+YX6JsCfJ6ie1K6tyxjslZanQ==}
-    hasBin: true
+  storybook@8.3.5:
     dependencies:
-      '@storybook/cli': 8.2.0-alpha.5(react-dom@18.3.1)(react@18.3.1)
+      '@storybook/core': 8.3.5
     transitivePeerDependencies:
-      - '@babel/preset-env'
       - bufferutil
-      - encoding
-      - react
-      - react-dom
       - supports-color
       - utf-8-validate
-    dev: true
 
-  /stream-combiner@0.0.4:
-    resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==}
+  stream-combiner@0.0.4:
     dependencies:
       duplexer: 0.1.2
-    dev: true
-
-  /stream-shift@1.0.3:
-    resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
-    dev: true
 
-  /string-argv@0.3.1:
-    resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==}
-    engines: {node: '>=0.6.19'}
-    dev: true
-
-  /string-length@4.0.2:
-    resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
-    engines: {node: '>=10'}
+  string-argv@0.3.2: {}
+
+  string-length@4.0.2:
     dependencies:
       char-regex: 1.0.2
       strip-ansi: 6.0.1
-    dev: true
 
-  /string-width@4.2.3:
-    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
-    engines: {node: '>=8'}
+  string-width@4.2.3:
     dependencies:
       emoji-regex: 8.0.0
       is-fullwidth-code-point: 3.0.0
       strip-ansi: 6.0.1
-    dev: true
 
-  /string-width@5.1.2:
-    resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
-    engines: {node: '>=12'}
+  string-width@5.1.2:
     dependencies:
       eastasianwidth: 0.2.0
       emoji-regex: 9.2.2
       strip-ansi: 7.1.0
-    dev: true
 
-  /string.prototype.matchall@4.0.10:
-    resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==}
+  string.prototype.matchall@4.0.11:
     dependencies:
       call-bind: 1.0.7
       define-properties: 1.2.1
-      es-abstract: 1.23.1
+      es-abstract: 1.23.3
+      es-errors: 1.3.0
+      es-object-atoms: 1.0.0
       get-intrinsic: 1.2.4
+      gopd: 1.0.1
       has-symbols: 1.0.3
       internal-slot: 1.0.7
-      regexp.prototype.flags: 1.5.2
+      regexp.prototype.flags: 1.5.3
       set-function-name: 2.0.2
       side-channel: 1.0.6
-    dev: true
 
-  /string.prototype.trim@1.2.7:
-    resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.7
-      define-properties: 1.2.1
-      es-abstract: 1.21.2
-    dev: true
-
-  /string.prototype.trim@1.2.9:
-    resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
-    engines: {node: '>= 0.4'}
+  string.prototype.trim@1.2.9:
     dependencies:
       call-bind: 1.0.7
       define-properties: 1.2.1
-      es-abstract: 1.23.1
+      es-abstract: 1.23.3
       es-object-atoms: 1.0.0
-    dev: true
-
-  /string.prototype.trimend@1.0.6:
-    resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==}
-    dependencies:
-      call-bind: 1.0.7
-      define-properties: 1.2.1
-      es-abstract: 1.21.2
-    dev: true
 
-  /string.prototype.trimend@1.0.8:
-    resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==}
+  string.prototype.trimend@1.0.8:
     dependencies:
       call-bind: 1.0.7
       define-properties: 1.2.1
       es-object-atoms: 1.0.0
-    dev: true
-
-  /string.prototype.trimstart@1.0.6:
-    resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==}
-    dependencies:
-      call-bind: 1.0.7
-      define-properties: 1.2.1
-      es-abstract: 1.21.2
-    dev: true
 
-  /string.prototype.trimstart@1.0.7:
-    resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==}
+  string.prototype.trimstart@1.0.8:
     dependencies:
       call-bind: 1.0.7
       define-properties: 1.2.1
-      es-abstract: 1.23.1
-    dev: true
+      es-object-atoms: 1.0.0
 
-  /string_decoder@1.1.1:
-    resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+  string_decoder@1.1.1:
     dependencies:
       safe-buffer: 5.1.2
-    dev: true
 
-  /stringify-entities@4.0.3:
-    resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==}
+  stringify-entities@4.0.4:
     dependencies:
       character-entities-html4: 2.1.0
       character-entities-legacy: 3.0.0
-    dev: true
 
-  /stringify-object@3.3.0:
-    resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==}
-    engines: {node: '>=4'}
+  stringify-object@3.3.0:
     dependencies:
       get-own-enumerable-property-symbols: 3.0.2
       is-obj: 1.0.1
       is-regexp: 1.0.0
-    dev: true
 
-  /strip-ansi@6.0.1:
-    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
-    engines: {node: '>=8'}
+  strip-ansi@6.0.1:
     dependencies:
       ansi-regex: 5.0.1
-    dev: true
 
-  /strip-ansi@7.1.0:
-    resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
-    engines: {node: '>=12'}
+  strip-ansi@7.1.0:
     dependencies:
-      ansi-regex: 6.0.1
-    dev: true
+      ansi-regex: 6.1.0
 
-  /strip-bom@3.0.0:
-    resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /strip-bom@4.0.0:
-    resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
-    engines: {node: '>=8'}
-    dev: true
+  strip-bom@4.0.0: {}
 
-  /strip-comments@2.0.1:
-    resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==}
-    engines: {node: '>=10'}
-    dev: true
-
-  /strip-final-newline@2.0.0:
-    resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
-    engines: {node: '>=6'}
-    dev: true
+  strip-comments@2.0.1: {}
 
-  /strip-final-newline@3.0.0:
-    resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
-    engines: {node: '>=12'}
-    dev: true
+  strip-final-newline@2.0.0: {}
 
-  /strip-indent@3.0.0:
-    resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
-    engines: {node: '>=8'}
+  strip-indent@3.0.0:
     dependencies:
       min-indent: 1.0.1
-    dev: true
 
-  /strip-json-comments@3.1.1:
-    resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /strip-literal@2.0.0:
-    resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==}
-    dependencies:
-      js-tokens: 8.0.3
-    dev: true
+  strip-json-comments@3.1.1: {}
 
-  /style-to-object@0.3.0:
-    resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==}
+  style-to-object@0.3.0:
     dependencies:
       inline-style-parser: 0.1.1
-    dev: true
 
-  /style-to-object@0.4.4:
-    resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==}
+  style-to-object@1.0.8:
     dependencies:
-      inline-style-parser: 0.1.1
-    dev: false
+      inline-style-parser: 0.2.4
 
-  /supports-color@5.5.0:
-    resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
-    engines: {node: '>=4'}
+  supports-color@5.5.0:
     dependencies:
       has-flag: 3.0.0
-    dev: true
 
-  /supports-color@7.2.0:
-    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
-    engines: {node: '>=8'}
+  supports-color@7.2.0:
     dependencies:
       has-flag: 4.0.0
-    dev: true
 
-  /supports-color@8.1.1:
-    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
-    engines: {node: '>=10'}
+  supports-color@8.1.1:
     dependencies:
       has-flag: 4.0.0
-    dev: true
 
-  /supports-hyperlinks@2.3.0:
-    resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==}
-    engines: {node: '>=8'}
+  supports-hyperlinks@2.3.0:
     dependencies:
       has-flag: 4.0.0
       supports-color: 7.2.0
-    dev: true
 
-  /supports-preserve-symlinks-flag@1.0.0:
-    resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
-    engines: {node: '>= 0.4'}
-    dev: true
+  supports-preserve-symlinks-flag@1.0.0: {}
 
-  /svelte-dnd-action@0.9.11:
-    resolution: {integrity: sha512-hkuBs8rT0yVD0Xq9p9GxeHN1zYD8r7oZO872VQHg7DJe3cAYwus4WXpx3DNYZiTcLcIOmDw3BVNdKvAl/B6VPg==}
-    dev: false
+  svelte-dnd-action@0.9.11: {}
 
-  /svgo@3.2.0:
-    resolution: {integrity: sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==}
-    engines: {node: '>=14.0.0'}
-    hasBin: true
+  svgo@3.3.2:
     dependencies:
       '@trysound/sax': 0.2.0
       commander: 7.2.0
@@ -15065,398 +14169,203 @@ packages:
       css-tree: 2.3.1
       css-what: 6.1.0
       csso: 5.0.5
-      picocolors: 1.0.0
-    dev: true
-
-  /symbol-tree@3.2.4:
-    resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
-    dev: true
-
-  /tapable@1.1.3:
-    resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==}
-    engines: {node: '>=6'}
-    dev: true
+      picocolors: 1.1.0
 
-  /tar-fs@2.1.1:
-    resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==}
-    dependencies:
-      chownr: 1.1.4
-      mkdirp-classic: 0.5.3
-      pump: 3.0.0
-      tar-stream: 2.2.0
-    dev: true
+  symbol-tree@3.2.4: {}
 
-  /tar-stream@2.2.0:
-    resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
-    engines: {node: '>=6'}
+  synckit@0.9.2:
     dependencies:
-      bl: 4.1.0
-      end-of-stream: 1.4.4
-      fs-constants: 1.0.0
-      inherits: 2.0.4
-      readable-stream: 3.6.2
-    dev: true
+      '@pkgr/core': 0.1.1
+      tslib: 2.7.0
 
-  /tar@6.2.1:
-    resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
-    engines: {node: '>=10'}
-    dependencies:
-      chownr: 2.0.0
-      fs-minipass: 2.1.0
-      minipass: 5.0.0
-      minizlib: 2.1.2
-      mkdirp: 1.0.4
-      yallist: 4.0.0
-    dev: true
+  tapable@1.1.3: {}
 
-  /telejson@7.2.0:
-    resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==}
+  telejson@7.2.0:
     dependencies:
       memoizerific: 1.11.3
-    dev: true
-
-  /temp-dir@2.0.0:
-    resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /temp-dir@3.0.0:
-    resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==}
-    engines: {node: '>=14.16'}
-    dev: true
 
-  /temp@0.8.4:
-    resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==}
-    engines: {node: '>=6.0.0'}
-    dependencies:
-      rimraf: 2.6.3
-    dev: true
+  temp-dir@2.0.0: {}
 
-  /tempy@0.6.0:
-    resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==}
-    engines: {node: '>=10'}
+  tempy@0.6.0:
     dependencies:
       is-stream: 2.0.1
       temp-dir: 2.0.0
       type-fest: 0.16.0
       unique-string: 2.0.0
-    dev: true
-
-  /tempy@3.1.0:
-    resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==}
-    engines: {node: '>=14.16'}
-    dependencies:
-      is-stream: 3.0.0
-      temp-dir: 3.0.0
-      type-fest: 2.19.0
-      unique-string: 3.0.0
-    dev: true
 
-  /terminal-link@2.1.1:
-    resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==}
-    engines: {node: '>=8'}
+  terminal-link@2.1.1:
     dependencies:
       ansi-escapes: 4.3.2
       supports-hyperlinks: 2.3.0
-    dev: true
 
-  /terser@5.29.2:
-    resolution: {integrity: sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==}
-    engines: {node: '>=10'}
-    hasBin: true
+  terser@5.34.1:
     dependencies:
       '@jridgewell/source-map': 0.3.6
-      acorn: 8.11.3
+      acorn: 8.12.1
       commander: 2.20.3
       source-map-support: 0.5.21
-    dev: true
 
-  /test-exclude@6.0.0:
-    resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
-    engines: {node: '>=8'}
+  test-exclude@6.0.0:
     dependencies:
       '@istanbuljs/schema': 0.1.3
       glob: 7.2.3
       minimatch: 3.1.2
-    dev: true
 
-  /text-table@0.2.0:
-    resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
-    dev: true
+  test-exclude@7.0.1:
+    dependencies:
+      '@istanbuljs/schema': 0.1.3
+      glob: 10.4.5
+      minimatch: 9.0.5
 
-  /throat@6.0.1:
-    resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==}
-    dev: true
+  text-table@0.2.0: {}
 
-  /through2@2.0.5:
-    resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==}
+  throat@6.0.2: {}
+
+  through@2.3.8: {}
+
+  tiny-invariant@1.3.3: {}
+
+  tinybench@2.9.0: {}
+
+  tinyexec@0.3.0: {}
+
+  tinyglobby@0.2.9:
     dependencies:
-      readable-stream: 2.3.7
-      xtend: 4.0.2
-    dev: true
+      fdir: 6.4.0(picomatch@4.0.2)
+      picomatch: 4.0.2
 
-  /through@2.3.8:
-    resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
-    dev: true
+  tinypool@1.0.1: {}
 
-  /tiny-invariant@1.3.3:
-    resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
-    dev: true
+  tinyrainbow@1.2.0: {}
 
-  /tinybench@2.6.0:
-    resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==}
-    dev: true
+  tinyspy@3.0.2: {}
 
-  /tinypool@0.8.2:
-    resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==}
-    engines: {node: '>=14.0.0'}
-    dev: true
+  tldts-core@6.1.50: {}
 
-  /tinyspy@2.2.1:
-    resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==}
-    engines: {node: '>=14.0.0'}
-    dev: true
+  tldts@6.1.50:
+    dependencies:
+      tldts-core: 6.1.50
 
-  /tmpl@1.0.5:
-    resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
-    dev: true
+  tmpl@1.0.5: {}
 
-  /to-fast-properties@2.0.0:
-    resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
-    engines: {node: '>=4'}
-    dev: true
+  to-fast-properties@2.0.0: {}
 
-  /to-regex-range@5.0.1:
-    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
-    engines: {node: '>=8.0'}
+  to-regex-range@5.0.1:
     dependencies:
       is-number: 7.0.0
-    dev: true
-
-  /tocbot@4.28.2:
-    resolution: {integrity: sha512-/MaSa9xI6mIo84IxqqliSCtPlH0oy7sLcY9s26qPMyH/2CxtZ2vNAXYlIdEQ7kjAkCQnc0rbLygf//F5c663oQ==}
-    dev: true
 
-  /toidentifier@1.0.1:
-    resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
-    engines: {node: '>=0.6'}
-    dev: true
+  toidentifier@1.0.1: {}
 
-  /totalist@3.0.1:
-    resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
-    engines: {node: '>=6'}
-    dev: true
+  totalist@3.0.1: {}
 
-  /tough-cookie@4.1.3:
-    resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==}
-    engines: {node: '>=6'}
+  tough-cookie@4.1.4:
     dependencies:
       psl: 1.9.0
       punycode: 2.3.1
       universalify: 0.2.0
       url-parse: 1.5.10
-    dev: true
 
-  /tr46@0.0.3:
-    resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+  tough-cookie@5.0.0:
+    dependencies:
+      tldts: 6.1.50
 
-  /tr46@1.0.1:
-    resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
+  tr46@0.0.3: {}
+
+  tr46@1.0.1:
     dependencies:
       punycode: 2.3.1
-    dev: true
 
-  /tr46@2.1.0:
-    resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==}
-    engines: {node: '>=8'}
+  tr46@2.1.0:
     dependencies:
       punycode: 2.3.1
-    dev: true
 
-  /tr46@5.0.0:
-    resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==}
-    engines: {node: '>=18'}
+  tr46@5.0.0:
     dependencies:
       punycode: 2.3.1
-    dev: true
 
-  /trim-lines@3.0.1:
-    resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+  trim-lines@3.0.1: {}
 
-  /trough@2.2.0:
-    resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+  trough@2.2.0: {}
 
-  /ts-dedent@2.2.0:
-    resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==}
-    engines: {node: '>=6.10'}
-    dev: true
+  ts-api-utils@1.3.0(typescript@5.6.3):
+    dependencies:
+      typescript: 5.6.3
 
-  /ts-evaluator@1.2.0(jsdom@24.0.0)(typescript@5.4.2):
-    resolution: {integrity: sha512-ncSGek1p92bj2ifB7s9UBgryHCkU9vwC5d+Lplt12gT9DH+e41X8dMoHRQjIMeAvyG7j9dEnuHmwgOtuRIQL+Q==}
-    engines: {node: '>=14.19.0'}
-    peerDependencies:
-      jsdom: '>=14.x || >=15.x || >=16.x || >=17.x || >=18.x || >=19.x || >=20.x || >=21.x || >=22.x'
-      typescript: '>=3.2.x || >= 4.x || >= 5.x'
-    peerDependenciesMeta:
-      jsdom:
-        optional: true
+  ts-dedent@2.2.0: {}
+
+  ts-evaluator@1.2.0(jsdom@25.0.1)(typescript@5.6.3):
     dependencies:
       ansi-colors: 4.1.3
       crosspath: 2.0.0
-      jsdom: 24.0.0
       object-path: 0.11.8
-      typescript: 5.4.2
-    dev: true
+      typescript: 5.6.3
+    optionalDependencies:
+      jsdom: 25.0.1
 
-  /ts-morph@21.0.1:
-    resolution: {integrity: sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==}
+  ts-morph@21.0.1:
     dependencies:
       '@ts-morph/common': 0.22.0
       code-block-writer: 12.0.0
-    dev: true
 
-  /ts-pattern@5.0.8:
-    resolution: {integrity: sha512-aafbuAQOTEeWmA7wtcL94w6I89EgLD7F+IlWkr596wYxeb0oveWDO5dQpv85YP0CGbxXT/qXBIeV6IYLcoZ2uA==}
-    dev: true
+  ts-pattern@5.0.8: {}
 
-  /tsc-watch@6.0.4(typescript@5.4.2):
-    resolution: {integrity: sha512-cHvbvhjO86w2aGlaHgSCeQRl+Aqw6X6XN4sQMPZKF88GoP30O+oTuh5lRIJr5pgFWrRpF1AgXnJJ2DoFEIPHyg==}
-    engines: {node: '>=12.12.0'}
-    hasBin: true
-    peerDependencies:
-      typescript: '*'
+  tsc-watch@6.2.0(typescript@5.6.3):
     dependencies:
       cross-spawn: 7.0.3
       node-cleanup: 2.1.2
       ps-tree: 1.2.0
-      string-argv: 0.3.1
-      typescript: 5.4.2
-    dev: true
+      string-argv: 0.3.2
+      typescript: 5.6.3
 
-  /tsconfck@3.0.2(typescript@5.4.2):
-    resolution: {integrity: sha512-6lWtFjwuhS3XI4HsX4Zg0izOI3FU/AI9EGVlPEUMDIhvLPMD4wkiof0WCoDgW7qY+Dy198g4d9miAqUHWHFH6Q==}
-    engines: {node: ^18 || >=20}
-    hasBin: true
-    peerDependencies:
-      typescript: ^5.0.0
-    peerDependenciesMeta:
-      typescript:
-        optional: true
-    dependencies:
-      typescript: 5.4.2
-    dev: true
+  tsconfck@3.0.2(typescript@5.6.3):
+    optionalDependencies:
+      typescript: 5.6.3
 
-  /tslib@1.14.1:
-    resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
-    dev: true
+  tslib@1.14.1: {}
 
-  /tslib@2.6.2:
-    resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+  tslib@2.7.0: {}
 
-  /tsutils@3.21.0(typescript@5.4.2):
-    resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
-    engines: {node: '>= 6'}
-    peerDependencies:
-      typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+  tsutils@3.21.0(typescript@5.6.3):
     dependencies:
       tslib: 1.14.1
-      typescript: 5.4.2
-    dev: true
-
-  /tween-functions@1.2.0:
-    resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==}
-    dev: true
+      typescript: 5.6.3
 
-  /type-check@0.3.2:
-    resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      prelude-ls: 1.1.2
-    dev: true
+  tween-functions@1.2.0: {}
 
-  /type-check@0.4.0:
-    resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
-    engines: {node: '>= 0.8.0'}
+  type-check@0.4.0:
     dependencies:
       prelude-ls: 1.2.1
-    dev: true
-
-  /type-detect@4.0.8:
-    resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /type-fest@0.16.0:
-    resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==}
-    engines: {node: '>=10'}
-    dev: true
-
-  /type-fest@0.20.2:
-    resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
-    engines: {node: '>=10'}
-    dev: true
 
-  /type-fest@0.21.3:
-    resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
-    engines: {node: '>=10'}
-    dev: true
-
-  /type-fest@0.6.0:
-    resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
-    engines: {node: '>=8'}
-    dev: true
+  type-detect@4.0.8: {}
 
-  /type-fest@0.8.1:
-    resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
-    engines: {node: '>=8'}
-    dev: true
+  type-fest@0.16.0: {}
 
-  /type-fest@1.4.0:
-    resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==}
-    engines: {node: '>=10'}
-    dev: true
+  type-fest@0.20.2: {}
 
-  /type-fest@2.19.0:
-    resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
-    engines: {node: '>=12.20'}
-    dev: true
+  type-fest@0.21.3: {}
 
-  /type-fest@3.13.1:
-    resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==}
-    engines: {node: '>=14.16'}
-    dev: true
+  type-fest@2.19.0: {}
 
-  /type-is@1.6.18:
-    resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
-    engines: {node: '>= 0.6'}
+  type-is@1.6.18:
     dependencies:
       media-typer: 0.3.0
       mime-types: 2.1.35
-    dev: true
 
-  /typed-array-buffer@1.0.2:
-    resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
-    engines: {node: '>= 0.4'}
+  typed-array-buffer@1.0.2:
     dependencies:
       call-bind: 1.0.7
       es-errors: 1.3.0
       is-typed-array: 1.1.13
-    dev: true
 
-  /typed-array-byte-length@1.0.1:
-    resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==}
-    engines: {node: '>= 0.4'}
+  typed-array-byte-length@1.0.1:
     dependencies:
       call-bind: 1.0.7
       for-each: 0.3.3
       gopd: 1.0.1
       has-proto: 1.0.3
       is-typed-array: 1.1.13
-    dev: true
 
-  /typed-array-byte-offset@1.0.2:
-    resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==}
-    engines: {node: '>= 0.4'}
+  typed-array-byte-offset@1.0.2:
     dependencies:
       available-typed-arrays: 1.0.7
       call-bind: 1.0.7
@@ -15464,19 +14373,8 @@ packages:
       gopd: 1.0.1
       has-proto: 1.0.3
       is-typed-array: 1.1.13
-    dev: true
-
-  /typed-array-length@1.0.4:
-    resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
-    dependencies:
-      call-bind: 1.0.7
-      for-each: 0.3.3
-      is-typed-array: 1.1.10
-    dev: true
 
-  /typed-array-length@1.0.5:
-    resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==}
-    engines: {node: '>= 0.4'}
+  typed-array-length@1.0.6:
     dependencies:
       call-bind: 1.0.7
       for-each: 0.3.3
@@ -15484,1070 +14382,580 @@ packages:
       has-proto: 1.0.3
       is-typed-array: 1.1.13
       possible-typed-array-names: 1.0.0
-    dev: true
 
-  /typed-emitter@2.1.0:
-    resolution: {integrity: sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==}
+  typed-emitter@2.1.0:
     optionalDependencies:
       rxjs: 7.8.1
-    dev: true
 
-  /typedarray-to-buffer@3.1.5:
-    resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
+  typedarray-to-buffer@3.1.5:
     dependencies:
       is-typedarray: 1.0.0
-    dev: true
 
-  /typedoc@0.25.1(typescript@5.4.2):
-    resolution: {integrity: sha512-c2ye3YUtGIadxN2O6YwPEXgrZcvhlZ6HlhWZ8jQRNzwLPn2ylhdGqdR8HbyDRyALP8J6lmSANILCkkIdNPFxqA==}
-    engines: {node: '>= 16'}
-    hasBin: true
-    peerDependencies:
-      typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x
+  typedoc@0.25.13(typescript@5.6.3):
     dependencies:
       lunr: 2.3.9
       marked: 4.3.0
-      minimatch: 9.0.4
-      shiki: 0.14.1
-      typescript: 5.4.2
-    dev: true
+      minimatch: 9.0.5
+      shiki: 0.14.7
+      typescript: 5.6.3
 
-  /typescript@4.9.5:
-    resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
-    engines: {node: '>=4.2.0'}
-    hasBin: true
-    dev: true
+  typescript-eslint@8.8.1(eslint@9.12.0)(typescript@5.6.3):
+    dependencies:
+      '@typescript-eslint/eslint-plugin': 8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3)
+      '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3)
+      '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3)
+    optionalDependencies:
+      typescript: 5.6.3
+    transitivePeerDependencies:
+      - eslint
+      - supports-color
 
-  /typescript@5.3.3:
-    resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
-    engines: {node: '>=14.17'}
-    hasBin: true
-    dev: true
+  typescript@4.9.5: {}
 
-  /typescript@5.4.2:
-    resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==}
-    engines: {node: '>=14.17'}
-    hasBin: true
+  typescript@5.3.3: {}
 
-  /ufo@1.5.1:
-    resolution: {integrity: sha512-HGyF79+/qZ4soRvM+nHERR2pJ3VXDZ/8sL1uLahdgEDf580NkgiWOxLk33FetExqOWp352JZRsgXbG/4MaGOSg==}
-    dev: true
+  typescript@5.6.3: {}
 
-  /uglify-js@3.17.4:
-    resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==}
-    engines: {node: '>=0.8.0'}
-    hasBin: true
-    requiresBuild: true
-    dev: true
-    optional: true
+  ufo@1.5.4: {}
 
-  /ulid@2.3.0:
-    resolution: {integrity: sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==}
-    hasBin: true
-    dev: false
+  ulid@2.3.0: {}
 
-  /unbox-primitive@1.0.2:
-    resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+  unbox-primitive@1.0.2:
     dependencies:
       call-bind: 1.0.7
       has-bigints: 1.0.2
       has-symbols: 1.0.3
       which-boxed-primitive: 1.0.2
-    dev: true
 
-  /undici-types@5.26.5:
-    resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+  undici-types@5.26.5: {}
 
-  /unicode-canonical-property-names-ecmascript@2.0.0:
-    resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==}
-    engines: {node: '>=4'}
-    dev: true
+  undici-types@6.19.8: {}
 
-  /unicode-match-property-ecmascript@2.0.0:
-    resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
-    engines: {node: '>=4'}
+  unicode-canonical-property-names-ecmascript@2.0.1: {}
+
+  unicode-match-property-ecmascript@2.0.0:
     dependencies:
-      unicode-canonical-property-names-ecmascript: 2.0.0
+      unicode-canonical-property-names-ecmascript: 2.0.1
       unicode-property-aliases-ecmascript: 2.1.0
-    dev: true
-
-  /unicode-match-property-value-ecmascript@2.1.0:
-    resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==}
-    engines: {node: '>=4'}
-    dev: true
 
-  /unicode-property-aliases-ecmascript@2.1.0:
-    resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /unicorn-magic@0.1.0:
-    resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
-    engines: {node: '>=18'}
-    dev: true
+  unicode-match-property-value-ecmascript@2.2.0: {}
 
-  /unified@11.0.4:
-    resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==}
-    dependencies:
-      '@types/unist': 3.0.2
-      bail: 2.0.2
-      devlop: 1.1.0
-      extend: 3.0.2
-      is-plain-obj: 4.1.0
-      trough: 2.2.0
-      vfile: 6.0.1
+  unicode-property-aliases-ecmascript@2.1.0: {}
 
-  /unified@11.0.5:
-    resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+  unified@11.0.5:
     dependencies:
-      '@types/unist': 3.0.2
+      '@types/unist': 3.0.3
       bail: 2.0.2
-      devlop: 1.1.0
-      extend: 3.0.2
-      is-plain-obj: 4.1.0
-      trough: 2.2.0
-      vfile: 6.0.1
-    dev: false
-
-  /unique-string@2.0.0:
-    resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
-    engines: {node: '>=8'}
-    dependencies:
-      crypto-random-string: 2.0.0
-    dev: true
-
-  /unique-string@3.0.0:
-    resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==}
-    engines: {node: '>=12'}
-    dependencies:
-      crypto-random-string: 4.0.0
-    dev: true
-
-  /unist-util-find-after@5.0.0:
-    resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
-    dependencies:
-      '@types/unist': 3.0.2
-      unist-util-is: 6.0.0
-    dev: false
-
-  /unist-util-generated@2.0.1:
-    resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==}
-    dev: false
+      devlop: 1.1.0
+      extend: 3.0.2
+      is-plain-obj: 4.1.0
+      trough: 2.2.0
+      vfile: 6.0.3
 
-  /unist-util-is@5.2.1:
-    resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==}
+  unique-string@2.0.0:
     dependencies:
-      '@types/unist': 2.0.10
-    dev: false
+      crypto-random-string: 2.0.0
 
-  /unist-util-is@6.0.0:
-    resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
+  unist-util-find-after@5.0.0:
     dependencies:
-      '@types/unist': 3.0.2
+      '@types/unist': 3.0.3
+      unist-util-is: 6.0.0
 
-  /unist-util-position@4.0.4:
-    resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==}
+  unist-util-is@6.0.0:
     dependencies:
-      '@types/unist': 2.0.10
-    dev: false
+      '@types/unist': 3.0.3
 
-  /unist-util-position@5.0.0:
-    resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+  unist-util-position@5.0.0:
     dependencies:
-      '@types/unist': 3.0.2
+      '@types/unist': 3.0.3
 
-  /unist-util-remove-position@5.0.0:
-    resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
+  unist-util-remove-position@5.0.0:
     dependencies:
-      '@types/unist': 3.0.2
+      '@types/unist': 3.0.3
       unist-util-visit: 5.0.0
-    dev: false
 
-  /unist-util-select@5.1.0:
-    resolution: {integrity: sha512-4A5mfokSHG/rNQ4g7gSbdEs+H586xyd24sdJqF1IWamqrLHvYb+DH48fzxowyOhOfK7YSqX+XlCojAyuuyyT2A==}
+  unist-util-select@5.1.0:
     dependencies:
-      '@types/unist': 3.0.2
+      '@types/unist': 3.0.3
       css-selector-parser: 3.0.5
       devlop: 1.1.0
       nth-check: 2.1.1
       zwitch: 2.0.4
-    dev: false
-
-  /unist-util-stringify-position@4.0.0:
-    resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
-    dependencies:
-      '@types/unist': 3.0.2
 
-  /unist-util-visit-parents@5.1.3:
-    resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==}
+  unist-util-stringify-position@4.0.0:
     dependencies:
-      '@types/unist': 2.0.10
-      unist-util-is: 5.2.1
-    dev: false
+      '@types/unist': 3.0.3
 
-  /unist-util-visit-parents@6.0.1:
-    resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
+  unist-util-visit-parents@6.0.1:
     dependencies:
-      '@types/unist': 3.0.2
+      '@types/unist': 3.0.3
       unist-util-is: 6.0.0
 
-  /unist-util-visit@4.1.2:
-    resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==}
-    dependencies:
-      '@types/unist': 2.0.10
-      unist-util-is: 5.2.1
-      unist-util-visit-parents: 5.1.3
-    dev: false
-
-  /unist-util-visit@5.0.0:
-    resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+  unist-util-visit@5.0.0:
     dependencies:
-      '@types/unist': 3.0.2
+      '@types/unist': 3.0.3
       unist-util-is: 6.0.0
       unist-util-visit-parents: 6.0.1
 
-  /universal-github-app-jwt@1.1.2:
-    resolution: {integrity: sha512-t1iB2FmLFE+yyJY9+3wMx0ejB+MQpEVkH0gQv7dR6FZyltyq+ZZO0uDpbopxhrZ3SLEO4dCEkIujOMldEQ2iOA==}
+  universal-github-app-jwt@1.2.0:
     dependencies:
-      '@types/jsonwebtoken': 9.0.6
+      '@types/jsonwebtoken': 9.0.7
       jsonwebtoken: 9.0.2
-    dev: false
 
-  /universal-user-agent@6.0.1:
-    resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==}
-    dev: false
+  universal-user-agent@6.0.1: {}
 
-  /universalify@0.2.0:
-    resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
-    engines: {node: '>= 4.0.0'}
-    dev: true
+  universalify@0.2.0: {}
 
-  /universalify@2.0.1:
-    resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
-    engines: {node: '>= 10.0.0'}
-    dev: true
+  universalify@2.0.1: {}
 
-  /unpipe@1.0.0:
-    resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
-    engines: {node: '>= 0.8'}
-    dev: true
+  unpipe@1.0.0: {}
 
-  /unplugin@1.10.1:
-    resolution: {integrity: sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==}
-    engines: {node: '>=14.0.0'}
+  unplugin@1.14.1:
     dependencies:
-      acorn: 8.11.3
-      chokidar: 3.6.0
-      webpack-sources: 3.2.3
+      acorn: 8.12.1
       webpack-virtual-modules: 0.6.2
-    dev: true
 
-  /untildify@4.0.0:
-    resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
-    engines: {node: '>=8'}
-    dev: true
+  upath@1.2.0: {}
 
-  /upath@1.2.0:
-    resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==}
-    engines: {node: '>=4'}
-    dev: true
+  update-browserslist-db@1.1.1(browserslist@4.23.3):
+    dependencies:
+      browserslist: 4.23.3
+      escalade: 3.2.0
+      picocolors: 1.1.0
 
-  /update-browserslist-db@1.0.13(browserslist@4.23.0):
-    resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
-    hasBin: true
-    peerDependencies:
-      browserslist: '>= 4.21.0'
+  update-browserslist-db@1.1.1(browserslist@4.24.0):
     dependencies:
-      browserslist: 4.23.0
-      escalade: 3.1.2
-      picocolors: 1.0.0
-    dev: true
+      browserslist: 4.24.0
+      escalade: 3.2.0
+      picocolors: 1.1.0
 
-  /uri-js@4.4.1:
-    resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+  uri-js@4.4.1:
     dependencies:
       punycode: 2.3.1
-    dev: true
 
-  /url-parse@1.5.10:
-    resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+  url-parse@1.5.10:
     dependencies:
       querystringify: 2.2.0
       requires-port: 1.0.0
-    dev: true
-
-  /use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
-    dependencies:
-      '@types/react': 18.3.3
-      react: 18.3.1
-      tslib: 2.6.2
-    dev: true
-
-  /use-sidecar@1.1.2(@types/react@18.3.3)(react@18.3.1):
-    resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
-    dependencies:
-      '@types/react': 18.3.3
-      detect-node-es: 1.1.0
-      react: 18.3.1
-      tslib: 2.6.2
-    dev: true
 
-  /util-deprecate@1.0.2:
-    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
-    dev: true
+  util-deprecate@1.0.2: {}
 
-  /util@0.12.5:
-    resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
+  util@0.12.5:
     dependencies:
       inherits: 2.0.4
       is-arguments: 1.1.1
       is-generator-function: 1.0.10
       is-typed-array: 1.1.13
       which-typed-array: 1.1.15
-    dev: true
 
-  /utils-merge@1.0.1:
-    resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
-    engines: {node: '>= 0.4.0'}
-    dev: true
+  utils-merge@1.0.1: {}
 
-  /uuid@9.0.1:
-    resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
-    hasBin: true
-    dev: true
+  uuid@9.0.1: {}
 
-  /v8-to-istanbul@8.1.1:
-    resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==}
-    engines: {node: '>=10.12.0'}
+  v8-to-istanbul@8.1.1:
     dependencies:
-      '@types/istanbul-lib-coverage': 2.0.4
+      '@types/istanbul-lib-coverage': 2.0.6
       convert-source-map: 1.9.0
       source-map: 0.7.4
-    dev: true
 
-  /validate-html-nesting@1.2.1:
-    resolution: {integrity: sha512-T1ab131NkP3BfXB7KUSgV7Rhu81R2id+L6NaJ7NypAAG5iV6gXnPpQE5RK1fvb+3JYsPTL+ihWna5sr5RN9gaQ==}
-    dev: true
+  validate-html-nesting@1.2.2: {}
 
-  /validate-npm-package-license@3.0.4:
-    resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
-    dependencies:
-      spdx-correct: 3.2.0
-      spdx-expression-parse: 3.0.1
-    dev: true
-
-  /vary@1.1.2:
-    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
-    engines: {node: '>= 0.8'}
-    dev: true
+  vary@1.1.2: {}
 
-  /vfile-location@5.0.2:
-    resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==}
+  vfile-location@5.0.3:
     dependencies:
-      '@types/unist': 3.0.2
-      vfile: 6.0.1
+      '@types/unist': 3.0.3
+      vfile: 6.0.3
 
-  /vfile-message@4.0.2:
-    resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
+  vfile-message@4.0.2:
     dependencies:
-      '@types/unist': 3.0.2
+      '@types/unist': 3.0.3
       unist-util-stringify-position: 4.0.0
 
-  /vfile@6.0.1:
-    resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==}
+  vfile@6.0.3:
     dependencies:
-      '@types/unist': 3.0.2
-      unist-util-stringify-position: 4.0.0
+      '@types/unist': 3.0.3
       vfile-message: 4.0.2
 
-  /vite-node@1.4.0:
-    resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==}
-    engines: {node: ^18.0.0 || >=20.0.0}
-    hasBin: true
+  vite-node@2.1.2(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1):
     dependencies:
       cac: 6.7.14
-      debug: 4.3.4
+      debug: 4.3.7
       pathe: 1.1.2
-      picocolors: 1.0.0
-      vite: 5.1.6
+      vite: 5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)
     transitivePeerDependencies:
       - '@types/node'
       - less
       - lightningcss
       - sass
+      - sass-embedded
       - stylus
       - sugarss
       - supports-color
       - terser
-    dev: true
 
-  /vite-plugin-inspect@0.8.3(rollup@2.79.1)(vite@5.1.6):
-    resolution: {integrity: sha512-SBVzOIdP/kwe6hjkt7LSW4D0+REqqe58AumcnCfRNw4Kt3mbS9pEBkch+nupu2PBxv2tQi69EQHQ1ZA1vgB/Og==}
-    engines: {node: '>=14'}
-    peerDependencies:
-      '@nuxt/kit': '*'
-      vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0
-    peerDependenciesMeta:
-      '@nuxt/kit':
-        optional: true
+  vite-plugin-inspect@0.8.7(rollup@2.79.2)(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)):
     dependencies:
-      '@antfu/utils': 0.7.7
-      '@rollup/pluginutils': 5.1.0(rollup@2.79.1)
-      debug: 4.3.4
-      error-stack-parser-es: 0.1.1
+      '@antfu/utils': 0.7.10
+      '@rollup/pluginutils': 5.1.2(rollup@2.79.2)
+      debug: 4.3.7
+      error-stack-parser-es: 0.1.5
       fs-extra: 11.2.0
       open: 10.1.0
       perfect-debounce: 1.0.0
-      picocolors: 1.0.0
+      picocolors: 1.1.0
       sirv: 2.0.4
-      vite: 5.1.6
+      vite: 5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)
     transitivePeerDependencies:
       - rollup
       - supports-color
-    dev: true
 
-  /vite-plugin-pwa@0.19.4(vite@5.1.6)(workbox-build@7.0.0)(workbox-window@7.0.0):
-    resolution: {integrity: sha512-KiEFXaYEj2Hg1it+yECy75oqNmlXimI7BaLx7Sxl7Qsd9EIVxaf3GX1mZdLpHe83pDgHBNwm9USGQxSCNp5m7A==}
-    engines: {node: '>=16.0.0'}
-    peerDependencies:
-      '@vite-pwa/assets-generator': ^0.2.4
-      vite: ^3.1.0 || ^4.0.0 || ^5.0.0
-      workbox-build: ^7.0.0
-      workbox-window: ^7.0.0
-    peerDependenciesMeta:
-      '@vite-pwa/assets-generator':
-        optional: true
+  vite-plugin-pwa@0.20.5(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.1.0):
     dependencies:
-      debug: 4.3.4
-      fast-glob: 3.3.2
+      debug: 4.3.7
       pretty-bytes: 6.1.1
-      vite: 5.1.6
-      workbox-build: 7.0.0
-      workbox-window: 7.0.0
+      tinyglobby: 0.2.9
+      vite: 5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)
+      workbox-build: 7.1.1(@types/babel__core@7.20.5)
+      workbox-window: 7.1.0
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /vite-plugin-solid-svg@0.8.0(solid-js@1.8.15)(vite@5.1.6):
-    resolution: {integrity: sha512-m4HQ6nnwjPqiJONnRRZjLkOC86ZbgfBMpE6UnqGI62R2a7SZB2To/v6oeiZ+17LFtYYCNbZ2DPQT66a/YmqM3A==}
-    peerDependencies:
-      solid-js: ^1
-      vite: '>=4'
+  vite-plugin-solid-svg@0.8.1(solid-js@1.9.2)(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)):
     dependencies:
-      solid-js: 1.8.15
-      svgo: 3.2.0
-      vite: 5.1.6
-    dev: true
+      solid-js: 1.9.2
+      svgo: 3.3.2
+      vite: 5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)
 
-  /vite-plugin-solid@2.10.2(@testing-library/jest-dom@6.4.2)(solid-js@1.8.15)(vite@5.1.6):
-    resolution: {integrity: sha512-AOEtwMe2baBSXMXdo+BUwECC8IFHcKS6WQV/1NEd+Q7vHPap5fmIhLcAzr+DUJ04/KHx/1UBU0l1/GWP+rMAPQ==}
-    peerDependencies:
-      '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.*
-      solid-js: ^1.7.2
-      vite: ^3.0.0 || ^4.0.0 || ^5.0.0
-    peerDependenciesMeta:
-      '@testing-library/jest-dom':
-        optional: true
+  vite-plugin-solid@2.10.2(@testing-library/jest-dom@6.5.0)(solid-js@1.9.2)(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)):
     dependencies:
-      '@babel/core': 7.24.0
-      '@testing-library/jest-dom': 6.4.2(vitest@1.4.0)
+      '@babel/core': 7.25.7
       '@types/babel__core': 7.20.5
-      babel-preset-solid: 1.8.15(@babel/core@7.24.0)
+      babel-preset-solid: 1.9.2(@babel/core@7.25.7)
       merge-anything: 5.1.7
-      solid-js: 1.8.15
-      solid-refresh: 0.6.3(solid-js@1.8.15)
-      vite: 5.1.6
-      vitefu: 0.2.5(vite@5.1.6)
+      solid-js: 1.9.2
+      solid-refresh: 0.6.3(solid-js@1.9.2)
+      vite: 5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)
+      vitefu: 0.2.5(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1))
+    optionalDependencies:
+      '@testing-library/jest-dom': 6.5.0
     transitivePeerDependencies:
       - supports-color
-    dev: true
 
-  /vite@5.1.6:
-    resolution: {integrity: sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==}
-    engines: {node: ^18.0.0 || >=20.0.0}
-    hasBin: true
-    peerDependencies:
-      '@types/node': ^18.0.0 || >=20.0.0
-      less: '*'
-      lightningcss: ^1.21.0
-      sass: '*'
-      stylus: '*'
-      sugarss: '*'
-      terser: ^5.4.0
-    peerDependenciesMeta:
-      '@types/node':
-        optional: true
-      less:
-        optional: true
-      lightningcss:
-        optional: true
-      sass:
-        optional: true
-      stylus:
-        optional: true
-      sugarss:
-        optional: true
-      terser:
-        optional: true
+  vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1):
     dependencies:
-      esbuild: 0.19.12
-      postcss: 8.4.35
-      rollup: 4.13.0
+      esbuild: 0.21.5
+      postcss: 8.4.47
+      rollup: 4.24.0
     optionalDependencies:
+      '@types/node': 22.7.5
       fsevents: 2.3.3
-    dev: true
-
-  /vitefu@0.2.5(vite@5.1.6):
-    resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
-    peerDependencies:
-      vite: ^3.0.0 || ^4.0.0 || ^5.0.0
-    peerDependenciesMeta:
-      vite:
-        optional: true
-    dependencies:
-      vite: 5.1.6
-    dev: true
+      lightningcss: 1.27.0
+      terser: 5.34.1
 
-  /vitest@1.4.0(jsdom@24.0.0):
-    resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==}
-    engines: {node: ^18.0.0 || >=20.0.0}
-    hasBin: true
-    peerDependencies:
-      '@edge-runtime/vm': '*'
-      '@types/node': ^18.0.0 || >=20.0.0
-      '@vitest/browser': 1.4.0
-      '@vitest/ui': 1.4.0
-      happy-dom: '*'
-      jsdom: '*'
-    peerDependenciesMeta:
-      '@edge-runtime/vm':
-        optional: true
-      '@types/node':
-        optional: true
-      '@vitest/browser':
-        optional: true
-      '@vitest/ui':
-        optional: true
-      happy-dom:
-        optional: true
-      jsdom:
-        optional: true
-    dependencies:
-      '@vitest/expect': 1.4.0
-      '@vitest/runner': 1.4.0
-      '@vitest/snapshot': 1.4.0
-      '@vitest/spy': 1.4.0
-      '@vitest/utils': 1.4.0
-      acorn-walk: 8.3.2
-      chai: 4.4.1
-      debug: 4.3.4
-      execa: 8.0.1
-      jsdom: 24.0.0
-      local-pkg: 0.5.0
-      magic-string: 0.30.8
+  vitefu@0.2.5(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)):
+    optionalDependencies:
+      vite: 5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)
+
+  vitest@2.1.2(@types/node@22.7.5)(jsdom@25.0.1)(lightningcss@1.27.0)(terser@5.34.1):
+    dependencies:
+      '@vitest/expect': 2.1.2
+      '@vitest/mocker': 2.1.2(@vitest/spy@2.1.2)(vite@5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1))
+      '@vitest/pretty-format': 2.1.2
+      '@vitest/runner': 2.1.2
+      '@vitest/snapshot': 2.1.2
+      '@vitest/spy': 2.1.2
+      '@vitest/utils': 2.1.2
+      chai: 5.1.1
+      debug: 4.3.7
+      magic-string: 0.30.11
       pathe: 1.1.2
-      picocolors: 1.0.0
       std-env: 3.7.0
-      strip-literal: 2.0.0
-      tinybench: 2.6.0
-      tinypool: 0.8.2
-      vite: 5.1.6
-      vite-node: 1.4.0
-      why-is-node-running: 2.2.2
+      tinybench: 2.9.0
+      tinyexec: 0.3.0
+      tinypool: 1.0.1
+      tinyrainbow: 1.2.0
+      vite: 5.4.8(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)
+      vite-node: 2.1.2(@types/node@22.7.5)(lightningcss@1.27.0)(terser@5.34.1)
+      why-is-node-running: 2.3.0
+    optionalDependencies:
+      '@types/node': 22.7.5
+      jsdom: 25.0.1
     transitivePeerDependencies:
       - less
       - lightningcss
+      - msw
       - sass
+      - sass-embedded
       - stylus
       - sugarss
       - supports-color
       - terser
-    dev: true
 
-  /vscode-oniguruma@1.7.0:
-    resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==}
-    dev: true
+  vscode-oniguruma@1.7.0: {}
 
-  /vscode-textmate@8.0.0:
-    resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==}
-    dev: true
+  vscode-textmate@8.0.0: {}
 
-  /w3c-hr-time@1.0.2:
-    resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==}
-    deprecated: Use your platform's native performance.now() and performance.timeOrigin.
+  w3c-hr-time@1.0.2:
     dependencies:
       browser-process-hrtime: 1.0.0
-    dev: true
 
-  /w3c-xmlserializer@2.0.0:
-    resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==}
-    engines: {node: '>=10'}
+  w3c-xmlserializer@2.0.0:
     dependencies:
       xml-name-validator: 3.0.0
-    dev: true
 
-  /w3c-xmlserializer@5.0.0:
-    resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
-    engines: {node: '>=18'}
+  w3c-xmlserializer@5.0.0:
     dependencies:
       xml-name-validator: 5.0.0
-    dev: true
 
-  /walker@1.0.8:
-    resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+  walker@1.0.8:
     dependencies:
       makeerror: 1.0.12
-    dev: true
-
-  /watchpack@2.4.1:
-    resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==}
-    engines: {node: '>=10.13.0'}
-    dependencies:
-      glob-to-regexp: 0.4.1
-      graceful-fs: 4.2.11
-    dev: true
-
-  /wcwidth@1.0.1:
-    resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
-    dependencies:
-      defaults: 1.0.4
-    dev: true
-
-  /web-namespaces@2.0.1:
-    resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
 
-  /webidl-conversions@3.0.1:
-    resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+  web-namespaces@2.0.1: {}
 
-  /webidl-conversions@4.0.2:
-    resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
-    dev: true
+  webidl-conversions@3.0.1: {}
 
-  /webidl-conversions@5.0.0:
-    resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==}
-    engines: {node: '>=8'}
-    dev: true
+  webidl-conversions@4.0.2: {}
 
-  /webidl-conversions@6.1.0:
-    resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==}
-    engines: {node: '>=10.4'}
-    dev: true
+  webidl-conversions@5.0.0: {}
 
-  /webidl-conversions@7.0.0:
-    resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
-    engines: {node: '>=12'}
-    dev: true
+  webidl-conversions@6.1.0: {}
 
-  /webpack-sources@3.2.3:
-    resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
-    engines: {node: '>=10.13.0'}
-    dev: true
+  webidl-conversions@7.0.0: {}
 
-  /webpack-virtual-modules@0.6.2:
-    resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
-    dev: true
+  webpack-virtual-modules@0.6.2: {}
 
-  /whatwg-encoding@1.0.5:
-    resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==}
+  whatwg-encoding@1.0.5:
     dependencies:
       iconv-lite: 0.4.24
-    dev: true
 
-  /whatwg-encoding@3.1.1:
-    resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
-    engines: {node: '>=18'}
+  whatwg-encoding@3.1.1:
     dependencies:
       iconv-lite: 0.6.3
-    dev: true
 
-  /whatwg-mimetype@2.3.0:
-    resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==}
-    dev: true
+  whatwg-mimetype@2.3.0: {}
 
-  /whatwg-mimetype@4.0.0:
-    resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
-    engines: {node: '>=18'}
-    dev: true
+  whatwg-mimetype@4.0.0: {}
 
-  /whatwg-url@14.0.0:
-    resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==}
-    engines: {node: '>=18'}
+  whatwg-url@14.0.0:
     dependencies:
       tr46: 5.0.0
       webidl-conversions: 7.0.0
-    dev: true
 
-  /whatwg-url@5.0.0:
-    resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+  whatwg-url@5.0.0:
     dependencies:
       tr46: 0.0.3
       webidl-conversions: 3.0.1
 
-  /whatwg-url@7.1.0:
-    resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
+  whatwg-url@7.1.0:
     dependencies:
       lodash.sortby: 4.7.0
       tr46: 1.0.1
       webidl-conversions: 4.0.2
-    dev: true
 
-  /whatwg-url@8.7.0:
-    resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==}
-    engines: {node: '>=10'}
+  whatwg-url@8.7.0:
     dependencies:
       lodash: 4.17.21
       tr46: 2.1.0
       webidl-conversions: 6.1.0
-    dev: true
 
-  /which-boxed-primitive@1.0.2:
-    resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+  which-boxed-primitive@1.0.2:
     dependencies:
       is-bigint: 1.0.4
       is-boolean-object: 1.1.2
       is-number-object: 1.0.7
       is-string: 1.0.7
       is-symbol: 1.0.4
-    dev: true
 
-  /which-collection@1.0.2:
-    resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
-    engines: {node: '>= 0.4'}
+  which-collection@1.0.2:
     dependencies:
       is-map: 2.0.3
       is-set: 2.0.3
       is-weakmap: 2.0.2
       is-weakset: 2.0.3
-    dev: true
 
-  /which-pm@2.0.0:
-    resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==}
-    engines: {node: '>=8.15'}
-    dependencies:
-      load-yaml-file: 0.2.0
-      path-exists: 4.0.0
-    dev: true
-
-  /which-typed-array@1.1.15:
-    resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
-    engines: {node: '>= 0.4'}
+  which-typed-array@1.1.15:
     dependencies:
       available-typed-arrays: 1.0.7
       call-bind: 1.0.7
       for-each: 0.3.3
       gopd: 1.0.1
       has-tostringtag: 1.0.2
-    dev: true
 
-  /which@2.0.2:
-    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
-    engines: {node: '>= 8'}
-    hasBin: true
+  which@2.0.2:
     dependencies:
       isexe: 2.0.0
-    dev: true
 
-  /why-is-node-running@2.2.2:
-    resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==}
-    engines: {node: '>=8'}
-    hasBin: true
+  why-is-node-running@2.3.0:
     dependencies:
       siginfo: 2.0.0
       stackback: 0.0.2
-    dev: true
-
-  /word-wrap@1.2.3:
-    resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
-    engines: {node: '>=0.10.0'}
-    dev: true
 
-  /wordwrap@1.0.0:
-    resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
-    dev: true
+  word-wrap@1.2.5: {}
 
-  /workbox-background-sync@7.0.0:
-    resolution: {integrity: sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==}
+  workbox-background-sync@7.1.0:
     dependencies:
       idb: 7.1.1
-      workbox-core: 7.0.0
-    dev: true
+      workbox-core: 7.1.0
 
-  /workbox-broadcast-update@7.0.0:
-    resolution: {integrity: sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==}
+  workbox-broadcast-update@7.1.0:
     dependencies:
-      workbox-core: 7.0.0
-    dev: true
+      workbox-core: 7.1.0
 
-  /workbox-build@7.0.0:
-    resolution: {integrity: sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==}
-    engines: {node: '>=16.0.0'}
+  workbox-build@7.1.1(@types/babel__core@7.20.5):
     dependencies:
-      '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0)
-      '@babel/core': 7.24.7
-      '@babel/preset-env': 7.24.7(@babel/core@7.24.7)
-      '@babel/runtime': 7.24.0
-      '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.7)(rollup@2.79.1)
-      '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1)
-      '@rollup/plugin-replace': 2.4.2(rollup@2.79.1)
+      '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1)
+      '@babel/core': 7.25.7
+      '@babel/preset-env': 7.25.7(@babel/core@7.25.7)
+      '@babel/runtime': 7.25.7
+      '@rollup/plugin-babel': 5.3.1(@babel/core@7.25.7)(@types/babel__core@7.20.5)(rollup@2.79.2)
+      '@rollup/plugin-node-resolve': 15.3.0(rollup@2.79.2)
+      '@rollup/plugin-replace': 2.4.2(rollup@2.79.2)
+      '@rollup/plugin-terser': 0.4.4(rollup@2.79.2)
       '@surma/rollup-plugin-off-main-thread': 2.2.3
-      ajv: 8.12.0
+      ajv: 8.17.1
       common-tags: 1.8.2
       fast-json-stable-stringify: 2.1.0
       fs-extra: 9.1.0
       glob: 7.2.3
       lodash: 4.17.21
       pretty-bytes: 5.6.0
-      rollup: 2.79.1
-      rollup-plugin-terser: 7.0.2(rollup@2.79.1)
+      rollup: 2.79.2
       source-map: 0.8.0-beta.0
       stringify-object: 3.3.0
       strip-comments: 2.0.1
       tempy: 0.6.0
       upath: 1.2.0
-      workbox-background-sync: 7.0.0
-      workbox-broadcast-update: 7.0.0
-      workbox-cacheable-response: 7.0.0
-      workbox-core: 7.0.0
-      workbox-expiration: 7.0.0
-      workbox-google-analytics: 7.0.0
-      workbox-navigation-preload: 7.0.0
-      workbox-precaching: 7.0.0
-      workbox-range-requests: 7.0.0
-      workbox-recipes: 7.0.0
-      workbox-routing: 7.0.0
-      workbox-strategies: 7.0.0
-      workbox-streams: 7.0.0
-      workbox-sw: 7.0.0
-      workbox-window: 7.0.0
+      workbox-background-sync: 7.1.0
+      workbox-broadcast-update: 7.1.0
+      workbox-cacheable-response: 7.1.0
+      workbox-core: 7.1.0
+      workbox-expiration: 7.1.0
+      workbox-google-analytics: 7.1.0
+      workbox-navigation-preload: 7.1.0
+      workbox-precaching: 7.1.0
+      workbox-range-requests: 7.1.0
+      workbox-recipes: 7.1.0
+      workbox-routing: 7.1.0
+      workbox-strategies: 7.1.0
+      workbox-streams: 7.1.0
+      workbox-sw: 7.1.0
+      workbox-window: 7.1.0
     transitivePeerDependencies:
       - '@types/babel__core'
       - supports-color
-    dev: true
 
-  /workbox-cacheable-response@7.0.0:
-    resolution: {integrity: sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==}
+  workbox-cacheable-response@7.1.0:
     dependencies:
-      workbox-core: 7.0.0
-    dev: true
+      workbox-core: 7.1.0
 
-  /workbox-core@7.0.0:
-    resolution: {integrity: sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==}
+  workbox-core@7.1.0: {}
 
-  /workbox-expiration@7.0.0:
-    resolution: {integrity: sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==}
+  workbox-expiration@7.1.0:
     dependencies:
       idb: 7.1.1
-      workbox-core: 7.0.0
-    dev: true
+      workbox-core: 7.1.0
 
-  /workbox-google-analytics@7.0.0:
-    resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==}
-    deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained
+  workbox-google-analytics@7.1.0:
     dependencies:
-      workbox-background-sync: 7.0.0
-      workbox-core: 7.0.0
-      workbox-routing: 7.0.0
-      workbox-strategies: 7.0.0
-    dev: true
+      workbox-background-sync: 7.1.0
+      workbox-core: 7.1.0
+      workbox-routing: 7.1.0
+      workbox-strategies: 7.1.0
 
-  /workbox-navigation-preload@7.0.0:
-    resolution: {integrity: sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==}
+  workbox-navigation-preload@7.1.0:
     dependencies:
-      workbox-core: 7.0.0
-    dev: true
+      workbox-core: 7.1.0
 
-  /workbox-precaching@7.0.0:
-    resolution: {integrity: sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==}
+  workbox-precaching@7.1.0:
     dependencies:
-      workbox-core: 7.0.0
-      workbox-routing: 7.0.0
-      workbox-strategies: 7.0.0
+      workbox-core: 7.1.0
+      workbox-routing: 7.1.0
+      workbox-strategies: 7.1.0
 
-  /workbox-range-requests@7.0.0:
-    resolution: {integrity: sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==}
+  workbox-range-requests@7.1.0:
     dependencies:
-      workbox-core: 7.0.0
-    dev: true
+      workbox-core: 7.1.0
 
-  /workbox-recipes@7.0.0:
-    resolution: {integrity: sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==}
+  workbox-recipes@7.1.0:
     dependencies:
-      workbox-cacheable-response: 7.0.0
-      workbox-core: 7.0.0
-      workbox-expiration: 7.0.0
-      workbox-precaching: 7.0.0
-      workbox-routing: 7.0.0
-      workbox-strategies: 7.0.0
-    dev: true
+      workbox-cacheable-response: 7.1.0
+      workbox-core: 7.1.0
+      workbox-expiration: 7.1.0
+      workbox-precaching: 7.1.0
+      workbox-routing: 7.1.0
+      workbox-strategies: 7.1.0
 
-  /workbox-routing@7.0.0:
-    resolution: {integrity: sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==}
+  workbox-routing@7.1.0:
     dependencies:
-      workbox-core: 7.0.0
+      workbox-core: 7.1.0
 
-  /workbox-strategies@7.0.0:
-    resolution: {integrity: sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==}
+  workbox-strategies@7.1.0:
     dependencies:
-      workbox-core: 7.0.0
+      workbox-core: 7.1.0
 
-  /workbox-streams@7.0.0:
-    resolution: {integrity: sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==}
+  workbox-streams@7.1.0:
     dependencies:
-      workbox-core: 7.0.0
-      workbox-routing: 7.0.0
-    dev: true
+      workbox-core: 7.1.0
+      workbox-routing: 7.1.0
 
-  /workbox-sw@7.0.0:
-    resolution: {integrity: sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==}
-    dev: true
+  workbox-sw@7.1.0: {}
 
-  /workbox-window@7.0.0:
-    resolution: {integrity: sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==}
+  workbox-window@7.1.0:
     dependencies:
       '@types/trusted-types': 2.0.7
-      workbox-core: 7.0.0
-    dev: true
+      workbox-core: 7.1.0
 
-  /wrap-ansi@7.0.0:
-    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
-    engines: {node: '>=10'}
+  wrap-ansi@7.0.0:
     dependencies:
       ansi-styles: 4.3.0
       string-width: 4.2.3
       strip-ansi: 6.0.1
-    dev: true
 
-  /wrap-ansi@8.1.0:
-    resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
-    engines: {node: '>=12'}
+  wrap-ansi@8.1.0:
     dependencies:
       ansi-styles: 6.2.1
       string-width: 5.1.2
       strip-ansi: 7.1.0
-    dev: true
-
-  /wrappy@1.0.2:
-    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
 
-  /write-file-atomic@2.4.3:
-    resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==}
-    dependencies:
-      graceful-fs: 4.2.11
-      imurmurhash: 0.1.4
-      signal-exit: 3.0.7
-    dev: true
+  wrappy@1.0.2: {}
 
-  /write-file-atomic@3.0.3:
-    resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
+  write-file-atomic@3.0.3:
     dependencies:
       imurmurhash: 0.1.4
       is-typedarray: 1.0.0
       signal-exit: 3.0.7
       typedarray-to-buffer: 3.1.5
-    dev: true
-
-  /ws@7.5.9:
-    resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==}
-    engines: {node: '>=8.3.0'}
-    peerDependencies:
-      bufferutil: ^4.0.1
-      utf-8-validate: ^5.0.2
-    peerDependenciesMeta:
-      bufferutil:
-        optional: true
-      utf-8-validate:
-        optional: true
-    dev: true
-
-  /ws@8.16.0:
-    resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==}
-    engines: {node: '>=10.0.0'}
-    peerDependencies:
-      bufferutil: ^4.0.1
-      utf-8-validate: '>=5.0.2'
-    peerDependenciesMeta:
-      bufferutil:
-        optional: true
-      utf-8-validate:
-        optional: true
 
-  /xml-name-validator@3.0.0:
-    resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==}
-    dev: true
+  ws@7.5.10: {}
 
-  /xml-name-validator@5.0.0:
-    resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
-    engines: {node: '>=18'}
-    dev: true
+  ws@8.18.0: {}
 
-  /xmlchars@2.2.0:
-    resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
-    dev: true
+  xml-name-validator@3.0.0: {}
 
-  /xtend@4.0.2:
-    resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
-    engines: {node: '>=0.4'}
-    dev: true
+  xml-name-validator@5.0.0: {}
 
-  /y18n@5.0.8:
-    resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
-    engines: {node: '>=10'}
-    dev: true
+  xmlchars@2.2.0: {}
 
-  /yallist@3.1.1:
-    resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
-    dev: true
+  y18n@5.0.8: {}
 
-  /yallist@4.0.0:
-    resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+  yallist@3.1.1: {}
 
-  /yaml@1.10.2:
-    resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
-    engines: {node: '>= 6'}
-    dev: true
+  yaml@1.10.2: {}
 
-  /yargs-parser@20.2.9:
-    resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
-    engines: {node: '>=10'}
-    dev: true
+  yargs-parser@20.2.9: {}
 
-  /yargs@16.2.0:
-    resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
-    engines: {node: '>=10'}
+  yargs@16.2.0:
     dependencies:
       cliui: 7.0.4
-      escalade: 3.1.2
+      escalade: 3.2.0
       get-caller-file: 2.0.5
       require-directory: 2.1.1
       string-width: 4.2.3
       y18n: 5.0.8
       yargs-parser: 20.2.9
-    dev: true
-
-  /yocto-queue@0.1.0:
-    resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
-    engines: {node: '>=10'}
-    dev: true
 
-  /yocto-queue@1.0.0:
-    resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
-    engines: {node: '>=12.20'}
-    dev: true
+  yocto-queue@0.1.0: {}
 
-  /zwitch@2.0.4:
-    resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+  zwitch@2.0.4: {}