Jelajahi Sumber

initial commit

Jason Gorst 1 bulan lalu
melakukan
64444f4275
62 mengubah file dengan 17758 tambahan dan 0 penghapusan
  1. 28 0
      .gitignore
  2. 1 0
      .node-version
  3. 15 0
      app/app.vue
  4. 17 0
      app/assets/css/main.css
  5. 13 0
      app/assets/css/skeleton.css
  6. 423 0
      app/assets/css/theme.css
  7. 36 0
      app/assets/css/tooltip.css
  8. 65 0
      app/assets/css/trix.css
  9. 14 0
      app/components/ClearFiltersButton.vue
  10. 36 0
      app/components/NavBar.vue
  11. 83 0
      app/components/OptionsFilter.vue
  12. 40 0
      app/components/SearchField.vue
  13. 41 0
      app/components/SpinnerModal.vue
  14. 97 0
      app/components/TextFilter.vue
  15. 35 0
      app/components/ToggleFilterButton.vue
  16. 137 0
      app/components/UserMenu.vue
  17. 81 0
      app/components/character/CharacterFilterChips.vue
  18. 62 0
      app/components/character/CharacterToolbar.vue
  19. 8 0
      app/composables/useAuthClient.js
  20. 15 0
      app/composables/useEmit.js
  21. 15 0
      app/pages/blank.vue
  22. 51 0
      app/pages/filter.vue
  23. 230 0
      app/pages/index.vue
  24. 120 0
      app/plugins/socketio.js
  25. 16 0
      app/queries/character.js
  26. 106 0
      app/stores/useFiltersStore.js
  27. 5 0
      app/utils/findUniqueOptions.js
  28. 3 0
      app/utils/isBlank.js
  29. 3 0
      app/utils/isPresent.js
  30. 1021 0
      app/utils/passthrough.js
  31. 7 0
      app/utils/pluralize.js
  32. 5 0
      app/utils/sleep.js
  33. 4 0
      app/utils/tw.js
  34. 3 0
      app/utils/uniqValues.js
  35. 25 0
      modules/lodash-shared/exclude.js
  36. 74 0
      modules/lodash-shared/index.js
  37. 1 0
      modules/lodash-shared/runtime/lodash.js
  38. 80 0
      nuxt.config.js
  39. 58 0
      package.json
  40. 8968 0
      pnpm-lock.yaml
  41. 5 0
      pnpm-workspace.yaml
  42. 25 0
      prettier.config.js
  43. 10 0
      prisma.config.js
  44. 30 0
      prisma/schema.prisma
  45. 57 0
      prisma/seed.js
  46. 5114 0
      prisma/seeds/Character.json
  47. 92 0
      server/plugins/socketio.js
  48. 95 0
      server/socketio/handlers/characterHandlers.js
  49. 2 0
      server/socketio/handlers/index.js
  50. 100 0
      server/socketio/handlers/userHandlers.js
  51. 16 0
      server/socketio/middlewares/authMiddleware.js
  52. 1 0
      server/socketio/middlewares/index.js
  53. 45 0
      server/utils/executeQuery.js
  54. 5 0
      server/utils/htmlToPlainText.js
  55. 9 0
      server/utils/prisma.js
  56. 15 0
      server/utils/withPlainTextFields.js
  57. 25 0
      shared/utils/characterFields.js
  58. 2 0
      shared/utils/schema.js
  59. 18 0
      shared/utils/schema/character.js
  60. 14 0
      shared/utils/schema/user.js
  61. 18 0
      shared/utils/z.js
  62. 18 0
      tsconfig.json

+ 28 - 0
.gitignore

@@ -0,0 +1,28 @@
+# Nuxt dev/build outputs
+.output
+.data
+.nuxt
+.nitro
+.cache
+dist
+
+# Node dependencies
+node_modules
+
+# Logs
+logs
+*.log
+
+# Misc
+.DS_Store
+.fleet
+.idea
+
+# Local env files
+.env
+.env.*
+!.env.example
+
+# generated
+/prisma/generated/
+/.nuxtrc

+ 1 - 0
.node-version

@@ -0,0 +1 @@
+24.14.0

+ 15 - 0
app/app.vue

@@ -0,0 +1,15 @@
+<template>
+  <div class="relative">
+    <NavBar />
+
+    <NuxtPage />
+  </div>
+</template>
+
+<script setup>
+
+</script>
+
+<style scoped>
+
+</style>

+ 17 - 0
app/assets/css/main.css

@@ -0,0 +1,17 @@
+@import "tailwindcss";
+@import "tailwindcss-primeui";
+@import "./theme.css";
+
+@import "./skeleton.css";
+@import "./tooltip.css";
+@import "./trix.css";
+
+@plugin "@tailwindcss/typography";
+
+/* scan nuxt config to pick up default icon class */
+@source "../../../nuxt.config.js";
+@source "../../utils/passthrough.js";
+
+body {
+  @apply bg-surface-100 text-surface-950 dark:bg-surface-950 dark:text-surface-100;
+}

+ 13 - 0
app/assets/css/skeleton.css

@@ -0,0 +1,13 @@
+.skeleton-animation::after {
+  @apply absolute top-0 right-0 left-0 z-1 h-full -translate-x-full animate-[skeleton_1.2s_infinite] bg-linear-90
+  from-transparent via-white/40 to-transparent content-[''] dark:via-white/4;
+}
+
+@keyframes skeleton {
+  from {
+    transform: translateX(-100%);
+  }
+  to {
+    transform: translateX(100%);
+  }
+}

+ 423 - 0
app/assets/css/theme.css

@@ -0,0 +1,423 @@
+/* primary palette */
+:root {
+  --p-primary-50: oklch(0.99 0.141 139.549);
+  --p-primary-100: oklch(0.95289 0.141 139.549);
+  --p-primary-200: oklch(0.93 0.141 139.549);
+  --p-primary-300: oklch(0.90711 0.141 139.549);
+  --p-primary-400: oklch(0.88422 0.141 139.549);
+  --p-primary-500: oklch(0.86133 0.141 139.549);
+  --p-primary-600: oklch(0.741 0.141 139.549);
+  --p-primary-700: oklch(0.62067 0.141 139.549);
+  --p-primary-800: oklch(0.50033 0.141 139.549);
+  --p-primary-900: oklch(0.38 0.141 139.549);
+  --p-primary-950: oklch(0.25967 0.141 139.549);
+  --p-surface-0: oklch(1 0 360);
+  --p-surface-50: oklch(0.9851 0.018 262.177);
+  --p-surface-100: oklch(0.9674 0.018 262.177);
+  --p-surface-200: oklch(0.9197 0.018 262.177);
+  --p-surface-300: oklch(0.8711 0.018 262.177);
+  --p-surface-400: oklch(0.7118 0.018 262.177);
+  --p-surface-500: oklch(0.5517 0.018 262.177);
+  --p-surface-600: oklch(0.4419 0.018 262.177);
+  --p-surface-700: oklch(0.30857 0.018 262.177);
+  --p-surface-800: oklch(0.28036 0.018 262.177);
+  --p-surface-900: oklch(0.26346 0.018 262.177);
+  --p-surface-950: oklch(0.1408 0.018 262.177);
+  --p-content-border-radius: 6px;
+}
+
+/* Light */
+:root {
+  --p-surface-color: var(--p-surface-0);
+  --p-primary-color: var(--p-primary-500);
+  --p-primary-contrast-color: var(--p-surface-0);
+  --p-primary-hover-color: var(--p-primary-700);
+  --p-primary-active-color: var(--p-primary-900);
+  --p-content-border-color: var(--p-surface-200);
+  --p-content-hover-background: var(--p-surface-100);
+  --p-content-hover-color: var(--p-surface-800);
+  --p-highlight-background: var(--p-primary-50);
+  --p-highlight-color: var(--p-primary-700);
+  --p-highlight-focus-background: var(--p-primary-100);
+  --p-highlight-focus-color: var(--p-primary-800);
+  --p-text-color: var(--p-surface-700);
+  --p-text-hover-color: var(--p-surface-800);
+  --p-text-muted-color: var(--p-surface-500);
+  --p-text-hover-muted-color: var(--p-surface-600);
+}
+
+/*
+ * Dark Mode
+ * Defaults to system, change the dark variant selector to match the CSS variable configuration.
+ * For example;
+ * @custom-variant dark (&:where(.app-dark, .app-dark *));
+ * should match to;
+ * :root[class="app-dark"]
+*/
+@media (prefers-color-scheme: dark) {
+  :root {
+    --p-surface-color: var(--p-surface-950);
+    --p-primary-color: var(--p-primary-400);
+    --p-primary-contrast-color: var(--p-surface-900);
+    --p-primary-hover-color: var(--p-primary-200);
+    --p-primary-active-color: var(--p-primary-50);
+    --p-content-border-color: var(--p-surface-700);
+    --p-content-hover-background: var(--p-surface-800);
+    --p-content-hover-color: var(--p-surface-0);
+    --p-highlight-background: var(--p-primary-900);
+    --p-highlight-color: var(--p-primary-200);
+    --p-highlight-focus-background: var(--p-primary-800);
+    --p-highlight-focus-color: var(--p-primary-100);
+    --p-text-color: var(--p-surface-0);
+    --p-text-hover-color: var(--p-surface-0);
+    --p-text-muted-color: var(--p-surface-400);
+    --p-text-hover-muted-color: var(--p-surface-300);
+  }
+}
+
+@theme inline {
+  --color-surface: var(--p-surface-color);
+  --color-primary: var(--p-primary-color);
+  --color-primary-emphasis: var(--p-primary-hover-color);
+  --color-primary-emphasis-alt: var(--p-primary-active-color);
+  --color-primary-contrast: var(--p-primary-contrast-color);
+  --color-primary-50: var(--p-primary-50);
+  --color-primary-100: var(--p-primary-100);
+  --color-primary-200: var(--p-primary-200);
+  --color-primary-300: var(--p-primary-300);
+  --color-primary-400: var(--p-primary-400);
+  --color-primary-500: var(--p-primary-500);
+  --color-primary-600: var(--p-primary-600);
+  --color-primary-700: var(--p-primary-700);
+  --color-primary-800: var(--p-primary-800);
+  --color-primary-900: var(--p-primary-900);
+  --color-primary-950: var(--p-primary-950);
+}
+
+:root {
+  --theme-primary: oklch(88.422% 0.141 139.549);
+  --theme-secondary: oklch(73.375% 0.165 35.353);
+  --theme-success: oklch(86.171% 0.142 166.534);
+  --theme-info: oklch(86.078% 0.142 206.182);
+  --theme-warn: oklch(86.163% 0.142 94.818);
+  --theme-help: oklch(74.229% 0.133 311.379);
+  --theme-danger: oklch(82.418% 0.099 33.756);
+
+  --theme-l-50: 0.99;
+  --theme-l-100: 0.95289;
+  --theme-l-200: 0.93;
+  --theme-l-300: 0.90711;
+  --theme-l-400: 0.88422;
+  --theme-l-500: 0.86133;
+  --theme-l-600: 0.741;
+  --theme-l-700: 0.62067;
+  --theme-l-800: 0.50033;
+  --theme-l-900: 0.38;
+  --theme-l-950: 0.25967;
+
+  --theme-secondary-50: oklch(from var(--theme-secondary) var(--theme-l-50) c h);
+  --theme-secondary-100: oklch(from var(--theme-secondary) var(--theme-l-100) c h);
+  --theme-secondary-200: oklch(from var(--theme-secondary) var(--theme-l-200) c h);
+  --theme-secondary-300: oklch(from var(--theme-secondary) var(--theme-l-300) c h);
+  --theme-secondary-400: oklch(from var(--theme-secondary) var(--theme-l-400) c h);
+  --theme-secondary-500: oklch(from var(--theme-secondary) var(--theme-l-500) c h);
+  --theme-secondary-600: oklch(from var(--theme-secondary) var(--theme-l-600) c h);
+  --theme-secondary-700: oklch(from var(--theme-secondary) var(--theme-l-700) c h);
+  --theme-secondary-800: oklch(from var(--theme-secondary) var(--theme-l-800) c h);
+  --theme-secondary-900: oklch(from var(--theme-secondary) var(--theme-l-900) c h);
+  --theme-secondary-950: oklch(from var(--theme-secondary) var(--theme-l-950) c h);
+
+  --theme-success-50: oklch(from var(--theme-success) var(--theme-l-50) c h);
+  --theme-success-100: oklch(from var(--theme-success) var(--theme-l-100) c h);
+  --theme-success-200: oklch(from var(--theme-success) var(--theme-l-200) c h);
+  --theme-success-300: oklch(from var(--theme-success) var(--theme-l-300) c h);
+  --theme-success-400: oklch(from var(--theme-success) var(--theme-l-400) c h);
+  --theme-success-500: oklch(from var(--theme-success) var(--theme-l-500) c h);
+  --theme-success-600: oklch(from var(--theme-success) var(--theme-l-600) c h);
+  --theme-success-700: oklch(from var(--theme-success) var(--theme-l-700) c h);
+  --theme-success-800: oklch(from var(--theme-success) var(--theme-l-800) c h);
+  --theme-success-900: oklch(from var(--theme-success) var(--theme-l-900) c h);
+  --theme-success-950: oklch(from var(--theme-success) var(--theme-l-950) c h);
+
+  --theme-info-50: oklch(from var(--theme-info) var(--theme-l-50) c h);
+  --theme-info-100: oklch(from var(--theme-info) var(--theme-l-100) c h);
+  --theme-info-200: oklch(from var(--theme-info) var(--theme-l-200) c h);
+  --theme-info-300: oklch(from var(--theme-info) var(--theme-l-300) c h);
+  --theme-info-400: oklch(from var(--theme-info) var(--theme-l-400) c h);
+  --theme-info-500: oklch(from var(--theme-info) var(--theme-l-500) c h);
+  --theme-info-600: oklch(from var(--theme-info) var(--theme-l-600) c h);
+  --theme-info-700: oklch(from var(--theme-info) var(--theme-l-700) c h);
+  --theme-info-800: oklch(from var(--theme-info) var(--theme-l-800) c h);
+  --theme-info-900: oklch(from var(--theme-info) var(--theme-l-900) c h);
+  --theme-info-950: oklch(from var(--theme-info) var(--theme-l-950) c h);
+
+  --theme-warn-50: oklch(from var(--theme-warn) var(--theme-l-50) c h);
+  --theme-warn-100: oklch(from var(--theme-warn) var(--theme-l-100) c h);
+  --theme-warn-200: oklch(from var(--theme-warn) var(--theme-l-200) c h);
+  --theme-warn-300: oklch(from var(--theme-warn) var(--theme-l-300) c h);
+  --theme-warn-400: oklch(from var(--theme-warn) var(--theme-l-400) c h);
+  --theme-warn-500: oklch(from var(--theme-warn) var(--theme-l-500) c h);
+  --theme-warn-600: oklch(from var(--theme-warn) var(--theme-l-600) c h);
+  --theme-warn-700: oklch(from var(--theme-warn) var(--theme-l-700) c h);
+  --theme-warn-800: oklch(from var(--theme-warn) var(--theme-l-800) c h);
+  --theme-warn-900: oklch(from var(--theme-warn) var(--theme-l-900) c h);
+  --theme-warn-950: oklch(from var(--theme-warn) var(--theme-l-950) c h);
+
+  --theme-help-50: oklch(from var(--theme-help) var(--theme-l-50) c h);
+  --theme-help-100: oklch(from var(--theme-help) var(--theme-l-100) c h);
+  --theme-help-200: oklch(from var(--theme-help) var(--theme-l-200) c h);
+  --theme-help-300: oklch(from var(--theme-help) var(--theme-l-300) c h);
+  --theme-help-400: oklch(from var(--theme-help) var(--theme-l-400) c h);
+  --theme-help-500: oklch(from var(--theme-help) var(--theme-l-500) c h);
+  --theme-help-600: oklch(from var(--theme-help) var(--theme-l-600) c h);
+  --theme-help-700: oklch(from var(--theme-help) var(--theme-l-700) c h);
+  --theme-help-800: oklch(from var(--theme-help) var(--theme-l-800) c h);
+  --theme-help-900: oklch(from var(--theme-help) var(--theme-l-900) c h);
+  --theme-help-950: oklch(from var(--theme-help) var(--theme-l-950) c h);
+
+  --theme-danger-50: oklch(from var(--theme-danger) var(--theme-l-50) c h);
+  --theme-danger-100: oklch(from var(--theme-danger) var(--theme-l-100) c h);
+  --theme-danger-200: oklch(from var(--theme-danger) var(--theme-l-200) c h);
+  --theme-danger-300: oklch(from var(--theme-danger) var(--theme-l-300) c h);
+  --theme-danger-400: oklch(from var(--theme-danger) var(--theme-l-400) c h);
+  --theme-danger-500: oklch(from var(--theme-danger) var(--theme-l-500) c h);
+  --theme-danger-600: oklch(from var(--theme-danger) var(--theme-l-600) c h);
+  --theme-danger-700: oklch(from var(--theme-danger) var(--theme-l-700) c h);
+  --theme-danger-800: oklch(from var(--theme-danger) var(--theme-l-800) c h);
+  --theme-danger-900: oklch(from var(--theme-danger) var(--theme-l-900) c h);
+  --theme-danger-950: oklch(from var(--theme-danger) var(--theme-l-950) c h);
+
+  --theme-secondary-color: var(--theme-secondary-500);
+  --theme-secondary-contrast-color: var(--p-primary-contrast-color);
+  --theme-secondary-hover-color: var(--theme-secondary-700);
+  --theme-secondary-active-color: var(--theme-secondary-900);
+  --theme-secondary-highlight-background: var(--theme-secondary-50);
+  --theme-secondary-highlight-color: var(--theme-secondary-700);
+  --theme-secondary-highlight-focus-background: var(--theme-secondary-100);
+  --theme-secondary-highlight-focus-color: var(--theme-secondary-800);
+
+  --theme-success-color: var(--theme-success-500);
+  --theme-success-contrast-color: var(--p-primary-contrast-color);
+  --theme-success-hover-color: var(--theme-success-700);
+  --theme-success-active-color: var(--theme-success-900);
+  --theme-success-highlight-background: var(--theme-success-50);
+  --theme-success-highlight-color: var(--theme-success-700);
+  --theme-success-highlight-focus-background: var(--theme-success-100);
+  --theme-success-highlight-focus-color: var(--theme-success-800);
+
+  --theme-info-color: var(--theme-info-500);
+  --theme-info-contrast-color: var(--p-primary-contrast-color);
+  --theme-info-hover-color: var(--theme-info-700);
+  --theme-info-active-color: var(--theme-info-900);
+  --theme-info-highlight-background: var(--theme-info-50);
+  --theme-info-highlight-color: var(--theme-info-700);
+  --theme-info-highlight-focus-background: var(--theme-info-100);
+  --theme-info-highlight-focus-color: var(--theme-info-800);
+
+  --theme-warn-color: var(--theme-warn-500);
+  --theme-warn-contrast-color: var(--p-primary-contrast-color);
+  --theme-warn-hover-color: var(--theme-warn-700);
+  --theme-warn-active-color: var(--theme-warn-900);
+  --theme-warn-highlight-background: var(--theme-warn-50);
+  --theme-warn-highlight-color: var(--theme-warn-700);
+  --theme-warn-highlight-focus-background: var(--theme-warn-100);
+  --theme-warn-highlight-focus-color: var(--theme-warn-800);
+
+  --theme-help-color: var(--theme-help-500);
+  --theme-help-contrast-color: var(--p-primary-contrast-color);
+  --theme-help-hover-color: var(--theme-help-700);
+  --theme-help-active-color: var(--theme-help-900);
+  --theme-help-highlight-background: var(--theme-help-50);
+  --theme-help-highlight-color: var(--theme-help-700);
+  --theme-help-highlight-focus-background: var(--theme-help-100);
+  --theme-help-highlight-focus-color: var(--theme-help-800);
+
+  --theme-danger-color: var(--theme-danger-500);
+  --theme-danger-contrast-color: var(--p-primary-contrast-color);
+  --theme-danger-hover-color: var(--theme-danger-700);
+  --theme-danger-active-color: var(--theme-danger-900);
+  --theme-danger-highlight-background: var(--theme-danger-50);
+  --theme-danger-highlight-color: var(--theme-danger-700);
+  --theme-danger-highlight-focus-background: var(--theme-danger-100);
+  --theme-danger-highlight-focus-color: var(--theme-danger-800);
+}
+
+@media (prefers-color-scheme: dark) {
+  :root {
+    --theme-secondary-color: var(--theme-secondary-400);
+    --theme-secondary-contrast-color: var(--p-surface-900);
+    --theme-secondary-hover-color: var(--theme-secondary-200);
+    --theme-secondary-active-color: var(--theme-secondary-50);
+
+    --theme-success-color: var(--theme-success-400);
+    --theme-success-contrast-color: var(--p-surface-900);
+    --theme-success-hover-color: var(--theme-success-200);
+    --theme-success-active-color: var(--theme-success-50);
+
+    --theme-info-color: var(--theme-info-400);
+    --theme-info-contrast-color: var(--p-surface-900);
+    --theme-info-hover-color: var(--theme-info-200);
+    --theme-info-active-color: var(--theme-info-50);
+
+    --theme-warn-color: var(--theme-warn-400);
+    --theme-warn-contrast-color: var(--p-surface-900);
+    --theme-warn-hover-color: var(--theme-warn-200);
+    --theme-warn-active-color: var(--theme-warn-50);
+
+    --theme-help-color: var(--theme-help-400);
+    --theme-help-contrast-color: var(--p-surface-900);
+    --theme-help-hover-color: var(--theme-help-200);
+    --theme-help-active-color: var(--theme-help-50);
+
+    --theme-danger-color: var(--theme-danger-400);
+    --theme-danger-contrast-color: var(--p-surface-900);
+    --theme-danger-hover-color: var(--theme-danger-200);
+    --theme-danger-active-color: var(--theme-danger-50);
+  }
+}
+
+@theme inline {
+  --color-secondary: var(--theme-secondary-color);
+  --color-secondary-emphasis: var(--theme-secondary-hover-color);
+  --color-secondary-emphasis-alt: var(--theme-secondary-active-color);
+  --color-secondary-contrast: var(--theme-secondary-contrast-color);
+  --color-secondary-50: var(--theme-secondary-50);
+  --color-secondary-100: var(--theme-secondary-100);
+  --color-secondary-200: var(--theme-secondary-200);
+  --color-secondary-300: var(--theme-secondary-300);
+  --color-secondary-400: var(--theme-secondary-400);
+  --color-secondary-500: var(--theme-secondary-500);
+  --color-secondary-600: var(--theme-secondary-600);
+  --color-secondary-700: var(--theme-secondary-700);
+  --color-secondary-800: var(--theme-secondary-800);
+  --color-secondary-900: var(--theme-secondary-900);
+  --color-secondary-950: var(--theme-secondary-950);
+
+  --color-success: var(--theme-success-color);
+  --color-success-emphasis: var(--theme-success-hover-color);
+  --color-success-emphasis-alt: var(--theme-success-active-color);
+  --color-success-contrast: var(--theme-success-contrast-color);
+  --color-success-50: var(--theme-success-50);
+  --color-success-100: var(--theme-success-100);
+  --color-success-200: var(--theme-success-200);
+  --color-success-300: var(--theme-success-300);
+  --color-success-400: var(--theme-success-400);
+  --color-success-500: var(--theme-success-500);
+  --color-success-600: var(--theme-success-600);
+  --color-success-700: var(--theme-success-700);
+  --color-success-800: var(--theme-success-800);
+  --color-success-900: var(--theme-success-900);
+  --color-success-950: var(--theme-success-950);
+
+  --color-info: var(--theme-info-color);
+  --color-info-emphasis: var(--theme-info-hover-color);
+  --color-info-emphasis-alt: var(--theme-info-active-color);
+  --color-info-contrast: var(--theme-info-contrast-color);
+  --color-info-50: var(--theme-info-50);
+  --color-info-100: var(--theme-info-100);
+  --color-info-200: var(--theme-info-200);
+  --color-info-300: var(--theme-info-300);
+  --color-info-400: var(--theme-info-400);
+  --color-info-500: var(--theme-info-500);
+  --color-info-600: var(--theme-info-600);
+  --color-info-700: var(--theme-info-700);
+  --color-info-800: var(--theme-info-800);
+  --color-info-900: var(--theme-info-900);
+  --color-info-950: var(--theme-info-950);
+
+  --color-warn: var(--theme-warn-color);
+  --color-warn-emphasis: var(--theme-warn-hover-color);
+  --color-warn-emphasis-alt: var(--theme-warn-active-color);
+  --color-warn-contrast: var(--theme-warn-contrast-color);
+  --color-warn-50: var(--theme-warn-50);
+  --color-warn-100: var(--theme-warn-100);
+  --color-warn-200: var(--theme-warn-200);
+  --color-warn-300: var(--theme-warn-300);
+  --color-warn-400: var(--theme-warn-400);
+  --color-warn-500: var(--theme-warn-500);
+  --color-warn-600: var(--theme-warn-600);
+  --color-warn-700: var(--theme-warn-700);
+  --color-warn-800: var(--theme-warn-800);
+  --color-warn-900: var(--theme-warn-900);
+  --color-warn-950: var(--theme-warn-950);
+
+  --color-help: var(--theme-help-color);
+  --color-help-emphasis: var(--theme-help-hover-color);
+  --color-help-emphasis-alt: var(--theme-help-active-color);
+  --color-help-contrast: var(--theme-help-contrast-color);
+  --color-help-50: var(--theme-help-50);
+  --color-help-100: var(--theme-help-100);
+  --color-help-200: var(--theme-help-200);
+  --color-help-300: var(--theme-help-300);
+  --color-help-400: var(--theme-help-400);
+  --color-help-500: var(--theme-help-500);
+  --color-help-600: var(--theme-help-600);
+  --color-help-700: var(--theme-help-700);
+  --color-help-800: var(--theme-help-800);
+  --color-help-900: var(--theme-help-900);
+  --color-help-950: var(--theme-help-950);
+
+  --color-danger: var(--theme-danger-color);
+  --color-danger-emphasis: var(--theme-danger-hover-color);
+  --color-danger-emphasis-alt: var(--theme-danger-active-color);
+  --color-danger-contrast: var(--theme-danger-contrast-color);
+  --color-danger-50: var(--theme-danger-50);
+  --color-danger-100: var(--theme-danger-100);
+  --color-danger-200: var(--theme-danger-200);
+  --color-danger-300: var(--theme-danger-300);
+  --color-danger-400: var(--theme-danger-400);
+  --color-danger-500: var(--theme-danger-500);
+  --color-danger-600: var(--theme-danger-600);
+  --color-danger-700: var(--theme-danger-700);
+  --color-danger-800: var(--theme-danger-800);
+  --color-danger-900: var(--theme-danger-900);
+  --color-danger-950: var(--theme-danger-950);
+}
+
+@custom-variant p-secondary {
+  &:where([data-p-severity~="secondary"], [data-p~="secondary"]) {
+    @slot;
+  }
+}
+
+@custom-variant p-contrast {
+  &:where([data-p-severity~="contrast"], [data-p~="contrast"]) {
+    @slot;
+  }
+}
+
+@custom-variant p-success {
+  &:where([data-p-severity~="success"], [data-p~="success"]) {
+    @slot;
+  }
+}
+
+@custom-variant p-info {
+  &:where([data-p-severity~="info"], [data-p~="info"]) {
+    @slot;
+  }
+}
+
+@custom-variant p-warn {
+  &:where([data-p-severity~="warn"], [data-p~="warn"]) {
+    @slot;
+  }
+}
+
+@custom-variant p-help {
+  &:where([data-p-severity~="help"], [data-p~="help"]) {
+    @slot;
+  }
+}
+
+@custom-variant p-danger {
+  &:where([data-p-severity~="danger"], [data-p~="danger"]) {
+    @slot;
+  }
+}
+
+@custom-variant p-error {
+  &:where([data-p-severity~="error"], [data-p~="error"]) {
+    @slot;
+  }
+}

+ 36 - 0
app/assets/css/tooltip.css

@@ -0,0 +1,36 @@
+:where([data-pc-name~="tooltip"]) {
+  @apply absolute max-w-50;
+
+  &:where([data-p-position="right"]), &:where([data-p-position="left"]) {
+    @apply px-1 py-0;
+  }
+
+  &:where([data-p-position="top"]), &:where([data-p-position="bottom"]) {
+    @apply px-0 py-1;
+  }
+
+  & > :where([data-pc-section~="text"]) {
+    @apply rounded-md bg-primary-700 px-3 py-2 break-normal whitespace-pre-line
+    text-surface shadow-[0_4px_6px_-1px_rgba(0,0,0,0.1),0_2px_4px_-2px_rgba(0,0,0,0.1)];
+  }
+
+  & > :where([data-pc-section~="arrow"]) {
+    @apply absolute h-0 w-0 border-4 border-solid border-transparent;
+  }
+
+  &:where([data-p-position="right"]) > &:where([data-pc-section~="arrow"]) {
+    @apply -mt-1 border-l-0 border-r-surface-700;
+  }
+
+  &:where([data-p-position="left"]) > &:where([data-pc-section~="arrow"]) {
+    @apply -mt-1 border-r-0 border-l-surface-700;
+  }
+
+  &:where([data-p-position="top"]) > &:where([data-pc-section~="arrow"]) {
+    @apply -ml-1 border-b-0 border-y-surface-700;
+  }
+
+  &:where([data-p-position="bottom"]) > &:where([data-pc-section~="arrow"]) {
+    @apply -ml-1 border-t-0 border-y-surface-700;
+  }
+}

+ 65 - 0
app/assets/css/trix.css

@@ -0,0 +1,65 @@
+@custom-variant active {
+  &:where(&:active, [data-trix-active]) {
+    @slot;
+  }
+}
+
+.trix-content {
+  @apply prose leading-[1.5];
+  @apply prose-h1:text-xl prose-h1:mt-0 prose-h1:mb-2;
+  @apply prose-p:mt-0 prose-p:mb-2;
+  @apply prose-a:underline;
+  @apply prose-blockquote:mt-0 prose-blockquote:mb-2;
+  @apply prose-pre:mt-0 prose-pre:mb-2;
+  @apply prose-ol:mt-0 prose-ol:mb-2;
+  @apply prose-ul:mt-0 prose-ul:mb-2;
+  @apply prose-li:my-0;
+
+  & :is(div, p) + h1 {
+    @apply mt-4;
+  }
+
+  & :first-child {
+    @apply mt-0;
+  }
+
+  & :last-child {
+    @apply mb-0;
+  }
+
+  --tw-prose-body: var(--p-text-color);
+  --tw-prose-headings: var(--p-primary-color);
+  --tw-prose-lead: var(--p-primary-color);
+  --tw-prose-links: var(--p-primary-color);
+  --tw-prose-bold: var(--p-text-hover-color);
+  --tw-prose-counters: var(--p-text-color);
+  --tw-prose-bullets: var(--p-primary-color);
+  --tw-prose-hr: var(--p-text-muted-color);
+  --tw-prose-quotes: var(--p-text-color);
+  --tw-prose-quote-borders: var(--p-primary-color);
+  --tw-prose-captions: var(--p-text-hover-color);
+  --tw-prose-code: var(--p-text-muted-color);
+  --tw-prose-pre-code: var(--p-content-hover-color);
+  --tw-prose-pre-bg: var(--p-content-hover-background);
+  --tw-prose-th-borders: var(--p-content-border-color);
+  --tw-prose-td-borders: var(--p-content-border-color);
+
+  /*
+  --tw-prose-invert-body: var(--color-pink-200);
+  --tw-prose-invert-headings: var(--color-white);
+  --tw-prose-invert-lead: var(--color-pink-300);
+  --tw-prose-invert-links: var(--color-white);
+  --tw-prose-invert-bold: var(--color-white);
+  --tw-prose-invert-counters: var(--color-pink-400);
+  --tw-prose-invert-bullets: var(--color-pink-600);
+  --tw-prose-invert-hr: var(--color-pink-700);
+  --tw-prose-invert-quotes: var(--color-pink-100);
+  --tw-prose-invert-quote-borders: var(--color-pink-700);
+  --tw-prose-invert-captions: var(--color-pink-400);
+  --tw-prose-invert-code: var(--color-white);
+  --tw-prose-invert-pre-code: var(--color-pink-300);
+  --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);
+  --tw-prose-invert-th-borders: var(--color-pink-600);
+  --tw-prose-invert-td-borders: var(--color-pink-700);
+  */
+}

+ 14 - 0
app/components/ClearFiltersButton.vue

@@ -0,0 +1,14 @@
+<template>
+  <Button variant="outlined">
+    <Icon
+      name="ph:funnel-simple-x-bold"
+      size="1.25rem"
+    />
+
+    Clear
+  </Button>
+</template>
+
+<script setup></script>
+
+<style scoped></style>

+ 36 - 0
app/components/NavBar.vue

@@ -0,0 +1,36 @@
+<template>
+  <Toolbar
+    id="navbar"
+    :pt="{
+      root: 'mb-4 rounded-t-none',
+      start: 'gap-2',
+      center: 'hidden',
+      end: 'flex-none'
+    }"
+  >
+    <template #start>
+      <Button
+        class="border-none px-6!"
+        variant="text"
+      >
+        <NuxtLink
+          class="text-[1.25rem] font-bold whitespace-nowrap"
+          data-testid="title"
+          to="/"
+        >
+          <Icon name="personae" />
+
+          Dramatis Personae
+        </NuxtLink>
+      </Button>
+    </template>
+
+    <template #end>
+      <UserMenu />
+    </template>
+  </Toolbar>
+</template>
+
+<script setup></script>
+
+<style scoped></style>

+ 83 - 0
app/components/OptionsFilter.vue

@@ -0,0 +1,83 @@
+<template>
+  <div class="flex min-h-56.5 flex-col justify-between gap-2">
+    <Listbox
+      v-model="model"
+      :options="options"
+      multiple
+      scrollHeight="12rem"
+      @change="filterCallback"
+    >
+      <!--suppress VueUnrecognizedSlot -->
+      <template #option="{ option, selected, index }">
+        <div
+          :id="`filter_${index}`"
+          class="flex w-full flex-row items-center gap-1"
+          :class="
+            !isFilteredOption(option) &&
+            'text-surface-400! dark:text-surface-500!'
+          "
+        >
+          <div class="min-w-[0.875em]">
+            <Icon
+              v-if="selected"
+              name="ph:check-bold"
+              size="0.875em"
+            />
+          </div>
+
+          <div class="truncate">
+            {{ option }}
+          </div>
+        </div>
+      </template>
+    </Listbox>
+
+    <Button
+      class="py-0.5!"
+      variant="outlined"
+      size="small"
+      fluid
+      :disabled="!hasFilter()"
+      @click="resetFilter"
+    >
+      Clear
+    </Button>
+  </div>
+</template>
+
+<script setup>
+const model = defineModel()
+
+const props = defineProps({
+  options: {
+    type: Array,
+    required: true
+  },
+
+  filteredOptions: {
+    type: Array,
+    required: true
+  },
+
+  filterCallback: {
+    type: Function,
+    required: true
+  },
+
+  hasFilter: {
+    type: Function,
+    required: true
+  },
+
+  resetFilter: {
+    type: Function,
+    required: true
+  }
+})
+
+function isFilteredOption(option) {
+  return _includes(props.filteredOptions, option)
+}
+</script>
+
+<style scoped></style>

+ 40 - 0
app/components/SearchField.vue

@@ -0,0 +1,40 @@
+<template>
+  <div
+    class="group flex flex-auto items-stretch rounded-md border border-surface-300
+      text-base has-hover:border-surface-400 has-focus:border-primary
+      has-p-invalid:border-danger-300 has-hover:has-p-invalid:border-danger-400
+      has-focus:has-p-invalid:border-danger dark:border-surface-700
+      dark:has-hover:border-surface-600 dark:has-p-invalid:border-danger-700
+      dark:has-hover:has-p-invalid:border-danger-600"
+  >
+    <div
+      class="relative inline-flex cursor-pointer items-center justify-center gap-2
+        overflow-hidden rounded-s-md bg-surface-0 px-3 py-2 text-primary-300 select-none
+        group-has-hover:text-primary-400 group-has-focus:text-primary!
+        dark:bg-surface-950 dark:text-primary-700 dark:group-has-hover:text-primary-600"
+    >
+      <Icon name="ph:magnifying-glass-bold" />
+    </div>
+
+    <input
+      v-model="model"
+      v-bind="$attrs"
+      class="w-full appearance-none rounded-s-none rounded-e-md bg-surface-0 py-2 ps-0.5 pe-3
+        text-surface-700 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)] outline-hidden
+        transition-colors duration-200 placeholder:text-surface-500
+        disabled:bg-surface-200 disabled:text-surface-500 dark:bg-surface-950
+        dark:text-surface-0 dark:placeholder:text-surface-400
+        dark:disabled:bg-surface-700 dark:disabled:text-surface-400"
+    />
+  </div>
+</template>
+
+<script setup>
+defineOptions({
+  inheritAttrs: false
+})
+
+const model = defineModel()
+</script>
+
+<style scoped></style>

+ 41 - 0
app/components/SpinnerModal.vue

@@ -0,0 +1,41 @@
+<template>
+  <Dialog
+    :visible="visible"
+    :closeOnEscape="false"
+    modal
+    :showHeader="false"
+    :pt="{
+      root: 'border-0 bg-transparent! shadow-none',
+      content: 'p-0!',
+      mask: maskClass
+    }"
+  >
+    <ProgressSpinner
+      class="p-progressspinner"
+      :unstyled="false"
+    />
+  </Dialog>
+</template>
+
+<script setup>
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    default: false
+  },
+
+  maskClass: {
+    type: String,
+    required: false
+  }
+})
+</script>
+
+<style scoped>
+.p-progressspinner {
+  --p-progressspinner-color-one: var(--color-primary-400);
+  --p-progressspinner-color-two: var(--color-primary-900);
+  --p-progressspinner-color-three: var(--color-primary-400);
+  --p-progressspinner-color-four: var(--color-primary-100);
+}
+</style>

+ 97 - 0
app/components/TextFilter.vue

@@ -0,0 +1,97 @@
+<template>
+  <div class="flex min-h-56.5 flex-col justify-between">
+    <div class="flex flex-col gap-2">
+      <InputText
+        v-model="model.value"
+        fluid
+        type="search"
+        placeholder="Filter&hellip;"
+      />
+
+      <div class="w-full bg-primary-200 px-2 py-1">
+        {{ matchMode }}
+      </div>
+
+      <SelectButton
+        v-model="model.matchMode"
+        :options="matchModeOptions"
+        optionLabel="name"
+        optionValue="value"
+        dataKey="value"
+        :pt="{
+          root: `*:rounded-none *:not-last:border-r-0 *:first:rounded-s-md *:last:rounded-e-md
+          *:focus-visible:relative *:focus-visible:z-10`,
+          pcToggleButton: {
+            root: `grow border-primary-200! bg-transparent! p-0! text-primary!
+            hover:border-primary-300! hover:bg-primary-50! dark:border-primary-700!
+            dark:hover:border-primary-600! dark:hover:bg-primary/5!
+            p-checked:border-primary-400! p-checked:bg-primary-100!
+            dark:p-checked:border-primary-500! dark:p-checked:bg-primary/15!`,
+            content: 'px-0! py-0.5! p-checked:bg-transparent!'
+          }
+        }"
+      >
+        <!--suppress VueUnrecognizedSlot -->
+        <template #option="slotProps">
+          <Icon :name="slotProps.option.icon" />
+        </template>
+      </SelectButton>
+    </div>
+
+    <Button
+      class="py-0.5!"
+      variant="outlined"
+      size="small"
+      fluid
+      :disabled="!hasFilter()"
+      @click="resetFilter"
+    >
+      Clear
+    </Button>
+  </div>
+</template>
+
+<script setup>
+import { FilterMatchMode } from "@primevue/core/api"
+
+const model = defineModel()
+
+const props = defineProps({
+  filterCallback: {
+    type: Function,
+    required: true
+  },
+
+  hasFilter: {
+    type: Function,
+    required: true
+  },
+
+  resetFilter: {
+    type: Function,
+    required: true
+  }
+})
+
+const matchModeOptions = ref([
+  {
+    name: "Starts with",
+    icon: "ph:arrow-line-left",
+    value: FilterMatchMode.STARTS_WITH
+  },
+  {
+    name: "Contains",
+    icon: "ph:arrows-out-line-horizontal",
+    value: FilterMatchMode.CONTAINS
+  },
+  {
+    name: "Ends with",
+    icon: "ph:arrow-line-right",
+    value: FilterMatchMode.ENDS_WITH
+  }
+])
+
+const matchMode = ref("Contains")
+</script>
+
+<style scoped></style>

+ 35 - 0
app/components/ToggleFilterButton.vue

@@ -0,0 +1,35 @@
+<template>
+  <Button variant="outlined">
+    <Icon
+      name="ph:funnel-simple-bold"
+      size="1.25rem"
+    />
+
+    <div class="flex flex-col">
+      <div
+        class="overflow-hidden"
+        :class="showFilters && 'h-0!'"
+      >
+        Show
+      </div>
+
+      <div
+        class="overflow-hidden"
+        :class="!showFilters && 'h-0!'"
+      >
+        Hide
+      </div>
+    </div>
+  </Button>
+</template>
+
+<script setup>
+const props = defineProps({
+  showFilters: {
+    type: Boolean,
+    required: true
+  }
+})
+</script>
+
+<style scoped></style>

+ 137 - 0
app/components/UserMenu.vue

@@ -0,0 +1,137 @@
+<template>
+  <div>
+    <Button
+      v-if="isSignedIn"
+      class="border-none px-6! py-2.75"
+      variant="text"
+      aria-haspopup="true"
+      aria-controls="user_menu"
+      @click="toggleMenu"
+    >
+      <span class="font-semibold">
+        {{ user.username }}
+      </span>
+
+      <Icon
+        name="ph:user-circle-fill"
+        size="1.25rem"
+      />
+    </Button>
+
+    <Button
+      v-else
+      class="border-none px-6! py-2.75"
+      variant="text"
+      @click="showSignInDialog"
+    >
+      <span class="font-semibold">Sign In</span>
+
+      <Icon
+        name="ph:user-circle-light"
+        size="1.25rem"
+      />
+    </Button>
+
+    <Menu
+      class="mt-0"
+      id="user_menu"
+      :model="model"
+      :popup="true"
+      ref="menu"
+    >
+      <template #item="{ item, props }">
+        <!--suppress HtmlUnknownTarget -->
+        <NuxtLink
+          v-if="item.route"
+          v-slot="{ href, navigate }"
+          :to="item.route"
+          custom
+        >
+          <a
+            :href="href"
+            v-bind="props.action"
+            @click="navigate"
+          >
+            {{ item.label }}
+          </a>
+        </NuxtLink>
+
+        <a
+          v-else
+          :href="item?.url"
+          :target="item?.target"
+          v-bind="props.action"
+        >
+          {{ item.label }}
+        </a>
+      </template>
+    </Menu>
+  </div>
+</template>
+
+<script setup>
+// const SignInDialog = defineLazyHydrationComponent(
+//   "visible",
+//   () => import("~/components/SignInDialog.vue")
+// )
+
+// const ChangePasswordDialog = defineLazyHydrationComponent(
+//   "visible",
+//   () => import("~/components/ChangePasswordDialog.vue")
+// )
+
+const { isSignedIn, signOut, user } = useAuthClient()
+// const dialog = useDialog()
+// const toast = useToast()
+
+const menu = useTemplateRef("menu")
+
+const model = computed(() => {
+  const menu = [
+    { label: "Change Password", command: showChangePasswordDialog },
+    { label: "Sign Out", command: doSignOut }
+  ]
+
+  // noinspection JSUnresolvedReference
+  if (isSignedIn.value && user.value.role === "admin") {
+    menu.unshift({
+      label: "Dashboard",
+      command: async () => await navigateTo({ name: "admin:users" })
+    })
+  }
+
+  return menu
+})
+
+async function doSignOut() {
+  await signOut()
+  closeMenu()
+
+  // toast.add({
+  //   severity: "success",
+  //   summary: "Signed Out.",
+  //   detail: "You've been signed out.",
+  //   life: 3000
+  // })
+}
+
+function toggleMenu(event) {
+  menu.value.toggle(event)
+}
+
+function closeMenu(_) {
+  menu.value.hide()
+}
+
+function showSignInDialog() {
+  closeMenu()
+  // useOpenDialog(dialog, SignInDialog)
+}
+
+function showChangePasswordDialog() {
+  closeMenu()
+  // useOpenDialog(dialog, ChangePasswordDialog)
+}
+</script>
+
+<style scoped></style>

+ 81 - 0
app/components/character/CharacterFilterChips.vue

@@ -0,0 +1,81 @@
+<!--suppress JSUnresolvedReference, VueUnrecognizedSlot -->
+<template>
+  <div class="flex flex-row flex-wrap gap-1">
+    <template v-if="filters.global.value.length > 0">
+      <Chip
+        :label="`Anywhere: &ldquo;${filters.global.value}&rdquo;`"
+        removable
+      >
+        <template #removeicon>
+          <Icon
+            name="ph:x-bold"
+            class="rounded-full p-0.5 hover:bg-primary-200 dark:hover:bg-primary-600"
+            size="1.25em"
+            @click="resetGlobalFilter"
+          />
+        </template>
+      </Chip>
+    </template>
+
+    <template
+      v-if="hasAnyNameFilters"
+      v-for="field in _keys(nameFields)"
+      :key="field"
+    >
+      <Chip
+        v-if="hasFilterFor(field)"
+        :label="`${_startCase(field)}: &ldquo;${filters[field].value}&rdquo;`"
+        removable
+      >
+        <template #removeicon>
+          <Icon
+            name="ph:x-bold"
+            class="rounded-full p-0.5 hover:bg-primary-200 dark:hover:bg-primary-600"
+            size="1.25em"
+            @click="resetFilterFor(field)"
+          />
+        </template>
+      </Chip>
+    </template>
+
+    <template
+      v-if="hasAnyCategoryFilters"
+      v-for="field in _keys(optionsFields)"
+      :key="field"
+    >
+      <Chip
+        v-if="hasFilterFor(field)"
+        v-for="value in filters[field].value"
+        :label="value"
+        removable
+      >
+        <template #removeicon>
+          <Icon
+            name="ph:x-bold"
+            class="rounded-full p-0.5 hover:bg-primary-200 dark:hover:bg-primary-600"
+            size="1.25em"
+            @click="removeFilterValueFrom(field, value)"
+          />
+        </template>
+      </Chip>
+    </template>
+  </div>
+</template>
+
+<script setup>
+const filtersStore = useFiltersStore()
+
+const {
+  hasAnyCategoryFilters,
+  hasAnyNameFilters,
+  hasFilterFor,
+  hasGlobalFilter,
+  removeFilterValueFrom,
+  resetFilterFor,
+  resetGlobalFilter
+} = filtersStore
+
+const { filters } = storeToRefs(filtersStore)
+</script>
+
+<style scoped></style>

+ 62 - 0
app/components/character/CharacterToolbar.vue

@@ -0,0 +1,62 @@
+<!--suppress VueUnrecognizedSlot -->
+<template>
+  <Toolbar :pt="{ root: 'min-h-11.5 rounded-b-none' }">
+    <template #start>
+      <div class="ps-6 text-sm whitespace-nowrap text-primary">
+        Showing
+        <strong class="font-semibold">{{ filteredCountText }}</strong> of
+        <strong class="font-semibold">{{ count }}</strong>
+        {{ pluralize("character", count) }}
+      </div>
+    </template>
+
+    <template #end>
+      <Button
+        v-if="isSignedIn"
+        class="border-none px-6! py-3.25"
+        variant="text"
+      >
+        <!--suppress HtmlUnknownTarget -->
+        <NuxtLink
+          class="flex items-center gap-0.5"
+          :to="{ name: 'characterCreate' }"
+        >
+          <span class="font-semibold">Add</span>
+
+          <Icon name="ph:plus-bold" />
+        </NuxtLink>
+      </Button>
+    </template>
+  </Toolbar>
+</template>
+
+<script setup>
+const props = defineProps({
+  count: {
+    type: Number,
+    required: true
+  },
+
+  filteredCount: {
+    type: Number,
+    required: true
+  }
+})
+
+const { isSignedIn } = useAuthClient()
+
+const filteredCountText = computed(() => {
+  switch (props.filteredCount) {
+    case props.count:
+      return "all"
+
+    case 0:
+      return "none"
+
+    default:
+      return props.filteredCount
+  }
+})
+</script>
+
+<style scoped></style>

+ 8 - 0
app/composables/useAuthClient.js

@@ -0,0 +1,8 @@
+export default function useAuthClient() {
+  return {
+    isSignedIn: ref(false),
+    signIn: _noop(),
+    signOut: _noop(),
+    user: ref(null)
+  }
+}

+ 15 - 0
app/composables/useEmit.js

@@ -0,0 +1,15 @@
+export default async function useEmit(event, ...params) {
+  const {
+    $socketio: { socket }
+  } = useNuxtApp()
+
+  const { data, error } = await socket.emitWithAck(event, ...params)
+
+  if (error) {
+    console.error("[useEmit] [error]", event, params, error)
+
+    throw new Error(error)
+  }
+
+  return data
+}

+ 15 - 0
app/pages/blank.vue

@@ -0,0 +1,15 @@
+<template>
+  <div class="flex flex-row w-full border border-primary">
+    <Icon
+      name="personae"
+      size="5em"
+      v-tooltip.focus.left="{ value: 'tooltip', autoHide: false }"
+    />
+  </div>
+</template>
+
+<script setup></script>
+
+<style scoped>
+
+</style>

+ 51 - 0
app/pages/filter.vue

@@ -0,0 +1,51 @@
+<template>
+  <div class="w-54 flex flex-col gap-2">
+    <InputText
+      v-model="model.value"
+      fluid
+      type="search"
+      placeholder="Filter&hellip;"
+    />
+
+    <SelectButton
+      v-model="model.matchMode"
+      :options="matchModeOptions"
+      optionLabel="name"
+      optionValue="value"
+      :pt="{
+          root: `gap-0.25 *:rounded-none *:not-last:border-r-0 *:first:rounded-s-md
+          *:last:rounded-e-md *:focus-visible:relative *:focus-visible:z-10`,
+          pcToggleButton: {
+            root: `grow border-primary bg-primary text-primary-contrast hover:border-primary-emphasis
+            hover:bg-primary-emphasis active:border-primary-emphasis-alt
+            active:bg-primary-emphasis-alt p-checked:border-primary-emphasis-alt p-checked:bg-primary-emphasis-alt`,
+            content: `p-checked:bg-transparent`
+          }
+        }"
+    >
+      <!--suppress VueUnrecognizedSlot -->
+      <template #option="slotProps">
+        {{ slotProps.option.name }}
+      </template>
+    </SelectButton>
+  </div>
+
+  <div>{{ model.value }}</div>
+  <div>{{ model.matchMode }}</div>
+</template>
+
+<script setup>
+import { FilterMatchMode } from "@primevue/core/api"
+
+const model = ref({ value: "", matchMode: FilterMatchMode.CONTAINS })
+
+const matchModeOptions = ref([
+  { name: "lt", value: FilterMatchMode.STARTS_WITH },
+  { name: "eq", value: FilterMatchMode.CONTAINS },
+  { name: "gt", value: FilterMatchMode.ENDS_WITH }
+])
+</script>
+
+<style scoped>
+
+</style>

+ 230 - 0
app/pages/index.vue

@@ -0,0 +1,230 @@
+<!--suppress VueUnrecognizedSlot -->
+<template>
+  <DataTable
+    :value="characters"
+    dataKey="id"
+    :loading="isLoading"
+    sortField="createdAt"
+    :sortOrder="1"
+    removableSort
+    v-model:filters="filters"
+    :filterDisplay="showFilters ? 'row' : null"
+    :globalFilterFields="globalFilterFieldNames"
+    selectionMode="single"
+    resizableColumns
+    stateStorage="session"
+    stateKey="datatable-state"
+    scrollable
+    :scrollHeight="`calc(100vh - ${elementHeights}px)`"
+    size="small"
+    :pt="{
+      header: { id: 'datatable_header' },
+      footer: { id: 'datatable_footer' },
+      column: {
+        headerCell: 'max-w-[8rem]',
+        bodyCell: 'max-w-[8rem]'
+      }
+    }"
+    @filter="(event) => updateFilteredCharacters(event.filteredValue)"
+    @rowSelect="(event) => showDetail(event.data)"
+  >
+    <Column
+      v-for="field in _keys(columnFields)"
+      :key="field"
+      :field="field"
+      :header="_upperCase(field)"
+      :showFilterMenu="false"
+      :sortable="true"
+    >
+      <template #filter="{ filterModel, filterCallback }">
+        <OptionsFilter
+          v-if="_isMatch(characterFields[field], { type: 'autocomplete' })"
+          v-model="filterModel.value"
+          :options="options[field]"
+          :filteredOptions="filteredOptions[field]"
+          :filterCallback="filterCallback"
+          :hasFilter="() => hasFilterFor(field)"
+          :resetFilter="() => resetFilterFor(field)"
+        />
+
+        <TextFilter
+          v-else
+          v-model="filters[field]"
+          :filterCallback="filterCallback"
+          :hasFilter="() => hasFilterFor(field)"
+          :resetFilter="() => resetFilterFor(field)"
+        />
+      </template>
+
+      <template #sorticon="{ sorted, sortOrder }">
+        <Icon
+          v-if="sorted && sortOrder === 1"
+          name="ph:sort-ascending-bold"
+          size="1.25rem"
+        />
+
+        <Icon
+          v-else-if="sorted && sortOrder === -1"
+          name="ph:sort-descending-bold"
+          size="1.25rem"
+        />
+
+        <Icon
+          v-else
+          name="ph:arrows-down-up-bold"
+          size="1.25rem"
+        />
+      </template>
+    </Column>
+
+    <template #header>
+      <div :class="isLoading && 'hidden'">
+        <div class="flex justify-between gap-4 pb-2">
+          <SearchField
+            v-model="filters['global'].value"
+            placeholder="Search"
+            type="search"
+            id="global_filter"
+          />
+
+          <ClearFiltersButton
+            :disabled="!hasAnyFilters"
+            @click="resetFilters"
+            class="px-4"
+          />
+
+          <ToggleFilterButton
+            @click="toggleShowFilters"
+            class="px-4"
+            :showFilters="showFilters"
+          />
+        </div>
+
+        <CharacterFilterChips
+          v-if="hasAnyFilters && !showFilters"
+          class="pb-2"
+        />
+      </div>
+    </template>
+
+    <template #empty>
+      <div
+        class="text-center text-2xl"
+        :class="isLoading && 'hidden'"
+      >
+        <template v-if="hasGlobalFilter">
+          <template v-if="hasAnyColumnFilters">
+            No characters matching
+            <!--suppress JSUnresolvedReference -->
+            <span class="italic">&ldquo;{{ filters.global.value }}&rdquo;</span>
+            with the current filters.
+          </template>
+
+          <template v-else>
+            No characters matching
+            <!--suppress JSUnresolvedReference -->
+            <span class="italic">&ldquo;{{ filters.global.value }}&rdquo;</span
+            >.
+          </template>
+        </template>
+
+        <template v-else>No characters match the current filters.</template>
+      </div>
+    </template>
+
+    <template #loading>
+      <SpinnerModal
+        :visible="true"
+        maskClass="bg-surface!"
+      />
+    </template>
+
+    <template #footer>
+      <CharacterToolbar
+        :class="isLoading && 'hidden'"
+        :filteredCount="filteredCount"
+        :count="count"
+      />
+    </template>
+  </DataTable>
+</template>
+
+<script setup>
+definePageMeta({ name: "characters" })
+
+const { isSignedIn } = useAuthClient()
+
+const filtersStore = useFiltersStore()
+
+const {
+  hasAnyColumnFilters,
+  hasAnyFilters,
+  hasFilterFor,
+  hasGlobalFilter,
+  resetFilterFor,
+  resetFilters,
+  toggleShowFilters
+} = filtersStore
+
+const { filters, showFilters } = storeToRefs(filtersStore)
+
+const { data: characters, isLoading: isLoadingCharacters } =
+  useQuery(characterListQuery)
+
+const { data: options, isLoading: isLoadingOptions } = useQuery(
+  characterOptionsQuery
+)
+
+const isLoading = computed(
+  () => isLoadingCharacters.value || isLoadingOptions.value
+)
+
+const count = computed(() => _size(characters.value))
+const filteredCount = computed(() => _size(filteredCharacters.value))
+const filteredCharacters = ref(_cloneDeep(characters.value))
+
+const filteredOptions = computed(() =>
+  findUniqueOptions(filteredCharacters.value)
+)
+
+const DEFAULT_ELEMENT_HEIGHTS = 168
+const elementHeights = ref(DEFAULT_ELEMENT_HEIGHTS)
+
+onMounted(() => updateElementHeights())
+onUpdated(() => updateElementHeights())
+
+function updateFilteredCharacters(filteredValue) {
+  filteredCharacters.value = filteredValue
+}
+
+async function showDetail({ id: characterId }) {
+  if (isSignedIn.value) {
+    await navigateTo({ name: "characterEdit", params: { characterId } })
+  } else {
+    await navigateTo({ name: "characterView", params: { characterId } })
+  }
+}
+
+function updateElementHeights() {
+  elementHeights.value = totalElementHeights()
+}
+
+function totalElementHeights() {
+  // total height of non-datatable elements (in pixels)
+  const elements = ["navbar", "datatable_header", "datatable_footer"]
+
+  // noinspection JSUnresolvedReference
+  let totalHeights = _reduce(
+    elements,
+    (acc, element) => acc + document?.getElementById(element)?.offsetHeight,
+    0
+  )
+
+  // plus 16px [--spacing(4)] bottom navbar margin
+  totalHeights += 16
+
+  return _isNaN(totalHeights) ? DEFAULT_ELEMENT_HEIGHTS : totalHeights
+}
+</script>
+
+<style scoped></style>

+ 120 - 0
app/plugins/socketio.js

@@ -0,0 +1,120 @@
+import { io } from "socket.io-client"
+
+const LOG_CONNECTIONS = false
+const LOG_EVENTS = false
+const LOG_LISTENERS = false
+const LOG_HOOKS = false
+
+// noinspection JSUnusedGlobalSymbols
+export default defineNuxtPlugin({
+  name: "socketio",
+  enforce: "pre",
+
+  async setup() {
+    const { isSignedIn, user } = useAuthClient()
+    const config = useRuntimeConfig()
+    const socket = io(config.public.websocketHost)
+
+    const isConnected = ref(false)
+    const transport = ref("N/A")
+
+    if (socket.connected) {
+      onConnect()
+    }
+
+    socket.on("connect", onConnect)
+    socket.on("disconnect", onDisconnect)
+
+    if (LOG_EVENTS) {
+      // log all outgoing events
+      socket.onAnyOutgoing((eventName, ...args) =>
+        console.log("[app socketio] [outgoing]", eventName, args)
+      )
+    }
+
+    function onConnect() {
+      isConnected.value = true
+      transport.value = socket.io.engine.transport.name
+
+      socket.io.engine.on("upgrade", (rawTransport) => {
+        transport.value = rawTransport.name
+      })
+
+      if (LOG_CONNECTIONS) {
+        console.log(
+          "[app socketio] [onConnect]",
+          import.meta.server ? "server" : "client",
+          transport.value,
+          isSignedIn.value ? user.value.username : ""
+        )
+      }
+    }
+
+    function onDisconnect() {
+      if (LOG_CONNECTIONS) {
+        console.log(
+          "[app socketio] [onDisconnect]",
+          import.meta.server ? "server" : "client",
+          transport.value,
+          isSignedIn.value ? user.value.username : ""
+        )
+      }
+
+      isConnected.value = false
+      transport.value = "N/A"
+
+      socket.off("connect")
+      socket.off("disconnect")
+    }
+
+    return {
+      provide: {
+        socketio: { socket, isConnected, transport }
+      }
+    }
+  },
+
+  hooks: {
+    "app:mounted": () => {
+      if (LOG_HOOKS) {
+        console.log(
+          "[app socketio] [app:mounted]",
+          import.meta.server ? "server" : "client"
+        )
+      }
+
+      const {
+        $socketio: { socket }
+      } = useNuxtApp()
+
+      // useEventHandlers()
+
+      if (LOG_LISTENERS) {
+        console.log("[listeners]")
+
+        _forIn(socket._callbacks, (callbacks, event) => {
+          console.log(`${event}`, callbacks)
+        })
+      }
+
+      // reconnect on signin/signout
+      watch(useAuthClient().isSignedIn, () => socket.disconnect().connect())
+    },
+
+    "app:rendered": () => {
+      if (LOG_HOOKS) {
+        console.log(
+          "[app socketio] [app:rendered]",
+          import.meta.server ? "server" : "client"
+        )
+      }
+
+      useNuxtApp().$socketio.socket.disconnect()
+    }
+  },
+
+  env: {
+    // Set this value to `false` if you don't want the plugin to run when rendering server-only or island components.
+    islands: true
+  }
+})

+ 16 - 0
app/queries/character.js

@@ -0,0 +1,16 @@
+// noinspection JSCheckFunctionSignatures
+
+export const characterQueryKeys = {
+  root: ["characterList"],
+  options: () => [...characterQueryKeys.root, "options"]
+}
+
+export const characterListQuery = defineQueryOptions({
+  key: characterQueryKeys.root,
+  query: () => useEmit("character:list")
+})
+
+export const characterOptionsQuery = defineQueryOptions({
+  key: characterQueryKeys.options,
+  query: () => useEmit("character:options")
+})

+ 106 - 0
app/stores/useFiltersStore.js

@@ -0,0 +1,106 @@
+import { FilterMatchMode } from "@primevue/core/api"
+
+export const useFiltersStore = defineStore("filters", () => {
+  // state
+  const emptyFilters = ref({
+    global: { value: "", matchMode: FilterMatchMode.CONTAINS },
+
+    ..._mapValues(nameFields, () => ({
+      value: "",
+      matchMode: FilterMatchMode.CONTAINS
+    })),
+
+    ..._mapValues(optionsFields, () => ({
+      value: [],
+      matchMode: FilterMatchMode.IN
+    }))
+  })
+
+  const filters = ref(_cloneDeep(emptyFilters.value))
+  const showFilters = ref(false)
+
+  // getters
+  const hasFilterByField = computed(() =>
+    _mapValues(filters.value, ({ value }) => isPresent(value))
+  )
+
+  // actions
+  function hasAnyColumnFilters() {
+    return hasAnyFiltersFor(_keys(columnFields))
+  }
+
+  function hasAnyCategoryFilters() {
+    return hasAnyFiltersFor(_keys(optionsFields))
+  }
+
+  function hasAnyFilters() {
+    return _some(hasFilterByField.value)
+  }
+
+  function hasAnyFiltersFor(fields) {
+    return _some(_pick(hasFilterByField.value, fields))
+  }
+
+  function hasAnyNameFilters() {
+    return hasAnyFiltersFor(_keys(nameFields))
+  }
+
+  function hasFilterFor(field) {
+    return hasFilterByField.value?.[field]
+  }
+
+  function hasGlobalFilter() {
+    return isPresent(filters.value.global.value)
+  }
+
+  function removeFilterValueFrom(field, value) {
+    filters.value[field].value = _without(
+      filters.value[field].value,
+      value
+    )
+  }
+
+  function resetFilters() {
+    filters.value = _cloneDeep(emptyFilters.value)
+  }
+
+  function resetFilterFor(field) {
+    filters.value[field] = _cloneDeep(emptyFilters.value[field])
+  }
+
+  function resetGlobalFilter() {
+    filters.value.global.value = ""
+  }
+
+  function toggleShowFilters() {
+    showFilters.value = !showFilters.value
+  }
+
+  return {
+    // state
+    emptyFilters,
+    filters,
+    showFilters,
+
+    // getters
+    hasFilterByField,
+
+    // actions
+    hasAnyColumnFilters,
+    hasAnyCategoryFilters,
+    hasAnyFilters,
+    hasAnyFiltersFor,
+    hasAnyNameFilters,
+    hasFilterFor,
+    hasGlobalFilter,
+    removeFilterValueFrom,
+    resetFilterFor,
+    resetFilters,
+    resetGlobalFilter,
+    toggleShowFilters
+  }
+})
+
+if (import.meta.hot) {
+  import.meta.hot.accept(acceptHMRUpdate(useFiltersStore, import.meta.hot))
+}

+ 5 - 0
app/utils/findUniqueOptions.js

@@ -0,0 +1,5 @@
+export default function findUniqueOptions(characters) {
+  return _mapValues(optionsFields, (_, field) =>
+    uniqValues(characters, field)
+  )
+}

+ 3 - 0
app/utils/isBlank.js

@@ -0,0 +1,3 @@
+export default function isBlank(element) {
+  return _isNil(element) || _isEmpty(element)
+}

+ 3 - 0
app/utils/isPresent.js

@@ -0,0 +1,3 @@
+export default function isPresent(element) {
+  return !isBlank(element)
+}

+ 1021 - 0
app/utils/passthrough.js

@@ -0,0 +1,1021 @@
+export const passthrough = {
+  autocomplete: {
+    root: tw`inline-flex p-fluid:flex`,
+    pcInputText: {
+      root: tw`appearance-none rounded-md border border-surface-300 bg-surface-0 px-3 py-2
+      text-surface-700 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)] outline-hidden
+      transition-colors duration-200 placeholder:text-surface-500
+      enabled:hover:border-surface-400 enabled:focus:border-primary
+      disabled:bg-surface-200 disabled:text-surface-500 dark:border-surface-700
+      dark:bg-surface-950 dark:text-surface-0 dark:placeholder:text-surface-400
+      dark:enabled:hover:border-surface-600 dark:disabled:bg-surface-700
+      dark:disabled:text-surface-400 p-invalid:border-red-400
+      p-invalid:placeholder:text-red-600 dark:p-invalid:border-red-300
+      dark:p-invalid:placeholder:text-red-400 p-small:px-[0.625rem]
+      p-small:py-[0.375rem] p-small:text-sm p-large:px-[0.875rem]
+      p-large:py-[0.625rem] p-large:text-lg p-fluid:w-full p-filled:bg-surface-50
+      dark:p-filled:bg-surface-800 p-has-dropdown:w-[1%] p-has-dropdown:flex-auto
+      p-has-dropdown:rounded-e-none`
+    },
+    inputMultiple: tw`m-0 flex w-full cursor-text list-none flex-wrap items-center gap-1
+    overflow-hidden rounded-md border border-surface-300 bg-surface-0 px-3 py-1
+    text-surface-700 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)] transition-colors
+    duration-200 outline-none not-p-empty:px-1 hover:border-surface-400
+    dark:border-surface-700 dark:bg-surface-950 dark:text-surface-0
+    dark:hover:border-surface-600 p-invalid:border-red-400
+    dark:p-invalid:border-red-300 p-filled:bg-surface-50
+    dark:p-filled:bg-surface-800 p-disabled:pointer-events-none
+    p-disabled:bg-surface-200 p-disabled:text-surface-500
+    dark:p-disabled:bg-surface-700 dark:p-disabled:text-surface-400
+    p-focus:border-primary p-has-dropdown:rounded-e-none`,
+    chipItem: tw``,
+    pcChip: {
+      root: tw`inline-flex items-center gap-2 rounded-sm bg-surface-100 px-3 py-1
+      text-surface-800 has-[img]:pt-1 has-[img]:pb-1 dark:bg-surface-800
+      dark:text-surface-0 p-focus:bg-surface-200 p-focus:text-surface-800
+      dark:p-focus:bg-surface-700 dark:p-focus:text-surface-0 p-removable:pe-2`,
+      image: tw`-ms-2 h-8 w-8 rounded-full`,
+      icon: tw`h-4 w-4 text-base text-surface-800 dark:bg-surface-0`,
+      label: tw``,
+      removeIcon: tw`h-4 w-4 cursor-pointer rounded-full text-base text-surface-800
+      focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2
+      focus-visible:outline-primary dark:text-surface-0`
+    },
+    chipIcon: tw``,
+    inputChip: tw`inline-flex max-w-30 flex-auto py-1`,
+    input: tw`m-0 w-full rounded-none border-none bg-transparent p-0 text-inherit shadow-none
+    outline-none placeholder:text-surface-500 dark:placeholder:text-surface-400`,
+    loader: tw`absolute end-3 top-1/2 -mt-2 p-has-dropdown:end-[3.25rem]`,
+    dropdown: tw`relative inline-flex w-10 shrink-0 cursor-pointer items-center justify-center
+    overflow-hidden rounded-e-md border border-s-0 border-surface-300 bg-surface-100
+    text-surface-600 transition-colors duration-200 select-none
+    focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2
+    focus-visible:outline-primary enabled:hover:bg-surface-200
+    enabled:hover:text-surface-700 enabled:active:bg-surface-300
+    enabled:hover:active:text-surface-800 dark:border-surface-700
+    dark:bg-surface-800 dark:text-surface-300 dark:enabled:hover:bg-surface-700
+    dark:enabled:hover:text-surface-200 dark:enabled:active:bg-surface-600
+    dark:enabled:active:text-surface-100`,
+    dropdownIcon: tw``,
+    overlay: tw`absolute top-0 left-0 rounded-md border border-surface-200 bg-surface-50
+    text-surface-700
+    shadow-[0_4px_6px_-1px_rgba(0,0,0,0.1),0_2px_4px_-2px_rgba(0,0,0,0.1)]
+    dark:border-surface-700 dark:bg-surface-950 dark:text-surface-0
+    p-portal-self:min-w-full`,
+    virtualScroller: tw``,
+    listContainer: tw`overflow-auto`,
+    list: tw`m-0 flex list-none flex-col gap-[2px] p-1`,
+    optionGroup: tw`m-0 bg-transparent px-3 py-2 font-semibold text-surface-500
+    dark:text-surface-400`,
+    option: tw`relative flex cursor-pointer items-center overflow-hidden rounded-sm border-none
+    bg-transparent px-3 py-2 whitespace-nowrap text-surface-700 transition-colors
+    duration-200 dark:text-surface-0 p-selected:bg-highlight p-focus:bg-surface-100
+    p-focus:text-surface-800 dark:p-focus:bg-surface-800 dark:p-focus:text-surface-0
+    p-focus:p-selected:bg-highlight-emphasis`,
+    emptyMessage: tw`px-3 py-2`,
+    searchResultMessage: tw``,
+    selectedMessage: tw``,
+    transition: {
+      enterFromClass: tw`scale-y-75 opacity-0`,
+      enterActiveClass: tw`transition duration-120 ease-[cubic-bezier(0,0,0.2,1)]`,
+      leaveActiveClass: tw`transition-opacity duration-100 ease-linear`,
+      leaveToClass: tw`opacity-0`
+    }
+  },
+
+  button: {
+    root: tw`relative inline-flex cursor-pointer items-center justify-center gap-2
+    overflow-hidden rounded-md border border-primary bg-primary px-3 py-2
+    text-primary-contrast transition-colors duration-200 select-none
+    focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2
+    focus-visible:outline-primary enabled:hover:border-primary-emphasis
+    enabled:hover:bg-primary-emphasis enabled:active:border-primary-emphasis-alt
+    enabled:active:bg-primary-emphasis-alt disabled:pointer-events-none
+    disabled:opacity-60 p-small:px-[0.625rem] p-small:py-[0.375rem] p-small:text-sm
+    p-large:px-[0.875rem] p-large:py-[0.625rem] p-large:text-[1.125rem]
+    p-fluid:w-full p-vertical:flex-col p-icon-only:w-10 p-icon-only:gap-0
+    p-icon-only:px-0 p-fluid:p-icon-only:w-10 p-rounded:rounded-[2rem]
+    p-icon-only:p-rounded:h-10 p-icon-only:p-rounded:rounded-full p-raised:shadow-sm
+    p-secondary:border-secondary p-secondary:bg-secondary
+    p-secondary:text-secondary-contrast
+    p-secondary:enabled:hover:border-secondary-emphasis
+    p-secondary:enabled:hover:bg-secondary-emphasis
+    p-secondary:enabled:active:border-secondary-emphasis-alt
+    p-secondary:enabled:active:bg-secondary-emphasis-alt p-success:border-success
+    p-success:bg-success p-success:text-success-contrast
+    p-success:enabled:hover:border-success-emphasis
+    p-success:enabled:hover:bg-success-emphasis
+    p-success:enabled:active:border-success-emphasis-alt
+    p-success:enabled:active:bg-success-emphasis-alt p-info:border-info
+    p-info:bg-info p-info:text-info-contrast
+    p-info:enabled:hover:border-info-emphasis p-info:enabled:hover:bg-info-emphasis
+    p-info:enabled:active:border-info-emphasis-alt
+    p-info:enabled:active:bg-info-emphasis-alt p-warn:border-warn p-warn:bg-warn
+    p-warn:text-warn-contrast p-warn:enabled:hover:border-warn-emphasis
+    p-warn:enabled:hover:bg-warn-emphasis
+    p-warn:enabled:active:border-warn-emphasis-alt
+    p-warn:enabled:active:bg-warn-emphasis-alt p-danger:border-danger
+    p-danger:bg-danger p-danger:text-danger-contrast
+    p-danger:enabled:hover:border-danger-emphasis
+    p-danger:enabled:hover:bg-danger-emphasis
+    p-danger:enabled:active:border-danger-emphasis-alt
+    p-danger:enabled:active:bg-danger-emphasis-alt p-outlined:border-primary-200
+    p-outlined:bg-transparent p-outlined:text-primary
+    enabled:hover:p-outlined:border-primary-300
+    enabled:hover:p-outlined:bg-primary-50 enabled:hover:p-outlined:text-primary
+    enabled:active:p-outlined:border-primary-400
+    enabled:active:p-outlined:bg-primary-100 enabled:active:p-outlined:text-primary
+    dark:p-outlined:border-primary-700 dark:p-outlined:bg-transparent
+    dark:p-outlined:text-primary dark:enabled:hover:p-outlined:border-primary-600
+    dark:enabled:hover:p-outlined:bg-primary/5
+    dark:enabled:hover:p-outlined:text-primary
+    dark:enabled:active:p-outlined:border-primary-500
+    dark:enabled:active:p-outlined:bg-primary/15
+    dark:enabled:active:p-outlined:text-primary p-text:border-transparent
+    p-text:bg-transparent p-text:text-primary
+    enabled:hover:p-text:border-transparent enabled:hover:p-text:bg-primary-50
+    enabled:hover:p-text:text-primary enabled:active:p-text:border-transparent
+    enabled:active:p-text:bg-primary-100 enabled:active:p-text:text-primary
+    dark:p-text:border-transparent dark:p-text:bg-transparent
+    dark:p-text:text-primary dark:enabled:hover:p-text:border-transparent
+    dark:enabled:hover:p-text:bg-primary/5 dark:enabled:hover:p-text:text-primary
+    dark:enabled:active:p-text:border-transparent
+    dark:enabled:active:p-text:bg-primary/15 dark:enabled:active:p-text:text-primary
+    p-help:border-help p-help:bg-help p-help:text-help-contrast
+    p-help:enabled:hover:border-help-emphasis p-help:enabled:hover:bg-help-emphasis
+    p-help:enabled:active:border-help-emphasis-alt
+    p-help:enabled:active:bg-help-emphasis-alt`,
+    loadingIcon: tw`animate-spin`,
+    icon: tw`p-right:order-1 p-bottom:order-2`,
+    label: tw`font-medium p-small:text-sm p-large:text-[1.125rem] p-icon-only:invisible
+    p-icon-only:w-0`,
+    pcBadge: {
+      root: tw`h-4 min-w-4 rounded-full bg-primary-contrast text-xs leading-4 font-bold
+      text-primary`
+    }
+  },
+
+  buttongroup: {
+    root: tw`*:rounded-none *:not-last:border-r-0 *:first:rounded-s-md *:last:rounded-e-md
+    *:focus-visible:relative *:focus-visible:z-10`
+  },
+
+  card: {
+    root: tw`flex flex-col rounded-xl bg-surface-0 text-surface-700 shadow-md
+    dark:bg-surface-900 dark:text-surface-0`,
+    header: tw``,
+    body: tw`flex flex-col gap-2 p-5`,
+    caption: tw`flex flex-col gap-2`,
+    title: tw`text-xl font-medium`,
+    subtitle: tw`text-surface-500 dark:text-surface-400`,
+    content: tw``,
+    footer: tw``
+  },
+
+  chip: {
+    root: tw`inline-flex items-center gap-1.5 rounded-2xl bg-primary-100 px-3 py-2
+    text-primary-800 has-[img]:pt-1 has-[img]:pb-1 dark:bg-primary-900
+    dark:text-primary p-removable:pe-2`,
+    image: tw`-ms-2 h-8 w-8 rounded-full`,
+    icon: tw`h-4 w-4 text-base text-surface-800 dark:text-surface-0`
+  },
+
+  confirmdialog: {
+    root: tw`max-h-[90%] max-w-screen rounded-xl border border-surface-200 bg-surface-0
+    text-surface-700 shadow-lg dark:border-surface-700 dark:bg-surface-900
+    dark:text-surface-0`,
+    mask: tw`fixed start-0 top-0 h-full w-full bg-black/50`,
+    transition: {
+      enterFromClass: tw`scale-75 opacity-0`,
+      enterActiveClass: tw`transition-all duration-150 ease-[cubic-bezier(0,0,0.2,1)]`,
+      leaveActiveClass: tw`transition-all duration-150 ease-[cubic-bezier(0.4,0,0.2,1)]`,
+      leaveToClass: tw`scale-75 opacity-0`
+    }
+  },
+
+  datatable: {
+    root: tw`relative text-sm whitespace-nowrap p-flex-scrollable:flex
+    p-flex-scrollable:h-full p-flex-scrollable:flex-col`,
+    tableContainer: tw`p-scrollable:relative p-flex-scrollable:flex p-flex-scrollable:h-full
+    p-flex-scrollable:flex-1 p-flex-scrollable:flex-col`,
+    header: tw`border-b border-surface-200 bg-surface-50 pb-0 text-surface-700
+    dark:border-surface-700 dark:bg-surface-950 dark:text-surface-100`,
+    table: tw`w-full border-separate border-spacing-0`,
+    thead: tw`bg-surface-0! dark:bg-surface-950! p-scrollable:top-0 p-scrollable:z-10
+    p-scrollable:bg-surface-0 dark:p-scrollable:bg-surface-900`,
+    headerRow: tw`last:align-top last:*:border-r-0 first-of-type:bg-surface-0
+    first-of-type:*:border-r-2 nth-of-type-2:*:px-1 nth-of-type-2:*:py-2
+    dark:first-of-type:bg-surface-900`,
+    tbody: tw`p-hoverable:*:hover:bg-primary/15 p-frozen:sticky p-frozen:z-10`,
+    bodyRow: tw`bg-surface-0 text-surface-700 odd:bg-surface-50 dark:bg-surface-900
+    dark:text-surface-100 dark:odd:bg-surface-950 p-selected:bg-highlight!
+    p-selectable:cursor-pointer`,
+    tfoot: tw`p-scrollable:bottom-0 p-scrollable:z-10 p-scrollable:bg-surface-0
+    dark:p-scrollable:bg-surface-900`,
+    footer: tw`border-b border-surface-200 bg-surface-0 p-0 text-surface-700
+    dark:border-surface-700 dark:bg-surface-900 dark:text-surface-0`,
+    mask: tw`backdrop-blu- absolute z-10 flex h-full w-full items-center justify-center
+    bg-black/50 text-surface-200`,
+    column: {
+      root: tw``,
+      headerCell: tw`group relative truncate border-b border-surface-200 border-r-surface-200
+      bg-transparent px-4 py-3 text-start font-normal transition-colors duration-200
+      dark:border-surface-700 dark:border-r-surface-700 p-sortable:cursor-pointer
+      p-sortable:select-none p-sortable:hover:bg-surface-100
+      p-sortable:hover:text-surface-800 p-sortable:focus-visible:outline
+      p-sortable:focus-visible:outline-1 p-sortable:focus-visible:-outline-offset-1
+      p-sortable:focus-visible:outline-primary dark:p-sortable:hover:bg-surface-700
+      dark:p-sortable:hover:text-surface-0 p-frozen:sticky p-frozen:z-10
+      p-frozen:bg-surface-0 dark:p-frozen:bg-surface-900`,
+      columnHeaderContent: tw`flex items-center gap-1.5`,
+      columnTitle: tw`block leading-[1.25rem] font-semibold`,
+      bodyCell: tw`truncate border-b border-surface-200 px-4 py-3 text-start
+      dark:border-surface-800 p-frozen:sticky p-frozen:bg-surface-0
+      dark:p-frozen:bg-surface-900`,
+      bodyCellContent: tw``,
+      footerCell: tw`border-b border-surface-200 bg-surface-0 px-4 py-3 text-start text-surface-700
+      dark:border-surface-800 dark:bg-surface-900 dark:text-surface-0 p-frozen:sticky
+      p-frozen:bg-surface-0 dark:p-frozen:bg-surface-900`,
+      columnFooter: tw`font-semibold`,
+      columnResizer: tw`absolute end-0 top-0 m-0 block h-full w-2 cursor-col-resize border
+      border-transparent p-0`,
+      sort: tw`block leading-none`,
+      sortIcon: tw`text-surface-500 transition-colors duration-200
+      group-p-sortable:not-group-p-sorted:group-hover:text-surface-600
+      group-p-sorted:bg-highlight dark:text-surface-400
+      dark:group-p-sortable:not-group-p-sorted:group-hover:text-surface-300`,
+      pcSortBadge: {
+        root: tw`inline-flex h-6 min-w-6 items-center justify-center rounded-full bg-primary
+        text-xs font-bold text-primary-contrast`
+      },
+      pcHeaderCheckbox: {
+        root: tw`relative inline-flex h-5 w-5 align-bottom select-none`,
+        input: tw`peer absolute start-0 top-0 z-10 m-0 h-full w-full cursor-pointer
+        appearance-none rounded-xs border border-transparent p-0 opacity-0
+        disabled:cursor-default`,
+        box: tw`flex h-5 w-5 items-center justify-center rounded-sm border border-surface-300
+        bg-surface-0 text-surface-700 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)]
+        transition-colors duration-200 peer-focus-visible:outline
+        peer-focus-visible:outline-1 peer-focus-visible:outline-offset-2
+        peer-focus-visible:outline-primary peer-enabled:peer-hover:border-surface-400
+        dark:border-surface-700 dark:bg-surface-950 dark:text-surface-0
+        dark:peer-enabled:peer-hover:border-surface-600 p-checked:border-primary
+        p-checked:bg-primary p-checked:text-primary-contrast
+        peer-enabled:peer-hover:p-checked:border-primary-emphasis
+        peer-enabled:peer-hover:p-checked:bg-primary-emphasis
+        p-disabled:border-surface-300 p-disabled:bg-surface-200
+        p-disabled:text-surface-700 dark:p-disabled:border-surface-700
+        dark:p-disabled:bg-surface-400 dark:p-disabled:text-surface-400`,
+        icon: tw`h-[0.875rem] w-[0.875rem] text-sm transition-none`
+      },
+      pcRowRadiobutton: {
+        root: tw`relative inline-flex h-5 w-5 select-none`,
+        input: tw`peer absolute start-0 top-0 z-10 m-0 h-full w-full cursor-pointer
+        appearance-none rounded-full border border-transparent p-0 opacity-0
+        disabled:cursor-default`,
+        box: tw`flex h-5 w-5 items-center justify-center rounded-full border border-surface-300
+        bg-surface-0 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)] transition-colors
+        duration-200 peer-focus-visible:outline peer-focus-visible:outline-1
+        peer-focus-visible:outline-offset-2 peer-focus-visible:outline-primary
+        peer-enabled:peer-hover:border-surface-400 dark:border-surface-700
+        dark:bg-surface-950 dark:peer-enabled:peer-hover:border-surface-600
+        p-invalid:border-danger-400 dark:p-invalid:border-danger-300
+        p-filled:bg-surface-50 dark:p-filled:bg-surface-800 p-checked:border-primary
+        p-checked:bg-primary peer-enabled:peer-hover:p-checked:border-primary-emphasis
+        peer-enabled:peer-hover:p-checked:bg-primary-emphasis
+        p-disabled:border-surface-300 p-disabled:bg-surface-200
+        dark:p-disabled:border-surface-700 dark:p-disabled:bg-surface-400`,
+        icon: tw`h-3 w-3 scale-[0.1] rounded-full bg-transparent text-xs transition-all
+        duration-200 backface-hidden p-checked:visible p-checked:scale-100
+        p-checked:bg-primary-contrast p-disabled:bg-surface-700
+        dark:p-disabled:bg-surface-400`
+      },
+      pcRowCheckbox: {
+        root: tw`relative inline-flex h-5 w-5 align-bottom select-none`,
+        input: tw`peer absolute start-0 top-0 z-10 m-0 h-full w-full cursor-pointer
+        appearance-none rounded-xs border border-transparent p-0 opacity-0
+        disabled:cursor-default`,
+        box: tw`flex h-5 w-5 items-center justify-center rounded-sm border border-surface-300
+        bg-surface-0 text-surface-700 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)]
+        transition-colors duration-200 peer-focus-visible:outline
+        peer-focus-visible:outline-1 peer-focus-visible:outline-offset-2
+        peer-focus-visible:outline-primary peer-enabled:peer-hover:border-surface-400
+        dark:border-surface-700 dark:bg-surface-950 dark:text-surface-0
+        dark:peer-enabled:peer-hover:border-surface-600 p-checked:border-primary
+        p-checked:bg-primary p-checked:text-primary-contrast
+        peer-enabled:peer-hover:p-checked:border-primary-emphasis
+        peer-enabled:peer-hover:p-checked:bg-primary-emphasis
+        p-disabled:border-surface-300 p-disabled:bg-surface-200
+        p-disabled:text-surface-700 dark:p-disabled:border-surface-700
+        dark:p-disabled:bg-surface-400 dark:p-disabled:text-surface-400`,
+        icon: tw`h-[0.875rem] w-[0.875rem] text-sm transition-none`
+      },
+      rowToggleButton: tw`relative inline-flex h-7 w-7 cursor-pointer items-center justify-center
+      overflow-hidden rounded-full border-none bg-transparent text-surface-500
+      transition-colors duration-200 select-none focus-visible:outline
+      focus-visible:outline-1 focus-visible:outline-offset-2
+      focus-visible:outline-primary enabled:hover:bg-surface-100
+      enabled:hover:text-surface-700 dark:text-surface-400
+      dark:enabled:hover:bg-surface-800 dark:enabled:hover:text-surface-0
+      p-selected:hover:bg-surface-0 p-selected:hover:text-primary
+      dark:p-selected:hover:bg-surface-900`,
+      rowToggleIcon: tw``,
+      reorderableRowHandle: tw``
+    },
+    loadingIcon: tw``,
+    pcPaginator: {
+      paginatorContainer: tw`border-surface-200 dark:border-surface-700 p-bottom:border-b`,
+      root: tw`flex flex-wrap items-center justify-center gap-1 rounded-md bg-surface-0 px-4
+      py-2 text-surface-700 dark:bg-surface-900 dark:text-surface-0`
+    },
+    columnResizeIndicator: tw`absolute z-10 hidden w-px bg-primary`,
+    rowReorderIndicatorUp: tw`absolute hidden`,
+    rowReorderIndicatorDown: tw`absolute hidden`
+  },
+
+  datepicker: {
+    root: tw`relative inline-flex max-w-full p-fluid:flex`,
+    pcInputText: {
+      root: tw`w-[1%] flex-auto appearance-none rounded-md border border-surface-300
+      bg-surface-0 px-3 py-2 text-surface-700 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)]
+      outline-hidden transition-colors duration-200 placeholder:text-surface-500
+      enabled:hover:border-surface-400 enabled:focus:border-primary
+      disabled:bg-surface-200 disabled:text-surface-500 dark:border-surface-700
+      dark:bg-surface-950 dark:text-surface-0 dark:placeholder:text-surface-400
+      dark:enabled:hover:border-surface-600 dark:disabled:bg-surface-700
+      dark:disabled:text-surface-400 p-invalid:border-red-400
+      p-invalid:placeholder:text-red-600 dark:p-invalid:border-red-300
+      dark:p-invalid:placeholder:text-red-400 p-small:px-[0.625rem]
+      p-small:py-[0.375rem] p-small:text-sm p-large:px-[0.875rem]
+      p-large:py-[0.625rem] p-large:text-lg p-fluid:w-full p-filled:bg-surface-50
+      dark:p-filled:bg-surface-800 p-has-e-icon:pe-10 p-has-dropdown:rounded-e-none`
+    },
+    dropdown: tw`relative inline-flex w-10 shrink-0 cursor-pointer items-center justify-center
+    overflow-hidden rounded-e-md border border-s-0 border-surface-300 bg-surface-100
+    text-surface-600 transition-colors duration-200 select-none
+    focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2
+    focus-visible:outline-primary enabled:hover:bg-surface-200
+    enabled:hover:text-surface-700 enabled:active:bg-surface-300
+    enabled:hover:active:text-surface-800 dark:border-surface-700
+    dark:bg-surface-800 dark:text-surface-300 dark:enabled:hover:bg-surface-700
+    dark:enabled:hover:text-surface-200 dark:enabled:active:bg-surface-600
+    dark:enabled:active:text-surface-100`,
+    inputIconContainer: tw`absolute end-3 top-1/2 -mt-2 cursor-pointer leading-none text-surface-400
+    p-small:*:size-[0.875rem] p-large:*:size-[1.125rem]`,
+    panel: tw`w-auto rounded-md border border-surface-200 bg-surface-0 p-3 text-surface-700
+    shadow-[0_4px_6px_-1px_rgba(0,0,0,0.1),0_2px_4px_-2px_rgba(0,0,0,0.1)]
+    dark:border-surface-700 dark:bg-surface-900 dark:text-surface-0
+    p-portal-self:min-w-full p-inline:inline-block p-inline:overflow-x-auto
+    p-inline:shadow-none`,
+    calendarContainer: tw`flex`,
+    calendar: tw`flex-auto gap-3 border-s border-surface-200 px-3 first:border-s-0 first:ps-0
+    last:pe-0 dark:border-surface-700`,
+    header: tw`flex items-center justify-between gap-2 border-b border-surface-200 bg-surface-0
+    px-0 pt-0 pb-2 font-medium text-surface-700 dark:border-surface-700
+    dark:bg-surface-900 dark:text-surface-0`,
+    title: tw`flex items-center justify-between gap-2 font-medium`,
+    selectMonth: tw`m-0 cursor-pointer rounded-md border-none bg-transparent px-2 py-1 font-medium
+    text-surface-700 transition-colors duration-200 focus-visible:outline
+    focus-visible:outline-1 focus-visible:outline-offset-2
+    focus-visible:outline-primary enabled:hover:bg-surface-100
+    enabled:hover:text-surface-800 dark:text-surface-0
+    dark:enabled:hover:bg-surface-800 dark:enabled:hover:text-surface-0`,
+    selectYear: tw`m-0 cursor-pointer rounded-md border-none bg-transparent px-2 py-1 font-medium
+    text-surface-700 transition-colors duration-200 focus-visible:outline
+    focus-visible:outline-1 focus-visible:outline-offset-2
+    focus-visible:outline-primary enabled:hover:bg-surface-100
+    enabled:hover:text-surface-800 dark:text-surface-0
+    dark:enabled:hover:bg-surface-800 dark:enabled:hover:text-surface-0`,
+    decade: tw`white-space-nowrap`,
+    dayView: tw`mx-0 mt-2 mb-0 w-full border-collapse text-base`,
+    tableHeader: tw``,
+    tableHeaderRow: tw``,
+    weekHeader: tw`p-1`,
+    weekHeaderLabel: tw`font-medium text-surface-700 opacity-60 dark:text-surface-0`,
+    tableHeaderCell: tw``,
+    weekDayCell: tw`p-1`,
+    weekDay: tw`font-medium text-surface-700 dark:text-surface-0`,
+    tableBody: tw``,
+    weekNumber: tw``,
+    weekLabelContainer: tw`flex h-8 w-8 justify-center p-1 opacity-60`,
+    weekLabel: tw``,
+    dayCell: tw`p-1`,
+    day: tw`relative mx-auto my-0 flex h-8 w-8 cursor-pointer items-center justify-center
+    overflow-hidden rounded-full border border-transparent p-1 text-surface-700
+    transition-colors duration-200 hover:bg-surface-100 hover:text-surface-800
+    focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2
+    focus-visible:outline-primary dark:text-surface-0 dark:hover:bg-surface-800
+    dark:hover:text-surface-0 p-disabled:pointer-events-none p-disabled:opacity-60
+    p-selected:bg-primary p-selected:text-primary-contrast p-today:bg-surface-200
+    p-today:text-surface-900 p-today:hover:bg-surface-100
+    p-today:hover:text-surface-800 dark:p-today:bg-surface-700
+    dark:p-today:text-surface-0 dark:p-today:hover:bg-surface-800
+    dark:p-today:hover:text-surface-0 p-today:p-selected:bg-primary
+    p-today:p-selected:text-primary-contrast`,
+    monthView: tw`mx-0 mt-2 mb-0`,
+    month: tw`relative inline-flex w-1/3 cursor-pointer items-center justify-center
+    overflow-hidden rounded-md p-[0.375rem] text-surface-700 transition-colors
+    duration-200 hover:bg-surface-100 hover:text-surface-800 focus-visible:outline
+    focus-visible:outline-1 focus-visible:outline-offset-2
+    focus-visible:outline-primary dark:text-surface-0 dark:hover:bg-surface-800
+    dark:hover:text-surface-0 p-selected:bg-primary p-selected:text-primary-contrast`,
+    yearView: tw`mx-0 mt-2 mb-0`,
+    year: tw`relative inline-flex w-1/2 cursor-pointer items-center justify-center
+    overflow-hidden rounded-md p-[0.375rem] text-surface-700 transition-colors
+    duration-200 hover:bg-surface-100 hover:text-surface-800 focus-visible:outline
+    focus-visible:outline-1 focus-visible:outline-offset-2
+    focus-visible:outline-primary dark:text-surface-0 dark:hover:bg-surface-800
+    dark:hover:text-surface-0 p-selected:bg-primary p-selected:text-primary-contrast`,
+    timePicker: tw`flex items-center justify-center gap-2 border-t border-surface-200 p-0
+    not-p-time-only:px-0 not-p-time-only:pt-2 not-p-time-only:pb-0
+    dark:border-surface-700`,
+    hourPicker: tw`flex flex-col items-center gap-1`,
+    hour: tw`text-base`,
+    separatorContainer: tw`flex flex-col items-center gap-1`,
+    separator: tw`text-base`,
+    minutePicker: tw`flex flex-col items-center gap-1`,
+    minute: tw`text-base`,
+    secondPicker: tw`flex flex-col items-center gap-1`,
+    second: tw`text-base`,
+    ampmPicker: tw`flex flex-col items-center gap-1`,
+    ampm: tw`text-base`,
+    buttonbar: tw`flex items-center justify-between border-t border-surface-200 px-0 pt-2 pb-0
+    dark:border-surface-700`,
+    transition: {
+      enterFromClass: tw`scale-y-75 opacity-0`,
+      enterActiveClass: tw`transition duration-120 ease-[cubic-bezier(0,0,0.2,1)]`,
+      leaveActiveClass: tw`transition-opacity duration-100 ease-linear`,
+      leaveToClass: tw`opacity-0`
+    }
+  },
+
+  dialog: {
+    root: tw`max-h-full max-w-screen rounded-xl border border-surface-100 bg-surface-200
+    text-surface-700 shadow-lg dark:border-surface-800 dark:bg-surface-700
+    dark:text-surface-0 p-maximized:start-0 p-maximized:top-0 p-maximized:h-screen
+    p-maximized:max-h-[90%] p-maximized:w-screen p-maximized:rounded-none`,
+    header: tw`flex shrink-0 items-center justify-between p-5`,
+    title: tw`text-xl font-semibold`,
+    headerActions: tw`flex items-center gap-2`,
+    content: tw`overflow-y-auto px-5 pt-0 pb-5 p-maximized:grow`,
+    footer: tw`flex shrink-0 justify-end gap-2 px-5 pt-0 pb-5`,
+    mask: tw`p-modal:fixed p-modal:start-0 p-modal:top-0 p-modal:h-full p-modal:w-full
+    p-modal:bg-black/50`,
+    transition: {
+      enterFromClass: tw`scale-75 opacity-0`,
+      enterActiveClass: tw`transition-all duration-150 ease-[cubic-bezier(0,0,0.2,1)]`,
+      leaveActiveClass: tw`transition-all duration-150 ease-[cubic-bezier(0.4,0,0.2,1)]`,
+      leaveToClass: tw`scale-75 opacity-0`
+    }
+  },
+
+  inplace: {
+    root: tw``,
+    display: tw`inline-block cursor-pointer rounded-md border border-transparent px-3 py-2
+    transition-colors duration-200 hover:bg-surface-100 hover:text-surface-800
+    focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2
+    focus-visible:outline-primary dark:hover:bg-surface-800
+    dark:hover:text-surface-0 p-disabled:pointer-events-none`,
+    content: tw`block`
+  },
+
+  inputtext: {
+    root: tw`appearance-none rounded-md border border-surface-300 bg-surface-0 px-3 py-2
+    text-surface-700 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)] outline-hidden
+    transition-colors duration-200 placeholder:text-surface-500
+    enabled:hover:border-surface-400 enabled:focus:border-primary
+    disabled:bg-surface-200 disabled:text-surface-500 dark:border-surface-700
+    dark:bg-surface-950 dark:text-surface-0 dark:placeholder:text-surface-400
+    dark:enabled:hover:border-surface-600 dark:disabled:bg-surface-700
+    dark:disabled:text-surface-400 p-invalid:border-danger-400
+    p-invalid:placeholder:text-danger-600 dark:p-invalid:border-danger-300
+    dark:p-invalid:placeholder:text-danger-400 p-small:px-[0.625rem]
+    p-small:py-[0.375rem] p-small:text-sm p-large:px-[0.875rem]
+    p-large:py-[0.625rem] p-large:text-lg p-fluid:w-full p-filled:bg-surface-50
+    dark:p-filled:bg-surface-800`
+  },
+
+  listbox: {
+    root: tw`group rounded-md border border-surface-300 bg-surface-0 text-sm text-surface-700
+    shadow-[0_1px_2px_0_rgba(18,18,23,0.05)] transition-colors duration-200
+    dark:border-surface-700 dark:bg-surface-950 dark:text-surface-0
+    p-invalid:border-danger-400 dark:p-invalid:border-danger-300
+    p-disabled:pointer-events-none p-disabled:bg-surface-200
+    p-disabled:text-surface-500 dark:p-disabled:bg-surface-700
+    dark:p-disabled:text-surface-400`,
+    header: tw`px-4 pt-2 pb-1`,
+    pcFilterContainer: {
+      root: tw`relative`
+    },
+    pcFilter: {
+      root: tw`w-full appearance-none rounded-md border border-surface-300 bg-surface-0 py-2
+      ps-3 pe-10 text-surface-700 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)]
+      outline-hidden transition-colors duration-200 placeholder:text-surface-500
+      enabled:hover:border-surface-400 enabled:focus:border-primary
+      disabled:bg-surface-200 disabled:text-surface-500 dark:border-surface-700
+      dark:bg-surface-950 dark:text-surface-0 dark:placeholder:text-surface-400
+      dark:enabled:hover:border-surface-600 dark:disabled:bg-surface-700
+      dark:disabled:text-surface-400 p-fluid:w-full`
+    },
+    pcFilterIconContainer: {
+      root: tw`absolute end-3 top-1/2 z-1 -mt-2 leading-none`
+    },
+    filterIcon: tw`text-surface-400`,
+    listContainer: tw`overflow-auto`,
+    virtualScroller: tw``,
+    list: tw`m-0 flex list-none flex-col gap-[2px] p-0 outline-none`,
+    optionGroup: tw`m-0 px-3 py-2 font-semibold text-surface-500 dark:text-surface-400`,
+    option: tw`relative flex cursor-pointer items-center overflow-hidden rounded-sm border-none
+    px-1 py-0.75 text-surface-700 transition-colors duration-200
+    group-p-disabled:pointer-events-none group-p-disabled:text-surface-500
+    hover:not-p-selected:bg-surface-100 hover:not-p-selected:text-surface-800
+    dark:text-surface-0 dark:group-p-disabled:text-surface-400
+    dark:hover:not-p-selected:bg-surface-800
+    dark:hover:not-p-selected:text-surface-0 p-disabled:pointer-events-none
+    p-disabled:opacity-60 p-selected:bg-highlight
+    p-focus:not-p-selected:bg-surface-100 p-focus:not-p-selected:text-surface-800
+    dark:p-focus:not-p-selected:bg-surface-800
+    dark:p-focus:not-p-selected:text-surface-0
+    p-selected:p-focus:bg-highlight-emphasis`,
+    optionCheckIcon: tw``,
+    optionBlankIcon: tw``,
+    emptyMessage: tw`px-3 py-2`
+  },
+
+  menu: {
+    root: tw`min-w-52 rounded-md bg-primary-50 text-primary dark:bg-primary-900
+    p-popup:shadow-[0_4px_6px_-1px_rgba(0,0,0,0.1),0_2px_4px_-2px_rgba(0,0,0,0.1)]`,
+    list: tw`mx-1 mb-1 flex list-none flex-col gap-0.5 outline-none`,
+    item: tw`p-disabled:pointer-events-none p-disabled:opacity-60`,
+    itemContent: tw`group hover:bbg-primary-50 rounded-sm transition-colors duration-200
+    hover:text-primary dark:hover:bg-primary/5 dark:hover:text-primary
+    p-focus:bg-primary-50 p-focus:text-primary dark:p-focus:bg-primary/5
+    dark:p-focus:text-primary`,
+    itemLink: tw`relative flex cursor-pointer items-center gap-2 overflow-hidden px-4 py-2
+    text-inherit no-underline outline-none select-none`,
+    itemIcon: tw`text-primary group-hover:text-primary p-focus:text-primary`,
+    itemLabel: tw``,
+    submenuLabel: tw`bg-transparent px-4 py-2 font-semibold text-primary`,
+    separator: tw`border-t border-primary dark:border-primary`,
+    transition: {
+      enterFromClass: tw`scale-y-75 opacity-0`,
+      enterActiveClass: tw`transition duration-120 ease-[cubic-bezier(0,0,0.2,1)]`,
+      leaveActiveClass: tw`transition-opacity duration-100 ease-linear`,
+      leaveToClass: tw`opacity-0`
+    }
+  },
+
+  message: {
+    root: tw`dark: rounded-md outline outline-1 p-secondary:bg-surface-100
+    p-secondary:text-surface-600 p-secondary:outline-surface-200
+    dark:p-secondary:bg-surface-800 dark:p-secondary:text-surface-300
+    dark:p-secondary:outline-surface-700 p-contrast:bg-surface-900
+    p-contrast:text-surface-50 p-contrast:outline-surface-950
+    dark:p-contrast:bg-surface-0 dark:p-contrast:text-surface-950
+    dark:p-contrast:outline-surface-100 p-success:bg-success-50/95
+    p-success:text-success-600 p-success:outline-success-200
+    dark:p-success:bg-success-500/15 dark:p-success:text-success-500
+    dark:p-success:outline-success-700/35 p-info:bg-info-50/95 p-info:text-info-600
+    p-info:outline-info-200 dark:p-info:bg-info-500/15 dark:p-info:text-info-500
+    dark:p-info:outline-info-700/35 p-warn:bg-warn-50/95 p-warn:text-warn-600
+    p-warn:outline-warn-200 dark:p-warn:bg-warn-500/15 dark:p-warn:text-warn-500
+    dark:p-warn:outline-warn-700/35 p-error:bg-danger-50/95 p-error:text-danger-600
+    p-error:outline-danger-200 dark:p-error:bg-danger-500/15
+    dark:p-error:text-danger-500 dark:p-error:outline-danger-700/35
+    p-outlined:bg-transparent p-outlined:outline p-outlined:outline-1
+    p-secondary:p-outlined:text-surface-500
+    p-secondary:p-outlined:outline-surface-500
+    dark:p-secondary:p-outlined:text-surface-400
+    dark:p-secondary:p-outlined:outline-surface-400
+    p-contrast:p-outlined:text-surface-950 p-contrast:p-outlined:outline-surface-950
+    dark:p-contrast:p-outlined:text-surface-0
+    dark:p-contrast:p-outlined:outline-surface-0
+    p-success:p-outlined:text-success-500 p-success:p-outlined:outline-success-500
+    dark:p-success:p-outlined:text-success-600
+    dark:p-success:p-outlined:outline-success-600 p-info:p-outlined:text-info-500
+    p-info:p-outlined:outline-info-500 dark:p-info:p-outlined:text-info-600
+    dark:p-info:p-outlined:outline-info-600 p-warn:p-outlined:text-warn-500
+    p-warn:p-outlined:text-warn-600 p-warn:p-outlined:outline-warn-500
+    dark:p-warn:p-outlined:outline-warn-600 p-error:p-outlined:text-danger-500
+    p-error:p-outlined:outline-danger-500 dark:p-error:p-outlined:text-danger-600
+    dark:p-error:p-outlined:outline-danger-600 p-simple:bg-transparent
+    p-simple:outline-none p-secondary:p-simple:text-surface-500
+    dark:p-secondary:p-simple:text-surface-400 p-contrast:p-simple:text-surface-950
+    dark:p-contrast:p-simple:text-surface-0 p-success:p-simple:text-success-500
+    dark:p-success:p-simple:text-success-600 p-info:p-simple:text-info-500
+    dark:p-info:p-simple:text-info-600 p-warn:p-simple:text-warn-500
+    dark:p-warn:p-simple:text-warn-600 p-error:p-simple:text-danger-500
+    dark:p-error:p-simple:text-danger-600`,
+    content: tw`flex h-full items-center gap-2 px-3 py-2 p-small:px-2.5 p-small:py-[0.375rem]
+    p-large:px-3.5 p-large:py-2.5 p-simple:p-0`,
+    icon: tw`h-[1.125rem] w-[1.125rem] flex-shrink-0 text-lg p-small:h-[0.875rem]
+    p-small:w-[0.875rem] p-small:text-sm p-large:h-5 p-large:w-5 p-large:text-xl`,
+    text: tw`text-base font-medium p-small:text-sm p-large:text-xl`,
+    closeButton: tw`p:warn:hover:bg-warn-100 p:warn:focus-visible:outline-warn-600
+    dark:p:warn:hover:bg-white/5 dark:p:warn:focus-visible:outline-warn-500 relative
+    ms-auto flex h-7 w-7 flex-shrink-0 cursor-pointer items-center justify-center
+    overflow-hidden rounded-full border-none bg-transparent p-0 text-inherit
+    transition-colors duration-200 select-none focus-visible:outline
+    focus-visible:outline-1 focus-visible:outline-offset-2
+    p-secondary:hover:bg-surface-200 p-secondary:focus-visible:outline-surface-600
+    dark:p-secondary:hover:bg-surface-700
+    dark:p-secondary:focus-visible:outline-surface-300
+    p-contrast:hover:bg-surface-800 p-contrast:focus-visible:outline-surface-50
+    dark:p-contrast:hover:bg-surface-100
+    dark:p-contrast:focus-visible:outline-surface-950 p-success:hover:bg-success-100
+    p-success:focus-visible:outline-success-600 dark:p-success:hover:bg-white/5
+    dark:p-success:focus-visible:outline-success-500 p-info:hover:bg-info-100
+    p-info:focus-visible:outline-info-600 dark:p-info:hover:bg-white/5
+    dark:p-info:focus-visible:outline-info-500 p-error:hover:bg-danger-100
+    p-error:focus-visible:outline-danger-600 dark:p-error:hover:bg-white/5
+    dark:p-error:focus-visible:outline-danger-500 p-outlined:hover:bg-transparent
+    p-simple:hover:bg-transparent`,
+    closeIcon: tw`h-4 w-4 text-base p-small:h-3.5 p-small:w-3.5 p-small:text-sm
+    p-large:h-[1.125rem] p-large:w-[1.125rem] p-large:text-xl`,
+    transition: {
+      enterFromClass: tw`opacity-0`,
+      enterActiveClass: tw`transition-opacity duration-300`,
+      leaveFromClass: tw`max-h-40`,
+      leaveActiveClass: tw`overflow-hidden transition-all duration-300 ease-in`,
+      leaveToClass: tw`!m-0 max-h-0 opacity-0`
+    }
+  },
+
+  multiselect: {
+    root: tw`relative inline-flex cursor-pointer rounded-md border border-surface-300
+    bg-surface-0 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)] transition-colors
+    duration-200 select-none hover:border-surface-400 dark:border-surface-600
+    dark:bg-surface-950 dark:hover:border-surface-700 p-invalid:border-red-400
+    dark:p-invalid:border-red-300 p-fluid:flex p-filled:bg-surface-50
+    dark:p-filled:bg-surface-800 p-disabled:pointer-events-none
+    p-disabled:bg-surface-200 p-disabled:text-surface-500
+    dark:p-disabled:bg-surface-700 dark:p-disabled:text-surface-400
+    p-focus:border-primary`,
+    labelContainer: tw`flex-auto overflow-hidden`,
+    label: tw`flex items-center gap-1 overflow-hidden px-3 py-2 text-ellipsis
+    whitespace-nowrap text-surface-700 dark:text-surface-0 p-small:px-[0.625rem]
+    p-small:py-[0.375rem] p-small:text-sm p-large:px-[0.875rem]
+    p-large:py-[0.625rem] p-large:text-lg p-disabled:text-surface-500
+    dark:p-disabled:text-surface-400 p-empty:overflow-hidden p-empty:opacity-0
+    p-placeholder:text-surface-500 dark:p-placeholder:text-surface-400
+    p-has-chip:px-[0.375rem] p-has-chip:py-1`,
+    chipItem: tw``,
+    pcChip: {
+      root: tw`inline-flex items-center gap-2 rounded-sm bg-surface-100 px-3 py-1
+      text-surface-800 has-[img]:pt-1 has-[img]:pb-1 dark:bg-surface-800
+      dark:text-surface-0 p-removable:pe-2`,
+      removeIcon: tw`h-4 w-4 cursor-pointer rounded-full text-base text-surface-800
+      dark:text-surface-0`
+    },
+    dropdown: tw`flex w-10 shrink-0 items-center justify-center rounded-e-md bg-transparent
+    text-surface-400`,
+    overlay: tw`absolute top-0 left-0 rounded-md border border-surface-200 bg-surface-0
+    text-surface-700
+    shadow-[0_4px_6px_-1px_rgba(0,0,0,0.1),0_2px_4px_-2px_rgba(0,0,0,0.1)]
+    dark:border-surface-700 dark:bg-surface-900 dark:text-surface-0
+    p-portal-self:min-w-full`,
+    header: tw`flex items-center gap-2 px-4 pt-2 pb-1`,
+    pcHeaderCheckbox: {
+      root: tw`relative inline-flex h-5 w-5 align-bottom select-none`,
+      input: tw`peer absolute start-0 top-0 z-10 m-0 h-full w-full cursor-pointer
+      appearance-none rounded-xs border border-transparent p-0 opacity-0
+      disabled:cursor-default`,
+      box: tw`flex h-5 w-5 items-center justify-center rounded-sm border border-surface-300
+      bg-surface-0 text-surface-700 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)]
+      transition-colors duration-200 peer-focus-visible:outline
+      peer-focus-visible:outline-1 peer-focus-visible:outline-offset-2
+      peer-focus-visible:outline-primary peer-enabled:peer-hover:border-surface-400
+      dark:border-surface-700 dark:bg-surface-950 dark:text-surface-0
+      dark:peer-enabled:peer-hover:border-surface-600 p-checked:border-primary
+      p-checked:bg-primary p-checked:text-primary-contrast
+      peer-enabled:peer-hover:p-checked:border-primary-emphasis
+      peer-enabled:peer-hover:p-checked:bg-primary-emphasis
+      p-disabled:border-surface-300 p-disabled:bg-surface-200
+      p-disabled:text-surface-700 dark:p-disabled:border-surface-700
+      dark:p-disabled:bg-surface-400 dark:p-disabled:text-surface-400`,
+      icon: tw`h-[0.875rem] w-[0.875rem] text-sm transition-none`
+    },
+    pcFilterContainer: {
+      root: tw`relative flex-auto`
+    },
+    pcFilter: {
+      root: tw`w-full appearance-none rounded-md border border-surface-300 bg-surface-0 py-2
+      ps-3 pe-10 text-surface-700 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)]
+      outline-hidden transition-colors duration-200 placeholder:text-surface-500
+      enabled:hover:border-surface-400 enabled:focus:border-primary
+      disabled:bg-surface-200 disabled:text-surface-500 dark:border-surface-700
+      dark:bg-surface-950 dark:text-surface-0 dark:placeholder:text-surface-400
+      dark:enabled:hover:border-surface-600 dark:disabled:bg-surface-700
+      dark:disabled:text-surface-400 p-fluid:w-full`
+    },
+    pcFilterIconContainer: {
+      root: tw`absolute end-3 top-1/2 z-1 -mt-2 leading-none`
+    },
+    listContainer: tw`overflow-auto`,
+    virtualScroller: tw``,
+    list: tw`m-0 flex list-none flex-col gap-[2px] p-1`,
+    optionGroup: tw`m-0 bg-transparent px-3 py-2 font-semibold text-surface-500
+    dark:text-surface-400`,
+    option: tw`relative flex cursor-pointer items-center gap-2 overflow-hidden rounded-sm
+    border-none bg-transparent px-3 py-2 font-normal whitespace-nowrap
+    text-surface-700 transition-colors duration-200 dark:text-surface-0
+    p-focus:bg-surface-100 p-focus:text-surface-800 dark:p-focus:bg-surface-800
+    dark:p-focus:text-surface-0`,
+    optionLabel: tw``,
+    pcOptionCheckbox: {
+      root: tw`relative inline-flex h-5 w-5 align-bottom select-none`,
+      input: tw`peer absolute start-0 top-0 z-10 m-0 h-full w-full cursor-pointer
+      appearance-none rounded-xs border border-transparent p-0 opacity-0
+      disabled:cursor-default`,
+      box: tw`flex h-5 w-5 items-center justify-center rounded-sm border border-surface-300
+      bg-surface-0 text-surface-700 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)]
+      transition-colors duration-200 peer-focus-visible:outline
+      peer-focus-visible:outline-1 peer-focus-visible:outline-offset-2
+      peer-focus-visible:outline-primary peer-enabled:peer-hover:border-surface-400
+      dark:border-surface-700 dark:bg-surface-950 dark:text-surface-0
+      dark:peer-enabled:peer-hover:border-surface-600 p-checked:border-primary
+      p-checked:bg-primary p-checked:text-primary-contrast
+      peer-enabled:peer-hover:p-checked:border-primary-emphasis
+      peer-enabled:peer-hover:p-checked:bg-primary-emphasis
+      p-disabled:border-surface-300 p-disabled:bg-surface-200
+      p-disabled:text-surface-700 dark:p-disabled:border-surface-700
+      dark:p-disabled:bg-surface-400 dark:p-disabled:text-surface-400`,
+      icon: tw`h-[0.875rem] w-[0.875rem] text-sm transition-none`
+    },
+    emptyMessage: tw`px-3 py-2`,
+    transition: {
+      enterFromClass: "opacity-0 scale-y-75",
+      enterActiveClass:
+        "transition duration-120 ease-[cubic-bezier(0,0,0.2,1)]",
+      leaveActiveClass: "transition-opacity duration-100 ease-linear",
+      leaveToClass: "opacity-0"
+    }
+  },
+
+  panel: {
+    root: tw`rounded-md border border-surface-200 bg-surface-0 text-surface-700
+    dark:border-surface-700 dark:bg-surface-900 dark:text-surface-0`,
+    header: tw`flex items-center justify-between p-[1.125rem] p-toggleable:px-[1.125rem]
+    p-toggleable:py-[0.375rem]`,
+    title: tw`leading-none font-semibold`,
+    headerActions: tw`flex items-center gap-1`,
+    contentContainer: tw``,
+    content: tw`px-[1.125rem] pt-0 pb-[1.125rem]`,
+    footer: tw`px-[1.125rem] pt-0 pb-[1.125rem]`,
+    transition: {
+      enterFromClass: tw`max-h-0`,
+      enterActiveClass: tw`overflow-hidden transition-[max-height] duration-1000
+      ease-[cubic-bezier(0.42,0,0.58,1)]`,
+      enterToClass: tw`max-h-[1000px]`,
+      leaveFromClass: tw`max-h-[1000px]`,
+      leaveActiveClass: tw`overflow-hidden transition-[max-height] duration-[450ms]
+      ease-[cubic-bezier(0,1,0,1)]`,
+      leaveToClass: tw`max-h-0`
+    }
+  },
+
+  password: {
+    root: tw`relative inline-flex p-fluid:flex`,
+    pcInputText: {
+      root: tw`appearance-none rounded-md border border-surface-300 bg-surface-0 px-3 py-2
+      text-surface-700 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)] outline-hidden
+      transition-colors duration-200 placeholder:text-surface-500
+      enabled:hover:border-surface-400 enabled:focus:border-primary
+      disabled:bg-surface-200 disabled:text-surface-500 dark:border-surface-700
+      dark:bg-surface-950 dark:text-surface-0 dark:placeholder:text-surface-400
+      dark:enabled:hover:border-surface-600 dark:disabled:bg-surface-700
+      dark:disabled:text-surface-400 p-invalid:border-danger-400
+      p-invalid:placeholder:text-danger-600 dark:p-invalid:border-danger-300
+      dark:p-invalid:placeholder:text-danger-400 p-small:px-[0.625rem]
+      p-small:py-[0.375rem] p-small:text-sm p-large:px-[0.875rem]
+      p-large:py-[0.625rem] p-large:text-lg p-fluid:w-full p-filled:bg-surface-50
+      dark:p-filled:bg-surface-800 p-has-e-icon:pe-10`
+    },
+    overlay: tw`rounded-md border border-surface-200 bg-surface-0 p-3 text-surface-700
+    shadow-[0_4px_6px_-1px_rgba(0,0,0,0.1),0_2px_4px_-2px_rgba(0,0,0,0.1)]
+    dark:border-surface-700 dark:bg-surface-900 dark:text-surface-0
+    p-portal-self:min-w-full`,
+    content: tw`flex flex-col gap-2`,
+    meter: tw`h-3 rounded-md bg-surface-200 dark:bg-surface-700`,
+    meterLabel: tw`h-full w-0 rounded-md transition-[width] duration-1000 ease-in-out
+    p-weak:bg-red-500 dark:p-weak:bg-red-400 p-medium:bg-amber-500
+    dark:p-medium:bg-amber-400 p-strong:bg-green-500 dark:p-strong:bg-green-400`,
+    meterText: tw``,
+    transition: {
+      enterFromClass: tw`scale-y-75 opacity-0`,
+      enterActiveClass: tw`transition duration-120 ease-[cubic-bezier(0,0,0.2,1)]`,
+      leaveActiveClass: tw`transition-opacity duration-100 ease-linear`,
+      leaveToClass: tw`opacity-0`
+    }
+  },
+
+  select: {
+    root: tw`relative inline-flex cursor-pointer rounded-md border border-surface-300
+    bg-surface-0 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)] transition-colors
+    duration-200 select-none hover:border-surface-400 dark:border-surface-700
+    dark:bg-surface-950 dark:hover:border-surface-600 p-invalid:border-red-400
+    dark:p-invalid:border-red-300 p-fluid:flex p-filled:bg-surface-50
+    dark:p-filled:bg-surface-800 p-disabled:pointer-events-none
+    p-disabled:bg-surface-200 p-disabled:text-surface-500
+    dark:p-disabled:bg-surface-700 dark:p-disabled:text-surface-400
+    p-focus:border-primary`,
+    label: tw`block w-[1%] flex-auto overflow-hidden border-none bg-transparent px-3 py-2
+    overflow-ellipsis whitespace-nowrap text-surface-700 outline-none
+    dark:text-surface-0 p-small:px-[0.625rem] p-small:py-[0.375rem] p-small:text-sm
+    p-large:px-[0.875rem] p-large:py-[0.625rem] p-large:text-lg
+    p-disabled:text-surface-500 dark:p-disabled:text-surface-400
+    p-empty:overflow-hidden p-empty:opacity-0 p-placeholder:text-surface-500
+    dark:p-placeholder:text-surface-400 p-clearable:pe-7 p-editable:cursor-default`,
+    dropdown: tw`hidden`,
+    overlay: tw`absolute top-0 left-0 rounded-md border border-surface-200 bg-surface-50
+    text-surface-700
+    shadow-[0_4px_6px_-1px_rgba(0,0,0,0.1),0_2px_4px_-2px_rgba(0,0,0,0.1)]
+    dark:border-surface-700 dark:bg-surface-950 dark:text-surface-0
+    p-portal-self:min-w-full`,
+    header: tw`px-4 pt-2 pb-1`,
+    pcFilterContainer: {
+      root: tw`relative`
+    },
+    pcFilter: {
+      root: tw`w-full appearance-none rounded-md border border-surface-300 bg-surface-0 py-2
+      ps-3 pe-10 text-surface-700 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)]
+      outline-hidden transition-colors duration-200 placeholder:text-surface-500
+      enabled:hover:border-surface-400 enabled:focus:border-primary
+      disabled:bg-surface-200 disabled:text-surface-500 dark:border-surface-700
+      dark:bg-surface-950 dark:text-surface-0 dark:placeholder:text-surface-400
+      dark:enabled:hover:border-surface-600 dark:disabled:bg-surface-700
+      dark:disabled:text-surface-400 p-fluid:w-full`
+    },
+    pcFilterIconContainer: {
+      root: tw`absolute end-3 top-1/2 z-1 -mt-2 leading-none`
+    },
+    listContainer: tw`overflow-auto`,
+    list: tw`m-0 flex list-none flex-col gap-[2px] p-1`,
+    optionGroup: tw`m-0 bg-transparent px-3 py-2 font-semibold text-surface-500
+    dark:text-surface-400`,
+    optionGroupLabel: tw``,
+    option: tw`relative flex cursor-pointer items-center overflow-hidden rounded-sm border-none
+    bg-transparent px-3 py-2 font-normal whitespace-nowrap text-surface-700
+    transition-colors duration-200 dark:text-surface-0 p-selected:bg-highlight
+    p-focus:bg-surface-100 p-focus:text-surface-800 dark:p-focus:bg-surface-800
+    dark:p-focus:text-surface-0 p-focus:p-selected:bg-highlight-emphasis`,
+    optionLabel: tw``,
+    optionCheckIcon: tw`relative -ms-[0.375rem] me-[0.375rem] text-surface-700 dark:text-surface-0`,
+    optionBlankIcon: tw``,
+    emptyMessage: tw`px-3 py-2`,
+    virtualScroller: tw``,
+    transition: {
+      enterFromClass: "opacity-0 scale-y-75",
+      enterActiveClass:
+        "transition duration-120 ease-[cubic-bezier(0,0,0.2,1)]",
+      leaveActiveClass: "transition-opacity duration-100 ease-linear",
+      leaveToClass: "opacity-0"
+    }
+  },
+
+  selectbutton: {
+    root: tw`inline-flex rounded-md select-none p-invalid:outline p-invalid:outline-offset-0
+    p-invalid:outline-red-400 dark:p-invalid:outline-red-300`,
+    pcToggleButton: {
+      root: tw`relative inline-flex grow cursor-pointer items-center justify-center
+      overflow-hidden rounded-none border border-surface-100 bg-surface-100 p-1
+      text-base font-medium text-surface-500 transition-colors duration-200
+      select-none first:rounded-s-md last:rounded-e-md focus-visible:relative
+      focus-visible:z-10 focus-visible:outline focus-visible:outline-1
+      focus-visible:outline-offset-2 focus-visible:outline-primary
+      disabled:cursor-default disabled:border-surface-200 disabled:bg-surface-200
+      disabled:text-surface-500 dark:border-surface-950 dark:bg-surface-950
+      dark:text-surface-400 disabled:dark:border-surface-700
+      disabled:dark:bg-surface-700 disabled:dark:text-surface-400
+      p-invalid:border-red-400 dark:p-invalid:border-red-300 p-small:text-sm
+      p-large:text-lg p-checked:text-surface-700 dark:p-checked:text-surface-0 `,
+      content: tw`relative inline-flex flex-auto items-center justify-center gap-2 rounded-md px-3
+      py-1 transition-colors duration-200 p-checked:bg-surface-0
+      p-checked:shadow-[0px_1px_2px_0px_rgba(0,0,0,0.02),0px_1px_2px_0px_rgba(0,0,0,0.04)]
+      dark:p-checked:bg-surface-800`,
+      icon: tw``,
+      label: tw``
+    }
+  },
+
+  skeleton: {
+    root: tw`overflow-hidden rounded-md bg-surface-200 dark:bg-surface-700
+    p-circle:rounded-full`
+  },
+
+  textarea: {
+    root: tw`appearance-none rounded-md border border-surface-300 bg-surface-0 px-3 py-2
+    text-surface-700 shadow-[0_1px_2px_0_rgba(18,18,23,0.05)] outline-hidden
+    transition-colors duration-200 placeholder:text-surface-500
+    enabled:hover:border-surface-400 enabled:focus:border-primary
+    disabled:bg-surface-200 disabled:text-surface-500 dark:border-surface-700
+    dark:bg-surface-950 dark:text-surface-0 dark:placeholder:text-surface-400
+    dark:enabled:hover:border-surface-600 dark:disabled:bg-surface-700
+    dark:disabled:text-surface-400 p-invalid:border-red-400
+    p-invalid:placeholder:text-red-600 dark:p-invalid:border-red-300
+    dark:p-invalid:placeholder:text-red-400 p-small:px-[0.625rem]
+    p-small:py-[0.375rem] p-small:text-sm p-large:px-[0.875rem]
+    p-large:py-[0.625rem] p-large:text-lg p-fluid:w-full p-filled:bg-surface-50
+    dark:p-filled:bg-surface-800`
+  },
+
+  toast: {
+    root: tw`w-96 rounded-md break-words whitespace-pre-line p-center:min-w-[20vw]
+    p-center:-translate-x-1/2 p-center:-translate-y-1/2
+    p-top-center:-translate-x-1/2 p-bottom-center:-translate-x-1/2`,
+    message: tw`group mb-4 not-p-custom:rounded-md not-p-custom:border
+    not-p-custom:backdrop-blur-sm dark:not-p-custom:backdrop-blur-md
+    p-secondary:border-secondary-200 p-secondary:bg-secondary-50/95
+    p-secondary:text-secondary-600 dark:p-secondary:border-secondary-700/35
+    dark:p-secondary:bg-secondary-500/15 dark:p-secondary:text-secondary-500
+    p-contrast:border-surface-950 p-contrast:bg-surface-900
+    p-contrast:text-surface-50 dark:p-contrast:border-surface-100
+    dark:p-contrast:bg-surface-0 dark:p-contrast:text-surface-950
+    p-success:border-success-200 p-success:bg-success-50/95
+    p-success:text-success-600 dark:p-success:border-success-700/35
+    dark:p-success:bg-success-500/15 dark:p-success:text-success-500
+    p-info:border-info-200 p-info:bg-info-50/95 p-info:text-info-600
+    dark:p-info:border-info-700/35 dark:p-info:bg-info-500/15
+    dark:p-info:text-info-500 p-warn:border-warn-200 p-warn:bg-warn-50/95
+    p-warn:text-warn-600 dark:p-warn:border-warn-700/35 dark:p-warn:bg-warn-500/15
+    dark:p-warn:text-warn-500 p-danger:border-danger-200 p-danger:bg-danger-50/95
+    p-danger:text-danger-600 dark:p-danger:border-danger-700/35
+    dark:p-danger:bg-danger-500/15 dark:p-danger:text-danger-500
+    p-error:border-danger-200 p-error:bg-danger-50/95 p-error:text-danger-600
+    dark:p-error:border-danger-700/35 dark:p-error:bg-danger-500/15
+    dark:p-error:text-danger-500`,
+    messageContent: tw`flex items-start gap-2 p-3`,
+    messageIcon: tw`mt-1 h-[1.125rem] w-[1.125rem] flex-shrink-0 text-lg`,
+    messageText: tw`flex flex-auto flex-col gap-2`,
+    summary: tw`text-base font-medium`,
+    detail: tw`text-sm font-medium text-surface-700 dark:text-surface-0
+    p-contrast:text-surface-0 dark:p-contrast:text-surface-950`,
+    buttonContainer: tw``,
+    closeButton: tw`relative -end-1/4 -mt-[25%] flex h-7 w-7 cursor-pointer items-center
+    justify-center overflow-hidden rounded-full border-none bg-transparent p-0
+    text-inherit transition-colors duration-200 select-none focus-visible:outline
+    focus-visible:outline-1 focus-visible:outline-offset-2
+    p-secondary:hover:bg-surface-200 p-secondary:focus-visible:outline-surface-600
+    dark:p-secondary:hover:bg-surface-700
+    dark:p-secondary:focus-visible:outline-surface-300
+    p-contrast:hover:bg-surface-800 p-contrast:focus-visible:outline-surface-50
+    dark:p-contrast:hover:bg-surface-100
+    dark:p-contrast:focus-visible:outline-surface-950 p-success:hover:bg-success-100
+    p-success:focus-visible:outline-success-600 dark:p-success:hover:bg-white/5
+    dark:p-success:focus-visible:outline-success-500 p-info:hover:bg-info-100
+    p-info:focus-visible:outline-info-600 dark:p-info:hover:bg-white/5
+    dark:p-info:focus-visible:outline-info-500 p-warn:hover:bg-warn-100
+    p-warn:focus-visible:outline-warn-600 dark:p-warn:hover:bg-white/5
+    dark:p-warn:focus-visible:outline-warn-500 p-danger:hover:bg-danger-100
+    p-danger:focus-visible:outline-danger-600 dark:p-danger:hover:bg-white/5
+    dark:p-danger:focus-visible:outline-danger-500 p-error:hover:bg-danger-100
+    p-error:focus-visible:outline-danger-600 dark:p-error:hover:bg-white/5
+    dark:p-error:focus-visible:outline-danger-500`,
+    closeIcon: tw`h-4 w-4 text-base`,
+    transition: {
+      enterFromClass: tw`translate-y-1/2 opacity-0`,
+      enterActiveClass: tw`transition-all duration-500`,
+      leaveFromClass: tw`max-h-[1000px]`,
+      leaveActiveClass: tw`transition-all duration-500`,
+      leaveToClass: tw`mb-0 max-h-0 overflow-hidden opacity-0`
+    }
+  },
+
+  togglebutton: {
+    root: tw`relative inline-flex cursor-pointer items-center justify-center overflow-hidden
+    rounded-md border border-surface-100 bg-surface-100 p-1 text-base font-medium
+    text-surface-500 transition-colors duration-200 select-none
+    focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2
+    focus-visible:outline-primary disabled:cursor-default
+    disabled:border-surface-200 disabled:bg-surface-200 disabled:text-surface-500
+    dark:border-surface-950 dark:bg-surface-950 dark:text-surface-400
+    disabled:dark:border-surface-700 disabled:dark:bg-surface-700
+    disabled:dark:text-surface-400 p-invalid:border-red-400
+    dark:p-invalid:border-red-300 p-small:text-sm p-large:text-lg
+    p-checked:text-surface-700 dark:p-checked:text-surface-0 `,
+    content: tw`relative inline-flex flex-auto items-center justify-center gap-2 rounded-md px-3
+    py-1 transition-colors duration-200 p-checked:bg-surface-0
+    p-checked:shadow-[0px_1px_2px_0px_rgba(0,0,0,0.02),0px_1px_2px_0px_rgba(0,0,0,0.04)]
+    dark:p-checked:bg-surface-800`,
+    icon: tw``,
+    label: tw``
+  },
+
+  toolbar: {
+    root: tw`flex flex-wrap items-center justify-between gap-2 rounded-md border-0
+    bg-primary-50 p-0 text-primary dark:bg-primary-900`,
+    start: tw`flex items-center`,
+    center: tw`flex items-center`,
+    end: tw`flex items-center`
+  },
+
+  tooltip: {
+    root: tw`tooltip`,
+    text: tw`tooltip-text`,
+    arrow: tw`tooltip-arrow`
+  }
+}
+
+_set(passthrough, "patchedautocomplete", _cloneDeep(passthrough.autocomplete))
+
+export default passthrough

+ 7 - 0
app/utils/pluralize.js

@@ -0,0 +1,7 @@
+export default function pluralize(label, value) {
+  if (value === 1) {
+    return label
+  } else {
+    return label + "s"
+  }
+}

+ 5 - 0
app/utils/sleep.js

@@ -0,0 +1,5 @@
+export default function sleep(timeout) {
+  return new Promise((resolve) => {
+    setTimeout(() => resolve(), timeout)
+  })
+}

+ 4 - 0
app/utils/tw.js

@@ -0,0 +1,4 @@
+// tagged template literal function for prettier-plugin-tailwindcss
+export default function tw(strings, ...values) {
+  return String.raw({ raw: strings }, ...values)
+}

+ 3 - 0
app/utils/uniqValues.js

@@ -0,0 +1,3 @@
+export default function uniqValues(ary, property) {
+  return _sortBy(_uniq(_compact(_map(ary, property))))
+}

+ 25 - 0
modules/lodash-shared/exclude.js

@@ -0,0 +1,25 @@
+export default [
+  "wrapperValue",
+  "wrapperToIterator",
+  "wrapperReverse",
+  "wrapperPlant",
+  "wrapperNext",
+  "wrapperLodash",
+  "wrapperCommit",
+  "wrapperChain",
+  "wrapperAt",
+  "templateSettings",
+  "toIterator",
+  "VERSION",
+  "lodash",
+  "value",
+  "valueOf",
+  "toJSON",
+  "thru",
+  "plant",
+  "next",
+  "default",
+  "commit",
+  "head",
+  "isError"
+]

+ 74 - 0
modules/lodash-shared/index.js

@@ -0,0 +1,74 @@
+// noinspection JSUnresolvedReference
+
+import {
+  addImports,
+  addServerImports,
+  createResolver,
+  defineNuxtModule
+} from "@nuxt/kit"
+
+import * as lodash from "lodash-es"
+import excludeDefaults from "./exclude.js"
+
+export default defineNuxtModule({
+  meta: {
+    // Usually the npm package name of your module
+    name: "lodash-shared",
+    // The key in `nuxt.config` that holds your module options
+    configKey: "lodash",
+    // Compatibility constraints
+    compatibility: {
+      // Semver version of supported nuxt versions
+      nuxt: ">=4.0.0"
+    }
+  },
+
+  // Default configuration options for your module, can also be a function returning those
+  defaults: {
+    // from nuxt-lodash
+    prefix: "use",
+    prefixSkip: "is",
+    exclude: [],
+    alias: [],
+    upperAfterPrefix: true
+  },
+
+  // Shorthand sugar to register Nuxt hooks
+  hooks: {},
+
+  // Configuration for other modules - this does not ensure the module runs before
+  // your module, but it allows you to change the other module's configuration before it runs
+  moduleDependencies: {},
+
+  // The function holding your module logic, it can be asynchronous
+  setup(options, _nuxt) {
+    const { resolve } = createResolver(import.meta.url)
+
+    const aliasMap = new Map(options.alias)
+    const excludes = [...options.exclude, ...excludeDefaults]
+
+    const prefixSkip = options.prefixSkip
+      ? lodash.isArray(options.prefixSkip)
+        ? options.prefixSkip
+        : [options.prefixSkip]
+      : []
+
+    for (const name of Object.keys(lodash)) {
+      if (!excludes.includes(name)) {
+        const alias = aliasMap.has(name) ? aliasMap.get(name) : name
+        const prefix =
+          (!prefixSkip.some((key) => alias.startsWith(key)) &&
+            options.prefix) ||
+          ""
+
+        const as = prefix
+          ? prefix +
+            (options.upperAfterPrefix ? lodash.upperFirst(alias) : alias)
+          : alias
+
+        addImports({ name, as, from: resolve("./runtime/lodash") })
+        addServerImports({ name, as, from: resolve("./runtime/lodash") })
+      }
+    }
+  }
+})

+ 1 - 0
modules/lodash-shared/runtime/lodash.js

@@ -0,0 +1 @@
+export * from "lodash-es"

+ 80 - 0
nuxt.config.js

@@ -0,0 +1,80 @@
+import tailwindcss from "@tailwindcss/vite"
+
+export default defineNuxtConfig({
+  compatibilityDate: "2026-03-13",
+  css: ["~/assets/css/main.css"],
+  devServer: { port: 3000 },
+  devtools: { enabled: true, timeline: { enabled: true } },
+  // future: { compatibilityVersion: 5 },
+
+  imports: {
+    dirs: [
+      "mutations/**",
+      "queries",
+      "stores"
+    ]
+  },
+
+  modules: [
+    "@nuxt/icon",
+    "@pinia/nuxt",
+    "@pinia/colada-nuxt",
+    "@primevue/nuxt-module"
+  ],
+
+  nitro: {
+    experimental: {
+      asyncContext: true,
+      websocket: true
+    }
+  },
+
+  runtimeConfig: {
+    public: {
+      // api: { baseURL: "" },
+      // auth: { baseURL: "" },
+      websocketHost: ""
+    },
+
+    // betterAuth: { baseURL: "", secret: "" },
+    // postmarkServerToken: "",
+    prismaDatabaseURL: ""
+  },
+
+  vite: {
+    plugins: [tailwindcss()],
+
+    optimizeDeps: {
+      include: [
+        "lodash-es",
+        "socket.io-client",
+        "@primevue/core/api"
+      ]
+    }
+  },
+
+  // module configs
+  icon: {
+    size: "1em",
+    class: "inline",
+    mode: "svg",
+    aliases: { personae: "fa6-solid:masks-theater" }
+  },
+
+  lodash: {
+    prefix: "_",
+    prefixSkip: false,
+    upperAfterPrefix: false
+  },
+
+  pinia: { storesDirs: ["./app/stores/**"] },
+
+  primevue: {
+    importPT: { from: "~/utils/passthrough.js" },
+    options: {
+      ptOptions: { mergeSections: true, mergeProps: true },
+      ripple: true,
+      unstyled: true
+    }
+  }
+})

+ 58 - 0
package.json

@@ -0,0 +1,58 @@
+{
+  "name": "personae-colada",
+  "type": "module",
+  "scripts": {
+    "build": "nuxt build",
+    "cleanup": "nuxt cleanup",
+    "dev": "nuxt dev --hostname=127.0.0.1",
+    "dev:debug": "nuxt dev --inspect --hostname=127.0.0.1",
+    "generate": "nuxt generate",
+    "postcleanup": "nuxt prepare",
+    "postinstall": "nuxt prepare",
+    "postprisma:generate": "nuxt prepare",
+    "prepare": "nuxt prepare",
+    "preview": "nuxt preview -p 4001",
+    "prisma:generate": "prisma generate",
+    "prisma:push": "prisma db push"
+  },
+  "packageManager": "pnpm@10.32.1",
+  "dependencies": {
+    "nuxt": "^4.4.2",
+    "vue": "^3.5.30"
+  },
+  "devDependencies": {
+    "@iconify-json/fa6-solid": "^1.2.4",
+    "@iconify-json/ph": "^1.2.2",
+    "@nuxt/devtools": "^3.2.3",
+    "@nuxt/icon": "^2.2.1",
+    "@nuxt/kit": "^4.4.2",
+    "@pinia/colada": "^1.0.0",
+    "@pinia/colada-devtools": "^0.4.5",
+    "@pinia/colada-nuxt": "^0.3.2",
+    "@pinia/nuxt": "^0.11.3",
+    "@primevue/core": "^4.5.4",
+    "@primevue/nuxt-module": "^4.5.4",
+    "@prisma/adapter-pg": "^7.5.0",
+    "@prisma/client": "^7.5.0",
+    "@tailwindcss/typography": "^0.5.19",
+    "@tailwindcss/vite": "^4.2.1",
+    "dotenv": "^17.3.1",
+    "engine.io": "^6.6.6",
+    "html-to-text": "^9.0.5",
+    "lodash-es": "^4.17.23",
+    "pinia": "^3.0.4",
+    "prettier": "^3.8.1",
+    "prettier-plugin-classnames": "^0.9.0",
+    "prettier-plugin-merge": "^0.10.0",
+    "prettier-plugin-prisma": "^5.0.0",
+    "prettier-plugin-tailwindcss": "^0.7.2",
+    "prisma": "^7.5.0",
+    "socket.io": "^4.8.3",
+    "socket.io-client": "^4.8.3",
+    "tailwindcss": "^4.2.1",
+    "tailwindcss-primeui": "^0.6.1",
+    "tsx": "^4.21.0",
+    "vite": "^7.3.1",
+    "zod": "^4.3.6"
+  }
+}

+ 8968 - 0
pnpm-lock.yaml

@@ -0,0 +1,8968 @@
+lockfileVersion: '9.0'
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
+importers:
+
+  .:
+    dependencies:
+      nuxt:
+        specifier: ^4.4.2
+        version: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@electric-sql/pglite@0.3.15)(@parcel/watcher@2.5.6)(@pinia/colada@1.0.0(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)))(@types/node@25.5.0)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.3.15)(mysql2@3.15.3))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(mysql2@3.15.3)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rolldown@1.0.0-rc.9)(rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.9)(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(yaml@2.8.2)
+      vue:
+        specifier: ^3.5.30
+        version: 3.5.30(typescript@5.9.3)
+    devDependencies:
+      '@iconify-json/fa6-solid':
+        specifier: ^1.2.4
+        version: 1.2.4
+      '@iconify-json/ph':
+        specifier: ^1.2.2
+        version: 1.2.2
+      '@nuxt/devtools':
+        specifier: ^3.2.3
+        version: 3.2.3(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))
+      '@nuxt/icon':
+        specifier: ^2.2.1
+        version: 2.2.1(magicast@0.5.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))
+      '@nuxt/kit':
+        specifier: ^4.4.2
+        version: 4.4.2(magicast@0.5.2)
+      '@pinia/colada':
+        specifier: ^1.0.0
+        version: 1.0.0(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))
+      '@pinia/colada-devtools':
+        specifier: ^0.4.5
+        version: 0.4.5
+      '@pinia/colada-nuxt':
+        specifier: ^0.3.2
+        version: 0.3.2(@pinia/colada@1.0.0(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)))(magicast@0.5.2)
+      '@pinia/nuxt':
+        specifier: ^0.11.3
+        version: 0.11.3(magicast@0.5.2)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))
+      '@primevue/core':
+        specifier: ^4.5.4
+        version: 4.5.4(vue@3.5.30(typescript@5.9.3))
+      '@primevue/nuxt-module':
+        specifier: ^4.5.4
+        version: 4.5.4(@babel/parser@7.29.0)(magicast@0.5.2)(vue@3.5.30(typescript@5.9.3))
+      '@prisma/adapter-pg':
+        specifier: ^7.5.0
+        version: 7.5.0
+      '@prisma/client':
+        specifier: ^7.5.0
+        version: 7.5.0(prisma@7.5.0(@types/react@19.2.14)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3)
+      '@tailwindcss/typography':
+        specifier: ^0.5.19
+        version: 0.5.19(tailwindcss@4.2.1)
+      '@tailwindcss/vite':
+        specifier: ^4.2.1
+        version: 4.2.1(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+      dotenv:
+        specifier: ^17.3.1
+        version: 17.3.1
+      engine.io:
+        specifier: ^6.6.6
+        version: 6.6.6
+      html-to-text:
+        specifier: ^9.0.5
+        version: 9.0.5
+      lodash-es:
+        specifier: ^4.17.23
+        version: 4.17.23
+      pinia:
+        specifier: ^3.0.4
+        version: 3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3))
+      prettier:
+        specifier: ^3.8.1
+        version: 3.8.1
+      prettier-plugin-classnames:
+        specifier: ^0.9.0
+        version: 0.9.0(prettier@3.8.1)
+      prettier-plugin-merge:
+        specifier: ^0.10.0
+        version: 0.10.0(prettier@3.8.1)
+      prettier-plugin-prisma:
+        specifier: ^5.0.0
+        version: 5.0.0(prettier@3.8.1)
+      prettier-plugin-tailwindcss:
+        specifier: ^0.7.2
+        version: 0.7.2(prettier@3.8.1)
+      prisma:
+        specifier: ^7.5.0
+        version: 7.5.0(@types/react@19.2.14)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)
+      socket.io:
+        specifier: ^4.8.3
+        version: 4.8.3
+      socket.io-client:
+        specifier: ^4.8.3
+        version: 4.8.3
+      tailwindcss:
+        specifier: ^4.2.1
+        version: 4.2.1
+      tailwindcss-primeui:
+        specifier: ^0.6.1
+        version: 0.6.1(tailwindcss@4.2.1)
+      tsx:
+        specifier: ^4.21.0
+        version: 4.21.0
+      vite:
+        specifier: ^7.3.1
+        version: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+      zod:
+        specifier: ^4.3.6
+        version: 4.3.6
+
+packages:
+
+  '@antfu/install-pkg@1.1.0':
+    resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==}
+
+  '@babel/code-frame@7.29.0':
+    resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/compat-data@7.29.0':
+    resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/core@7.29.0':
+    resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/generator@7.29.1':
+    resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-annotate-as-pure@7.27.3':
+    resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-compilation-targets@7.28.6':
+    resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-create-class-features-plugin@7.28.6':
+    resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-globals@7.28.0':
+    resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-member-expression-to-functions@7.28.5':
+    resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-module-imports@7.28.6':
+    resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-module-transforms@7.28.6':
+    resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-optimise-call-expression@7.27.1':
+    resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-plugin-utils@7.28.6':
+    resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-replace-supers@7.28.6':
+    resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+    resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-string-parser@7.27.1':
+    resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-validator-identifier@7.28.5':
+    resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-validator-option@7.27.1':
+    resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helpers@7.28.6':
+    resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/parser@7.29.0':
+    resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+
+  '@babel/plugin-syntax-jsx@7.28.6':
+    resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-typescript@7.28.6':
+    resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-typescript@7.28.6':
+    resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/template@7.28.6':
+    resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/traverse@7.29.0':
+    resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/types@7.29.0':
+    resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
+    engines: {node: '>=6.9.0'}
+
+  '@bomb.sh/tab@0.0.14':
+    resolution: {integrity: sha512-cHMk2LI430MVoX1unTt9oK1iZzQS4CYDz97MSxKLNErW69T43Z2QLFTpdS/3jVOIKrIADWfuxQ+nQNJkNV7E4w==}
+    hasBin: true
+    peerDependencies:
+      cac: ^6.7.14
+      citty: ^0.1.6 || ^0.2.0
+      commander: ^13.1.0
+    peerDependenciesMeta:
+      cac:
+        optional: true
+      citty:
+        optional: true
+      commander:
+        optional: true
+
+  '@chevrotain/cst-dts-gen@10.5.0':
+    resolution: {integrity: sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==}
+
+  '@chevrotain/gast@10.5.0':
+    resolution: {integrity: sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==}
+
+  '@chevrotain/types@10.5.0':
+    resolution: {integrity: sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==}
+
+  '@chevrotain/utils@10.5.0':
+    resolution: {integrity: sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==}
+
+  '@clack/core@1.1.0':
+    resolution: {integrity: sha512-SVcm4Dqm2ukn64/8Gub2wnlA5nS2iWJyCkdNHcvNHPIeBTGojpdJ+9cZKwLfmqy7irD4N5qLteSilJlE0WLAtA==}
+
+  '@clack/prompts@1.1.0':
+    resolution: {integrity: sha512-pkqbPGtohJAvm4Dphs2M8xE29ggupihHdy1x84HNojZuMtFsHiUlRvqD24tM2+XmI+61LlfNceM3Wr7U5QES5g==}
+
+  '@cloudflare/kv-asset-handler@0.4.2':
+    resolution: {integrity: sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==}
+    engines: {node: '>=18.0.0'}
+
+  '@dxup/nuxt@0.4.0':
+    resolution: {integrity: sha512-28LDotpr9G2knUse3cQYsOo6NJq5yhABv4ByRVRYJUmzf9Q31DI7rpRek4POlKy1aAcYyKgu5J2616pyqLohYg==}
+    peerDependencies:
+      typescript: '*'
+
+  '@dxup/unimport@0.1.2':
+    resolution: {integrity: sha512-/B8YJGPzaYq1NbsQmwgP8EZqg40NpTw4ZB3suuI0TplbxKHeK94jeaawLmVhCv+YwUnOpiWEz9U6SeThku/8JQ==}
+
+  '@electric-sql/pglite-socket@0.0.20':
+    resolution: {integrity: sha512-J5nLGsicnD9wJHnno9r+DGxfcZWh+YJMCe0q/aCgtG6XOm9Z7fKeite8IZSNXgZeGltSigM9U/vAWZQWdgcSFg==}
+    hasBin: true
+    peerDependencies:
+      '@electric-sql/pglite': 0.3.15
+
+  '@electric-sql/pglite-tools@0.2.20':
+    resolution: {integrity: sha512-BK50ZnYa3IG7ztXhtgYf0Q7zijV32Iw1cYS8C+ThdQlwx12V5VZ9KRJ42y82Hyb4PkTxZQklVQA9JHyUlex33A==}
+    peerDependencies:
+      '@electric-sql/pglite': 0.3.15
+
+  '@electric-sql/pglite@0.3.15':
+    resolution: {integrity: sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==}
+
+  '@emnapi/core@1.9.0':
+    resolution: {integrity: sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==}
+
+  '@emnapi/runtime@1.9.0':
+    resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==}
+
+  '@emnapi/wasi-threads@1.2.0':
+    resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==}
+
+  '@esbuild/aix-ppc64@0.27.4':
+    resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [aix]
+
+  '@esbuild/android-arm64@0.27.4':
+    resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [android]
+
+  '@esbuild/android-arm@0.27.4':
+    resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [android]
+
+  '@esbuild/android-x64@0.27.4':
+    resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [android]
+
+  '@esbuild/darwin-arm64@0.27.4':
+    resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@esbuild/darwin-x64@0.27.4':
+    resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@esbuild/freebsd-arm64@0.27.4':
+    resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@esbuild/freebsd-x64@0.27.4':
+    resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@esbuild/linux-arm64@0.27.4':
+    resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@esbuild/linux-arm@0.27.4':
+    resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [linux]
+
+  '@esbuild/linux-ia32@0.27.4':
+    resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [linux]
+
+  '@esbuild/linux-loong64@0.27.4':
+    resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==}
+    engines: {node: '>=18'}
+    cpu: [loong64]
+    os: [linux]
+
+  '@esbuild/linux-mips64el@0.27.4':
+    resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==}
+    engines: {node: '>=18'}
+    cpu: [mips64el]
+    os: [linux]
+
+  '@esbuild/linux-ppc64@0.27.4':
+    resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@esbuild/linux-riscv64@0.27.4':
+    resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==}
+    engines: {node: '>=18'}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@esbuild/linux-s390x@0.27.4':
+    resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==}
+    engines: {node: '>=18'}
+    cpu: [s390x]
+    os: [linux]
+
+  '@esbuild/linux-x64@0.27.4':
+    resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [linux]
+
+  '@esbuild/netbsd-arm64@0.27.4':
+    resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [netbsd]
+
+  '@esbuild/netbsd-x64@0.27.4':
+    resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [netbsd]
+
+  '@esbuild/openbsd-arm64@0.27.4':
+    resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [openbsd]
+
+  '@esbuild/openbsd-x64@0.27.4':
+    resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [openbsd]
+
+  '@esbuild/openharmony-arm64@0.27.4':
+    resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [openharmony]
+
+  '@esbuild/sunos-x64@0.27.4':
+    resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [sunos]
+
+  '@esbuild/win32-arm64@0.27.4':
+    resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@esbuild/win32-ia32@0.27.4':
+    resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@esbuild/win32-x64@0.27.4':
+    resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [win32]
+
+  '@hono/node-server@1.19.9':
+    resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==}
+    engines: {node: '>=18.14.1'}
+    peerDependencies:
+      hono: ^4
+
+  '@iconify-json/fa6-solid@1.2.4':
+    resolution: {integrity: sha512-LmDNNdJVyvF5mPm1yxWvL8KjCc/E8LzoqnF1LNTVpyY2ZJRUlGOWuPIThdbuFBF2IovgttkIyumhyqfmlHdwKg==}
+
+  '@iconify-json/ph@1.2.2':
+    resolution: {integrity: sha512-PgkEZNtqa8hBGjHXQa4pMwZa93hmfu8FUSjs/nv4oUU6yLsgv+gh9nu28Kqi8Fz9CCVu4hj1MZs9/60J57IzFw==}
+
+  '@iconify/collections@1.0.660':
+    resolution: {integrity: sha512-7SG+ZacgqAhZdjSv4+eyFtJ+amI2PzIrg6NrZ2T5qdRpWOBv0Px1SB0C+4CsGxHenhhWjGMfSHG1vzkPgF0PyA==}
+
+  '@iconify/types@2.0.0':
+    resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+  '@iconify/utils@3.1.0':
+    resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==}
+
+  '@iconify/vue@5.0.0':
+    resolution: {integrity: sha512-C+KuEWIF5nSBrobFJhT//JS87OZ++QDORB6f2q2Wm6fl2mueSTpFBeBsveK0KW9hWiZ4mNiPjsh6Zs4jjdROSg==}
+    peerDependencies:
+      vue: '>=3'
+
+  '@ioredis/commands@1.5.1':
+    resolution: {integrity: sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==}
+
+  '@isaacs/cliui@8.0.2':
+    resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+    engines: {node: '>=12'}
+
+  '@isaacs/fs-minipass@4.0.1':
+    resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
+    engines: {node: '>=18.0.0'}
+
+  '@jridgewell/gen-mapping@0.3.13':
+    resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+  '@jridgewell/remapping@2.3.5':
+    resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
+  '@jridgewell/resolve-uri@3.1.2':
+    resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/source-map@0.3.11':
+    resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+
+  '@jridgewell/sourcemap-codec@1.5.5':
+    resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+  '@jridgewell/trace-mapping@0.3.31':
+    resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+  '@kwsites/file-exists@1.1.1':
+    resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==}
+
+  '@kwsites/promise-deferred@1.1.1':
+    resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==}
+
+  '@mapbox/node-pre-gyp@2.0.3':
+    resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==}
+    engines: {node: '>=18'}
+    hasBin: true
+
+  '@mrleebo/prisma-ast@0.13.1':
+    resolution: {integrity: sha512-XyroGQXcHrZdvmrGJvsA9KNeOOgGMg1Vg9OlheUsBOSKznLMDl+YChxbkboRHvtFYJEMRYmlV3uoo/njCw05iw==}
+    engines: {node: '>=16'}
+
+  '@napi-rs/wasm-runtime@1.1.1':
+    resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==}
+
+  '@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'}
+
+  '@nuxt/cli@3.34.0':
+    resolution: {integrity: sha512-KVI4xSo96UtUUbmxr9ouWTytbj1LzTw5alsM4vC/gSY/l8kPMRAlq0XpNSAVTDJyALzLY70WhaIMX24LJLpdFw==}
+    engines: {node: ^16.14.0 || >=18.0.0}
+    hasBin: true
+    peerDependencies:
+      '@nuxt/schema': ^4.3.1
+    peerDependenciesMeta:
+      '@nuxt/schema':
+        optional: true
+
+  '@nuxt/devalue@2.0.2':
+    resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==}
+
+  '@nuxt/devtools-kit@3.2.3':
+    resolution: {integrity: sha512-5zj7Xx5CDI6P84kMalXoxGLd470buF6ncsRhiEPq8UlwdpVeR7bwi8QnparZNFBdG79bZ5KUkfi5YDXpLYPoIA==}
+    peerDependencies:
+      vite: '>=6.0'
+
+  '@nuxt/devtools-wizard@3.2.3':
+    resolution: {integrity: sha512-VXSxWlv476Mhg2RkWMkjslOXcbf0trsp/FDHZTjg9nPDGROGV88xNuvgIF4eClP7zesjETOUow0te6s8504w9A==}
+    hasBin: true
+
+  '@nuxt/devtools@3.2.3':
+    resolution: {integrity: sha512-UfbCHJDQ2DK0D787G6/QhuS2aYCDFTKMgtvE6OBBM1qYpR6pYEu5LRClQr9TFN4TIqJvgluQormGcYr1lsTKTw==}
+    hasBin: true
+    peerDependencies:
+      '@vitejs/devtools': '*'
+      vite: '>=6.0'
+    peerDependenciesMeta:
+      '@vitejs/devtools':
+        optional: true
+
+  '@nuxt/icon@2.2.1':
+    resolution: {integrity: sha512-GI840yYGuvHI0BGDQ63d6rAxGzG96jQcWrnaWIQKlyQo/7sx9PjXkSHckXUXyX1MCr9zY6U25Td6OatfY6Hklw==}
+
+  '@nuxt/kit@3.21.2':
+    resolution: {integrity: sha512-Bd6m6mrDrqpBEbX+g0rc66/ALd1sxlgdx5nfK9MAYO0yKLTOSK7McSYz1KcOYn3LQFCXOWfvXwaqih/b+REI1g==}
+    engines: {node: '>=18.12.0'}
+
+  '@nuxt/kit@4.4.2':
+    resolution: {integrity: sha512-5+IPRNX2CjkBhuWUwz0hBuLqiaJPRoKzQ+SvcdrQDbAyE+VDeFt74VpSFr5/R0ujrK4b+XnSHUJWdS72w6hsog==}
+    engines: {node: '>=18.12.0'}
+
+  '@nuxt/nitro-server@4.4.2':
+    resolution: {integrity: sha512-iMTfraWcpA0MuEnnEI8JFK/4DODY4ss1CfB8m3sBVOqW9jpY1Z6hikxzrtN+CadtepW2aOI5d8TdX5hab+Sb4Q==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    peerDependencies:
+      '@babel/plugin-proposal-decorators': ^7.25.0
+      '@rollup/plugin-babel': ^6.0.0 || ^7.0.0
+      nuxt: ^4.4.2
+    peerDependenciesMeta:
+      '@babel/plugin-proposal-decorators':
+        optional: true
+      '@rollup/plugin-babel':
+        optional: true
+
+  '@nuxt/schema@4.4.2':
+    resolution: {integrity: sha512-/q6C7Qhiricgi+PKR7ovBnJlKTL0memCbA1CzRT+itCW/oeYzUfeMdQ35mGntlBoyRPNrMXbzuSUhfDbSCU57w==}
+    engines: {node: ^14.18.0 || >=16.10.0}
+
+  '@nuxt/telemetry@2.7.0':
+    resolution: {integrity: sha512-mrKC3NjAlBOooLLVTYcIUie1meipoYq5vkoESoVTEWTB34T3a0QJzOfOPch+HYlUR+5Lqy1zLMv6epHFgYAKLA==}
+    engines: {node: '>=18.12.0'}
+    hasBin: true
+    peerDependencies:
+      '@nuxt/kit': '>=3.0.0'
+
+  '@nuxt/vite-builder@4.4.2':
+    resolution: {integrity: sha512-fJaIwMA8ID6BU5EqmoDvnhq4qYDJeWjdHk4jfqy8D3Nm7CoUW0BvX7Ee92XoO05rtUiClGlk/NQ1Ii8hs3ZIbw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    peerDependencies:
+      '@babel/plugin-proposal-decorators': ^7.25.0
+      '@babel/plugin-syntax-jsx': ^7.25.0
+      nuxt: 4.4.2
+      rolldown: ^1.0.0-beta.38
+      rollup-plugin-visualizer: ^6.0.0 || ^7.0.1
+      vue: ^3.3.4
+    peerDependenciesMeta:
+      '@babel/plugin-proposal-decorators':
+        optional: true
+      '@babel/plugin-syntax-jsx':
+        optional: true
+      rolldown:
+        optional: true
+      rollup-plugin-visualizer:
+        optional: true
+
+  '@oxc-minify/binding-android-arm-eabi@0.117.0':
+    resolution: {integrity: sha512-5Hf2KsGRjxp3HnPU/mse7cQJa5tWfMFUPZQcgSMVsv2JZnGFFOIDzA0Oja2KDD+VPJqMpEJKc2dCHAGZgJxsGg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm]
+    os: [android]
+
+  '@oxc-minify/binding-android-arm64@0.117.0':
+    resolution: {integrity: sha512-uuxGwxA5J4Sap+gz4nxyM/rer6q2A4X1Oe8HpE0CZQyb5cSBULQ15btZiVG3xOBctI5O+c2dwR1aZAP4oGKcLw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [android]
+
+  '@oxc-minify/binding-darwin-arm64@0.117.0':
+    resolution: {integrity: sha512-lLBf75cxUSLydumToKtGTwbLqO/1urScblJ33Vx0uF38M2ZbL2x51AybBV5vlfLjYNrxvQ8ov0Bj/OhsVO/biA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@oxc-minify/binding-darwin-x64@0.117.0':
+    resolution: {integrity: sha512-wBWwP1voLZMuN4hpe1HRtkPBd4/o/1qan5XssmmI/hewBvGHEHkyvVLS0zu+cKqXDxYzYvb/p+EqU+xSXhEl4A==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [darwin]
+
+  '@oxc-minify/binding-freebsd-x64@0.117.0':
+    resolution: {integrity: sha512-pYSacHw698oH2vb70iP1cHk6x0zhvAuOvdskvNtEqvfziu8MSjKXa699vA9Cx72+DH5rwVuj1I3f+7no2fWglA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@oxc-minify/binding-linux-arm-gnueabihf@0.117.0':
+    resolution: {integrity: sha512-Ugm4Qj7F2+bccjhHCjjnSNHBDPyvjPXWrntID4WJpSrPqt+Az/o0EGdty9sWOjQXRZiTVpa80uqCWZQUn94yTA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm]
+    os: [linux]
+
+  '@oxc-minify/binding-linux-arm-musleabihf@0.117.0':
+    resolution: {integrity: sha512-qrY6ZviO9wVRI/jl4nRZO4B9os8jaJQemMeWIyFInZNk3lhqihId8iBqMKibJnRaf+JRxLM9j68atXkFRhOHrg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm]
+    os: [linux]
+
+  '@oxc-minify/binding-linux-arm64-gnu@0.117.0':
+    resolution: {integrity: sha512-2VLJHKEFBRhCihT/8uesuDPhXpbWu1OlHCxqQ7pdFVqKik1Maj5E9oSDcYzxqfaCRStvTHkmLVWJBK5CVcIadg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-minify/binding-linux-arm64-musl@0.117.0':
+    resolution: {integrity: sha512-C3zapJconWpl2Y7LR3GkRkH6jxpuV2iVUfkFcHT5Ffn4Zu7l88mZa2dhcfdULZDybN1Phka/P34YUzuskUUrXw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@oxc-minify/binding-linux-ppc64-gnu@0.117.0':
+    resolution: {integrity: sha512-2T/Bm+3/qTfuNS4gKSzL8qbiYk+ErHW2122CtDx+ilZAzvWcJ8IbqdZIbEWOlwwe03lESTxPwTBLFqVgQU2OeQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [ppc64]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-minify/binding-linux-riscv64-gnu@0.117.0':
+    resolution: {integrity: sha512-MKLjpldYkeoB4T+yAi4aIAb0waifxUjLcKkCUDmYAY3RqBJTvWK34KtfaKZL0IBMIXfD92CbKkcxQirDUS9Xcg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [riscv64]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-minify/binding-linux-riscv64-musl@0.117.0':
+    resolution: {integrity: sha512-UFVcbPvKUStry6JffriobBp8BHtjmLLPl4bCY+JMxIn/Q3pykCpZzRwFTcDurG/kY8tm+uSNfKKdRNa5Nh9A7g==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [riscv64]
+    os: [linux]
+    libc: [musl]
+
+  '@oxc-minify/binding-linux-s390x-gnu@0.117.0':
+    resolution: {integrity: sha512-B9GyPQ1NKbvpETVAMyJMfRlD3c6UJ7kiuFUAlx9LTYiQL+YIyT6vpuRlq1zgsXxavZluVrfeJv6x0owV4KDx4Q==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [s390x]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-minify/binding-linux-x64-gnu@0.117.0':
+    resolution: {integrity: sha512-fXfhtr+WWBGNy4M5GjAF5vu/lpulR4Me34FjTyaK9nDrTZs7LM595UDsP1wliksqp4hD/KdoqHGmbCrC+6d4vA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-minify/binding-linux-x64-musl@0.117.0':
+    resolution: {integrity: sha512-jFBgGbx1oLadb83ntJmy1dWlAHSQanXTS21G4PgkxyONmxZdZ/UMKr7KsADzMuoPsd2YhJHxzRpwJd9U+4BFBw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@oxc-minify/binding-openharmony-arm64@0.117.0':
+    resolution: {integrity: sha512-nxPd9vx1vYz8IlIMdl9HFdOK/ood1H5hzbSFsyO8JU55tkcJoBL8TLCbuFf9pHpOy27l2gcPyV6z3p4eAcTH5Q==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [openharmony]
+
+  '@oxc-minify/binding-wasm32-wasi@0.117.0':
+    resolution: {integrity: sha512-pSvjJ6cCCfEXSteWSiVfZhdRzvpmS3tLhlXrXTYiuTDFrkRCobRP39SRwAzK23rE9i/m2JAaES2xPEW6+xu85g==}
+    engines: {node: '>=14.0.0'}
+    cpu: [wasm32]
+
+  '@oxc-minify/binding-win32-arm64-msvc@0.117.0':
+    resolution: {integrity: sha512-9NoT9baFrWPdJRIZVQ1jzPZW9TjPT2sbzQyDdoK7uD1V8JXCe1L2y7sp9k2ldZZheaIcmtNwHc7jyD7kYz/0XQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [win32]
+
+  '@oxc-minify/binding-win32-ia32-msvc@0.117.0':
+    resolution: {integrity: sha512-E51LTjkRei5u2dpFiYSObuh+e43xg45qlmilSTd0XDGFdYJCOv62Q0MEn61TR+efQYPNleYwWdTS9t+tp9p/4w==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [ia32]
+    os: [win32]
+
+  '@oxc-minify/binding-win32-x64-msvc@0.117.0':
+    resolution: {integrity: sha512-I8vniPOxWQdxfIbXNvQLaJ1n8SrnqES6wuiAX10CU72sKsizkds9kDaJ1KzWvDy39RKhTBmD1cJsU2uxPFgizQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [win32]
+
+  '@oxc-parser/binding-android-arm-eabi@0.117.0':
+    resolution: {integrity: sha512-XarGPJpaobgKjfm7xRfCGWWszuPbm/OeP91NdMhxtcLZ/qLTmWF0P0z0gqmr0Uysi1F1v1BNtcST11THMrcEOw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm]
+    os: [android]
+
+  '@oxc-parser/binding-android-arm64@0.117.0':
+    resolution: {integrity: sha512-EPTs2EBijGmyhPso4rXAL0NSpECXER9IaVKFZEv83YcA6h4uhKW47kmYt+OZcSp130zhHx+lTWILDQ/LDkCRNA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [android]
+
+  '@oxc-parser/binding-darwin-arm64@0.117.0':
+    resolution: {integrity: sha512-3bAEpyih6r/Kb+Xzn1em1qBMClOS7NsVWgF86k95jpysR5ix/HlKFKSy7cax6PcS96HeHR4kjlME20n/XK1zNg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@oxc-parser/binding-darwin-x64@0.117.0':
+    resolution: {integrity: sha512-W7S99zFwVZhSbCxvjfZkioStFU249DBc4TJw/kK6kfKwx2Zew+jvizX5Y3ZPkAh7fBVUSNOdSeOqLBHLiP50tw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [darwin]
+
+  '@oxc-parser/binding-freebsd-x64@0.117.0':
+    resolution: {integrity: sha512-xH76lqSdjCSY0KUMPwLXlvQ3YEm3FFVEQmgiOCGNf+stZ6E4Mo3nC102Bo8yKd7aW0foIPAFLYsHgj7vVI/axw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@oxc-parser/binding-linux-arm-gnueabihf@0.117.0':
+    resolution: {integrity: sha512-9Hdm1imzrn4RdMYnQKKcy+7p7QsSPIrgVIZmpGSJT02nYDuBWLdG1pdYMPFoEo46yiXry3tS3RoHIpNbT1IiyQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm]
+    os: [linux]
+
+  '@oxc-parser/binding-linux-arm-musleabihf@0.117.0':
+    resolution: {integrity: sha512-Itszer/VCeYhYVJLcuKnHktlY8QyGnVxapltP68S1XRGlV6IsM9HQAElJRMwQhT6/GkMjOhANmkv2Qu/9v44lw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm]
+    os: [linux]
+
+  '@oxc-parser/binding-linux-arm64-gnu@0.117.0':
+    resolution: {integrity: sha512-jBxD7DtlHQ36ivjjZdH0noQJgWNouenzpLmXNKnYaCsBfo3jY95m5iyjYQEiWkvkhJ3TJUAs7tQ1/kEpY7x/Kg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-parser/binding-linux-arm64-musl@0.117.0':
+    resolution: {integrity: sha512-QagKTDF4lrz8bCXbUi39Uq5xs7C7itAseKm51f33U+Dyar9eJY/zGKqfME9mKLOiahX7Fc1J3xMWVS0AdDXLPg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@oxc-parser/binding-linux-ppc64-gnu@0.117.0':
+    resolution: {integrity: sha512-RPddpcE/0xxWaommWy0c5i/JdrXcXAkxBS2GOrAUh5LKmyCh03hpJedOAWszG4ADsKQwoUQQ1/tZVGRhZIWtKA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [ppc64]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-parser/binding-linux-riscv64-gnu@0.117.0':
+    resolution: {integrity: sha512-ur/WVZF9FSOiZGxyP+nfxZzuv6r5OJDYoVxJnUR7fM/hhXLh4V/be6rjbzm9KLCDBRwYCEKJtt+XXNccwd06IA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [riscv64]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-parser/binding-linux-riscv64-musl@0.117.0':
+    resolution: {integrity: sha512-ujGcAx8xAMvhy7X5sBFi3GXML1EtyORuJZ5z2T6UV3U416WgDX/4OCi3GnoteeenvxIf6JgP45B+YTHpt71vpA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [riscv64]
+    os: [linux]
+    libc: [musl]
+
+  '@oxc-parser/binding-linux-s390x-gnu@0.117.0':
+    resolution: {integrity: sha512-hbsfKjUwRjcMZZvvmpZSc+qS0bHcHRu8aV/I3Ikn9BzOA0ZAgUE7ctPtce5zCU7bM8dnTLi4sJ1Pi9YHdx6Urw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [s390x]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-parser/binding-linux-x64-gnu@0.117.0':
+    resolution: {integrity: sha512-1QrTrf8rige7UPJrYuDKJLQOuJlgkt+nRSJLBMHWNm9TdivzP48HaK3f4q18EjNlglKtn03lgjMu4fryDm8X4A==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-parser/binding-linux-x64-musl@0.117.0':
+    resolution: {integrity: sha512-gRvK6HPzF5ITRL68fqb2WYYs/hGviPIbkV84HWCgiJX+LkaOpp+HIHQl3zVZdyKHwopXToTbXbtx/oFjDjl8pg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@oxc-parser/binding-openharmony-arm64@0.117.0':
+    resolution: {integrity: sha512-QPJvFbnnDZZY7xc+xpbIBWLThcGBakwaYA9vKV8b3+oS5MGfAZUoTFJcix5+Zg2Ri46sOfrUim6Y6jsKNcssAQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [openharmony]
+
+  '@oxc-parser/binding-wasm32-wasi@0.117.0':
+    resolution: {integrity: sha512-+XRSNA0xt3pk/6CUHM7pykVe7M8SdifJk8LX1+fIp/zefvR3HBieZCbwG5un8gogNgh7srLycoh/cQA9uozv5g==}
+    engines: {node: '>=14.0.0'}
+    cpu: [wasm32]
+
+  '@oxc-parser/binding-win32-arm64-msvc@0.117.0':
+    resolution: {integrity: sha512-GpxeGS+Vo030DsrXeRPc7OSJOQIyAHkM3mzwBcnQjg/79XnOIDDMXJ5X6/aNdkVt/+Pv35pqKzGA4TQau97x8w==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [win32]
+
+  '@oxc-parser/binding-win32-ia32-msvc@0.117.0':
+    resolution: {integrity: sha512-tchWEYiso1+objTZirmlR+w3fcIel6PVBOJ8NuC2Jr30dxBOiKUfFLovJLANwHg1+TzeD6pVSLIIIEf2T5o5lQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [ia32]
+    os: [win32]
+
+  '@oxc-parser/binding-win32-x64-msvc@0.117.0':
+    resolution: {integrity: sha512-ysRJAjIbB4e5y+t9PZs7TwbgOV/GVT//s30AORLCT/pedYwpYzHq6ApXK7is9fvyfZtgT3anNir8+esurmyaDw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [win32]
+
+  '@oxc-project/types@0.115.0':
+    resolution: {integrity: sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==}
+
+  '@oxc-project/types@0.117.0':
+    resolution: {integrity: sha512-C/kPXBphID44fXdsa2xSOCuzX8fKZiFxPsvucJ6Yfkr6CJlMA+kNLPNKyLoI+l9XlDsNxBrz6h7IIjKU8pB69w==}
+
+  '@oxc-transform/binding-android-arm-eabi@0.117.0':
+    resolution: {integrity: sha512-17giX7h5VR9Eodru4OoSCFdgwLFIaUxeEn8JWe0vMZrAuRbT9NiDTy5dXdbGQBoO8aXPkbGS38FGlvbi31aujw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm]
+    os: [android]
+
+  '@oxc-transform/binding-android-arm64@0.117.0':
+    resolution: {integrity: sha512-1LrDd1CPochtLx04pAafdah6QtOQQj0/Evttevi+0u8rCI5FKucIG7pqBHkIQi/y7pycFYIj+GebhET80maeUg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [android]
+
+  '@oxc-transform/binding-darwin-arm64@0.117.0':
+    resolution: {integrity: sha512-K1Xo52xJOvFfHSkz2ax9X5Qsku23RCfTIPbHZWdUCAQ1TQooI+sFcewSubhVUJ4DVK12/tYT//XXboumin+FHA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@oxc-transform/binding-darwin-x64@0.117.0':
+    resolution: {integrity: sha512-ftFT/8Laolfq49mRRWLkIhd1AbJ0MI5bW3LwddvdoAg9zXwkx4qhzTYyBPRZhvXWftts+NjlHfHsXCOqI4tPtw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [darwin]
+
+  '@oxc-transform/binding-freebsd-x64@0.117.0':
+    resolution: {integrity: sha512-QDRyw0atg9BMnwOwnJeW6REzWPLEjiWtsCc2Sj612F1hCdvP+n0L3o8sHinEWM+BiOkOYtUxHA69WjUslc3G+g==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@oxc-transform/binding-linux-arm-gnueabihf@0.117.0':
+    resolution: {integrity: sha512-UvpvOjyQVgiIJahIpMT0qAsLJT8O1ibHTBgXGOsZkQgw1xmjARPQ07dpRcucPPn6cqCF3wrxfbqtr2vFHaMkdA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm]
+    os: [linux]
+
+  '@oxc-transform/binding-linux-arm-musleabihf@0.117.0':
+    resolution: {integrity: sha512-cIhztGFjKk8ngP+/7EPkEhzWMGr2neezxgWirSn/f/MirjH234oHHGJ2diKIbGQEsy0aOuJMTkL9NLfzfmH51A==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm]
+    os: [linux]
+
+  '@oxc-transform/binding-linux-arm64-gnu@0.117.0':
+    resolution: {integrity: sha512-mXbDfvDN0RZVg7v4LohNzU0kK3fMAZgkUKTkpFVgxEvzibEG5VpSznkypUwHI4a8U8pz+K6mGaLetX3Xt+CvvA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-transform/binding-linux-arm64-musl@0.117.0':
+    resolution: {integrity: sha512-ykxpPQp0eAcSmhy0Y3qKvdanHY4d8THPonDfmCoktUXb6r0X6qnjpJB3V+taN1wevW55bOEZd97kxtjTKjqhmg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@oxc-transform/binding-linux-ppc64-gnu@0.117.0':
+    resolution: {integrity: sha512-Rvspti4Kr7eq6zSrURK5WjscfWQPvmy/KjJZV45neRKW8RLonE3r9+NgrwSLGoHvQ3F24fbqlkplox1RtlhH5A==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [ppc64]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-transform/binding-linux-riscv64-gnu@0.117.0':
+    resolution: {integrity: sha512-Dr2ZW9ZZ4l1eQ5JUEUY3smBh4JFPCPuybWaDZTLn3ADZjyd8ZtNXEjeMT8rQbbhbgSL9hEgbwaqraole3FNThQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [riscv64]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-transform/binding-linux-riscv64-musl@0.117.0':
+    resolution: {integrity: sha512-oD1Bnes1bIC3LVBSrWEoSUBj6fvatESPwAVWfJVGVQlqWuOs/ZBn1e4Nmbipo3KGPHK7DJY75r/j7CQCxhrOFQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [riscv64]
+    os: [linux]
+    libc: [musl]
+
+  '@oxc-transform/binding-linux-s390x-gnu@0.117.0':
+    resolution: {integrity: sha512-qT//IAPLvse844t99Kff5j055qEbXfwzWgvCMb0FyjisnB8foy25iHZxZIocNBe6qwrCYWUP1M8rNrB/WyfS1Q==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [s390x]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-transform/binding-linux-x64-gnu@0.117.0':
+    resolution: {integrity: sha512-2YEO5X+KgNzFqRVO5dAkhjcI5gwxus4NSWVl/+cs2sI6P0MNPjqE3VWPawl4RTC11LvetiiZdHcujUCPM8aaUw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@oxc-transform/binding-linux-x64-musl@0.117.0':
+    resolution: {integrity: sha512-3wqWbTSaIFZvDr1aqmTul4cg8PRWYh6VC52E8bLI7ytgS/BwJLW+sDUU2YaGIds4sAf/1yKeJRmudRCDPW9INg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@oxc-transform/binding-openharmony-arm64@0.117.0':
+    resolution: {integrity: sha512-Ebxx6NPqhzlrjvx4+PdSqbOq+li0f7X59XtJljDghkbJsbnkHvhLmPR09ifHt5X32UlZN63ekjwcg/nbmHLLlA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [openharmony]
+
+  '@oxc-transform/binding-wasm32-wasi@0.117.0':
+    resolution: {integrity: sha512-Nn8mmcBiQ0XKHLTb05QBlH+CDkn7jf5YDVv9FtKhy4zJT0NEU9y3dXVbfcurOpsVrG9me4ktzDQNCaAoJjUQyw==}
+    engines: {node: '>=14.0.0'}
+    cpu: [wasm32]
+
+  '@oxc-transform/binding-win32-arm64-msvc@0.117.0':
+    resolution: {integrity: sha512-15cbsF8diXWGnHrTsVgVeabETiT/KdMAfRAcot99xsaVecJs3pITNNjC6Qj+/TPNpehbgIFjlhhxOVSbQsTBgg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [win32]
+
+  '@oxc-transform/binding-win32-ia32-msvc@0.117.0':
+    resolution: {integrity: sha512-I6DkhCuFX6p9rckdWiLuZfBWrrYUC7sNX+zLaCfa5zvrPNwo1/29KkefvqXVxu3AWT/6oZAbtc0A8/mqhETJPQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [ia32]
+    os: [win32]
+
+  '@oxc-transform/binding-win32-x64-msvc@0.117.0':
+    resolution: {integrity: sha512-V7YzavQnYcRJBeJkp0qpb3FKrlm5I57XJetCYB4jsjStuboQmnFMZ/XQH55Szlf/kVyeU9ddQwv72gJJ5BrGjQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [win32]
+
+  '@parcel/watcher-android-arm64@2.5.6':
+    resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [android]
+
+  '@parcel/watcher-darwin-arm64@2.5.6':
+    resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@parcel/watcher-darwin-x64@2.5.6':
+    resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@parcel/watcher-freebsd-x64@2.5.6':
+    resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@parcel/watcher-linux-arm-glibc@2.5.6':
+    resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm]
+    os: [linux]
+    libc: [glibc]
+
+  '@parcel/watcher-linux-arm-musl@2.5.6':
+    resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm]
+    os: [linux]
+    libc: [musl]
+
+  '@parcel/watcher-linux-arm64-glibc@2.5.6':
+    resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@parcel/watcher-linux-arm64-musl@2.5.6':
+    resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@parcel/watcher-linux-x64-glibc@2.5.6':
+    resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@parcel/watcher-linux-x64-musl@2.5.6':
+    resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@parcel/watcher-wasm@2.5.6':
+    resolution: {integrity: sha512-byAiBZ1t3tXQvc8dMD/eoyE7lTXYorhn+6uVW5AC+JGI1KtJC/LvDche5cfUE+qiefH+Ybq0bUCJU0aB1cSHUA==}
+    engines: {node: '>= 10.0.0'}
+    bundledDependencies:
+      - napi-wasm
+
+  '@parcel/watcher-win32-arm64@2.5.6':
+    resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@parcel/watcher-win32-ia32@2.5.6':
+    resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@parcel/watcher-win32-x64@2.5.6':
+    resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [win32]
+
+  '@parcel/watcher@2.5.6':
+    resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==}
+    engines: {node: '>= 10.0.0'}
+
+  '@pinia/colada-devtools@0.4.5':
+    resolution: {integrity: sha512-YSUa5nVmtbcQG+to7qysixNcB49bxEMUo+VvkU9YFrUNFPhPVUl+tMx3Xx79J024MEV46nQkyf1+hpQ4kwSsyg==}
+
+  '@pinia/colada-nuxt@0.3.2':
+    resolution: {integrity: sha512-ICPbRZ03g43CPKYwxkWf3yFbW8iz7L7kF5QoJw7lok7k7fkz9t0tFc3SrOgjl7B8PEiw3syD7rRtu3CeGmuJeg==}
+    peerDependencies:
+      '@pinia/colada': '>=0.21.6'
+
+  '@pinia/colada@1.0.0':
+    resolution: {integrity: sha512-YKSybA6wusFK4CAUPzItoSgPCfScVnnnO2MSlmaaisE/L7luE77GxFyhTzipM8IbvbXh4zkCy97OE7w9WX34wA==}
+    peerDependencies:
+      pinia: ^2.2.6 || ^3.0.0
+      vue: ^3.5.17
+
+  '@pinia/nuxt@0.11.3':
+    resolution: {integrity: sha512-7WVNHpWx4qAEzOlnyrRC88kYrwnlR/PrThWT0XI1dSNyUAXu/KBv9oR37uCgYkZroqP5jn8DfzbkNF3BtKvE9w==}
+    peerDependencies:
+      pinia: ^3.0.4
+
+  '@pkgjs/parseargs@0.11.0':
+    resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+    engines: {node: '>=14'}
+
+  '@polka/url@1.0.0-next.29':
+    resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
+
+  '@poppinss/colors@4.1.6':
+    resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==}
+
+  '@poppinss/dumper@0.7.0':
+    resolution: {integrity: sha512-0UTYalzk2t6S4rA2uHOz5bSSW2CHdv4vggJI6Alg90yvl0UgXs6XSXpH96OH+bRkX4J/06djv29pqXJ0lq5Kag==}
+
+  '@poppinss/exception@1.2.3':
+    resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==}
+
+  '@primeuix/forms@0.1.0':
+    resolution: {integrity: sha512-LctcQidb+B5PuvAFWH24YH/SIzmHlOabLHpaTeGY/k51iBv1WyCp+5w9JMYuMB/BplSvV0ZGySxQVkN5Azr/aQ==}
+    engines: {node: '>=12.11.0'}
+
+  '@primeuix/styled@0.7.4':
+    resolution: {integrity: sha512-QSO/NpOQg8e9BONWRBx9y8VGMCMYz0J/uKfNJEya/RGEu7ARx0oYW0ugI1N3/KB1AAvyGxzKBzGImbwg0KUiOQ==}
+    engines: {node: '>=12.11.0'}
+
+  '@primeuix/styles@2.0.3':
+    resolution: {integrity: sha512-2ykAB6BaHzR/6TwF8ShpJTsZrid6cVIEBVlookSdvOdmlWuevGu5vWOScgIwqWwlZcvkFYAGR/SUV3OHCTBMdw==}
+
+  '@primeuix/utils@0.6.4':
+    resolution: {integrity: sha512-pZ5f+vj7wSzRhC7KoEQRU5fvYAe+RP9+m39CTscZ3UywCD1Y2o6Fe1rRgklMPSkzUcty2jzkA0zMYkiJBD1hgg==}
+    engines: {node: '>=12.11.0'}
+
+  '@primevue/auto-import-resolver@4.5.4':
+    resolution: {integrity: sha512-YQHrZ9PQSG/4K2BwthA2Xuna4WyS0JMHajiHD9PljaDyQtBVwCadX5ZpKcrAUWR8E/1gjva8x/si0RYxxYrRJw==}
+    engines: {node: '>=12.11.0'}
+
+  '@primevue/core@4.5.4':
+    resolution: {integrity: sha512-lYJJB3wTrDJ8MkLctzHfrPZAqXVxoatjIsswSJzupatf6ZogJHVYADUKcn1JAkLLk8dtV1FA2AxDek663fHO5Q==}
+    engines: {node: '>=12.11.0'}
+    peerDependencies:
+      vue: ^3.5.0
+
+  '@primevue/forms@4.5.4':
+    resolution: {integrity: sha512-2TlD8oJEtb8vuKzY3jY0W+7NVBC/Qj0m57iWzpMUmGnEKg9sbQ2/ZiU1sTof710/liYgm4FneRTOYHIpVkiJNA==}
+    engines: {node: '>=12.11.0'}
+
+  '@primevue/icons@4.5.4':
+    resolution: {integrity: sha512-DxgryEc7ZmUqcEhYMcxGBRyFzdtLIoy3jLtlH1zsVSRZaG+iSAcjQ88nvfkZxGUZtZBFL7sRjF6KLq3bJZJwUw==}
+    engines: {node: '>=12.11.0'}
+
+  '@primevue/metadata@4.5.4':
+    resolution: {integrity: sha512-jJFD0KYm8bPYgFo0JP3Dc2RkyXzrMI1XHQGsEKTysx9Jx2d1XdxtFji/ZsQeoo/RmwUNof5ciZ72URq37rnK+g==}
+    engines: {node: '>=12.11.0'}
+
+  '@primevue/nuxt-module@4.5.4':
+    resolution: {integrity: sha512-ckffyeJcBCAVhi5IkiYcpQ8EVoNv0eSZhbxBdU3T5wz5bYgo0jd9dAetMc5D2j+vGLBqcTZQnqy8eTwcN3rZHQ==}
+    engines: {node: '>=12.11.0'}
+
+  '@prisma/adapter-pg@7.5.0':
+    resolution: {integrity: sha512-EJx7OLULahcC3IjJgdx2qRDNCT+ToY2v66UkeETMCLhNOTgqVzRzYvOEphY7Zp0eHyzfkC33Edd/qqeadf9R4A==}
+
+  '@prisma/client-runtime-utils@7.5.0':
+    resolution: {integrity: sha512-KnJ2b4Si/pcWEtK68uM+h0h1oh80CZt2suhLTVuLaSKg4n58Q9jBF/A42Kw6Ma+aThy1yAhfDeTC0JvEmeZnFQ==}
+
+  '@prisma/client@7.5.0':
+    resolution: {integrity: sha512-h4hF9ctp+kSRs7ENHGsFQmHAgHcfkOCxbYt6Ti9Xi8x7D+kP4tTi9x51UKmiTH/OqdyJAO+8V+r+JA5AWdav7w==}
+    engines: {node: ^20.19 || ^22.12 || >=24.0}
+    peerDependencies:
+      prisma: '*'
+      typescript: '>=5.4.0'
+    peerDependenciesMeta:
+      prisma:
+        optional: true
+      typescript:
+        optional: true
+
+  '@prisma/config@7.5.0':
+    resolution: {integrity: sha512-1J/9YEX7A889xM46PYg9e8VAuSL1IUmXJW3tEhMv7XQHDWlfC9YSkIw9sTYRaq5GswGlxZ+GnnyiNsUZ9JJhSQ==}
+
+  '@prisma/debug@7.2.0':
+    resolution: {integrity: sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==}
+
+  '@prisma/debug@7.5.0':
+    resolution: {integrity: sha512-163+nffny0JoPEkDhfNco0vcuT3ymIJc9+WX7MHSQhfkeKUmKe9/wqvGk5SjppT93DtBjVwr5HPJYlXbzm6qtg==}
+
+  '@prisma/dev@0.20.0':
+    resolution: {integrity: sha512-ovlBYwWor0OzG+yH4J3Ot+AneD818BttLA+Ii7wjbcLHUrnC4tbUPVGyNd3c/+71KETPKZfjhkTSpdS15dmXNQ==}
+
+  '@prisma/driver-adapter-utils@7.5.0':
+    resolution: {integrity: sha512-B79N/amgV677mFesFDBAdrW0OIaqawap9E0sjgLBtzIz2R3hIMS1QB8mLZuUEiS4q5Y8Oh3I25Kw4SLxMypk9Q==}
+
+  '@prisma/engines-version@7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e':
+    resolution: {integrity: sha512-E+iRV/vbJLl8iGjVr6g/TEWokA+gjkV/doZkaQN1i/ULVdDwGnPJDfLUIFGS3BVwlG/m6L8T4x1x5isl8hGMxA==}
+
+  '@prisma/engines@7.5.0':
+    resolution: {integrity: sha512-ondGRhzoaVpRWvFaQ5wH5zS1BIbhzbKqczKjCn6j3L0Zfe/LInjcEg8+xtB49AuZBX30qyx1ZtGoootUohz2pw==}
+
+  '@prisma/fetch-engine@7.5.0':
+    resolution: {integrity: sha512-kZCl2FV54qnyrVdnII8MI6qvt7HfU6Cbiz8dZ8PXz4f4lbSw45jEB9/gEMK2SGdiNhBKyk/Wv95uthoLhGMLYA==}
+
+  '@prisma/get-platform@7.2.0':
+    resolution: {integrity: sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==}
+
+  '@prisma/get-platform@7.5.0':
+    resolution: {integrity: sha512-7I+2y1nu/gkEKSiHHbcZ1HPe/euGdEqJZxEEMT0246q4De1+hla0ZzlTgvaT9dHcVCgLSuCG8v39db5qUUWNgw==}
+
+  '@prisma/prisma-schema-wasm@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584':
+    resolution: {integrity: sha512-JFdsnSgBPN8reDTLOI9Vh/6ccCb2aD1LbY/LWQnkcIgNo6IdpzvuM+qRVbBuA6IZP2SdqQI8Lu6RL2P8EFBQUA==}
+
+  '@prisma/query-plan-executor@7.2.0':
+    resolution: {integrity: sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==}
+
+  '@prisma/studio-core@0.21.1':
+    resolution: {integrity: sha512-bOGqG/eMQtKC0XVvcVLRmhWWzm/I+0QUWqAEhEBtetpuS3k3V4IWqKGUONkAIT223DNXJMxMtZp36b1FmcdPeg==}
+    engines: {node: ^20.19 || ^22.12 || ^24.0, pnpm: '8'}
+    peerDependencies:
+      '@types/react': ^18.0.0 || ^19.0.0
+      react: ^18.0.0 || ^19.0.0
+      react-dom: ^18.0.0 || ^19.0.0
+
+  '@rolldown/binding-android-arm64@1.0.0-rc.9':
+    resolution: {integrity: sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [android]
+
+  '@rolldown/binding-darwin-arm64@1.0.0-rc.9':
+    resolution: {integrity: sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@rolldown/binding-darwin-x64@1.0.0-rc.9':
+    resolution: {integrity: sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [darwin]
+
+  '@rolldown/binding-freebsd-x64@1.0.0-rc.9':
+    resolution: {integrity: sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.9':
+    resolution: {integrity: sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm]
+    os: [linux]
+
+  '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9':
+    resolution: {integrity: sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rolldown/binding-linux-arm64-musl@1.0.0-rc.9':
+    resolution: {integrity: sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.9':
+    resolution: {integrity: sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [ppc64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.9':
+    resolution: {integrity: sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [s390x]
+    os: [linux]
+    libc: [glibc]
+
+  '@rolldown/binding-linux-x64-gnu@1.0.0-rc.9':
+    resolution: {integrity: sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rolldown/binding-linux-x64-musl@1.0.0-rc.9':
+    resolution: {integrity: sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@rolldown/binding-openharmony-arm64@1.0.0-rc.9':
+    resolution: {integrity: sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [openharmony]
+
+  '@rolldown/binding-wasm32-wasi@1.0.0-rc.9':
+    resolution: {integrity: sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==}
+    engines: {node: '>=14.0.0'}
+    cpu: [wasm32]
+
+  '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.9':
+    resolution: {integrity: sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [arm64]
+    os: [win32]
+
+  '@rolldown/binding-win32-x64-msvc@1.0.0-rc.9':
+    resolution: {integrity: sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    cpu: [x64]
+    os: [win32]
+
+  '@rolldown/pluginutils@1.0.0-rc.2':
+    resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==}
+
+  '@rolldown/pluginutils@1.0.0-rc.9':
+    resolution: {integrity: sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==}
+
+  '@rollup/plugin-alias@6.0.0':
+    resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==}
+    engines: {node: '>=20.19.0'}
+    peerDependencies:
+      rollup: '>=4.0.0'
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+
+  '@rollup/plugin-commonjs@29.0.2':
+    resolution: {integrity: sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg==}
+    engines: {node: '>=16.0.0 || 14 >= 14.17'}
+    peerDependencies:
+      rollup: ^2.68.0||^3.0.0||^4.0.0
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+
+  '@rollup/plugin-inject@5.0.5':
+    resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+
+  '@rollup/plugin-json@6.1.0':
+    resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+
+  '@rollup/plugin-node-resolve@16.0.3':
+    resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      rollup: ^2.78.0||^3.0.0||^4.0.0
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+
+  '@rollup/plugin-replace@6.0.3':
+    resolution: {integrity: sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+
+  '@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@5.3.0':
+    resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
+    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.59.0':
+    resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==}
+    cpu: [arm]
+    os: [android]
+
+  '@rollup/rollup-android-arm64@4.59.0':
+    resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==}
+    cpu: [arm64]
+    os: [android]
+
+  '@rollup/rollup-darwin-arm64@4.59.0':
+    resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@rollup/rollup-darwin-x64@4.59.0':
+    resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@rollup/rollup-freebsd-arm64@4.59.0':
+    resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@rollup/rollup-freebsd-x64@4.59.0':
+    resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@rollup/rollup-linux-arm-gnueabihf@4.59.0':
+    resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==}
+    cpu: [arm]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-arm-musleabihf@4.59.0':
+    resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==}
+    cpu: [arm]
+    os: [linux]
+    libc: [musl]
+
+  '@rollup/rollup-linux-arm64-gnu@4.59.0':
+    resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-arm64-musl@4.59.0':
+    resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@rollup/rollup-linux-loong64-gnu@4.59.0':
+    resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==}
+    cpu: [loong64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-loong64-musl@4.59.0':
+    resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==}
+    cpu: [loong64]
+    os: [linux]
+    libc: [musl]
+
+  '@rollup/rollup-linux-ppc64-gnu@4.59.0':
+    resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==}
+    cpu: [ppc64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-ppc64-musl@4.59.0':
+    resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==}
+    cpu: [ppc64]
+    os: [linux]
+    libc: [musl]
+
+  '@rollup/rollup-linux-riscv64-gnu@4.59.0':
+    resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==}
+    cpu: [riscv64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-riscv64-musl@4.59.0':
+    resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==}
+    cpu: [riscv64]
+    os: [linux]
+    libc: [musl]
+
+  '@rollup/rollup-linux-s390x-gnu@4.59.0':
+    resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==}
+    cpu: [s390x]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-x64-gnu@4.59.0':
+    resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-x64-musl@4.59.0':
+    resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@rollup/rollup-openbsd-x64@4.59.0':
+    resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==}
+    cpu: [x64]
+    os: [openbsd]
+
+  '@rollup/rollup-openharmony-arm64@4.59.0':
+    resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==}
+    cpu: [arm64]
+    os: [openharmony]
+
+  '@rollup/rollup-win32-arm64-msvc@4.59.0':
+    resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@rollup/rollup-win32-ia32-msvc@4.59.0':
+    resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==}
+    cpu: [ia32]
+    os: [win32]
+
+  '@rollup/rollup-win32-x64-gnu@4.59.0':
+    resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==}
+    cpu: [x64]
+    os: [win32]
+
+  '@rollup/rollup-win32-x64-msvc@4.59.0':
+    resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==}
+    cpu: [x64]
+    os: [win32]
+
+  '@selderee/plugin-htmlparser2@0.11.0':
+    resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==}
+
+  '@sindresorhus/is@7.2.0':
+    resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==}
+    engines: {node: '>=18'}
+
+  '@sindresorhus/merge-streams@4.0.0':
+    resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
+    engines: {node: '>=18'}
+
+  '@socket.io/component-emitter@3.1.2':
+    resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==}
+
+  '@speed-highlight/core@1.2.14':
+    resolution: {integrity: sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==}
+
+  '@standard-schema/spec@1.1.0':
+    resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
+
+  '@tailwindcss/node@4.2.1':
+    resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==}
+
+  '@tailwindcss/oxide-android-arm64@4.2.1':
+    resolution: {integrity: sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==}
+    engines: {node: '>= 20'}
+    cpu: [arm64]
+    os: [android]
+
+  '@tailwindcss/oxide-darwin-arm64@4.2.1':
+    resolution: {integrity: sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==}
+    engines: {node: '>= 20'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@tailwindcss/oxide-darwin-x64@4.2.1':
+    resolution: {integrity: sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==}
+    engines: {node: '>= 20'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@tailwindcss/oxide-freebsd-x64@4.2.1':
+    resolution: {integrity: sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==}
+    engines: {node: '>= 20'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1':
+    resolution: {integrity: sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==}
+    engines: {node: '>= 20'}
+    cpu: [arm]
+    os: [linux]
+
+  '@tailwindcss/oxide-linux-arm64-gnu@4.2.1':
+    resolution: {integrity: sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==}
+    engines: {node: '>= 20'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@tailwindcss/oxide-linux-arm64-musl@4.2.1':
+    resolution: {integrity: sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==}
+    engines: {node: '>= 20'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@tailwindcss/oxide-linux-x64-gnu@4.2.1':
+    resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==}
+    engines: {node: '>= 20'}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@tailwindcss/oxide-linux-x64-musl@4.2.1':
+    resolution: {integrity: sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==}
+    engines: {node: '>= 20'}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@tailwindcss/oxide-wasm32-wasi@4.2.1':
+    resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==}
+    engines: {node: '>=14.0.0'}
+    cpu: [wasm32]
+    bundledDependencies:
+      - '@napi-rs/wasm-runtime'
+      - '@emnapi/core'
+      - '@emnapi/runtime'
+      - '@tybys/wasm-util'
+      - '@emnapi/wasi-threads'
+      - tslib
+
+  '@tailwindcss/oxide-win32-arm64-msvc@4.2.1':
+    resolution: {integrity: sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==}
+    engines: {node: '>= 20'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@tailwindcss/oxide-win32-x64-msvc@4.2.1':
+    resolution: {integrity: sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==}
+    engines: {node: '>= 20'}
+    cpu: [x64]
+    os: [win32]
+
+  '@tailwindcss/oxide@4.2.1':
+    resolution: {integrity: sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==}
+    engines: {node: '>= 20'}
+
+  '@tailwindcss/typography@0.5.19':
+    resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==}
+    peerDependencies:
+      tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1'
+
+  '@tailwindcss/vite@4.2.1':
+    resolution: {integrity: sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==}
+    peerDependencies:
+      vite: ^5.2.0 || ^6 || ^7
+
+  '@tybys/wasm-util@0.10.1':
+    resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
+
+  '@types/cors@2.8.19':
+    resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==}
+
+  '@types/estree@1.0.8':
+    resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+  '@types/node@25.5.0':
+    resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==}
+
+  '@types/pg@8.11.11':
+    resolution: {integrity: sha512-kGT1qKM8wJQ5qlawUrEkXgvMSXoV213KfMGXcwfDwUIfUHXqXYXOfS1nE1LINRJVVVx5wCm70XnFlMHaIcQAfw==}
+
+  '@types/react@19.2.14':
+    resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==}
+
+  '@types/resolve@1.20.2':
+    resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
+
+  '@types/ws@8.18.1':
+    resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==}
+
+  '@unhead/vue@2.1.12':
+    resolution: {integrity: sha512-zEWqg0nZM8acpuTZE40wkeUl8AhIe0tU0OkilVi1D4fmVjACrwoh5HP6aNqJ8kUnKsoy6D+R3Vi/O+fmdNGO7g==}
+    peerDependencies:
+      vue: '>=3.5.18'
+
+  '@vercel/nft@1.3.2':
+    resolution: {integrity: sha512-HC8venRc4Ya7vNeBsJneKHHMDDWpQie7VaKhAIOst3MKO+DES+Y/SbzSp8mFkD7OzwAE2HhHkeSuSmwS20mz3A==}
+    engines: {node: '>=20'}
+    hasBin: true
+
+  '@vitejs/plugin-vue-jsx@5.1.5':
+    resolution: {integrity: sha512-jIAsvHOEtWpslLOI2MeElGFxH7M8pM83BU/Tor4RLyiwH0FM4nUW3xdvbw20EeU9wc5IspQwMq225K3CMnJEpA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    peerDependencies:
+      vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
+      vue: ^3.0.0
+
+  '@vitejs/plugin-vue@6.0.5':
+    resolution: {integrity: sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    peerDependencies:
+      vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
+      vue: ^3.2.25
+
+  '@vue-macros/common@3.1.2':
+    resolution: {integrity: sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==}
+    engines: {node: '>=20.19.0'}
+    peerDependencies:
+      vue: ^2.7.0 || ^3.2.25
+    peerDependenciesMeta:
+      vue:
+        optional: true
+
+  '@vue/babel-helper-vue-transform-on@2.0.1':
+    resolution: {integrity: sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==}
+
+  '@vue/babel-plugin-jsx@2.0.1':
+    resolution: {integrity: sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    peerDependenciesMeta:
+      '@babel/core':
+        optional: true
+
+  '@vue/babel-plugin-resolve-type@2.0.1':
+    resolution: {integrity: sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@vue/compiler-core@3.5.30':
+    resolution: {integrity: sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==}
+
+  '@vue/compiler-dom@3.5.30':
+    resolution: {integrity: sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==}
+
+  '@vue/compiler-sfc@3.5.30':
+    resolution: {integrity: sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==}
+
+  '@vue/compiler-ssr@3.5.30':
+    resolution: {integrity: sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==}
+
+  '@vue/devtools-api@7.7.9':
+    resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==}
+
+  '@vue/devtools-api@8.1.0':
+    resolution: {integrity: sha512-O44X57jjkLKbLEc4OgL/6fEPOOanRJU8kYpCE8qfKlV96RQZcdzrcLI5mxMuVRUeXhHKIHGhCpHacyCk0HyO4w==}
+
+  '@vue/devtools-core@8.1.0':
+    resolution: {integrity: sha512-LvD1VgDpoHmYL00IgKRLKktF6SsPAb0yaV8wB8q2jRwsAWvqhS8+vsMLEGKNs7uoKyymXhT92dhxgf/wir6YGQ==}
+    peerDependencies:
+      vue: ^3.0.0
+
+  '@vue/devtools-kit@7.7.9':
+    resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==}
+
+  '@vue/devtools-kit@8.1.0':
+    resolution: {integrity: sha512-/NZlS4WtGIB54DA/z10gzk+n/V7zaqSzYZOVlg2CfdnpIKdB61bd7JDIMxf/zrtX41zod8E2/bbEBoW/d7x70Q==}
+
+  '@vue/devtools-shared@7.7.9':
+    resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==}
+
+  '@vue/devtools-shared@8.1.0':
+    resolution: {integrity: sha512-h8uCb4Qs8UT8VdTT5yjY6tOJ//qH7EpxToixR0xqejR55t5OdISIg7AJ7eBkhBs8iu1qG5gY3QQNN1DF1EelAA==}
+
+  '@vue/reactivity@3.5.30':
+    resolution: {integrity: sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==}
+
+  '@vue/runtime-core@3.5.30':
+    resolution: {integrity: sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==}
+
+  '@vue/runtime-dom@3.5.30':
+    resolution: {integrity: sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==}
+
+  '@vue/server-renderer@3.5.30':
+    resolution: {integrity: sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==}
+    peerDependencies:
+      vue: 3.5.30
+
+  '@vue/shared@3.5.30':
+    resolution: {integrity: sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==}
+
+  abbrev@3.0.1:
+    resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==}
+    engines: {node: ^18.17.0 || >=20.5.0}
+
+  abort-controller@3.0.0:
+    resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
+    engines: {node: '>=6.5'}
+
+  accepts@1.3.8:
+    resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+    engines: {node: '>= 0.6'}
+
+  acorn-import-attributes@1.9.5:
+    resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==}
+    peerDependencies:
+      acorn: ^8
+
+  acorn@8.16.0:
+    resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
+  agent-base@7.1.4:
+    resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
+    engines: {node: '>= 14'}
+
+  ansi-regex@5.0.1:
+    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+    engines: {node: '>=8'}
+
+  ansi-regex@6.2.2:
+    resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
+    engines: {node: '>=12'}
+
+  ansi-styles@4.3.0:
+    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+    engines: {node: '>=8'}
+
+  ansi-styles@6.2.3:
+    resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
+    engines: {node: '>=12'}
+
+  ansis@4.2.0:
+    resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==}
+    engines: {node: '>=14'}
+
+  anymatch@3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+
+  archiver-utils@5.0.2:
+    resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==}
+    engines: {node: '>= 14'}
+
+  archiver@7.0.1:
+    resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==}
+    engines: {node: '>= 14'}
+
+  ast-kit@2.2.0:
+    resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==}
+    engines: {node: '>=20.19.0'}
+
+  ast-walker-scope@0.8.3:
+    resolution: {integrity: sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==}
+    engines: {node: '>=20.19.0'}
+
+  async-sema@3.1.1:
+    resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==}
+
+  async@3.2.6:
+    resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+
+  autoprefixer@10.4.27:
+    resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==}
+    engines: {node: ^10 || ^12 || >=14}
+    hasBin: true
+    peerDependencies:
+      postcss: ^8.1.0
+
+  aws-ssl-profiles@1.1.2:
+    resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==}
+    engines: {node: '>= 6.0.0'}
+
+  b4a@1.8.0:
+    resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==}
+    peerDependencies:
+      react-native-b4a: '*'
+    peerDependenciesMeta:
+      react-native-b4a:
+        optional: true
+
+  balanced-match@1.0.2:
+    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+  balanced-match@4.0.4:
+    resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
+    engines: {node: 18 || 20 || >=22}
+
+  bare-events@2.8.2:
+    resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==}
+    peerDependencies:
+      bare-abort-controller: '*'
+    peerDependenciesMeta:
+      bare-abort-controller:
+        optional: true
+
+  bare-fs@4.5.5:
+    resolution: {integrity: sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w==}
+    engines: {bare: '>=1.16.0'}
+    peerDependencies:
+      bare-buffer: '*'
+    peerDependenciesMeta:
+      bare-buffer:
+        optional: true
+
+  bare-os@3.7.1:
+    resolution: {integrity: sha512-ebvMaS5BgZKmJlvuWh14dg9rbUI84QeV3WlWn6Ph6lFI8jJoh7ADtVTyD2c93euwbe+zgi0DVrl4YmqXeM9aIA==}
+    engines: {bare: '>=1.14.0'}
+
+  bare-path@3.0.0:
+    resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==}
+
+  bare-stream@2.8.1:
+    resolution: {integrity: sha512-bSeR8RfvbRwDpD7HWZvn8M3uYNDrk7m9DQjYOFkENZlXW8Ju/MPaqUPQq5LqJ3kyjEm07siTaAQ7wBKCU59oHg==}
+    peerDependencies:
+      bare-buffer: '*'
+      bare-events: '*'
+    peerDependenciesMeta:
+      bare-buffer:
+        optional: true
+      bare-events:
+        optional: true
+
+  bare-url@2.3.2:
+    resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==}
+
+  base64-js@1.5.1:
+    resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+  base64id@2.0.0:
+    resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==}
+    engines: {node: ^4.5.0 || >= 5.9}
+
+  baseline-browser-mapping@2.10.7:
+    resolution: {integrity: sha512-1ghYO3HnxGec0TCGBXiDLVns4eCSx4zJpxnHrlqFQajmhfKMQBzUGDdkMK7fUW7PTHTeLf+j87aTuKuuwWzMGw==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+
+  binary-extensions@2.3.0:
+    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+    engines: {node: '>=8'}
+
+  bindings@1.5.0:
+    resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
+
+  birpc@2.9.0:
+    resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==}
+
+  birpc@4.0.0:
+    resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==}
+
+  boolbase@1.0.0:
+    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+  brace-expansion@2.0.2:
+    resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
+
+  brace-expansion@5.0.4:
+    resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==}
+    engines: {node: 18 || 20 || >=22}
+
+  braces@3.0.3:
+    resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+    engines: {node: '>=8'}
+
+  browserslist@4.28.1:
+    resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
+    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+    hasBin: true
+
+  buffer-crc32@1.0.0:
+    resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==}
+    engines: {node: '>=8.0.0'}
+
+  buffer-from@1.1.2:
+    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+  buffer@6.0.3:
+    resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
+  bundle-name@4.1.0:
+    resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
+    engines: {node: '>=18'}
+
+  c12@3.1.0:
+    resolution: {integrity: sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==}
+    peerDependencies:
+      magicast: ^0.3.5
+    peerDependenciesMeta:
+      magicast:
+        optional: true
+
+  c12@3.3.3:
+    resolution: {integrity: sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==}
+    peerDependencies:
+      magicast: '*'
+    peerDependenciesMeta:
+      magicast:
+        optional: true
+
+  cac@6.7.14:
+    resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+    engines: {node: '>=8'}
+
+  caniuse-api@3.0.0:
+    resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==}
+
+  caniuse-lite@1.0.30001778:
+    resolution: {integrity: sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg==}
+
+  chevrotain@10.5.0:
+    resolution: {integrity: sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==}
+
+  chokidar@3.6.0:
+    resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+    engines: {node: '>= 8.10.0'}
+
+  chokidar@4.0.3:
+    resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+    engines: {node: '>= 14.16.0'}
+
+  chokidar@5.0.0:
+    resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
+    engines: {node: '>= 20.19.0'}
+
+  chownr@3.0.0:
+    resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
+    engines: {node: '>=18'}
+
+  citty@0.1.6:
+    resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
+
+  citty@0.2.1:
+    resolution: {integrity: sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg==}
+
+  clipboardy@4.0.0:
+    resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==}
+    engines: {node: '>=18'}
+
+  cliui@8.0.1:
+    resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+    engines: {node: '>=12'}
+
+  cluster-key-slot@1.1.2:
+    resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==}
+    engines: {node: '>=0.10.0'}
+
+  color-convert@2.0.1:
+    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+    engines: {node: '>=7.0.0'}
+
+  color-name@1.1.4:
+    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+  colord@2.9.3:
+    resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
+
+  commander@11.1.0:
+    resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
+    engines: {node: '>=16'}
+
+  commander@2.20.3:
+    resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+  commondir@1.0.1:
+    resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
+
+  compatx@0.2.0:
+    resolution: {integrity: sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==}
+
+  compress-commons@6.0.2:
+    resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==}
+    engines: {node: '>= 14'}
+
+  confbox@0.1.8:
+    resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+  confbox@0.2.4:
+    resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==}
+
+  consola@3.4.2:
+    resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
+    engines: {node: ^14.18.0 || >=16.10.0}
+
+  convert-source-map@2.0.0:
+    resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+  cookie-es@1.2.2:
+    resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==}
+
+  cookie-es@2.0.0:
+    resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==}
+
+  cookie@0.7.2:
+    resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
+    engines: {node: '>= 0.6'}
+
+  copy-anything@4.0.5:
+    resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==}
+    engines: {node: '>=18'}
+
+  core-util-is@1.0.3:
+    resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+  cors@2.8.6:
+    resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==}
+    engines: {node: '>= 0.10'}
+
+  crc-32@1.2.2:
+    resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
+    engines: {node: '>=0.8'}
+    hasBin: true
+
+  crc32-stream@6.0.0:
+    resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==}
+    engines: {node: '>= 14'}
+
+  croner@9.1.0:
+    resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==}
+    engines: {node: '>=18.0'}
+
+  cross-spawn@7.0.6:
+    resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+    engines: {node: '>= 8'}
+
+  crossws@0.3.5:
+    resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==}
+
+  css-declaration-sorter@7.3.1:
+    resolution: {integrity: sha512-gz6x+KkgNCjxq3Var03pRYLhyNfwhkKF1g/yoLgDNtFvVu0/fOLV9C8fFEZRjACp/XQLumjAYo7JVjzH3wLbxA==}
+    engines: {node: ^14 || ^16 || >=18}
+    peerDependencies:
+      postcss: ^8.0.9
+
+  css-select@5.2.2:
+    resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==}
+
+  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@3.2.1:
+    resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==}
+    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+  css-what@6.2.2:
+    resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
+    engines: {node: '>= 6'}
+
+  cssesc@3.0.0:
+    resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  cssnano-preset-default@7.0.11:
+    resolution: {integrity: sha512-waWlAMuCakP7//UCY+JPrQS1z0OSLeOXk2sKWJximKWGupVxre50bzPlvpbUwZIDylhf/ptf0Pk+Yf7C+hoa3g==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  cssnano-utils@5.0.1:
+    resolution: {integrity: sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  cssnano@7.1.3:
+    resolution: {integrity: sha512-mLFHQAzyapMVFLiJIn7Ef4C2UCEvtlTlbyILR6B5ZsUAV3D/Pa761R5uC1YPhyBkRd3eqaDm2ncaNrD7R4mTRg==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  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'}
+
+  csstype@3.2.3:
+    resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
+  db0@0.3.4:
+    resolution: {integrity: sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==}
+    peerDependencies:
+      '@electric-sql/pglite': '*'
+      '@libsql/client': '*'
+      better-sqlite3: '*'
+      drizzle-orm: '*'
+      mysql2: '*'
+      sqlite3: '*'
+    peerDependenciesMeta:
+      '@electric-sql/pglite':
+        optional: true
+      '@libsql/client':
+        optional: true
+      better-sqlite3:
+        optional: true
+      drizzle-orm:
+        optional: true
+      mysql2:
+        optional: true
+      sqlite3:
+        optional: true
+
+  debug@4.4.3:
+    resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  deepmerge-ts@7.1.5:
+    resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==}
+    engines: {node: '>=16.0.0'}
+
+  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.1:
+    resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==}
+    engines: {node: '>=18'}
+
+  default-browser@5.5.0:
+    resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==}
+    engines: {node: '>=18'}
+
+  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'}
+
+  defu@6.1.4:
+    resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+
+  denque@2.1.0:
+    resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
+    engines: {node: '>=0.10'}
+
+  depd@2.0.0:
+    resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+    engines: {node: '>= 0.8'}
+
+  destr@2.0.5:
+    resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
+
+  detect-libc@2.1.2:
+    resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+    engines: {node: '>=8'}
+
+  devalue@5.6.4:
+    resolution: {integrity: sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==}
+
+  diff@5.2.2:
+    resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==}
+    engines: {node: '>=0.3.1'}
+
+  diff@8.0.3:
+    resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==}
+    engines: {node: '>=0.3.1'}
+
+  dom-serializer@2.0.0:
+    resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+  domelementtype@2.3.0:
+    resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+  domhandler@5.0.3:
+    resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+    engines: {node: '>= 4'}
+
+  domutils@3.2.2:
+    resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
+  dot-prop@10.1.0:
+    resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==}
+    engines: {node: '>=20'}
+
+  dotenv@16.6.1:
+    resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
+    engines: {node: '>=12'}
+
+  dotenv@17.3.1:
+    resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==}
+    engines: {node: '>=12'}
+
+  duplexer@0.1.2:
+    resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
+
+  eastasianwidth@0.2.0:
+    resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+  ee-first@1.1.1:
+    resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+  effect@3.18.4:
+    resolution: {integrity: sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==}
+
+  electron-to-chromium@1.5.313:
+    resolution: {integrity: sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==}
+
+  emoji-regex@8.0.0:
+    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+  emoji-regex@9.2.2:
+    resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+  empathic@2.0.0:
+    resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==}
+    engines: {node: '>=14'}
+
+  encodeurl@2.0.0:
+    resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+    engines: {node: '>= 0.8'}
+
+  engine.io-client@6.6.4:
+    resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==}
+
+  engine.io-parser@5.2.3:
+    resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==}
+    engines: {node: '>=10.0.0'}
+
+  engine.io@6.6.6:
+    resolution: {integrity: sha512-U2SN0w3OpjFRVlrc17E6TMDmH58Xl9rai1MblNjAdwWp07Kk+llmzX0hjDpQdrDGzwmvOtgM5yI+meYX6iZ2xA==}
+    engines: {node: '>=10.2.0'}
+
+  enhanced-resolve@5.20.0:
+    resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==}
+    engines: {node: '>=10.13.0'}
+
+  entities@4.5.0:
+    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+    engines: {node: '>=0.12'}
+
+  entities@7.0.1:
+    resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
+    engines: {node: '>=0.12'}
+
+  error-stack-parser-es@1.0.5:
+    resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==}
+
+  errx@0.1.0:
+    resolution: {integrity: sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==}
+
+  es-module-lexer@2.0.0:
+    resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==}
+
+  esbuild@0.27.4:
+    resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==}
+    engines: {node: '>=18'}
+    hasBin: true
+
+  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@5.0.0:
+    resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+    engines: {node: '>=12'}
+
+  estree-walker@2.0.2:
+    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+  estree-walker@3.0.3:
+    resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+  etag@1.8.1:
+    resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+    engines: {node: '>= 0.6'}
+
+  event-target-shim@5.0.1:
+    resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+    engines: {node: '>=6'}
+
+  events-universal@1.0.1:
+    resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==}
+
+  events@3.3.0:
+    resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+    engines: {node: '>=0.8.x'}
+
+  execa@8.0.1:
+    resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+    engines: {node: '>=16.17'}
+
+  exsolve@1.0.8:
+    resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==}
+
+  fast-check@3.23.2:
+    resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==}
+    engines: {node: '>=8.0.0'}
+
+  fast-fifo@1.3.2:
+    resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==}
+
+  fast-glob@3.3.3:
+    resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+    engines: {node: '>=8.6.0'}
+
+  fast-npm-meta@1.4.2:
+    resolution: {integrity: sha512-XXyd9d3ie/JeIIjm6WeKalvapGGFI4ShAjPJM78vgUFYzoEsuNSjvvVTuht0XZcwbVdOnEEGzhxwguRbxkIcDg==}
+    hasBin: true
+
+  fastq@1.20.1:
+    resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
+
+  fdir@6.5.0:
+    resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+    engines: {node: '>=12.0.0'}
+    peerDependencies:
+      picomatch: ^3 || ^4
+    peerDependenciesMeta:
+      picomatch:
+        optional: true
+
+  file-uri-to-path@1.0.0:
+    resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
+
+  fill-range@7.1.1:
+    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+    engines: {node: '>=8'}
+
+  foreground-child@3.3.1:
+    resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
+    engines: {node: '>=14'}
+
+  fraction.js@5.3.4:
+    resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==}
+
+  fresh@2.0.0:
+    resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
+    engines: {node: '>= 0.8'}
+
+  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==}
+
+  fuse.js@7.1.0:
+    resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==}
+    engines: {node: '>=10'}
+
+  fzf@0.5.2:
+    resolution: {integrity: sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==}
+
+  generate-function@2.3.1:
+    resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==}
+
+  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-port-please@3.2.0:
+    resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==}
+
+  get-stream@8.0.1:
+    resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+    engines: {node: '>=16'}
+
+  get-tsconfig@4.13.6:
+    resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==}
+
+  giget@2.0.0:
+    resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==}
+    hasBin: true
+
+  giget@3.1.2:
+    resolution: {integrity: sha512-T2qUpKBHeUTwHcIhydgnJzhL0Hj785ms+JkxaaWQH9SDM/llXeewnOkfJcFShAHjWI+26hOChwUfCoupaXLm8g==}
+    hasBin: true
+
+  glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
+
+  glob@10.5.0:
+    resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==}
+    deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
+    hasBin: true
+
+  glob@13.0.6:
+    resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==}
+    engines: {node: 18 || 20 || >=22}
+
+  global-directory@4.0.1:
+    resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
+    engines: {node: '>=18'}
+
+  globby@16.1.1:
+    resolution: {integrity: sha512-dW7vl+yiAJSp6aCekaVnVJxurRv7DCOLyXqEG3RYMYUg7AuJ2jCqPkZTA8ooqC2vtnkaMcV5WfFBMuEnTu1OQg==}
+    engines: {node: '>=20'}
+
+  graceful-fs@4.2.11:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+  grammex@3.1.12:
+    resolution: {integrity: sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==}
+
+  graphmatch@1.1.1:
+    resolution: {integrity: sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==}
+
+  gzip-size@7.0.0:
+    resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  h3@1.15.6:
+    resolution: {integrity: sha512-oi15ESLW5LRthZ+qPCi5GNasY/gvynSKUQxgiovrY63bPAtG59wtM+LSrlcwvOHAXzGrXVLnI97brbkdPF9WoQ==}
+
+  hasown@2.0.2:
+    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+    engines: {node: '>= 0.4'}
+
+  hono@4.11.4:
+    resolution: {integrity: sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==}
+    engines: {node: '>=16.9.0'}
+
+  hookable@5.5.3:
+    resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
+
+  hookable@6.0.1:
+    resolution: {integrity: sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==}
+
+  html-to-text@9.0.5:
+    resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==}
+    engines: {node: '>=14'}
+
+  htmlparser2@8.0.2:
+    resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
+
+  http-errors@2.0.1:
+    resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
+    engines: {node: '>= 0.8'}
+
+  http-shutdown@1.2.2:
+    resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==}
+    engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+
+  http-status-codes@2.3.0:
+    resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==}
+
+  https-proxy-agent@7.0.6:
+    resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
+    engines: {node: '>= 14'}
+
+  httpxy@0.1.7:
+    resolution: {integrity: sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==}
+
+  human-signals@5.0.0:
+    resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+    engines: {node: '>=16.17.0'}
+
+  iconv-lite@0.7.2:
+    resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==}
+    engines: {node: '>=0.10.0'}
+
+  ieee754@1.2.1:
+    resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+  ignore@7.0.5:
+    resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+    engines: {node: '>= 4'}
+
+  image-meta@0.2.2:
+    resolution: {integrity: sha512-3MOLanc3sb3LNGWQl1RlQlNWURE5g32aUphrDyFeCsxBTk08iE3VNe4CwsUZ0Qs1X+EfX0+r29Sxdpza4B+yRA==}
+
+  impound@1.1.5:
+    resolution: {integrity: sha512-5AUn+QE0UofqNHu5f2Skf6Svukdg4ehOIq8O0EtqIx4jta0CDZYBPqpIHt0zrlUTiFVYlLpeH39DoikXBjPKpA==}
+
+  inherits@2.0.4:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+  ini@4.1.1:
+    resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==}
+    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+  ioredis@5.10.0:
+    resolution: {integrity: sha512-HVBe9OFuqs+Z6n64q09PQvP1/R4Bm+30PAyyD4wIEqssh3v9L21QjCVk4kRLucMBcDokJTcLjsGeVRlq/nH6DA==}
+    engines: {node: '>=12.22.0'}
+
+  iron-webcrypto@1.2.1:
+    resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
+
+  is-binary-path@2.1.0:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+
+  is-core-module@2.16.1:
+    resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+    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-glob@4.0.3:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
+
+  is-inside-container@1.0.0:
+    resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+    engines: {node: '>=14.16'}
+    hasBin: true
+
+  is-installed-globally@1.0.0:
+    resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==}
+    engines: {node: '>=18'}
+
+  is-module@1.0.0:
+    resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
+
+  is-number@7.0.0:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+
+  is-path-inside@4.0.0:
+    resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==}
+    engines: {node: '>=12'}
+
+  is-property@1.0.2:
+    resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==}
+
+  is-reference@1.2.1:
+    resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
+
+  is-stream@2.0.1:
+    resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+    engines: {node: '>=8'}
+
+  is-stream@3.0.0:
+    resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  is-what@5.5.0:
+    resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==}
+    engines: {node: '>=18'}
+
+  is-wsl@2.2.0:
+    resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+    engines: {node: '>=8'}
+
+  is-wsl@3.1.1:
+    resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==}
+    engines: {node: '>=16'}
+
+  is64bit@2.0.0:
+    resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==}
+    engines: {node: '>=18'}
+
+  isarray@1.0.0:
+    resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+  isexe@2.0.0:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+  isexe@3.1.5:
+    resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==}
+    engines: {node: '>=18'}
+
+  jackspeak@3.4.3:
+    resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+  jiti@2.6.1:
+    resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
+    hasBin: true
+
+  js-tokens@4.0.0:
+    resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+  js-tokens@9.0.1:
+    resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
+  jsesc@3.1.0:
+    resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  json5@2.2.3:
+    resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  kleur@4.1.5:
+    resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+    engines: {node: '>=6'}
+
+  klona@2.0.6:
+    resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==}
+    engines: {node: '>= 8'}
+
+  knitwork@1.3.0:
+    resolution: {integrity: sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==}
+
+  launch-editor@2.13.1:
+    resolution: {integrity: sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA==}
+
+  lazystream@1.0.1:
+    resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
+    engines: {node: '>= 0.6.3'}
+
+  leac@0.6.0:
+    resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==}
+
+  lightningcss-android-arm64@1.31.1:
+    resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [android]
+
+  lightningcss-android-arm64@1.32.0:
+    resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [android]
+
+  lightningcss-darwin-arm64@1.31.1:
+    resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+
+  lightningcss-darwin-arm64@1.32.0:
+    resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+
+  lightningcss-darwin-x64@1.31.1:
+    resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [darwin]
+
+  lightningcss-darwin-x64@1.32.0:
+    resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [darwin]
+
+  lightningcss-freebsd-x64@1.31.1:
+    resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [freebsd]
+
+  lightningcss-freebsd-x64@1.32.0:
+    resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [freebsd]
+
+  lightningcss-linux-arm-gnueabihf@1.31.1:
+    resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm]
+    os: [linux]
+
+  lightningcss-linux-arm-gnueabihf@1.32.0:
+    resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm]
+    os: [linux]
+
+  lightningcss-linux-arm64-gnu@1.31.1:
+    resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  lightningcss-linux-arm64-gnu@1.32.0:
+    resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  lightningcss-linux-arm64-musl@1.31.1:
+    resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  lightningcss-linux-arm64-musl@1.32.0:
+    resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  lightningcss-linux-x64-gnu@1.31.1:
+    resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  lightningcss-linux-x64-gnu@1.32.0:
+    resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  lightningcss-linux-x64-musl@1.31.1:
+    resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  lightningcss-linux-x64-musl@1.32.0:
+    resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  lightningcss-win32-arm64-msvc@1.31.1:
+    resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [win32]
+
+  lightningcss-win32-arm64-msvc@1.32.0:
+    resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [win32]
+
+  lightningcss-win32-x64-msvc@1.31.1:
+    resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [win32]
+
+  lightningcss-win32-x64-msvc@1.32.0:
+    resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [win32]
+
+  lightningcss@1.31.1:
+    resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==}
+    engines: {node: '>= 12.0.0'}
+
+  lightningcss@1.32.0:
+    resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
+    engines: {node: '>= 12.0.0'}
+
+  lilconfig@2.1.0:
+    resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
+    engines: {node: '>=10'}
+
+  lilconfig@3.1.3:
+    resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
+    engines: {node: '>=14'}
+
+  listhen@1.9.0:
+    resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==}
+    hasBin: true
+
+  local-pkg@1.1.2:
+    resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
+    engines: {node: '>=14'}
+
+  lodash-es@4.17.23:
+    resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==}
+
+  lodash.defaults@4.2.0:
+    resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
+
+  lodash.isarguments@3.1.0:
+    resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==}
+
+  lodash.memoize@4.1.2:
+    resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
+
+  lodash.uniq@4.5.0:
+    resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
+
+  lodash@4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+  lodash@4.17.23:
+    resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==}
+
+  long@5.3.2:
+    resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==}
+
+  lru-cache@10.4.3:
+    resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+  lru-cache@11.2.6:
+    resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==}
+    engines: {node: 20 || >=22}
+
+  lru-cache@5.1.1:
+    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+  lru.min@1.1.4:
+    resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==}
+    engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'}
+
+  magic-regexp@0.10.0:
+    resolution: {integrity: sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==}
+
+  magic-string-ast@1.0.3:
+    resolution: {integrity: sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==}
+    engines: {node: '>=20.19.0'}
+
+  magic-string@0.30.21:
+    resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
+  magicast@0.5.2:
+    resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==}
+
+  mdn-data@2.0.28:
+    resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
+
+  mdn-data@2.27.1:
+    resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==}
+
+  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'}
+
+  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-db@1.54.0:
+    resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
+    engines: {node: '>= 0.6'}
+
+  mime-types@2.1.35:
+    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+    engines: {node: '>= 0.6'}
+
+  mime-types@3.0.2:
+    resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
+    engines: {node: '>=18'}
+
+  mime@4.1.0:
+    resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==}
+    engines: {node: '>=16'}
+    hasBin: true
+
+  mimic-fn@4.0.0:
+    resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+    engines: {node: '>=12'}
+
+  minimatch@10.2.4:
+    resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==}
+    engines: {node: 18 || 20 || >=22}
+
+  minimatch@5.1.9:
+    resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==}
+    engines: {node: '>=10'}
+
+  minimatch@9.0.9:
+    resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  minipass@7.1.3:
+    resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  minizlib@3.1.0:
+    resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
+    engines: {node: '>= 18'}
+
+  mitt@3.0.1:
+    resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
+
+  mlly@1.8.1:
+    resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==}
+
+  mocked-exports@0.1.1:
+    resolution: {integrity: sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==}
+
+  mrmime@2.0.1:
+    resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
+    engines: {node: '>=10'}
+
+  ms@2.1.3:
+    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+  muggle-string@0.4.1:
+    resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
+  mysql2@3.15.3:
+    resolution: {integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==}
+    engines: {node: '>= 8.0'}
+
+  named-placeholders@1.1.6:
+    resolution: {integrity: sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==}
+    engines: {node: '>=8.0.0'}
+
+  nanoid@3.3.11:
+    resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+
+  nanotar@0.3.0:
+    resolution: {integrity: sha512-Kv2JYYiCzt16Kt5QwAc9BFG89xfPNBx+oQL4GQXD9nLqPkZBiNaqaCWtwnbk/q7UVsTYevvM1b0UF8zmEI4pCg==}
+
+  negotiator@0.6.3:
+    resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+    engines: {node: '>= 0.6'}
+
+  nitropack@2.13.1:
+    resolution: {integrity: sha512-2dDj89C4wC2uzG7guF3CnyG+zwkZosPEp7FFBGHB3AJo11AywOolWhyQJFHDzve8COvGxJaqscye9wW2IrUsNw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    hasBin: true
+    peerDependencies:
+      xml2js: ^0.6.2
+    peerDependenciesMeta:
+      xml2js:
+        optional: true
+
+  node-addon-api@7.1.1:
+    resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
+
+  node-fetch-native@1.6.7:
+    resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
+
+  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-forge@1.3.3:
+    resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==}
+    engines: {node: '>= 6.13.0'}
+
+  node-gyp-build@4.8.4:
+    resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==}
+    hasBin: true
+
+  node-mock-http@1.0.4:
+    resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==}
+
+  node-releases@2.0.36:
+    resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==}
+
+  nopt@8.1.0:
+    resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==}
+    engines: {node: ^18.17.0 || >=20.5.0}
+    hasBin: true
+
+  normalize-path@3.0.0:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+
+  npm-run-path@5.3.0:
+    resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  npm-run-path@6.0.0:
+    resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==}
+    engines: {node: '>=18'}
+
+  nth-check@2.1.1:
+    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+  nuxt@4.4.2:
+    resolution: {integrity: sha512-iWVFpr/YEqVU/CenqIHMnIkvb2HE/9f+q8oxZ+pj2et+60NljGRClCgnmbvGPdmNFE0F1bEhoBCYfqbDOCim3Q==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    hasBin: true
+    peerDependencies:
+      '@parcel/watcher': ^2.1.0
+      '@types/node': '>=18.12.0'
+    peerDependenciesMeta:
+      '@parcel/watcher':
+        optional: true
+      '@types/node':
+        optional: true
+
+  nypm@0.6.5:
+    resolution: {integrity: sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==}
+    engines: {node: '>=18'}
+    hasBin: true
+
+  object-assign@4.1.1:
+    resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+    engines: {node: '>=0.10.0'}
+
+  obuf@1.1.2:
+    resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
+
+  obug@2.1.1:
+    resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==}
+
+  ofetch@1.5.1:
+    resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==}
+
+  ofetch@2.0.0-alpha.3:
+    resolution: {integrity: sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA==}
+
+  ohash@2.0.11:
+    resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
+
+  on-change@6.0.2:
+    resolution: {integrity: sha512-08+12qcOVEA0fS9g/VxKS27HaT94nRutUT77J2dr8zv/unzXopvhBuF8tNLWsoLQ5IgrQ6eptGeGqUYat82U1w==}
+    engines: {node: '>=20'}
+
+  on-finished@2.4.1:
+    resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+    engines: {node: '>= 0.8'}
+
+  onetime@6.0.0:
+    resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+    engines: {node: '>=12'}
+
+  open@10.2.0:
+    resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==}
+    engines: {node: '>=18'}
+
+  open@8.4.2:
+    resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+    engines: {node: '>=12'}
+
+  oxc-minify@0.117.0:
+    resolution: {integrity: sha512-JHsv/b+bmBJkAzkHXgTN7RThloVxLHPT0ojHfjqxVeHuQB7LPpLUbJ2qfwz37sto9stZ9+AVwUP4b3gtR7p/Tw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+
+  oxc-parser@0.117.0:
+    resolution: {integrity: sha512-l3cbgK5wUvWDVNWM/JFU77qDdGZK1wudnLsFcrRyNo/bL1CyU8pC25vDhMHikVY29lbK2InTWsX42RxVSutUdQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+
+  oxc-transform@0.117.0:
+    resolution: {integrity: sha512-u1Stl2uhDh9bFuOGjGXQIqx46IRUNMyHQkq59LayXNGS2flNv7RpZpRSWs5S5deuNP6jJZ12gtMBze+m4dOhmw==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+
+  oxc-walker@0.7.0:
+    resolution: {integrity: sha512-54B4KUhrzbzc4sKvKwVYm7E2PgeROpGba0/2nlNZMqfDyca+yOor5IMb4WLGBatGDT0nkzYdYuzylg7n3YfB7A==}
+    peerDependencies:
+      oxc-parser: '>=0.98.0'
+
+  package-json-from-dist@1.0.1:
+    resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+  package-manager-detector@1.6.0:
+    resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==}
+
+  parseley@0.12.1:
+    resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==}
+
+  parseurl@1.3.3:
+    resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+    engines: {node: '>= 0.8'}
+
+  path-key@3.1.1:
+    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+    engines: {node: '>=8'}
+
+  path-key@4.0.0:
+    resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+    engines: {node: '>=12'}
+
+  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-scurry@2.0.2:
+    resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==}
+    engines: {node: 18 || 20 || >=22}
+
+  pathe@1.1.2:
+    resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+
+  pathe@2.0.3:
+    resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+  peberminta@0.9.0:
+    resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==}
+
+  perfect-debounce@1.0.0:
+    resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
+
+  perfect-debounce@2.1.0:
+    resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==}
+
+  pg-cloudflare@1.3.0:
+    resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==}
+
+  pg-connection-string@2.12.0:
+    resolution: {integrity: sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==}
+
+  pg-int8@1.0.1:
+    resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
+    engines: {node: '>=4.0.0'}
+
+  pg-numeric@1.0.2:
+    resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==}
+    engines: {node: '>=4'}
+
+  pg-pool@3.13.0:
+    resolution: {integrity: sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==}
+    peerDependencies:
+      pg: '>=8.0'
+
+  pg-protocol@1.13.0:
+    resolution: {integrity: sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==}
+
+  pg-types@2.2.0:
+    resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
+    engines: {node: '>=4'}
+
+  pg-types@4.1.0:
+    resolution: {integrity: sha512-o2XFanIMy/3+mThw69O8d4n1E5zsLhdO+OPqswezu7Z5ekP4hYDqlDjlmOpYMbzY2Br0ufCwJLdDIXeNVwcWFg==}
+    engines: {node: '>=10'}
+
+  pg@8.20.0:
+    resolution: {integrity: sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==}
+    engines: {node: '>= 16.0.0'}
+    peerDependencies:
+      pg-native: '>=3.0.1'
+    peerDependenciesMeta:
+      pg-native:
+        optional: true
+
+  pgpass@1.0.5:
+    resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==}
+
+  picocolors@1.1.1:
+    resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+  picomatch@2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+
+  picomatch@4.0.3:
+    resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+    engines: {node: '>=12'}
+
+  pinia@3.0.4:
+    resolution: {integrity: sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==}
+    peerDependencies:
+      typescript: '>=4.5.0'
+      vue: ^3.5.11
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  pkg-types@1.3.1:
+    resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+  pkg-types@2.3.0:
+    resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
+
+  postcss-calc@10.1.1:
+    resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==}
+    engines: {node: ^18.12 || ^20.9 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.38
+
+  postcss-colormin@7.0.6:
+    resolution: {integrity: sha512-oXM2mdx6IBTRm39797QguYzVEWzbdlFiMNfq88fCCN1Wepw3CYmJ/1/Ifa/KjWo+j5ZURDl2NTldLJIw51IeNQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-convert-values@7.0.9:
+    resolution: {integrity: sha512-l6uATQATZaCa0bckHV+r6dLXfWtUBKXxO3jK+AtxxJJtgMPD+VhhPCCx51I4/5w8U5uHV67g3w7PXj+V3wlMlg==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-discard-comments@7.0.6:
+    resolution: {integrity: sha512-Sq+Fzj1Eg5/CPf1ERb0wS1Im5cvE2gDXCE+si4HCn1sf+jpQZxDI4DXEp8t77B/ImzDceWE2ebJQFXdqZ6GRJw==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-discard-duplicates@7.0.2:
+    resolution: {integrity: sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-discard-empty@7.0.1:
+    resolution: {integrity: sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-discard-overridden@7.0.1:
+    resolution: {integrity: sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-merge-longhand@7.0.5:
+    resolution: {integrity: sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-merge-rules@7.0.8:
+    resolution: {integrity: sha512-BOR1iAM8jnr7zoQSlpeBmCsWV5Uudi/+5j7k05D0O/WP3+OFMPD86c1j/20xiuRtyt45bhxw/7hnhZNhW2mNFA==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-minify-font-values@7.0.1:
+    resolution: {integrity: sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-minify-gradients@7.0.1:
+    resolution: {integrity: sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-minify-params@7.0.6:
+    resolution: {integrity: sha512-YOn02gC68JijlaXVuKvFSCvQOhTpblkcfDre2hb/Aaa58r2BIaK4AtE/cyZf2wV7YKAG+UlP9DT+By0ry1E4VQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-minify-selectors@7.0.6:
+    resolution: {integrity: sha512-lIbC0jy3AAwDxEgciZlBullDiMBeBCT+fz5G8RcA9MWqh/hfUkpOI3vNDUNEZHgokaoiv0juB9Y8fGcON7rU/A==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-normalize-charset@7.0.1:
+    resolution: {integrity: sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-normalize-display-values@7.0.1:
+    resolution: {integrity: sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-normalize-positions@7.0.1:
+    resolution: {integrity: sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-normalize-repeat-style@7.0.1:
+    resolution: {integrity: sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-normalize-string@7.0.1:
+    resolution: {integrity: sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-normalize-timing-functions@7.0.1:
+    resolution: {integrity: sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-normalize-unicode@7.0.6:
+    resolution: {integrity: sha512-z6bwTV84YW6ZvvNoaNLuzRW4/uWxDKYI1iIDrzk6D2YTL7hICApy+Q1LP6vBEsljX8FM7YSuV9qI79XESd4ddQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-normalize-url@7.0.1:
+    resolution: {integrity: sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-normalize-whitespace@7.0.1:
+    resolution: {integrity: sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-ordered-values@7.0.2:
+    resolution: {integrity: sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-reduce-initial@7.0.6:
+    resolution: {integrity: sha512-G6ZyK68AmrPdMB6wyeA37ejnnRG2S8xinJrZJnOv+IaRKf6koPAVbQsiC7MfkmXaGmF1UO+QCijb27wfpxuRNg==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-reduce-transforms@7.0.1:
+    resolution: {integrity: sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-selector-parser@6.0.10:
+    resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+    engines: {node: '>=4'}
+
+  postcss-selector-parser@7.1.1:
+    resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==}
+    engines: {node: '>=4'}
+
+  postcss-svgo@7.1.1:
+    resolution: {integrity: sha512-zU9H9oEDrUFKa0JB7w+IYL7Qs9ey1mZyjhbf0KLxwJDdDRtoPvCmaEfknzqfHj44QS9VD6c5sJnBAVYTLRg/Sg==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >= 18}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-unique-selectors@7.0.5:
+    resolution: {integrity: sha512-3QoYmEt4qg/rUWDn6Tc8+ZVPmbp4G1hXDtCNWDx0st8SjtCbRcxRXDDM1QrEiXGG3A45zscSJFb4QH90LViyxg==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  postcss-value-parser@4.2.0:
+    resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+  postcss@8.5.8:
+    resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==}
+    engines: {node: ^10 || ^12 || >=14}
+
+  postgres-array@2.0.0:
+    resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
+    engines: {node: '>=4'}
+
+  postgres-array@3.0.4:
+    resolution: {integrity: sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==}
+    engines: {node: '>=12'}
+
+  postgres-bytea@1.0.1:
+    resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==}
+    engines: {node: '>=0.10.0'}
+
+  postgres-bytea@3.0.0:
+    resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==}
+    engines: {node: '>= 6'}
+
+  postgres-date@1.0.7:
+    resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==}
+    engines: {node: '>=0.10.0'}
+
+  postgres-date@2.1.0:
+    resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==}
+    engines: {node: '>=12'}
+
+  postgres-interval@1.2.0:
+    resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
+    engines: {node: '>=0.10.0'}
+
+  postgres-interval@3.0.0:
+    resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==}
+    engines: {node: '>=12'}
+
+  postgres-range@1.1.4:
+    resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==}
+
+  postgres@3.4.7:
+    resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==}
+    engines: {node: '>=12'}
+
+  prettier-plugin-classnames@0.9.0:
+    resolution: {integrity: sha512-xTTKf/us7YMcY4tuoQq0/WaFJzc/ZA0pPpWGphV1noLHX19mIMAJgqmy6ByX6ksVPtmcPDuAF36XVGr3DZYh4g==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@prettier/plugin-oxc': '*'
+      prettier: ^3
+      prettier-plugin-astro: '*'
+      prettier-plugin-svelte: '*'
+    peerDependenciesMeta:
+      '@prettier/plugin-oxc':
+        optional: true
+      prettier-plugin-astro:
+        optional: true
+      prettier-plugin-svelte:
+        optional: true
+
+  prettier-plugin-merge@0.10.0:
+    resolution: {integrity: sha512-OWF0lOnjH16U2iiviF5+6s77n863c6Wff8hAcCNH2bDgOxr+HlPEM6xsVnnaHd7xCrscgJxhMcBaYot/6D/o3g==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      prettier: ^3
+
+  prettier-plugin-prisma@5.0.0:
+    resolution: {integrity: sha512-jTJV04D9+yF7ziOOMs7CJe4ijgAH7DEGjt0SAWAToGNRy1H6BEhvcKA2UQH6gC6KVW5zeeOSAvsoiDDTt9oKXg==}
+    engines: {node: '>=14', npm: '>=8'}
+    peerDependencies:
+      prettier: '>=2 || >=3'
+
+  prettier-plugin-tailwindcss@0.7.2:
+    resolution: {integrity: sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA==}
+    engines: {node: '>=20.19'}
+    peerDependencies:
+      '@ianvs/prettier-plugin-sort-imports': '*'
+      '@prettier/plugin-hermes': '*'
+      '@prettier/plugin-oxc': '*'
+      '@prettier/plugin-pug': '*'
+      '@shopify/prettier-plugin-liquid': '*'
+      '@trivago/prettier-plugin-sort-imports': '*'
+      '@zackad/prettier-plugin-twig': '*'
+      prettier: ^3.0
+      prettier-plugin-astro: '*'
+      prettier-plugin-css-order: '*'
+      prettier-plugin-jsdoc: '*'
+      prettier-plugin-marko: '*'
+      prettier-plugin-multiline-arrays: '*'
+      prettier-plugin-organize-attributes: '*'
+      prettier-plugin-organize-imports: '*'
+      prettier-plugin-sort-imports: '*'
+      prettier-plugin-svelte: '*'
+    peerDependenciesMeta:
+      '@ianvs/prettier-plugin-sort-imports':
+        optional: true
+      '@prettier/plugin-hermes':
+        optional: true
+      '@prettier/plugin-oxc':
+        optional: true
+      '@prettier/plugin-pug':
+        optional: true
+      '@shopify/prettier-plugin-liquid':
+        optional: true
+      '@trivago/prettier-plugin-sort-imports':
+        optional: true
+      '@zackad/prettier-plugin-twig':
+        optional: true
+      prettier-plugin-astro:
+        optional: true
+      prettier-plugin-css-order:
+        optional: true
+      prettier-plugin-jsdoc:
+        optional: true
+      prettier-plugin-marko:
+        optional: true
+      prettier-plugin-multiline-arrays:
+        optional: true
+      prettier-plugin-organize-attributes:
+        optional: true
+      prettier-plugin-organize-imports:
+        optional: true
+      prettier-plugin-sort-imports:
+        optional: true
+      prettier-plugin-svelte:
+        optional: true
+
+  prettier@3.8.1:
+    resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==}
+    engines: {node: '>=14'}
+    hasBin: true
+
+  pretty-bytes@7.1.0:
+    resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==}
+    engines: {node: '>=20'}
+
+  primevue@4.5.4:
+    resolution: {integrity: sha512-nTyEohZABFJhVIpeUxgP0EJ8vKcJAhD+Z7DYj95e7ie/MNUCjRNcGjqmE1cXtXi4z54qDfTSI9h2uJ51qz2DIw==}
+    engines: {node: '>=12.11.0'}
+
+  prisma@7.5.0:
+    resolution: {integrity: sha512-n30qZpWehaYQzigLjmuPisyEsvOzHt7bZeRyg8gZ5DvJo9FGjD+gNaY59Ns3hlLD5/jZH5GBeftIss0jDbUoLg==}
+    engines: {node: ^20.19 || ^22.12 || >=24.0}
+    hasBin: true
+    peerDependencies:
+      better-sqlite3: '>=9.0.0'
+      typescript: '>=5.4.0'
+    peerDependenciesMeta:
+      better-sqlite3:
+        optional: true
+      typescript:
+        optional: true
+
+  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'}
+
+  proper-lockfile@4.1.2:
+    resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==}
+
+  pure-rand@6.1.0:
+    resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
+
+  quansync@0.2.11:
+    resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
+
+  queue-microtask@1.2.3:
+    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+  radix3@1.1.2:
+    resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
+
+  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'}
+
+  rc9@2.1.2:
+    resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==}
+
+  rc9@3.0.0:
+    resolution: {integrity: sha512-MGOue0VqscKWQ104udASX/3GYDcKyPI4j4F8gu/jHHzglpmy9a/anZK3PNe8ug6aZFl+9GxLtdhe3kVZuMaQbA==}
+
+  react-dom@19.2.4:
+    resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==}
+    peerDependencies:
+      react: ^19.2.4
+
+  react@19.2.4:
+    resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==}
+    engines: {node: '>=0.10.0'}
+
+  readable-stream@2.3.8:
+    resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+
+  readable-stream@4.7.0:
+    resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  readdir-glob@1.1.3:
+    resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==}
+
+  readdirp@3.6.0:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+
+  readdirp@4.1.2:
+    resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+    engines: {node: '>= 14.18.0'}
+
+  readdirp@5.0.0:
+    resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==}
+    engines: {node: '>= 20.19.0'}
+
+  redis-errors@1.2.0:
+    resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==}
+    engines: {node: '>=4'}
+
+  redis-parser@3.0.0:
+    resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==}
+    engines: {node: '>=4'}
+
+  regexp-to-ast@0.5.0:
+    resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==}
+
+  regexp-tree@0.1.27:
+    resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==}
+    hasBin: true
+
+  remeda@2.33.4:
+    resolution: {integrity: sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==}
+
+  require-directory@2.1.1:
+    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+    engines: {node: '>=0.10.0'}
+
+  resolve-from@5.0.0:
+    resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+    engines: {node: '>=8'}
+
+  resolve-pkg-maps@1.0.0:
+    resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+  resolve@1.22.11:
+    resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
+    engines: {node: '>= 0.4'}
+    hasBin: true
+
+  retry@0.12.0:
+    resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
+    engines: {node: '>= 4'}
+
+  reusify@1.1.0:
+    resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+  rfdc@1.4.1:
+    resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+  rolldown@1.0.0-rc.9:
+    resolution: {integrity: sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    hasBin: true
+
+  rollup-plugin-visualizer@6.0.11:
+    resolution: {integrity: sha512-TBwVHVY7buHjIKVLqr9scTVFwqZqMXINcCphPwIWKPDCOBIa+jCQfafvbjRJDZgXdq/A996Dy6yGJ/+/NtAXDQ==}
+    engines: {node: '>=18'}
+    hasBin: true
+    peerDependencies:
+      rolldown: 1.x || ^1.0.0-beta
+      rollup: 2.x || 3.x || 4.x
+    peerDependenciesMeta:
+      rolldown:
+        optional: true
+      rollup:
+        optional: true
+
+  rollup@4.59.0:
+    resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==}
+    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+    hasBin: true
+
+  rou3@0.8.1:
+    resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==}
+
+  run-applescript@7.1.0:
+    resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==}
+    engines: {node: '>=18'}
+
+  run-parallel@1.2.0:
+    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+  safe-buffer@5.1.2:
+    resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
+  safe-buffer@5.2.1:
+    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+  safer-buffer@2.1.2:
+    resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+  sax@1.5.0:
+    resolution: {integrity: sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==}
+    engines: {node: '>=11.0.0'}
+
+  scheduler@0.27.0:
+    resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
+
+  scule@1.3.0:
+    resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
+
+  selderee@0.11.0:
+    resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==}
+
+  semver@6.3.1:
+    resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+    hasBin: true
+
+  semver@7.7.4:
+    resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  send@1.2.1:
+    resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}
+    engines: {node: '>= 18'}
+
+  seq-queue@0.0.5:
+    resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==}
+
+  serialize-javascript@6.0.2:
+    resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+
+  seroval@1.5.1:
+    resolution: {integrity: sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA==}
+    engines: {node: '>=10'}
+
+  serve-placeholder@2.0.2:
+    resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==}
+
+  serve-static@2.2.1:
+    resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==}
+    engines: {node: '>= 18'}
+
+  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'}
+
+  shell-quote@1.8.3:
+    resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==}
+    engines: {node: '>= 0.4'}
+
+  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'}
+
+  simple-git@3.33.0:
+    resolution: {integrity: sha512-D4V/tGC2sjsoNhoMybKyGoE+v8A60hRawKQ1iFRA1zwuDgGZCBJ4ByOzZ5J8joBbi4Oam0qiPH+GhzmSBwbJng==}
+
+  sirv@3.0.2:
+    resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==}
+    engines: {node: '>=18'}
+
+  sisteransi@1.0.5:
+    resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+  slash@5.1.0:
+    resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
+    engines: {node: '>=14.16'}
+
+  smob@1.6.1:
+    resolution: {integrity: sha512-KAkBqZl3c2GvNgNhcoyJae1aKldDW0LO279wF9bk1PnluRTETKBq0WyzRXxEhoQLk56yHaOY4JCBEKDuJIET5g==}
+    engines: {node: '>=20.0.0'}
+
+  socket.io-adapter@2.5.6:
+    resolution: {integrity: sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==}
+
+  socket.io-client@4.8.3:
+    resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==}
+    engines: {node: '>=10.0.0'}
+
+  socket.io-parser@4.2.5:
+    resolution: {integrity: sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==}
+    engines: {node: '>=10.0.0'}
+
+  socket.io@4.8.3:
+    resolution: {integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==}
+    engines: {node: '>=10.2.0'}
+
+  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.6.1:
+    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+    engines: {node: '>=0.10.0'}
+
+  source-map@0.7.6:
+    resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
+    engines: {node: '>= 12'}
+
+  speakingurl@14.0.1:
+    resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
+    engines: {node: '>=0.10.0'}
+
+  split2@4.2.0:
+    resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+    engines: {node: '>= 10.x'}
+
+  sqlstring@2.3.3:
+    resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==}
+    engines: {node: '>= 0.6'}
+
+  srvx@0.11.9:
+    resolution: {integrity: sha512-97wWJS6F0KTKAhDlHVmBzMvlBOp5FiNp3XrLoodIgYJpXxgG5tE9rX4Pg7s46n2shI4wtEsMATTS1+rI3/ubzA==}
+    engines: {node: '>=20.16.0'}
+    hasBin: true
+
+  standard-as-callback@2.1.0:
+    resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==}
+
+  statuses@2.0.2:
+    resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
+    engines: {node: '>= 0.8'}
+
+  std-env@3.10.0:
+    resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==}
+
+  std-env@4.0.0:
+    resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==}
+
+  streamx@2.23.0:
+    resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==}
+
+  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_decoder@1.1.1:
+    resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+
+  string_decoder@1.3.0:
+    resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+  strip-ansi@6.0.1:
+    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+    engines: {node: '>=8'}
+
+  strip-ansi@7.2.0:
+    resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==}
+    engines: {node: '>=12'}
+
+  strip-final-newline@3.0.0:
+    resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+    engines: {node: '>=12'}
+
+  strip-literal@3.1.0:
+    resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==}
+
+  structured-clone-es@1.0.0:
+    resolution: {integrity: sha512-FL8EeKFFyNQv5cMnXI31CIMCsFarSVI2bF0U0ImeNE3g/F1IvJQyqzOXxPBRXiwQfyBTlbNe88jh1jFW0O/jiQ==}
+
+  stylehacks@7.0.8:
+    resolution: {integrity: sha512-I3f053GBLIiS5Fg6OMFhq/c+yW+5Hc2+1fgq7gElDMMSqwlRb3tBf2ef6ucLStYRpId4q//bQO1FjcyNyy4yDQ==}
+    engines: {node: ^18.12.0 || ^20.9.0 || >=22.0}
+    peerDependencies:
+      postcss: ^8.4.32
+
+  superjson@2.2.6:
+    resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==}
+    engines: {node: '>=16'}
+
+  supports-color@10.2.2:
+    resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==}
+    engines: {node: '>=18'}
+
+  supports-preserve-symlinks-flag@1.0.0:
+    resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+    engines: {node: '>= 0.4'}
+
+  svgo@4.0.1:
+    resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==}
+    engines: {node: '>=16'}
+    hasBin: true
+
+  system-architecture@0.1.0:
+    resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==}
+    engines: {node: '>=18'}
+
+  tagged-tag@1.0.0:
+    resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==}
+    engines: {node: '>=20'}
+
+  tailwindcss-primeui@0.6.1:
+    resolution: {integrity: sha512-T69Rylcrmnt8zy9ik+qZvsLuRIrS9/k6rYJSIgZ1trnbEzGDDQSCIdmfyZknevqiHwpSJHSmQ9XT2C+S/hJY4A==}
+    peerDependencies:
+      tailwindcss: '>=3.1.0'
+
+  tailwindcss@4.2.1:
+    resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==}
+
+  tapable@2.3.0:
+    resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
+    engines: {node: '>=6'}
+
+  tar-stream@3.1.8:
+    resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==}
+
+  tar@7.5.11:
+    resolution: {integrity: sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==}
+    engines: {node: '>=18'}
+
+  teex@1.0.1:
+    resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==}
+
+  terser@5.46.0:
+    resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  text-decoder@1.2.7:
+    resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==}
+
+  tiny-invariant@1.3.3:
+    resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
+
+  tinyclip@0.1.12:
+    resolution: {integrity: sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA==}
+    engines: {node: ^16.14.0 || >= 17.3.0}
+
+  tinyexec@1.0.2:
+    resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==}
+    engines: {node: '>=18'}
+
+  tinyglobby@0.2.15:
+    resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+    engines: {node: '>=12.0.0'}
+
+  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'}
+
+  tr46@0.0.3:
+    resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+  tslib@2.8.1:
+    resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+  tsx@4.21.0:
+    resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==}
+    engines: {node: '>=18.0.0'}
+    hasBin: true
+
+  type-fest@5.4.4:
+    resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==}
+    engines: {node: '>=20'}
+
+  type-level-regexp@0.1.17:
+    resolution: {integrity: sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==}
+
+  typescript@5.9.3:
+    resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+    engines: {node: '>=14.17'}
+    hasBin: true
+
+  ufo@1.6.3:
+    resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==}
+
+  ultrahtml@1.6.0:
+    resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==}
+
+  uncrypto@0.1.3:
+    resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
+
+  unctx@2.5.0:
+    resolution: {integrity: sha512-p+Rz9x0R7X+CYDkT+Xg8/GhpcShTlU8n+cf9OtOEf7zEQsNcCZO1dPKNRDqvUTaq+P32PMMkxWHwfrxkqfqAYg==}
+
+  undici-types@7.18.2:
+    resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
+
+  unenv@2.0.0-rc.24:
+    resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==}
+
+  unhead@2.1.12:
+    resolution: {integrity: sha512-iTHdWD9ztTunOErtfUFk6Wr11BxvzumcYJ0CzaSCBUOEtg+DUZ9+gnE99i8QkLFT2q1rZD48BYYGXpOZVDLYkA==}
+
+  unicorn-magic@0.3.0:
+    resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
+    engines: {node: '>=18'}
+
+  unicorn-magic@0.4.0:
+    resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==}
+    engines: {node: '>=20'}
+
+  unimport@5.7.0:
+    resolution: {integrity: sha512-njnL6sp8lEA8QQbZrt+52p/g4X0rw3bnGGmUcJnt1jeG8+iiqO779aGz0PirCtydAIVcuTBRlJ52F0u46z309Q==}
+    engines: {node: '>=18.12.0'}
+
+  unimport@6.0.1:
+    resolution: {integrity: sha512-RbT3PfMshH2eYH5ylQuCf1sUQ1ocygZp57HaBNIp96g1upcTZnIstCfl6ZbZM7KHI88K3jmwhgeMxwtYsWSqug==}
+    engines: {node: '>=18.12.0'}
+
+  unplugin-utils@0.2.5:
+    resolution: {integrity: sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==}
+    engines: {node: '>=18.12.0'}
+
+  unplugin-utils@0.3.1:
+    resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==}
+    engines: {node: '>=20.19.0'}
+
+  unplugin-vue-components@28.4.1:
+    resolution: {integrity: sha512-niGSc0vJD9ueAnsqcfAldmtpkppZ09B6p2G1dL7X5S8KPdgbk1P+txPwaaDCe7N+eZh2VG1aAypLXkuJs3OSUg==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@babel/parser': ^7.15.8
+      '@nuxt/kit': ^3.2.2
+      vue: 2 || 3
+    peerDependenciesMeta:
+      '@babel/parser':
+        optional: true
+      '@nuxt/kit':
+        optional: true
+
+  unplugin@2.3.11:
+    resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==}
+    engines: {node: '>=18.12.0'}
+
+  unplugin@3.0.0:
+    resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+
+  unrouting@0.1.5:
+    resolution: {integrity: sha512-Z9QCdWmf2dqrlcJ5KMgSRm5sEhhhSS2D7iOh/t3k0bnAKp5K8+AMf6eqfGGZAQCPn3IcM7ABixxy+FBjOvATBQ==}
+
+  unstorage@1.17.4:
+    resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==}
+    peerDependencies:
+      '@azure/app-configuration': ^1.8.0
+      '@azure/cosmos': ^4.2.0
+      '@azure/data-tables': ^13.3.0
+      '@azure/identity': ^4.6.0
+      '@azure/keyvault-secrets': ^4.9.0
+      '@azure/storage-blob': ^12.26.0
+      '@capacitor/preferences': ^6 || ^7 || ^8
+      '@deno/kv': '>=0.9.0'
+      '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0
+      '@planetscale/database': ^1.19.0
+      '@upstash/redis': ^1.34.3
+      '@vercel/blob': '>=0.27.1'
+      '@vercel/functions': ^2.2.12 || ^3.0.0
+      '@vercel/kv': ^1 || ^2 || ^3
+      aws4fetch: ^1.0.20
+      db0: '>=0.2.1'
+      idb-keyval: ^6.2.1
+      ioredis: ^5.4.2
+      uploadthing: ^7.4.4
+    peerDependenciesMeta:
+      '@azure/app-configuration':
+        optional: true
+      '@azure/cosmos':
+        optional: true
+      '@azure/data-tables':
+        optional: true
+      '@azure/identity':
+        optional: true
+      '@azure/keyvault-secrets':
+        optional: true
+      '@azure/storage-blob':
+        optional: true
+      '@capacitor/preferences':
+        optional: true
+      '@deno/kv':
+        optional: true
+      '@netlify/blobs':
+        optional: true
+      '@planetscale/database':
+        optional: true
+      '@upstash/redis':
+        optional: true
+      '@vercel/blob':
+        optional: true
+      '@vercel/functions':
+        optional: true
+      '@vercel/kv':
+        optional: true
+      aws4fetch:
+        optional: true
+      db0:
+        optional: true
+      idb-keyval:
+        optional: true
+      ioredis:
+        optional: true
+      uploadthing:
+        optional: true
+
+  untun@0.1.3:
+    resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==}
+    hasBin: true
+
+  untyped@2.0.0:
+    resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==}
+    hasBin: true
+
+  unwasm@0.5.3:
+    resolution: {integrity: sha512-keBgTSfp3r6+s9ZcSma+0chwxQdmLbB5+dAD9vjtB21UTMYuKAxHXCU1K2CbCtnP09EaWeRvACnXk0EJtUx+hw==}
+
+  update-browserslist-db@1.2.3:
+    resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
+    hasBin: true
+    peerDependencies:
+      browserslist: '>= 4.21.0'
+
+  uqr@0.1.2:
+    resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==}
+
+  util-deprecate@1.0.2:
+    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+  valibot@1.2.0:
+    resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==}
+    peerDependencies:
+      typescript: '>=5'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  vary@1.1.2:
+    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+    engines: {node: '>= 0.8'}
+
+  vite-dev-rpc@1.1.0:
+    resolution: {integrity: sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==}
+    peerDependencies:
+      vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0
+
+  vite-hot-client@2.1.0:
+    resolution: {integrity: sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==}
+    peerDependencies:
+      vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0
+
+  vite-node@5.3.0:
+    resolution: {integrity: sha512-8f20COPYJujc3OKPX6OuyBy3ZIv2det4eRRU4GY1y2MjbeGSUmPjedxg1b72KnTagCofwvZ65ThzjxDW2AtQFQ==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    hasBin: true
+
+  vite-plugin-checker@0.12.0:
+    resolution: {integrity: sha512-CmdZdDOGss7kdQwv73UyVgLPv0FVYe5czAgnmRX2oKljgEvSrODGuClaV3PDR2+3ou7N/OKGauDDBjy2MB07Rg==}
+    engines: {node: '>=16.11'}
+    peerDependencies:
+      '@biomejs/biome': '>=1.7'
+      eslint: '>=9.39.1'
+      meow: ^13.2.0
+      optionator: ^0.9.4
+      oxlint: '>=1'
+      stylelint: '>=16'
+      typescript: '*'
+      vite: '>=5.4.21'
+      vls: '*'
+      vti: '*'
+      vue-tsc: ~2.2.10 || ^3.0.0
+    peerDependenciesMeta:
+      '@biomejs/biome':
+        optional: true
+      eslint:
+        optional: true
+      meow:
+        optional: true
+      optionator:
+        optional: true
+      oxlint:
+        optional: true
+      stylelint:
+        optional: true
+      typescript:
+        optional: true
+      vls:
+        optional: true
+      vti:
+        optional: true
+      vue-tsc:
+        optional: true
+
+  vite-plugin-inspect@11.3.3:
+    resolution: {integrity: sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@nuxt/kit': '*'
+      vite: ^6.0.0 || ^7.0.0-0
+    peerDependenciesMeta:
+      '@nuxt/kit':
+        optional: true
+
+  vite-plugin-vue-tracer@1.3.0:
+    resolution: {integrity: sha512-Cgfce6VikzOw5MUJTpeg50s5rRjzU1Vr61ZjuHunVVHLjZZ5AUlgyExHthZ3r59vtoz9W2rDt23FYG81avYBKw==}
+    peerDependencies:
+      vite: ^6.0.0 || ^7.0.0
+      vue: ^3.5.0
+
+  vite@7.3.1:
+    resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    hasBin: true
+    peerDependencies:
+      '@types/node': ^20.19.0 || >=22.12.0
+      jiti: '>=1.21.0'
+      less: ^4.0.0
+      lightningcss: ^1.21.0
+      sass: ^1.70.0
+      sass-embedded: ^1.70.0
+      stylus: '>=0.54.8'
+      sugarss: ^5.0.0
+      terser: ^5.16.0
+      tsx: ^4.8.1
+      yaml: ^2.4.2
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      jiti:
+        optional: true
+      less:
+        optional: true
+      lightningcss:
+        optional: true
+      sass:
+        optional: true
+      sass-embedded:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
+      tsx:
+        optional: true
+      yaml:
+        optional: true
+
+  vscode-uri@3.1.0:
+    resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
+
+  vue-bundle-renderer@2.2.0:
+    resolution: {integrity: sha512-sz/0WEdYH1KfaOm0XaBmRZOWgYTEvUDt6yPYaUzl4E52qzgWLlknaPPTTZmp6benaPTlQAI/hN1x3tAzZygycg==}
+
+  vue-devtools-stub@0.1.0:
+    resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==}
+
+  vue-router@5.0.3:
+    resolution: {integrity: sha512-nG1c7aAFac7NYj8Hluo68WyWfc41xkEjaR0ViLHCa3oDvTQ/nIuLJlXJX1NUPw/DXzx/8+OKMng045HHQKQKWw==}
+    peerDependencies:
+      '@pinia/colada': '>=0.21.2'
+      '@vue/compiler-sfc': ^3.5.17
+      pinia: ^3.0.4
+      vue: ^3.5.0
+    peerDependenciesMeta:
+      '@pinia/colada':
+        optional: true
+      '@vue/compiler-sfc':
+        optional: true
+      pinia:
+        optional: true
+
+  vue@3.5.30:
+    resolution: {integrity: sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  webidl-conversions@3.0.1:
+    resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+  webpack-virtual-modules@0.6.2:
+    resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+  whatwg-url@5.0.0:
+    resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
+  which@2.0.2:
+    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+    engines: {node: '>= 8'}
+    hasBin: true
+
+  which@5.0.0:
+    resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==}
+    engines: {node: ^18.17.0 || >=20.5.0}
+    hasBin: true
+
+  wrap-ansi@7.0.0:
+    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+    engines: {node: '>=10'}
+
+  wrap-ansi@8.1.0:
+    resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+    engines: {node: '>=12'}
+
+  ws@8.18.3:
+    resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
+    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
+
+  ws@8.19.0:
+    resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==}
+    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
+
+  wsl-utils@0.1.0:
+    resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==}
+    engines: {node: '>=18'}
+
+  xmlhttprequest-ssl@2.1.2:
+    resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==}
+    engines: {node: '>=0.4.0'}
+
+  xtend@4.0.2:
+    resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+    engines: {node: '>=0.4'}
+
+  y18n@5.0.8:
+    resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+    engines: {node: '>=10'}
+
+  yallist@3.1.1:
+    resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+  yallist@5.0.0:
+    resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
+    engines: {node: '>=18'}
+
+  yaml@2.8.2:
+    resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==}
+    engines: {node: '>= 14.6'}
+    hasBin: true
+
+  yargs-parser@21.1.1:
+    resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+    engines: {node: '>=12'}
+
+  yargs@17.7.2:
+    resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+    engines: {node: '>=12'}
+
+  youch-core@0.3.3:
+    resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==}
+
+  youch@4.1.0:
+    resolution: {integrity: sha512-cYekNh2tUoU+voS11X0D0UQntVCSO6LQ1h10VriQGmfbpf0mnGTruwZICts23UUNiZCXm8H8hQBtRrdsbhuNNg==}
+
+  zeptomatch@2.1.0:
+    resolution: {integrity: sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==}
+
+  zip-stream@6.0.1:
+    resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==}
+    engines: {node: '>= 14'}
+
+  zod@3.22.4:
+    resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==}
+
+  zod@4.3.6:
+    resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
+
+snapshots:
+
+  '@antfu/install-pkg@1.1.0':
+    dependencies:
+      package-manager-detector: 1.6.0
+      tinyexec: 1.0.2
+
+  '@babel/code-frame@7.29.0':
+    dependencies:
+      '@babel/helper-validator-identifier': 7.28.5
+      js-tokens: 4.0.0
+      picocolors: 1.1.1
+
+  '@babel/compat-data@7.29.0': {}
+
+  '@babel/core@7.29.0':
+    dependencies:
+      '@babel/code-frame': 7.29.0
+      '@babel/generator': 7.29.1
+      '@babel/helper-compilation-targets': 7.28.6
+      '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0)
+      '@babel/helpers': 7.28.6
+      '@babel/parser': 7.29.0
+      '@babel/template': 7.28.6
+      '@babel/traverse': 7.29.0
+      '@babel/types': 7.29.0
+      '@jridgewell/remapping': 2.3.5
+      convert-source-map: 2.0.0
+      debug: 4.4.3
+      gensync: 1.0.0-beta.2
+      json5: 2.2.3
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/generator@7.29.1':
+    dependencies:
+      '@babel/parser': 7.29.0
+      '@babel/types': 7.29.0
+      '@jridgewell/gen-mapping': 0.3.13
+      '@jridgewell/trace-mapping': 0.3.31
+      jsesc: 3.1.0
+
+  '@babel/helper-annotate-as-pure@7.27.3':
+    dependencies:
+      '@babel/types': 7.29.0
+
+  '@babel/helper-compilation-targets@7.28.6':
+    dependencies:
+      '@babel/compat-data': 7.29.0
+      '@babel/helper-validator-option': 7.27.1
+      browserslist: 4.28.1
+      lru-cache: 5.1.1
+      semver: 6.3.1
+
+  '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/core': 7.29.0
+      '@babel/helper-annotate-as-pure': 7.27.3
+      '@babel/helper-member-expression-to-functions': 7.28.5
+      '@babel/helper-optimise-call-expression': 7.27.1
+      '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0)
+      '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+      '@babel/traverse': 7.29.0
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-globals@7.28.0': {}
+
+  '@babel/helper-member-expression-to-functions@7.28.5':
+    dependencies:
+      '@babel/traverse': 7.29.0
+      '@babel/types': 7.29.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-module-imports@7.28.6':
+    dependencies:
+      '@babel/traverse': 7.29.0
+      '@babel/types': 7.29.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/core': 7.29.0
+      '@babel/helper-module-imports': 7.28.6
+      '@babel/helper-validator-identifier': 7.28.5
+      '@babel/traverse': 7.29.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-optimise-call-expression@7.27.1':
+    dependencies:
+      '@babel/types': 7.29.0
+
+  '@babel/helper-plugin-utils@7.28.6': {}
+
+  '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/core': 7.29.0
+      '@babel/helper-member-expression-to-functions': 7.28.5
+      '@babel/helper-optimise-call-expression': 7.27.1
+      '@babel/traverse': 7.29.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+    dependencies:
+      '@babel/traverse': 7.29.0
+      '@babel/types': 7.29.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-string-parser@7.27.1': {}
+
+  '@babel/helper-validator-identifier@7.28.5': {}
+
+  '@babel/helper-validator-option@7.27.1': {}
+
+  '@babel/helpers@7.28.6':
+    dependencies:
+      '@babel/template': 7.28.6
+      '@babel/types': 7.29.0
+
+  '@babel/parser@7.29.0':
+    dependencies:
+      '@babel/types': 7.29.0
+
+  '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/core': 7.29.0
+      '@babel/helper-plugin-utils': 7.28.6
+
+  '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/core': 7.29.0
+      '@babel/helper-plugin-utils': 7.28.6
+
+  '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/core': 7.29.0
+      '@babel/helper-annotate-as-pure': 7.27.3
+      '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0)
+      '@babel/helper-plugin-utils': 7.28.6
+      '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+      '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/template@7.28.6':
+    dependencies:
+      '@babel/code-frame': 7.29.0
+      '@babel/parser': 7.29.0
+      '@babel/types': 7.29.0
+
+  '@babel/traverse@7.29.0':
+    dependencies:
+      '@babel/code-frame': 7.29.0
+      '@babel/generator': 7.29.1
+      '@babel/helper-globals': 7.28.0
+      '@babel/parser': 7.29.0
+      '@babel/template': 7.28.6
+      '@babel/types': 7.29.0
+      debug: 4.4.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/types@7.29.0':
+    dependencies:
+      '@babel/helper-string-parser': 7.27.1
+      '@babel/helper-validator-identifier': 7.28.5
+
+  '@bomb.sh/tab@0.0.14(cac@6.7.14)(citty@0.2.1)':
+    optionalDependencies:
+      cac: 6.7.14
+      citty: 0.2.1
+
+  '@chevrotain/cst-dts-gen@10.5.0':
+    dependencies:
+      '@chevrotain/gast': 10.5.0
+      '@chevrotain/types': 10.5.0
+      lodash: 4.17.21
+
+  '@chevrotain/gast@10.5.0':
+    dependencies:
+      '@chevrotain/types': 10.5.0
+      lodash: 4.17.21
+
+  '@chevrotain/types@10.5.0': {}
+
+  '@chevrotain/utils@10.5.0': {}
+
+  '@clack/core@1.1.0':
+    dependencies:
+      sisteransi: 1.0.5
+
+  '@clack/prompts@1.1.0':
+    dependencies:
+      '@clack/core': 1.1.0
+      sisteransi: 1.0.5
+
+  '@cloudflare/kv-asset-handler@0.4.2': {}
+
+  '@dxup/nuxt@0.4.0(magicast@0.5.2)(typescript@5.9.3)':
+    dependencies:
+      '@dxup/unimport': 0.1.2
+      '@nuxt/kit': 4.4.2(magicast@0.5.2)
+      chokidar: 5.0.0
+      pathe: 2.0.3
+      tinyglobby: 0.2.15
+      typescript: 5.9.3
+    transitivePeerDependencies:
+      - magicast
+
+  '@dxup/unimport@0.1.2': {}
+
+  '@electric-sql/pglite-socket@0.0.20(@electric-sql/pglite@0.3.15)':
+    dependencies:
+      '@electric-sql/pglite': 0.3.15
+
+  '@electric-sql/pglite-tools@0.2.20(@electric-sql/pglite@0.3.15)':
+    dependencies:
+      '@electric-sql/pglite': 0.3.15
+
+  '@electric-sql/pglite@0.3.15': {}
+
+  '@emnapi/core@1.9.0':
+    dependencies:
+      '@emnapi/wasi-threads': 1.2.0
+      tslib: 2.8.1
+    optional: true
+
+  '@emnapi/runtime@1.9.0':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@emnapi/wasi-threads@1.2.0':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@esbuild/aix-ppc64@0.27.4':
+    optional: true
+
+  '@esbuild/android-arm64@0.27.4':
+    optional: true
+
+  '@esbuild/android-arm@0.27.4':
+    optional: true
+
+  '@esbuild/android-x64@0.27.4':
+    optional: true
+
+  '@esbuild/darwin-arm64@0.27.4':
+    optional: true
+
+  '@esbuild/darwin-x64@0.27.4':
+    optional: true
+
+  '@esbuild/freebsd-arm64@0.27.4':
+    optional: true
+
+  '@esbuild/freebsd-x64@0.27.4':
+    optional: true
+
+  '@esbuild/linux-arm64@0.27.4':
+    optional: true
+
+  '@esbuild/linux-arm@0.27.4':
+    optional: true
+
+  '@esbuild/linux-ia32@0.27.4':
+    optional: true
+
+  '@esbuild/linux-loong64@0.27.4':
+    optional: true
+
+  '@esbuild/linux-mips64el@0.27.4':
+    optional: true
+
+  '@esbuild/linux-ppc64@0.27.4':
+    optional: true
+
+  '@esbuild/linux-riscv64@0.27.4':
+    optional: true
+
+  '@esbuild/linux-s390x@0.27.4':
+    optional: true
+
+  '@esbuild/linux-x64@0.27.4':
+    optional: true
+
+  '@esbuild/netbsd-arm64@0.27.4':
+    optional: true
+
+  '@esbuild/netbsd-x64@0.27.4':
+    optional: true
+
+  '@esbuild/openbsd-arm64@0.27.4':
+    optional: true
+
+  '@esbuild/openbsd-x64@0.27.4':
+    optional: true
+
+  '@esbuild/openharmony-arm64@0.27.4':
+    optional: true
+
+  '@esbuild/sunos-x64@0.27.4':
+    optional: true
+
+  '@esbuild/win32-arm64@0.27.4':
+    optional: true
+
+  '@esbuild/win32-ia32@0.27.4':
+    optional: true
+
+  '@esbuild/win32-x64@0.27.4':
+    optional: true
+
+  '@hono/node-server@1.19.9(hono@4.11.4)':
+    dependencies:
+      hono: 4.11.4
+
+  '@iconify-json/fa6-solid@1.2.4':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify-json/ph@1.2.2':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify/collections@1.0.660':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify/types@2.0.0': {}
+
+  '@iconify/utils@3.1.0':
+    dependencies:
+      '@antfu/install-pkg': 1.1.0
+      '@iconify/types': 2.0.0
+      mlly: 1.8.1
+
+  '@iconify/vue@5.0.0(vue@3.5.30(typescript@5.9.3))':
+    dependencies:
+      '@iconify/types': 2.0.0
+      vue: 3.5.30(typescript@5.9.3)
+
+  '@ioredis/commands@1.5.1': {}
+
+  '@isaacs/cliui@8.0.2':
+    dependencies:
+      string-width: 5.1.2
+      string-width-cjs: string-width@4.2.3
+      strip-ansi: 7.2.0
+      strip-ansi-cjs: strip-ansi@6.0.1
+      wrap-ansi: 8.1.0
+      wrap-ansi-cjs: wrap-ansi@7.0.0
+
+  '@isaacs/fs-minipass@4.0.1':
+    dependencies:
+      minipass: 7.1.3
+
+  '@jridgewell/gen-mapping@0.3.13':
+    dependencies:
+      '@jridgewell/sourcemap-codec': 1.5.5
+      '@jridgewell/trace-mapping': 0.3.31
+
+  '@jridgewell/remapping@2.3.5':
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.13
+      '@jridgewell/trace-mapping': 0.3.31
+
+  '@jridgewell/resolve-uri@3.1.2': {}
+
+  '@jridgewell/source-map@0.3.11':
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.13
+      '@jridgewell/trace-mapping': 0.3.31
+
+  '@jridgewell/sourcemap-codec@1.5.5': {}
+
+  '@jridgewell/trace-mapping@0.3.31':
+    dependencies:
+      '@jridgewell/resolve-uri': 3.1.2
+      '@jridgewell/sourcemap-codec': 1.5.5
+
+  '@kwsites/file-exists@1.1.1':
+    dependencies:
+      debug: 4.4.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@kwsites/promise-deferred@1.1.1': {}
+
+  '@mapbox/node-pre-gyp@2.0.3':
+    dependencies:
+      consola: 3.4.2
+      detect-libc: 2.1.2
+      https-proxy-agent: 7.0.6
+      node-fetch: 2.7.0
+      nopt: 8.1.0
+      semver: 7.7.4
+      tar: 7.5.11
+    transitivePeerDependencies:
+      - encoding
+      - supports-color
+
+  '@mrleebo/prisma-ast@0.13.1':
+    dependencies:
+      chevrotain: 10.5.0
+      lilconfig: 2.1.0
+
+  '@napi-rs/wasm-runtime@1.1.1':
+    dependencies:
+      '@emnapi/core': 1.9.0
+      '@emnapi/runtime': 1.9.0
+      '@tybys/wasm-util': 0.10.1
+    optional: true
+
+  '@nodelib/fs.scandir@2.1.5':
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      run-parallel: 1.2.0
+
+  '@nodelib/fs.stat@2.0.5': {}
+
+  '@nodelib/fs.walk@1.2.8':
+    dependencies:
+      '@nodelib/fs.scandir': 2.1.5
+      fastq: 1.20.1
+
+  '@nuxt/cli@3.34.0(@nuxt/schema@4.4.2)(cac@6.7.14)(magicast@0.5.2)':
+    dependencies:
+      '@bomb.sh/tab': 0.0.14(cac@6.7.14)(citty@0.2.1)
+      '@clack/prompts': 1.1.0
+      c12: 3.3.3(magicast@0.5.2)
+      citty: 0.2.1
+      confbox: 0.2.4
+      consola: 3.4.2
+      debug: 4.4.3
+      defu: 6.1.4
+      exsolve: 1.0.8
+      fuse.js: 7.1.0
+      fzf: 0.5.2
+      giget: 3.1.2
+      jiti: 2.6.1
+      listhen: 1.9.0
+      nypm: 0.6.5
+      ofetch: 1.5.1
+      ohash: 2.0.11
+      pathe: 2.0.3
+      perfect-debounce: 2.1.0
+      pkg-types: 2.3.0
+      scule: 1.3.0
+      semver: 7.7.4
+      srvx: 0.11.9
+      std-env: 3.10.0
+      tinyclip: 0.1.12
+      tinyexec: 1.0.2
+      ufo: 1.6.3
+      youch: 4.1.0
+    optionalDependencies:
+      '@nuxt/schema': 4.4.2
+    transitivePeerDependencies:
+      - cac
+      - commander
+      - magicast
+      - supports-color
+
+  '@nuxt/devalue@2.0.2': {}
+
+  '@nuxt/devtools-kit@3.2.3(magicast@0.5.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
+    dependencies:
+      '@nuxt/kit': 4.4.2(magicast@0.5.2)
+      execa: 8.0.1
+      vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+    transitivePeerDependencies:
+      - magicast
+
+  '@nuxt/devtools-wizard@3.2.3':
+    dependencies:
+      '@clack/prompts': 1.1.0
+      consola: 3.4.2
+      diff: 8.0.3
+      execa: 8.0.1
+      magicast: 0.5.2
+      pathe: 2.0.3
+      pkg-types: 2.3.0
+      semver: 7.7.4
+
+  '@nuxt/devtools@3.2.3(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))':
+    dependencies:
+      '@nuxt/devtools-kit': 3.2.3(magicast@0.5.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+      '@nuxt/devtools-wizard': 3.2.3
+      '@nuxt/kit': 4.4.2(magicast@0.5.2)
+      '@vue/devtools-core': 8.1.0(vue@3.5.30(typescript@5.9.3))
+      '@vue/devtools-kit': 8.1.0
+      birpc: 4.0.0
+      consola: 3.4.2
+      destr: 2.0.5
+      error-stack-parser-es: 1.0.5
+      execa: 8.0.1
+      fast-npm-meta: 1.4.2
+      get-port-please: 3.2.0
+      hookable: 6.0.1
+      image-meta: 0.2.2
+      is-installed-globally: 1.0.0
+      launch-editor: 2.13.1
+      local-pkg: 1.1.2
+      magicast: 0.5.2
+      nypm: 0.6.5
+      ohash: 2.0.11
+      pathe: 2.0.3
+      perfect-debounce: 2.1.0
+      pkg-types: 2.3.0
+      semver: 7.7.4
+      simple-git: 3.33.0
+      sirv: 3.0.2
+      structured-clone-es: 1.0.0
+      tinyglobby: 0.2.15
+      vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+      vite-plugin-inspect: 11.3.3(@nuxt/kit@4.4.2(magicast@0.5.2))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+      vite-plugin-vue-tracer: 1.3.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))
+      which: 5.0.0
+      ws: 8.19.0
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+      - vue
+
+  '@nuxt/icon@2.2.1(magicast@0.5.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))':
+    dependencies:
+      '@iconify/collections': 1.0.660
+      '@iconify/types': 2.0.0
+      '@iconify/utils': 3.1.0
+      '@iconify/vue': 5.0.0(vue@3.5.30(typescript@5.9.3))
+      '@nuxt/devtools-kit': 3.2.3(magicast@0.5.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+      '@nuxt/kit': 4.4.2(magicast@0.5.2)
+      consola: 3.4.2
+      local-pkg: 1.1.2
+      mlly: 1.8.1
+      ohash: 2.0.11
+      pathe: 2.0.3
+      picomatch: 4.0.3
+      std-env: 3.10.0
+      tinyglobby: 0.2.15
+    transitivePeerDependencies:
+      - magicast
+      - vite
+      - vue
+
+  '@nuxt/kit@3.21.2(magicast@0.5.2)':
+    dependencies:
+      c12: 3.3.3(magicast@0.5.2)
+      consola: 3.4.2
+      defu: 6.1.4
+      destr: 2.0.5
+      errx: 0.1.0
+      exsolve: 1.0.8
+      ignore: 7.0.5
+      jiti: 2.6.1
+      klona: 2.0.6
+      knitwork: 1.3.0
+      mlly: 1.8.1
+      ohash: 2.0.11
+      pathe: 2.0.3
+      pkg-types: 2.3.0
+      rc9: 3.0.0
+      scule: 1.3.0
+      semver: 7.7.4
+      tinyglobby: 0.2.15
+      ufo: 1.6.3
+      unctx: 2.5.0
+      untyped: 2.0.0
+    transitivePeerDependencies:
+      - magicast
+
+  '@nuxt/kit@4.4.2(magicast@0.5.2)':
+    dependencies:
+      c12: 3.3.3(magicast@0.5.2)
+      consola: 3.4.2
+      defu: 6.1.4
+      destr: 2.0.5
+      errx: 0.1.0
+      exsolve: 1.0.8
+      ignore: 7.0.5
+      jiti: 2.6.1
+      klona: 2.0.6
+      mlly: 1.8.1
+      ohash: 2.0.11
+      pathe: 2.0.3
+      pkg-types: 2.3.0
+      rc9: 3.0.0
+      scule: 1.3.0
+      semver: 7.7.4
+      tinyglobby: 0.2.15
+      ufo: 1.6.3
+      unctx: 2.5.0
+      untyped: 2.0.0
+    transitivePeerDependencies:
+      - magicast
+
+  '@nuxt/nitro-server@4.4.2(@babel/core@7.29.0)(@electric-sql/pglite@0.3.15)(db0@0.3.4(@electric-sql/pglite@0.3.15)(mysql2@3.15.3))(ioredis@5.10.0)(magicast@0.5.2)(mysql2@3.15.3)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@electric-sql/pglite@0.3.15)(@parcel/watcher@2.5.6)(@pinia/colada@1.0.0(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)))(@types/node@25.5.0)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.3.15)(mysql2@3.15.3))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(mysql2@3.15.3)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rolldown@1.0.0-rc.9)(rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.9)(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(yaml@2.8.2))(rolldown@1.0.0-rc.9)(typescript@5.9.3)':
+    dependencies:
+      '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0)
+      '@nuxt/devalue': 2.0.2
+      '@nuxt/kit': 4.4.2(magicast@0.5.2)
+      '@unhead/vue': 2.1.12(vue@3.5.30(typescript@5.9.3))
+      '@vue/shared': 3.5.30
+      consola: 3.4.2
+      defu: 6.1.4
+      destr: 2.0.5
+      devalue: 5.6.4
+      errx: 0.1.0
+      escape-string-regexp: 5.0.0
+      exsolve: 1.0.8
+      h3: 1.15.6
+      impound: 1.1.5
+      klona: 2.0.6
+      mocked-exports: 0.1.1
+      nitropack: 2.13.1(@electric-sql/pglite@0.3.15)(mysql2@3.15.3)(rolldown@1.0.0-rc.9)
+      nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@electric-sql/pglite@0.3.15)(@parcel/watcher@2.5.6)(@pinia/colada@1.0.0(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)))(@types/node@25.5.0)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.3.15)(mysql2@3.15.3))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(mysql2@3.15.3)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rolldown@1.0.0-rc.9)(rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.9)(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(yaml@2.8.2)
+      nypm: 0.6.5
+      ohash: 2.0.11
+      pathe: 2.0.3
+      pkg-types: 2.3.0
+      rou3: 0.8.1
+      std-env: 4.0.0
+      ufo: 1.6.3
+      unctx: 2.5.0
+      unstorage: 1.17.4(db0@0.3.4(@electric-sql/pglite@0.3.15)(mysql2@3.15.3))(ioredis@5.10.0)
+      vue: 3.5.30(typescript@5.9.3)
+      vue-bundle-renderer: 2.2.0
+      vue-devtools-stub: 0.1.0
+    transitivePeerDependencies:
+      - '@azure/app-configuration'
+      - '@azure/cosmos'
+      - '@azure/data-tables'
+      - '@azure/identity'
+      - '@azure/keyvault-secrets'
+      - '@azure/storage-blob'
+      - '@babel/core'
+      - '@capacitor/preferences'
+      - '@deno/kv'
+      - '@electric-sql/pglite'
+      - '@libsql/client'
+      - '@netlify/blobs'
+      - '@planetscale/database'
+      - '@upstash/redis'
+      - '@vercel/blob'
+      - '@vercel/functions'
+      - '@vercel/kv'
+      - aws4fetch
+      - bare-abort-controller
+      - bare-buffer
+      - better-sqlite3
+      - db0
+      - drizzle-orm
+      - encoding
+      - idb-keyval
+      - ioredis
+      - magicast
+      - mysql2
+      - react-native-b4a
+      - rolldown
+      - sqlite3
+      - supports-color
+      - typescript
+      - uploadthing
+      - xml2js
+
+  '@nuxt/schema@4.4.2':
+    dependencies:
+      '@vue/shared': 3.5.30
+      defu: 6.1.4
+      pathe: 2.0.3
+      pkg-types: 2.3.0
+      std-env: 4.0.0
+
+  '@nuxt/telemetry@2.7.0(@nuxt/kit@4.4.2(magicast@0.5.2))':
+    dependencies:
+      '@nuxt/kit': 4.4.2(magicast@0.5.2)
+      citty: 0.2.1
+      consola: 3.4.2
+      ofetch: 2.0.0-alpha.3
+      rc9: 3.0.0
+      std-env: 3.10.0
+
+  '@nuxt/vite-builder@4.4.2(516f12cfe377ad06dd9cf42b8cd2075a)':
+    dependencies:
+      '@nuxt/kit': 4.4.2(magicast@0.5.2)
+      '@rollup/plugin-replace': 6.0.3(rollup@4.59.0)
+      '@vitejs/plugin-vue': 6.0.5(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))
+      '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))
+      autoprefixer: 10.4.27(postcss@8.5.8)
+      consola: 3.4.2
+      cssnano: 7.1.3(postcss@8.5.8)
+      defu: 6.1.4
+      escape-string-regexp: 5.0.0
+      exsolve: 1.0.8
+      get-port-please: 3.2.0
+      jiti: 2.6.1
+      knitwork: 1.3.0
+      magic-string: 0.30.21
+      mlly: 1.8.1
+      mocked-exports: 0.1.1
+      nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@electric-sql/pglite@0.3.15)(@parcel/watcher@2.5.6)(@pinia/colada@1.0.0(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)))(@types/node@25.5.0)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.3.15)(mysql2@3.15.3))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(mysql2@3.15.3)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rolldown@1.0.0-rc.9)(rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.9)(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(yaml@2.8.2)
+      nypm: 0.6.5
+      pathe: 2.0.3
+      pkg-types: 2.3.0
+      postcss: 8.5.8
+      seroval: 1.5.1
+      std-env: 4.0.0
+      ufo: 1.6.3
+      unenv: 2.0.0-rc.24
+      vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+      vite-node: 5.3.0(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+      vite-plugin-checker: 0.12.0(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+      vue: 3.5.30(typescript@5.9.3)
+      vue-bundle-renderer: 2.2.0
+    optionalDependencies:
+      '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0)
+      rolldown: 1.0.0-rc.9
+      rollup-plugin-visualizer: 6.0.11(rolldown@1.0.0-rc.9)(rollup@4.59.0)
+    transitivePeerDependencies:
+      - '@biomejs/biome'
+      - '@types/node'
+      - eslint
+      - less
+      - lightningcss
+      - magicast
+      - meow
+      - optionator
+      - oxlint
+      - rollup
+      - sass
+      - sass-embedded
+      - stylelint
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+      - tsx
+      - typescript
+      - vls
+      - vti
+      - vue-tsc
+      - yaml
+
+  '@oxc-minify/binding-android-arm-eabi@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-android-arm64@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-darwin-arm64@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-darwin-x64@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-freebsd-x64@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-linux-arm-gnueabihf@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-linux-arm-musleabihf@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-linux-arm64-gnu@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-linux-arm64-musl@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-linux-ppc64-gnu@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-linux-riscv64-gnu@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-linux-riscv64-musl@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-linux-s390x-gnu@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-linux-x64-gnu@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-linux-x64-musl@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-openharmony-arm64@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-wasm32-wasi@0.117.0':
+    dependencies:
+      '@napi-rs/wasm-runtime': 1.1.1
+    optional: true
+
+  '@oxc-minify/binding-win32-arm64-msvc@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-win32-ia32-msvc@0.117.0':
+    optional: true
+
+  '@oxc-minify/binding-win32-x64-msvc@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-android-arm-eabi@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-android-arm64@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-darwin-arm64@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-darwin-x64@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-freebsd-x64@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-linux-arm-gnueabihf@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-linux-arm-musleabihf@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-linux-arm64-gnu@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-linux-arm64-musl@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-linux-ppc64-gnu@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-linux-riscv64-gnu@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-linux-riscv64-musl@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-linux-s390x-gnu@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-linux-x64-gnu@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-linux-x64-musl@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-openharmony-arm64@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-wasm32-wasi@0.117.0':
+    dependencies:
+      '@napi-rs/wasm-runtime': 1.1.1
+    optional: true
+
+  '@oxc-parser/binding-win32-arm64-msvc@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-win32-ia32-msvc@0.117.0':
+    optional: true
+
+  '@oxc-parser/binding-win32-x64-msvc@0.117.0':
+    optional: true
+
+  '@oxc-project/types@0.115.0':
+    optional: true
+
+  '@oxc-project/types@0.117.0': {}
+
+  '@oxc-transform/binding-android-arm-eabi@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-android-arm64@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-darwin-arm64@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-darwin-x64@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-freebsd-x64@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-linux-arm-gnueabihf@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-linux-arm-musleabihf@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-linux-arm64-gnu@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-linux-arm64-musl@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-linux-ppc64-gnu@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-linux-riscv64-gnu@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-linux-riscv64-musl@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-linux-s390x-gnu@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-linux-x64-gnu@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-linux-x64-musl@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-openharmony-arm64@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-wasm32-wasi@0.117.0':
+    dependencies:
+      '@napi-rs/wasm-runtime': 1.1.1
+    optional: true
+
+  '@oxc-transform/binding-win32-arm64-msvc@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-win32-ia32-msvc@0.117.0':
+    optional: true
+
+  '@oxc-transform/binding-win32-x64-msvc@0.117.0':
+    optional: true
+
+  '@parcel/watcher-android-arm64@2.5.6':
+    optional: true
+
+  '@parcel/watcher-darwin-arm64@2.5.6':
+    optional: true
+
+  '@parcel/watcher-darwin-x64@2.5.6':
+    optional: true
+
+  '@parcel/watcher-freebsd-x64@2.5.6':
+    optional: true
+
+  '@parcel/watcher-linux-arm-glibc@2.5.6':
+    optional: true
+
+  '@parcel/watcher-linux-arm-musl@2.5.6':
+    optional: true
+
+  '@parcel/watcher-linux-arm64-glibc@2.5.6':
+    optional: true
+
+  '@parcel/watcher-linux-arm64-musl@2.5.6':
+    optional: true
+
+  '@parcel/watcher-linux-x64-glibc@2.5.6':
+    optional: true
+
+  '@parcel/watcher-linux-x64-musl@2.5.6':
+    optional: true
+
+  '@parcel/watcher-wasm@2.5.6':
+    dependencies:
+      is-glob: 4.0.3
+      picomatch: 4.0.3
+
+  '@parcel/watcher-win32-arm64@2.5.6':
+    optional: true
+
+  '@parcel/watcher-win32-ia32@2.5.6':
+    optional: true
+
+  '@parcel/watcher-win32-x64@2.5.6':
+    optional: true
+
+  '@parcel/watcher@2.5.6':
+    dependencies:
+      detect-libc: 2.1.2
+      is-glob: 4.0.3
+      node-addon-api: 7.1.1
+      picomatch: 4.0.3
+    optionalDependencies:
+      '@parcel/watcher-android-arm64': 2.5.6
+      '@parcel/watcher-darwin-arm64': 2.5.6
+      '@parcel/watcher-darwin-x64': 2.5.6
+      '@parcel/watcher-freebsd-x64': 2.5.6
+      '@parcel/watcher-linux-arm-glibc': 2.5.6
+      '@parcel/watcher-linux-arm-musl': 2.5.6
+      '@parcel/watcher-linux-arm64-glibc': 2.5.6
+      '@parcel/watcher-linux-arm64-musl': 2.5.6
+      '@parcel/watcher-linux-x64-glibc': 2.5.6
+      '@parcel/watcher-linux-x64-musl': 2.5.6
+      '@parcel/watcher-win32-arm64': 2.5.6
+      '@parcel/watcher-win32-ia32': 2.5.6
+      '@parcel/watcher-win32-x64': 2.5.6
+
+  '@pinia/colada-devtools@0.4.5': {}
+
+  '@pinia/colada-nuxt@0.3.2(@pinia/colada@1.0.0(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)))(magicast@0.5.2)':
+    dependencies:
+      '@nuxt/kit': 4.4.2(magicast@0.5.2)
+      '@pinia/colada': 1.0.0(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))
+    transitivePeerDependencies:
+      - magicast
+
+  '@pinia/colada@1.0.0(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))':
+    dependencies:
+      pinia: 3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3))
+      vue: 3.5.30(typescript@5.9.3)
+
+  '@pinia/nuxt@0.11.3(magicast@0.5.2)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))':
+    dependencies:
+      '@nuxt/kit': 4.4.2(magicast@0.5.2)
+      pinia: 3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3))
+    transitivePeerDependencies:
+      - magicast
+
+  '@pkgjs/parseargs@0.11.0':
+    optional: true
+
+  '@polka/url@1.0.0-next.29': {}
+
+  '@poppinss/colors@4.1.6':
+    dependencies:
+      kleur: 4.1.5
+
+  '@poppinss/dumper@0.7.0':
+    dependencies:
+      '@poppinss/colors': 4.1.6
+      '@sindresorhus/is': 7.2.0
+      supports-color: 10.2.2
+
+  '@poppinss/exception@1.2.3': {}
+
+  '@primeuix/forms@0.1.0':
+    dependencies:
+      '@primeuix/utils': 0.6.4
+
+  '@primeuix/styled@0.7.4':
+    dependencies:
+      '@primeuix/utils': 0.6.4
+
+  '@primeuix/styles@2.0.3':
+    dependencies:
+      '@primeuix/styled': 0.7.4
+
+  '@primeuix/utils@0.6.4': {}
+
+  '@primevue/auto-import-resolver@4.5.4':
+    dependencies:
+      '@primevue/metadata': 4.5.4
+
+  '@primevue/core@4.5.4(vue@3.5.30(typescript@5.9.3))':
+    dependencies:
+      '@primeuix/styled': 0.7.4
+      '@primeuix/utils': 0.6.4
+      vue: 3.5.30(typescript@5.9.3)
+
+  '@primevue/forms@4.5.4(vue@3.5.30(typescript@5.9.3))':
+    dependencies:
+      '@primeuix/forms': 0.1.0
+      '@primeuix/utils': 0.6.4
+      '@primevue/core': 4.5.4(vue@3.5.30(typescript@5.9.3))
+    transitivePeerDependencies:
+      - vue
+
+  '@primevue/icons@4.5.4(vue@3.5.30(typescript@5.9.3))':
+    dependencies:
+      '@primeuix/utils': 0.6.4
+      '@primevue/core': 4.5.4(vue@3.5.30(typescript@5.9.3))
+    transitivePeerDependencies:
+      - vue
+
+  '@primevue/metadata@4.5.4': {}
+
+  '@primevue/nuxt-module@4.5.4(@babel/parser@7.29.0)(magicast@0.5.2)(vue@3.5.30(typescript@5.9.3))':
+    dependencies:
+      '@nuxt/kit': 3.21.2(magicast@0.5.2)
+      '@primeuix/styled': 0.7.4
+      '@primeuix/utils': 0.6.4
+      '@primevue/auto-import-resolver': 4.5.4
+      '@primevue/forms': 4.5.4(vue@3.5.30(typescript@5.9.3))
+      '@primevue/metadata': 4.5.4
+      pathe: 1.1.2
+      primevue: 4.5.4(vue@3.5.30(typescript@5.9.3))
+      unplugin-vue-components: 28.4.1(@babel/parser@7.29.0)(@nuxt/kit@3.21.2(magicast@0.5.2))(vue@3.5.30(typescript@5.9.3))
+    transitivePeerDependencies:
+      - '@babel/parser'
+      - magicast
+      - supports-color
+      - vue
+
+  '@prisma/adapter-pg@7.5.0':
+    dependencies:
+      '@prisma/driver-adapter-utils': 7.5.0
+      '@types/pg': 8.11.11
+      pg: 8.20.0
+      postgres-array: 3.0.4
+    transitivePeerDependencies:
+      - pg-native
+
+  '@prisma/client-runtime-utils@7.5.0': {}
+
+  '@prisma/client@7.5.0(prisma@7.5.0(@types/react@19.2.14)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3)':
+    dependencies:
+      '@prisma/client-runtime-utils': 7.5.0
+    optionalDependencies:
+      prisma: 7.5.0(@types/react@19.2.14)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)
+      typescript: 5.9.3
+
+  '@prisma/config@7.5.0(magicast@0.5.2)':
+    dependencies:
+      c12: 3.1.0(magicast@0.5.2)
+      deepmerge-ts: 7.1.5
+      effect: 3.18.4
+      empathic: 2.0.0
+    transitivePeerDependencies:
+      - magicast
+
+  '@prisma/debug@7.2.0': {}
+
+  '@prisma/debug@7.5.0': {}
+
+  '@prisma/dev@0.20.0(typescript@5.9.3)':
+    dependencies:
+      '@electric-sql/pglite': 0.3.15
+      '@electric-sql/pglite-socket': 0.0.20(@electric-sql/pglite@0.3.15)
+      '@electric-sql/pglite-tools': 0.2.20(@electric-sql/pglite@0.3.15)
+      '@hono/node-server': 1.19.9(hono@4.11.4)
+      '@mrleebo/prisma-ast': 0.13.1
+      '@prisma/get-platform': 7.2.0
+      '@prisma/query-plan-executor': 7.2.0
+      foreground-child: 3.3.1
+      get-port-please: 3.2.0
+      hono: 4.11.4
+      http-status-codes: 2.3.0
+      pathe: 2.0.3
+      proper-lockfile: 4.1.2
+      remeda: 2.33.4
+      std-env: 3.10.0
+      valibot: 1.2.0(typescript@5.9.3)
+      zeptomatch: 2.1.0
+    transitivePeerDependencies:
+      - typescript
+
+  '@prisma/driver-adapter-utils@7.5.0':
+    dependencies:
+      '@prisma/debug': 7.5.0
+
+  '@prisma/engines-version@7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e': {}
+
+  '@prisma/engines@7.5.0':
+    dependencies:
+      '@prisma/debug': 7.5.0
+      '@prisma/engines-version': 7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e
+      '@prisma/fetch-engine': 7.5.0
+      '@prisma/get-platform': 7.5.0
+
+  '@prisma/fetch-engine@7.5.0':
+    dependencies:
+      '@prisma/debug': 7.5.0
+      '@prisma/engines-version': 7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e
+      '@prisma/get-platform': 7.5.0
+
+  '@prisma/get-platform@7.2.0':
+    dependencies:
+      '@prisma/debug': 7.2.0
+
+  '@prisma/get-platform@7.5.0':
+    dependencies:
+      '@prisma/debug': 7.5.0
+
+  '@prisma/prisma-schema-wasm@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584': {}
+
+  '@prisma/query-plan-executor@7.2.0': {}
+
+  '@prisma/studio-core@0.21.1(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
+    dependencies:
+      '@types/react': 19.2.14
+      react: 19.2.4
+      react-dom: 19.2.4(react@19.2.4)
+
+  '@rolldown/binding-android-arm64@1.0.0-rc.9':
+    optional: true
+
+  '@rolldown/binding-darwin-arm64@1.0.0-rc.9':
+    optional: true
+
+  '@rolldown/binding-darwin-x64@1.0.0-rc.9':
+    optional: true
+
+  '@rolldown/binding-freebsd-x64@1.0.0-rc.9':
+    optional: true
+
+  '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.9':
+    optional: true
+
+  '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9':
+    optional: true
+
+  '@rolldown/binding-linux-arm64-musl@1.0.0-rc.9':
+    optional: true
+
+  '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.9':
+    optional: true
+
+  '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.9':
+    optional: true
+
+  '@rolldown/binding-linux-x64-gnu@1.0.0-rc.9':
+    optional: true
+
+  '@rolldown/binding-linux-x64-musl@1.0.0-rc.9':
+    optional: true
+
+  '@rolldown/binding-openharmony-arm64@1.0.0-rc.9':
+    optional: true
+
+  '@rolldown/binding-wasm32-wasi@1.0.0-rc.9':
+    dependencies:
+      '@napi-rs/wasm-runtime': 1.1.1
+    optional: true
+
+  '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.9':
+    optional: true
+
+  '@rolldown/binding-win32-x64-msvc@1.0.0-rc.9':
+    optional: true
+
+  '@rolldown/pluginutils@1.0.0-rc.2': {}
+
+  '@rolldown/pluginutils@1.0.0-rc.9': {}
+
+  '@rollup/plugin-alias@6.0.0(rollup@4.59.0)':
+    optionalDependencies:
+      rollup: 4.59.0
+
+  '@rollup/plugin-commonjs@29.0.2(rollup@4.59.0)':
+    dependencies:
+      '@rollup/pluginutils': 5.3.0(rollup@4.59.0)
+      commondir: 1.0.1
+      estree-walker: 2.0.2
+      fdir: 6.5.0(picomatch@4.0.3)
+      is-reference: 1.2.1
+      magic-string: 0.30.21
+      picomatch: 4.0.3
+    optionalDependencies:
+      rollup: 4.59.0
+
+  '@rollup/plugin-inject@5.0.5(rollup@4.59.0)':
+    dependencies:
+      '@rollup/pluginutils': 5.3.0(rollup@4.59.0)
+      estree-walker: 2.0.2
+      magic-string: 0.30.21
+    optionalDependencies:
+      rollup: 4.59.0
+
+  '@rollup/plugin-json@6.1.0(rollup@4.59.0)':
+    dependencies:
+      '@rollup/pluginutils': 5.3.0(rollup@4.59.0)
+    optionalDependencies:
+      rollup: 4.59.0
+
+  '@rollup/plugin-node-resolve@16.0.3(rollup@4.59.0)':
+    dependencies:
+      '@rollup/pluginutils': 5.3.0(rollup@4.59.0)
+      '@types/resolve': 1.20.2
+      deepmerge: 4.3.1
+      is-module: 1.0.0
+      resolve: 1.22.11
+    optionalDependencies:
+      rollup: 4.59.0
+
+  '@rollup/plugin-replace@6.0.3(rollup@4.59.0)':
+    dependencies:
+      '@rollup/pluginutils': 5.3.0(rollup@4.59.0)
+      magic-string: 0.30.21
+    optionalDependencies:
+      rollup: 4.59.0
+
+  '@rollup/plugin-terser@0.4.4(rollup@4.59.0)':
+    dependencies:
+      serialize-javascript: 6.0.2
+      smob: 1.6.1
+      terser: 5.46.0
+    optionalDependencies:
+      rollup: 4.59.0
+
+  '@rollup/pluginutils@5.3.0(rollup@4.59.0)':
+    dependencies:
+      '@types/estree': 1.0.8
+      estree-walker: 2.0.2
+      picomatch: 4.0.3
+    optionalDependencies:
+      rollup: 4.59.0
+
+  '@rollup/rollup-android-arm-eabi@4.59.0':
+    optional: true
+
+  '@rollup/rollup-android-arm64@4.59.0':
+    optional: true
+
+  '@rollup/rollup-darwin-arm64@4.59.0':
+    optional: true
+
+  '@rollup/rollup-darwin-x64@4.59.0':
+    optional: true
+
+  '@rollup/rollup-freebsd-arm64@4.59.0':
+    optional: true
+
+  '@rollup/rollup-freebsd-x64@4.59.0':
+    optional: true
+
+  '@rollup/rollup-linux-arm-gnueabihf@4.59.0':
+    optional: true
+
+  '@rollup/rollup-linux-arm-musleabihf@4.59.0':
+    optional: true
+
+  '@rollup/rollup-linux-arm64-gnu@4.59.0':
+    optional: true
+
+  '@rollup/rollup-linux-arm64-musl@4.59.0':
+    optional: true
+
+  '@rollup/rollup-linux-loong64-gnu@4.59.0':
+    optional: true
+
+  '@rollup/rollup-linux-loong64-musl@4.59.0':
+    optional: true
+
+  '@rollup/rollup-linux-ppc64-gnu@4.59.0':
+    optional: true
+
+  '@rollup/rollup-linux-ppc64-musl@4.59.0':
+    optional: true
+
+  '@rollup/rollup-linux-riscv64-gnu@4.59.0':
+    optional: true
+
+  '@rollup/rollup-linux-riscv64-musl@4.59.0':
+    optional: true
+
+  '@rollup/rollup-linux-s390x-gnu@4.59.0':
+    optional: true
+
+  '@rollup/rollup-linux-x64-gnu@4.59.0':
+    optional: true
+
+  '@rollup/rollup-linux-x64-musl@4.59.0':
+    optional: true
+
+  '@rollup/rollup-openbsd-x64@4.59.0':
+    optional: true
+
+  '@rollup/rollup-openharmony-arm64@4.59.0':
+    optional: true
+
+  '@rollup/rollup-win32-arm64-msvc@4.59.0':
+    optional: true
+
+  '@rollup/rollup-win32-ia32-msvc@4.59.0':
+    optional: true
+
+  '@rollup/rollup-win32-x64-gnu@4.59.0':
+    optional: true
+
+  '@rollup/rollup-win32-x64-msvc@4.59.0':
+    optional: true
+
+  '@selderee/plugin-htmlparser2@0.11.0':
+    dependencies:
+      domhandler: 5.0.3
+      selderee: 0.11.0
+
+  '@sindresorhus/is@7.2.0': {}
+
+  '@sindresorhus/merge-streams@4.0.0': {}
+
+  '@socket.io/component-emitter@3.1.2': {}
+
+  '@speed-highlight/core@1.2.14': {}
+
+  '@standard-schema/spec@1.1.0': {}
+
+  '@tailwindcss/node@4.2.1':
+    dependencies:
+      '@jridgewell/remapping': 2.3.5
+      enhanced-resolve: 5.20.0
+      jiti: 2.6.1
+      lightningcss: 1.31.1
+      magic-string: 0.30.21
+      source-map-js: 1.2.1
+      tailwindcss: 4.2.1
+
+  '@tailwindcss/oxide-android-arm64@4.2.1':
+    optional: true
+
+  '@tailwindcss/oxide-darwin-arm64@4.2.1':
+    optional: true
+
+  '@tailwindcss/oxide-darwin-x64@4.2.1':
+    optional: true
+
+  '@tailwindcss/oxide-freebsd-x64@4.2.1':
+    optional: true
+
+  '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1':
+    optional: true
+
+  '@tailwindcss/oxide-linux-arm64-gnu@4.2.1':
+    optional: true
+
+  '@tailwindcss/oxide-linux-arm64-musl@4.2.1':
+    optional: true
+
+  '@tailwindcss/oxide-linux-x64-gnu@4.2.1':
+    optional: true
+
+  '@tailwindcss/oxide-linux-x64-musl@4.2.1':
+    optional: true
+
+  '@tailwindcss/oxide-wasm32-wasi@4.2.1':
+    optional: true
+
+  '@tailwindcss/oxide-win32-arm64-msvc@4.2.1':
+    optional: true
+
+  '@tailwindcss/oxide-win32-x64-msvc@4.2.1':
+    optional: true
+
+  '@tailwindcss/oxide@4.2.1':
+    optionalDependencies:
+      '@tailwindcss/oxide-android-arm64': 4.2.1
+      '@tailwindcss/oxide-darwin-arm64': 4.2.1
+      '@tailwindcss/oxide-darwin-x64': 4.2.1
+      '@tailwindcss/oxide-freebsd-x64': 4.2.1
+      '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.1
+      '@tailwindcss/oxide-linux-arm64-gnu': 4.2.1
+      '@tailwindcss/oxide-linux-arm64-musl': 4.2.1
+      '@tailwindcss/oxide-linux-x64-gnu': 4.2.1
+      '@tailwindcss/oxide-linux-x64-musl': 4.2.1
+      '@tailwindcss/oxide-wasm32-wasi': 4.2.1
+      '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1
+      '@tailwindcss/oxide-win32-x64-msvc': 4.2.1
+
+  '@tailwindcss/typography@0.5.19(tailwindcss@4.2.1)':
+    dependencies:
+      postcss-selector-parser: 6.0.10
+      tailwindcss: 4.2.1
+
+  '@tailwindcss/vite@4.2.1(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))':
+    dependencies:
+      '@tailwindcss/node': 4.2.1
+      '@tailwindcss/oxide': 4.2.1
+      tailwindcss: 4.2.1
+      vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+
+  '@tybys/wasm-util@0.10.1':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@types/cors@2.8.19':
+    dependencies:
+      '@types/node': 25.5.0
+
+  '@types/estree@1.0.8': {}
+
+  '@types/node@25.5.0':
+    dependencies:
+      undici-types: 7.18.2
+
+  '@types/pg@8.11.11':
+    dependencies:
+      '@types/node': 25.5.0
+      pg-protocol: 1.13.0
+      pg-types: 4.1.0
+
+  '@types/react@19.2.14':
+    dependencies:
+      csstype: 3.2.3
+
+  '@types/resolve@1.20.2': {}
+
+  '@types/ws@8.18.1':
+    dependencies:
+      '@types/node': 25.5.0
+
+  '@unhead/vue@2.1.12(vue@3.5.30(typescript@5.9.3))':
+    dependencies:
+      hookable: 6.0.1
+      unhead: 2.1.12
+      vue: 3.5.30(typescript@5.9.3)
+
+  '@vercel/nft@1.3.2(rollup@4.59.0)':
+    dependencies:
+      '@mapbox/node-pre-gyp': 2.0.3
+      '@rollup/pluginutils': 5.3.0(rollup@4.59.0)
+      acorn: 8.16.0
+      acorn-import-attributes: 1.9.5(acorn@8.16.0)
+      async-sema: 3.1.1
+      bindings: 1.5.0
+      estree-walker: 2.0.2
+      glob: 13.0.6
+      graceful-fs: 4.2.11
+      node-gyp-build: 4.8.4
+      picomatch: 4.0.3
+      resolve-from: 5.0.0
+    transitivePeerDependencies:
+      - encoding
+      - rollup
+      - supports-color
+
+  '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))':
+    dependencies:
+      '@babel/core': 7.29.0
+      '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0)
+      '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0)
+      '@rolldown/pluginutils': 1.0.0-rc.9
+      '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.0)
+      vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+      vue: 3.5.30(typescript@5.9.3)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vitejs/plugin-vue@6.0.5(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))':
+    dependencies:
+      '@rolldown/pluginutils': 1.0.0-rc.2
+      vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+      vue: 3.5.30(typescript@5.9.3)
+
+  '@vue-macros/common@3.1.2(vue@3.5.30(typescript@5.9.3))':
+    dependencies:
+      '@vue/compiler-sfc': 3.5.30
+      ast-kit: 2.2.0
+      local-pkg: 1.1.2
+      magic-string-ast: 1.0.3
+      unplugin-utils: 0.3.1
+    optionalDependencies:
+      vue: 3.5.30(typescript@5.9.3)
+
+  '@vue/babel-helper-vue-transform-on@2.0.1': {}
+
+  '@vue/babel-plugin-jsx@2.0.1(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/helper-module-imports': 7.28.6
+      '@babel/helper-plugin-utils': 7.28.6
+      '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0)
+      '@babel/template': 7.28.6
+      '@babel/traverse': 7.29.0
+      '@babel/types': 7.29.0
+      '@vue/babel-helper-vue-transform-on': 2.0.1
+      '@vue/babel-plugin-resolve-type': 2.0.1(@babel/core@7.29.0)
+      '@vue/shared': 3.5.30
+    optionalDependencies:
+      '@babel/core': 7.29.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/code-frame': 7.29.0
+      '@babel/core': 7.29.0
+      '@babel/helper-module-imports': 7.28.6
+      '@babel/helper-plugin-utils': 7.28.6
+      '@babel/parser': 7.29.0
+      '@vue/compiler-sfc': 3.5.30
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vue/compiler-core@3.5.30':
+    dependencies:
+      '@babel/parser': 7.29.0
+      '@vue/shared': 3.5.30
+      entities: 7.0.1
+      estree-walker: 2.0.2
+      source-map-js: 1.2.1
+
+  '@vue/compiler-dom@3.5.30':
+    dependencies:
+      '@vue/compiler-core': 3.5.30
+      '@vue/shared': 3.5.30
+
+  '@vue/compiler-sfc@3.5.30':
+    dependencies:
+      '@babel/parser': 7.29.0
+      '@vue/compiler-core': 3.5.30
+      '@vue/compiler-dom': 3.5.30
+      '@vue/compiler-ssr': 3.5.30
+      '@vue/shared': 3.5.30
+      estree-walker: 2.0.2
+      magic-string: 0.30.21
+      postcss: 8.5.8
+      source-map-js: 1.2.1
+
+  '@vue/compiler-ssr@3.5.30':
+    dependencies:
+      '@vue/compiler-dom': 3.5.30
+      '@vue/shared': 3.5.30
+
+  '@vue/devtools-api@7.7.9':
+    dependencies:
+      '@vue/devtools-kit': 7.7.9
+
+  '@vue/devtools-api@8.1.0':
+    dependencies:
+      '@vue/devtools-kit': 8.1.0
+
+  '@vue/devtools-core@8.1.0(vue@3.5.30(typescript@5.9.3))':
+    dependencies:
+      '@vue/devtools-kit': 8.1.0
+      '@vue/devtools-shared': 8.1.0
+      vue: 3.5.30(typescript@5.9.3)
+
+  '@vue/devtools-kit@7.7.9':
+    dependencies:
+      '@vue/devtools-shared': 7.7.9
+      birpc: 2.9.0
+      hookable: 5.5.3
+      mitt: 3.0.1
+      perfect-debounce: 1.0.0
+      speakingurl: 14.0.1
+      superjson: 2.2.6
+
+  '@vue/devtools-kit@8.1.0':
+    dependencies:
+      '@vue/devtools-shared': 8.1.0
+      birpc: 2.9.0
+      hookable: 5.5.3
+      perfect-debounce: 2.1.0
+
+  '@vue/devtools-shared@7.7.9':
+    dependencies:
+      rfdc: 1.4.1
+
+  '@vue/devtools-shared@8.1.0': {}
+
+  '@vue/reactivity@3.5.30':
+    dependencies:
+      '@vue/shared': 3.5.30
+
+  '@vue/runtime-core@3.5.30':
+    dependencies:
+      '@vue/reactivity': 3.5.30
+      '@vue/shared': 3.5.30
+
+  '@vue/runtime-dom@3.5.30':
+    dependencies:
+      '@vue/reactivity': 3.5.30
+      '@vue/runtime-core': 3.5.30
+      '@vue/shared': 3.5.30
+      csstype: 3.2.3
+
+  '@vue/server-renderer@3.5.30(vue@3.5.30(typescript@5.9.3))':
+    dependencies:
+      '@vue/compiler-ssr': 3.5.30
+      '@vue/shared': 3.5.30
+      vue: 3.5.30(typescript@5.9.3)
+
+  '@vue/shared@3.5.30': {}
+
+  abbrev@3.0.1: {}
+
+  abort-controller@3.0.0:
+    dependencies:
+      event-target-shim: 5.0.1
+
+  accepts@1.3.8:
+    dependencies:
+      mime-types: 2.1.35
+      negotiator: 0.6.3
+
+  acorn-import-attributes@1.9.5(acorn@8.16.0):
+    dependencies:
+      acorn: 8.16.0
+
+  acorn@8.16.0: {}
+
+  agent-base@7.1.4: {}
+
+  ansi-regex@5.0.1: {}
+
+  ansi-regex@6.2.2: {}
+
+  ansi-styles@4.3.0:
+    dependencies:
+      color-convert: 2.0.1
+
+  ansi-styles@6.2.3: {}
+
+  ansis@4.2.0: {}
+
+  anymatch@3.1.3:
+    dependencies:
+      normalize-path: 3.0.0
+      picomatch: 2.3.1
+
+  archiver-utils@5.0.2:
+    dependencies:
+      glob: 10.5.0
+      graceful-fs: 4.2.11
+      is-stream: 2.0.1
+      lazystream: 1.0.1
+      lodash: 4.17.23
+      normalize-path: 3.0.0
+      readable-stream: 4.7.0
+
+  archiver@7.0.1:
+    dependencies:
+      archiver-utils: 5.0.2
+      async: 3.2.6
+      buffer-crc32: 1.0.0
+      readable-stream: 4.7.0
+      readdir-glob: 1.1.3
+      tar-stream: 3.1.8
+      zip-stream: 6.0.1
+    transitivePeerDependencies:
+      - bare-abort-controller
+      - bare-buffer
+      - react-native-b4a
+
+  ast-kit@2.2.0:
+    dependencies:
+      '@babel/parser': 7.29.0
+      pathe: 2.0.3
+
+  ast-walker-scope@0.8.3:
+    dependencies:
+      '@babel/parser': 7.29.0
+      ast-kit: 2.2.0
+
+  async-sema@3.1.1: {}
+
+  async@3.2.6: {}
+
+  autoprefixer@10.4.27(postcss@8.5.8):
+    dependencies:
+      browserslist: 4.28.1
+      caniuse-lite: 1.0.30001778
+      fraction.js: 5.3.4
+      picocolors: 1.1.1
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  aws-ssl-profiles@1.1.2: {}
+
+  b4a@1.8.0: {}
+
+  balanced-match@1.0.2: {}
+
+  balanced-match@4.0.4: {}
+
+  bare-events@2.8.2: {}
+
+  bare-fs@4.5.5:
+    dependencies:
+      bare-events: 2.8.2
+      bare-path: 3.0.0
+      bare-stream: 2.8.1(bare-events@2.8.2)
+      bare-url: 2.3.2
+      fast-fifo: 1.3.2
+    transitivePeerDependencies:
+      - bare-abort-controller
+      - react-native-b4a
+
+  bare-os@3.7.1: {}
+
+  bare-path@3.0.0:
+    dependencies:
+      bare-os: 3.7.1
+
+  bare-stream@2.8.1(bare-events@2.8.2):
+    dependencies:
+      streamx: 2.23.0
+      teex: 1.0.1
+    optionalDependencies:
+      bare-events: 2.8.2
+    transitivePeerDependencies:
+      - bare-abort-controller
+      - react-native-b4a
+
+  bare-url@2.3.2:
+    dependencies:
+      bare-path: 3.0.0
+
+  base64-js@1.5.1: {}
+
+  base64id@2.0.0: {}
+
+  baseline-browser-mapping@2.10.7: {}
+
+  binary-extensions@2.3.0: {}
+
+  bindings@1.5.0:
+    dependencies:
+      file-uri-to-path: 1.0.0
+
+  birpc@2.9.0: {}
+
+  birpc@4.0.0: {}
+
+  boolbase@1.0.0: {}
+
+  brace-expansion@2.0.2:
+    dependencies:
+      balanced-match: 1.0.2
+
+  brace-expansion@5.0.4:
+    dependencies:
+      balanced-match: 4.0.4
+
+  braces@3.0.3:
+    dependencies:
+      fill-range: 7.1.1
+
+  browserslist@4.28.1:
+    dependencies:
+      baseline-browser-mapping: 2.10.7
+      caniuse-lite: 1.0.30001778
+      electron-to-chromium: 1.5.313
+      node-releases: 2.0.36
+      update-browserslist-db: 1.2.3(browserslist@4.28.1)
+
+  buffer-crc32@1.0.0: {}
+
+  buffer-from@1.1.2: {}
+
+  buffer@6.0.3:
+    dependencies:
+      base64-js: 1.5.1
+      ieee754: 1.2.1
+
+  bundle-name@4.1.0:
+    dependencies:
+      run-applescript: 7.1.0
+
+  c12@3.1.0(magicast@0.5.2):
+    dependencies:
+      chokidar: 4.0.3
+      confbox: 0.2.4
+      defu: 6.1.4
+      dotenv: 16.6.1
+      exsolve: 1.0.8
+      giget: 2.0.0
+      jiti: 2.6.1
+      ohash: 2.0.11
+      pathe: 2.0.3
+      perfect-debounce: 1.0.0
+      pkg-types: 2.3.0
+      rc9: 2.1.2
+    optionalDependencies:
+      magicast: 0.5.2
+
+  c12@3.3.3(magicast@0.5.2):
+    dependencies:
+      chokidar: 5.0.0
+      confbox: 0.2.4
+      defu: 6.1.4
+      dotenv: 17.3.1
+      exsolve: 1.0.8
+      giget: 2.0.0
+      jiti: 2.6.1
+      ohash: 2.0.11
+      pathe: 2.0.3
+      perfect-debounce: 2.1.0
+      pkg-types: 2.3.0
+      rc9: 2.1.2
+    optionalDependencies:
+      magicast: 0.5.2
+
+  cac@6.7.14: {}
+
+  caniuse-api@3.0.0:
+    dependencies:
+      browserslist: 4.28.1
+      caniuse-lite: 1.0.30001778
+      lodash.memoize: 4.1.2
+      lodash.uniq: 4.5.0
+
+  caniuse-lite@1.0.30001778: {}
+
+  chevrotain@10.5.0:
+    dependencies:
+      '@chevrotain/cst-dts-gen': 10.5.0
+      '@chevrotain/gast': 10.5.0
+      '@chevrotain/types': 10.5.0
+      '@chevrotain/utils': 10.5.0
+      lodash: 4.17.21
+      regexp-to-ast: 0.5.0
+
+  chokidar@3.6.0:
+    dependencies:
+      anymatch: 3.1.3
+      braces: 3.0.3
+      glob-parent: 5.1.2
+      is-binary-path: 2.1.0
+      is-glob: 4.0.3
+      normalize-path: 3.0.0
+      readdirp: 3.6.0
+    optionalDependencies:
+      fsevents: 2.3.3
+
+  chokidar@4.0.3:
+    dependencies:
+      readdirp: 4.1.2
+
+  chokidar@5.0.0:
+    dependencies:
+      readdirp: 5.0.0
+
+  chownr@3.0.0: {}
+
+  citty@0.1.6:
+    dependencies:
+      consola: 3.4.2
+
+  citty@0.2.1: {}
+
+  clipboardy@4.0.0:
+    dependencies:
+      execa: 8.0.1
+      is-wsl: 3.1.1
+      is64bit: 2.0.0
+
+  cliui@8.0.1:
+    dependencies:
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      wrap-ansi: 7.0.0
+
+  cluster-key-slot@1.1.2: {}
+
+  color-convert@2.0.1:
+    dependencies:
+      color-name: 1.1.4
+
+  color-name@1.1.4: {}
+
+  colord@2.9.3: {}
+
+  commander@11.1.0: {}
+
+  commander@2.20.3: {}
+
+  commondir@1.0.1: {}
+
+  compatx@0.2.0: {}
+
+  compress-commons@6.0.2:
+    dependencies:
+      crc-32: 1.2.2
+      crc32-stream: 6.0.0
+      is-stream: 2.0.1
+      normalize-path: 3.0.0
+      readable-stream: 4.7.0
+
+  confbox@0.1.8: {}
+
+  confbox@0.2.4: {}
+
+  consola@3.4.2: {}
+
+  convert-source-map@2.0.0: {}
+
+  cookie-es@1.2.2: {}
+
+  cookie-es@2.0.0: {}
+
+  cookie@0.7.2: {}
+
+  copy-anything@4.0.5:
+    dependencies:
+      is-what: 5.5.0
+
+  core-util-is@1.0.3: {}
+
+  cors@2.8.6:
+    dependencies:
+      object-assign: 4.1.1
+      vary: 1.1.2
+
+  crc-32@1.2.2: {}
+
+  crc32-stream@6.0.0:
+    dependencies:
+      crc-32: 1.2.2
+      readable-stream: 4.7.0
+
+  croner@9.1.0: {}
+
+  cross-spawn@7.0.6:
+    dependencies:
+      path-key: 3.1.1
+      shebang-command: 2.0.0
+      which: 2.0.2
+
+  crossws@0.3.5:
+    dependencies:
+      uncrypto: 0.1.3
+
+  css-declaration-sorter@7.3.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+
+  css-select@5.2.2:
+    dependencies:
+      boolbase: 1.0.0
+      css-what: 6.2.2
+      domhandler: 5.0.3
+      domutils: 3.2.2
+      nth-check: 2.1.1
+
+  css-tree@2.2.1:
+    dependencies:
+      mdn-data: 2.0.28
+      source-map-js: 1.2.1
+
+  css-tree@3.2.1:
+    dependencies:
+      mdn-data: 2.27.1
+      source-map-js: 1.2.1
+
+  css-what@6.2.2: {}
+
+  cssesc@3.0.0: {}
+
+  cssnano-preset-default@7.0.11(postcss@8.5.8):
+    dependencies:
+      browserslist: 4.28.1
+      css-declaration-sorter: 7.3.1(postcss@8.5.8)
+      cssnano-utils: 5.0.1(postcss@8.5.8)
+      postcss: 8.5.8
+      postcss-calc: 10.1.1(postcss@8.5.8)
+      postcss-colormin: 7.0.6(postcss@8.5.8)
+      postcss-convert-values: 7.0.9(postcss@8.5.8)
+      postcss-discard-comments: 7.0.6(postcss@8.5.8)
+      postcss-discard-duplicates: 7.0.2(postcss@8.5.8)
+      postcss-discard-empty: 7.0.1(postcss@8.5.8)
+      postcss-discard-overridden: 7.0.1(postcss@8.5.8)
+      postcss-merge-longhand: 7.0.5(postcss@8.5.8)
+      postcss-merge-rules: 7.0.8(postcss@8.5.8)
+      postcss-minify-font-values: 7.0.1(postcss@8.5.8)
+      postcss-minify-gradients: 7.0.1(postcss@8.5.8)
+      postcss-minify-params: 7.0.6(postcss@8.5.8)
+      postcss-minify-selectors: 7.0.6(postcss@8.5.8)
+      postcss-normalize-charset: 7.0.1(postcss@8.5.8)
+      postcss-normalize-display-values: 7.0.1(postcss@8.5.8)
+      postcss-normalize-positions: 7.0.1(postcss@8.5.8)
+      postcss-normalize-repeat-style: 7.0.1(postcss@8.5.8)
+      postcss-normalize-string: 7.0.1(postcss@8.5.8)
+      postcss-normalize-timing-functions: 7.0.1(postcss@8.5.8)
+      postcss-normalize-unicode: 7.0.6(postcss@8.5.8)
+      postcss-normalize-url: 7.0.1(postcss@8.5.8)
+      postcss-normalize-whitespace: 7.0.1(postcss@8.5.8)
+      postcss-ordered-values: 7.0.2(postcss@8.5.8)
+      postcss-reduce-initial: 7.0.6(postcss@8.5.8)
+      postcss-reduce-transforms: 7.0.1(postcss@8.5.8)
+      postcss-svgo: 7.1.1(postcss@8.5.8)
+      postcss-unique-selectors: 7.0.5(postcss@8.5.8)
+
+  cssnano-utils@5.0.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+
+  cssnano@7.1.3(postcss@8.5.8):
+    dependencies:
+      cssnano-preset-default: 7.0.11(postcss@8.5.8)
+      lilconfig: 3.1.3
+      postcss: 8.5.8
+
+  csso@5.0.5:
+    dependencies:
+      css-tree: 2.2.1
+
+  csstype@3.2.3: {}
+
+  db0@0.3.4(@electric-sql/pglite@0.3.15)(mysql2@3.15.3):
+    optionalDependencies:
+      '@electric-sql/pglite': 0.3.15
+      mysql2: 3.15.3
+
+  debug@4.4.3:
+    dependencies:
+      ms: 2.1.3
+
+  deepmerge-ts@7.1.5: {}
+
+  deepmerge@4.3.1: {}
+
+  default-browser-id@5.0.1: {}
+
+  default-browser@5.5.0:
+    dependencies:
+      bundle-name: 4.1.0
+      default-browser-id: 5.0.1
+
+  define-lazy-prop@2.0.0: {}
+
+  define-lazy-prop@3.0.0: {}
+
+  defu@6.1.4: {}
+
+  denque@2.1.0: {}
+
+  depd@2.0.0: {}
+
+  destr@2.0.5: {}
+
+  detect-libc@2.1.2: {}
+
+  devalue@5.6.4: {}
+
+  diff@5.2.2: {}
+
+  diff@8.0.3: {}
+
+  dom-serializer@2.0.0:
+    dependencies:
+      domelementtype: 2.3.0
+      domhandler: 5.0.3
+      entities: 4.5.0
+
+  domelementtype@2.3.0: {}
+
+  domhandler@5.0.3:
+    dependencies:
+      domelementtype: 2.3.0
+
+  domutils@3.2.2:
+    dependencies:
+      dom-serializer: 2.0.0
+      domelementtype: 2.3.0
+      domhandler: 5.0.3
+
+  dot-prop@10.1.0:
+    dependencies:
+      type-fest: 5.4.4
+
+  dotenv@16.6.1: {}
+
+  dotenv@17.3.1: {}
+
+  duplexer@0.1.2: {}
+
+  eastasianwidth@0.2.0: {}
+
+  ee-first@1.1.1: {}
+
+  effect@3.18.4:
+    dependencies:
+      '@standard-schema/spec': 1.1.0
+      fast-check: 3.23.2
+
+  electron-to-chromium@1.5.313: {}
+
+  emoji-regex@8.0.0: {}
+
+  emoji-regex@9.2.2: {}
+
+  empathic@2.0.0: {}
+
+  encodeurl@2.0.0: {}
+
+  engine.io-client@6.6.4:
+    dependencies:
+      '@socket.io/component-emitter': 3.1.2
+      debug: 4.4.3
+      engine.io-parser: 5.2.3
+      ws: 8.18.3
+      xmlhttprequest-ssl: 2.1.2
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+
+  engine.io-parser@5.2.3: {}
+
+  engine.io@6.6.6:
+    dependencies:
+      '@types/cors': 2.8.19
+      '@types/node': 25.5.0
+      '@types/ws': 8.18.1
+      accepts: 1.3.8
+      base64id: 2.0.0
+      cookie: 0.7.2
+      cors: 2.8.6
+      debug: 4.4.3
+      engine.io-parser: 5.2.3
+      ws: 8.18.3
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+
+  enhanced-resolve@5.20.0:
+    dependencies:
+      graceful-fs: 4.2.11
+      tapable: 2.3.0
+
+  entities@4.5.0: {}
+
+  entities@7.0.1: {}
+
+  error-stack-parser-es@1.0.5: {}
+
+  errx@0.1.0: {}
+
+  es-module-lexer@2.0.0: {}
+
+  esbuild@0.27.4:
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.27.4
+      '@esbuild/android-arm': 0.27.4
+      '@esbuild/android-arm64': 0.27.4
+      '@esbuild/android-x64': 0.27.4
+      '@esbuild/darwin-arm64': 0.27.4
+      '@esbuild/darwin-x64': 0.27.4
+      '@esbuild/freebsd-arm64': 0.27.4
+      '@esbuild/freebsd-x64': 0.27.4
+      '@esbuild/linux-arm': 0.27.4
+      '@esbuild/linux-arm64': 0.27.4
+      '@esbuild/linux-ia32': 0.27.4
+      '@esbuild/linux-loong64': 0.27.4
+      '@esbuild/linux-mips64el': 0.27.4
+      '@esbuild/linux-ppc64': 0.27.4
+      '@esbuild/linux-riscv64': 0.27.4
+      '@esbuild/linux-s390x': 0.27.4
+      '@esbuild/linux-x64': 0.27.4
+      '@esbuild/netbsd-arm64': 0.27.4
+      '@esbuild/netbsd-x64': 0.27.4
+      '@esbuild/openbsd-arm64': 0.27.4
+      '@esbuild/openbsd-x64': 0.27.4
+      '@esbuild/openharmony-arm64': 0.27.4
+      '@esbuild/sunos-x64': 0.27.4
+      '@esbuild/win32-arm64': 0.27.4
+      '@esbuild/win32-ia32': 0.27.4
+      '@esbuild/win32-x64': 0.27.4
+
+  escalade@3.2.0: {}
+
+  escape-html@1.0.3: {}
+
+  escape-string-regexp@5.0.0: {}
+
+  estree-walker@2.0.2: {}
+
+  estree-walker@3.0.3:
+    dependencies:
+      '@types/estree': 1.0.8
+
+  etag@1.8.1: {}
+
+  event-target-shim@5.0.1: {}
+
+  events-universal@1.0.1:
+    dependencies:
+      bare-events: 2.8.2
+    transitivePeerDependencies:
+      - bare-abort-controller
+
+  events@3.3.0: {}
+
+  execa@8.0.1:
+    dependencies:
+      cross-spawn: 7.0.6
+      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
+
+  exsolve@1.0.8: {}
+
+  fast-check@3.23.2:
+    dependencies:
+      pure-rand: 6.1.0
+
+  fast-fifo@1.3.2: {}
+
+  fast-glob@3.3.3:
+    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.8
+
+  fast-npm-meta@1.4.2: {}
+
+  fastq@1.20.1:
+    dependencies:
+      reusify: 1.1.0
+
+  fdir@6.5.0(picomatch@4.0.3):
+    optionalDependencies:
+      picomatch: 4.0.3
+
+  file-uri-to-path@1.0.0: {}
+
+  fill-range@7.1.1:
+    dependencies:
+      to-regex-range: 5.0.1
+
+  foreground-child@3.3.1:
+    dependencies:
+      cross-spawn: 7.0.6
+      signal-exit: 4.1.0
+
+  fraction.js@5.3.4: {}
+
+  fresh@2.0.0: {}
+
+  fsevents@2.3.3:
+    optional: true
+
+  function-bind@1.1.2: {}
+
+  fuse.js@7.1.0: {}
+
+  fzf@0.5.2: {}
+
+  generate-function@2.3.1:
+    dependencies:
+      is-property: 1.0.2
+
+  gensync@1.0.0-beta.2: {}
+
+  get-caller-file@2.0.5: {}
+
+  get-port-please@3.2.0: {}
+
+  get-stream@8.0.1: {}
+
+  get-tsconfig@4.13.6:
+    dependencies:
+      resolve-pkg-maps: 1.0.0
+
+  giget@2.0.0:
+    dependencies:
+      citty: 0.1.6
+      consola: 3.4.2
+      defu: 6.1.4
+      node-fetch-native: 1.6.7
+      nypm: 0.6.5
+      pathe: 2.0.3
+
+  giget@3.1.2: {}
+
+  glob-parent@5.1.2:
+    dependencies:
+      is-glob: 4.0.3
+
+  glob@10.5.0:
+    dependencies:
+      foreground-child: 3.3.1
+      jackspeak: 3.4.3
+      minimatch: 9.0.9
+      minipass: 7.1.3
+      package-json-from-dist: 1.0.1
+      path-scurry: 1.11.1
+
+  glob@13.0.6:
+    dependencies:
+      minimatch: 10.2.4
+      minipass: 7.1.3
+      path-scurry: 2.0.2
+
+  global-directory@4.0.1:
+    dependencies:
+      ini: 4.1.1
+
+  globby@16.1.1:
+    dependencies:
+      '@sindresorhus/merge-streams': 4.0.0
+      fast-glob: 3.3.3
+      ignore: 7.0.5
+      is-path-inside: 4.0.0
+      slash: 5.1.0
+      unicorn-magic: 0.4.0
+
+  graceful-fs@4.2.11: {}
+
+  grammex@3.1.12: {}
+
+  graphmatch@1.1.1: {}
+
+  gzip-size@7.0.0:
+    dependencies:
+      duplexer: 0.1.2
+
+  h3@1.15.6:
+    dependencies:
+      cookie-es: 1.2.2
+      crossws: 0.3.5
+      defu: 6.1.4
+      destr: 2.0.5
+      iron-webcrypto: 1.2.1
+      node-mock-http: 1.0.4
+      radix3: 1.1.2
+      ufo: 1.6.3
+      uncrypto: 0.1.3
+
+  hasown@2.0.2:
+    dependencies:
+      function-bind: 1.1.2
+
+  hono@4.11.4: {}
+
+  hookable@5.5.3: {}
+
+  hookable@6.0.1: {}
+
+  html-to-text@9.0.5:
+    dependencies:
+      '@selderee/plugin-htmlparser2': 0.11.0
+      deepmerge: 4.3.1
+      dom-serializer: 2.0.0
+      htmlparser2: 8.0.2
+      selderee: 0.11.0
+
+  htmlparser2@8.0.2:
+    dependencies:
+      domelementtype: 2.3.0
+      domhandler: 5.0.3
+      domutils: 3.2.2
+      entities: 4.5.0
+
+  http-errors@2.0.1:
+    dependencies:
+      depd: 2.0.0
+      inherits: 2.0.4
+      setprototypeof: 1.2.0
+      statuses: 2.0.2
+      toidentifier: 1.0.1
+
+  http-shutdown@1.2.2: {}
+
+  http-status-codes@2.3.0: {}
+
+  https-proxy-agent@7.0.6:
+    dependencies:
+      agent-base: 7.1.4
+      debug: 4.4.3
+    transitivePeerDependencies:
+      - supports-color
+
+  httpxy@0.1.7: {}
+
+  human-signals@5.0.0: {}
+
+  iconv-lite@0.7.2:
+    dependencies:
+      safer-buffer: 2.1.2
+
+  ieee754@1.2.1: {}
+
+  ignore@7.0.5: {}
+
+  image-meta@0.2.2: {}
+
+  impound@1.1.5:
+    dependencies:
+      '@jridgewell/trace-mapping': 0.3.31
+      es-module-lexer: 2.0.0
+      pathe: 2.0.3
+      unplugin: 3.0.0
+      unplugin-utils: 0.3.1
+
+  inherits@2.0.4: {}
+
+  ini@4.1.1: {}
+
+  ioredis@5.10.0:
+    dependencies:
+      '@ioredis/commands': 1.5.1
+      cluster-key-slot: 1.1.2
+      debug: 4.4.3
+      denque: 2.1.0
+      lodash.defaults: 4.2.0
+      lodash.isarguments: 3.1.0
+      redis-errors: 1.2.0
+      redis-parser: 3.0.0
+      standard-as-callback: 2.1.0
+    transitivePeerDependencies:
+      - supports-color
+
+  iron-webcrypto@1.2.1: {}
+
+  is-binary-path@2.1.0:
+    dependencies:
+      binary-extensions: 2.3.0
+
+  is-core-module@2.16.1:
+    dependencies:
+      hasown: 2.0.2
+
+  is-docker@2.2.1: {}
+
+  is-docker@3.0.0: {}
+
+  is-extglob@2.1.1: {}
+
+  is-fullwidth-code-point@3.0.0: {}
+
+  is-glob@4.0.3:
+    dependencies:
+      is-extglob: 2.1.1
+
+  is-inside-container@1.0.0:
+    dependencies:
+      is-docker: 3.0.0
+
+  is-installed-globally@1.0.0:
+    dependencies:
+      global-directory: 4.0.1
+      is-path-inside: 4.0.0
+
+  is-module@1.0.0: {}
+
+  is-number@7.0.0: {}
+
+  is-path-inside@4.0.0: {}
+
+  is-property@1.0.2: {}
+
+  is-reference@1.2.1:
+    dependencies:
+      '@types/estree': 1.0.8
+
+  is-stream@2.0.1: {}
+
+  is-stream@3.0.0: {}
+
+  is-what@5.5.0: {}
+
+  is-wsl@2.2.0:
+    dependencies:
+      is-docker: 2.2.1
+
+  is-wsl@3.1.1:
+    dependencies:
+      is-inside-container: 1.0.0
+
+  is64bit@2.0.0:
+    dependencies:
+      system-architecture: 0.1.0
+
+  isarray@1.0.0: {}
+
+  isexe@2.0.0: {}
+
+  isexe@3.1.5: {}
+
+  jackspeak@3.4.3:
+    dependencies:
+      '@isaacs/cliui': 8.0.2
+    optionalDependencies:
+      '@pkgjs/parseargs': 0.11.0
+
+  jiti@2.6.1: {}
+
+  js-tokens@4.0.0: {}
+
+  js-tokens@9.0.1: {}
+
+  jsesc@3.1.0: {}
+
+  json5@2.2.3: {}
+
+  kleur@4.1.5: {}
+
+  klona@2.0.6: {}
+
+  knitwork@1.3.0: {}
+
+  launch-editor@2.13.1:
+    dependencies:
+      picocolors: 1.1.1
+      shell-quote: 1.8.3
+
+  lazystream@1.0.1:
+    dependencies:
+      readable-stream: 2.3.8
+
+  leac@0.6.0: {}
+
+  lightningcss-android-arm64@1.31.1:
+    optional: true
+
+  lightningcss-android-arm64@1.32.0:
+    optional: true
+
+  lightningcss-darwin-arm64@1.31.1:
+    optional: true
+
+  lightningcss-darwin-arm64@1.32.0:
+    optional: true
+
+  lightningcss-darwin-x64@1.31.1:
+    optional: true
+
+  lightningcss-darwin-x64@1.32.0:
+    optional: true
+
+  lightningcss-freebsd-x64@1.31.1:
+    optional: true
+
+  lightningcss-freebsd-x64@1.32.0:
+    optional: true
+
+  lightningcss-linux-arm-gnueabihf@1.31.1:
+    optional: true
+
+  lightningcss-linux-arm-gnueabihf@1.32.0:
+    optional: true
+
+  lightningcss-linux-arm64-gnu@1.31.1:
+    optional: true
+
+  lightningcss-linux-arm64-gnu@1.32.0:
+    optional: true
+
+  lightningcss-linux-arm64-musl@1.31.1:
+    optional: true
+
+  lightningcss-linux-arm64-musl@1.32.0:
+    optional: true
+
+  lightningcss-linux-x64-gnu@1.31.1:
+    optional: true
+
+  lightningcss-linux-x64-gnu@1.32.0:
+    optional: true
+
+  lightningcss-linux-x64-musl@1.31.1:
+    optional: true
+
+  lightningcss-linux-x64-musl@1.32.0:
+    optional: true
+
+  lightningcss-win32-arm64-msvc@1.31.1:
+    optional: true
+
+  lightningcss-win32-arm64-msvc@1.32.0:
+    optional: true
+
+  lightningcss-win32-x64-msvc@1.31.1:
+    optional: true
+
+  lightningcss-win32-x64-msvc@1.32.0:
+    optional: true
+
+  lightningcss@1.31.1:
+    dependencies:
+      detect-libc: 2.1.2
+    optionalDependencies:
+      lightningcss-android-arm64: 1.31.1
+      lightningcss-darwin-arm64: 1.31.1
+      lightningcss-darwin-x64: 1.31.1
+      lightningcss-freebsd-x64: 1.31.1
+      lightningcss-linux-arm-gnueabihf: 1.31.1
+      lightningcss-linux-arm64-gnu: 1.31.1
+      lightningcss-linux-arm64-musl: 1.31.1
+      lightningcss-linux-x64-gnu: 1.31.1
+      lightningcss-linux-x64-musl: 1.31.1
+      lightningcss-win32-arm64-msvc: 1.31.1
+      lightningcss-win32-x64-msvc: 1.31.1
+
+  lightningcss@1.32.0:
+    dependencies:
+      detect-libc: 2.1.2
+    optionalDependencies:
+      lightningcss-android-arm64: 1.32.0
+      lightningcss-darwin-arm64: 1.32.0
+      lightningcss-darwin-x64: 1.32.0
+      lightningcss-freebsd-x64: 1.32.0
+      lightningcss-linux-arm-gnueabihf: 1.32.0
+      lightningcss-linux-arm64-gnu: 1.32.0
+      lightningcss-linux-arm64-musl: 1.32.0
+      lightningcss-linux-x64-gnu: 1.32.0
+      lightningcss-linux-x64-musl: 1.32.0
+      lightningcss-win32-arm64-msvc: 1.32.0
+      lightningcss-win32-x64-msvc: 1.32.0
+    optional: true
+
+  lilconfig@2.1.0: {}
+
+  lilconfig@3.1.3: {}
+
+  listhen@1.9.0:
+    dependencies:
+      '@parcel/watcher': 2.5.6
+      '@parcel/watcher-wasm': 2.5.6
+      citty: 0.1.6
+      clipboardy: 4.0.0
+      consola: 3.4.2
+      crossws: 0.3.5
+      defu: 6.1.4
+      get-port-please: 3.2.0
+      h3: 1.15.6
+      http-shutdown: 1.2.2
+      jiti: 2.6.1
+      mlly: 1.8.1
+      node-forge: 1.3.3
+      pathe: 1.1.2
+      std-env: 3.10.0
+      ufo: 1.6.3
+      untun: 0.1.3
+      uqr: 0.1.2
+
+  local-pkg@1.1.2:
+    dependencies:
+      mlly: 1.8.1
+      pkg-types: 2.3.0
+      quansync: 0.2.11
+
+  lodash-es@4.17.23: {}
+
+  lodash.defaults@4.2.0: {}
+
+  lodash.isarguments@3.1.0: {}
+
+  lodash.memoize@4.1.2: {}
+
+  lodash.uniq@4.5.0: {}
+
+  lodash@4.17.21: {}
+
+  lodash@4.17.23: {}
+
+  long@5.3.2: {}
+
+  lru-cache@10.4.3: {}
+
+  lru-cache@11.2.6: {}
+
+  lru-cache@5.1.1:
+    dependencies:
+      yallist: 3.1.1
+
+  lru.min@1.1.4: {}
+
+  magic-regexp@0.10.0:
+    dependencies:
+      estree-walker: 3.0.3
+      magic-string: 0.30.21
+      mlly: 1.8.1
+      regexp-tree: 0.1.27
+      type-level-regexp: 0.1.17
+      ufo: 1.6.3
+      unplugin: 2.3.11
+
+  magic-string-ast@1.0.3:
+    dependencies:
+      magic-string: 0.30.21
+
+  magic-string@0.30.21:
+    dependencies:
+      '@jridgewell/sourcemap-codec': 1.5.5
+
+  magicast@0.5.2:
+    dependencies:
+      '@babel/parser': 7.29.0
+      '@babel/types': 7.29.0
+      source-map-js: 1.2.1
+
+  mdn-data@2.0.28: {}
+
+  mdn-data@2.27.1: {}
+
+  merge-stream@2.0.0: {}
+
+  merge2@1.4.1: {}
+
+  micromatch@4.0.8:
+    dependencies:
+      braces: 3.0.3
+      picomatch: 2.3.1
+
+  mime-db@1.52.0: {}
+
+  mime-db@1.54.0: {}
+
+  mime-types@2.1.35:
+    dependencies:
+      mime-db: 1.52.0
+
+  mime-types@3.0.2:
+    dependencies:
+      mime-db: 1.54.0
+
+  mime@4.1.0: {}
+
+  mimic-fn@4.0.0: {}
+
+  minimatch@10.2.4:
+    dependencies:
+      brace-expansion: 5.0.4
+
+  minimatch@5.1.9:
+    dependencies:
+      brace-expansion: 2.0.2
+
+  minimatch@9.0.9:
+    dependencies:
+      brace-expansion: 2.0.2
+
+  minipass@7.1.3: {}
+
+  minizlib@3.1.0:
+    dependencies:
+      minipass: 7.1.3
+
+  mitt@3.0.1: {}
+
+  mlly@1.8.1:
+    dependencies:
+      acorn: 8.16.0
+      pathe: 2.0.3
+      pkg-types: 1.3.1
+      ufo: 1.6.3
+
+  mocked-exports@0.1.1: {}
+
+  mrmime@2.0.1: {}
+
+  ms@2.1.3: {}
+
+  muggle-string@0.4.1: {}
+
+  mysql2@3.15.3:
+    dependencies:
+      aws-ssl-profiles: 1.1.2
+      denque: 2.1.0
+      generate-function: 2.3.1
+      iconv-lite: 0.7.2
+      long: 5.3.2
+      lru.min: 1.1.4
+      named-placeholders: 1.1.6
+      seq-queue: 0.0.5
+      sqlstring: 2.3.3
+
+  named-placeholders@1.1.6:
+    dependencies:
+      lru.min: 1.1.4
+
+  nanoid@3.3.11: {}
+
+  nanotar@0.3.0: {}
+
+  negotiator@0.6.3: {}
+
+  nitropack@2.13.1(@electric-sql/pglite@0.3.15)(mysql2@3.15.3)(rolldown@1.0.0-rc.9):
+    dependencies:
+      '@cloudflare/kv-asset-handler': 0.4.2
+      '@rollup/plugin-alias': 6.0.0(rollup@4.59.0)
+      '@rollup/plugin-commonjs': 29.0.2(rollup@4.59.0)
+      '@rollup/plugin-inject': 5.0.5(rollup@4.59.0)
+      '@rollup/plugin-json': 6.1.0(rollup@4.59.0)
+      '@rollup/plugin-node-resolve': 16.0.3(rollup@4.59.0)
+      '@rollup/plugin-replace': 6.0.3(rollup@4.59.0)
+      '@rollup/plugin-terser': 0.4.4(rollup@4.59.0)
+      '@vercel/nft': 1.3.2(rollup@4.59.0)
+      archiver: 7.0.1
+      c12: 3.3.3(magicast@0.5.2)
+      chokidar: 5.0.0
+      citty: 0.1.6
+      compatx: 0.2.0
+      confbox: 0.2.4
+      consola: 3.4.2
+      cookie-es: 2.0.0
+      croner: 9.1.0
+      crossws: 0.3.5
+      db0: 0.3.4(@electric-sql/pglite@0.3.15)(mysql2@3.15.3)
+      defu: 6.1.4
+      destr: 2.0.5
+      dot-prop: 10.1.0
+      esbuild: 0.27.4
+      escape-string-regexp: 5.0.0
+      etag: 1.8.1
+      exsolve: 1.0.8
+      globby: 16.1.1
+      gzip-size: 7.0.0
+      h3: 1.15.6
+      hookable: 5.5.3
+      httpxy: 0.1.7
+      ioredis: 5.10.0
+      jiti: 2.6.1
+      klona: 2.0.6
+      knitwork: 1.3.0
+      listhen: 1.9.0
+      magic-string: 0.30.21
+      magicast: 0.5.2
+      mime: 4.1.0
+      mlly: 1.8.1
+      node-fetch-native: 1.6.7
+      node-mock-http: 1.0.4
+      ofetch: 1.5.1
+      ohash: 2.0.11
+      pathe: 2.0.3
+      perfect-debounce: 2.1.0
+      pkg-types: 2.3.0
+      pretty-bytes: 7.1.0
+      radix3: 1.1.2
+      rollup: 4.59.0
+      rollup-plugin-visualizer: 6.0.11(rolldown@1.0.0-rc.9)(rollup@4.59.0)
+      scule: 1.3.0
+      semver: 7.7.4
+      serve-placeholder: 2.0.2
+      serve-static: 2.2.1
+      source-map: 0.7.6
+      std-env: 3.10.0
+      ufo: 1.6.3
+      ultrahtml: 1.6.0
+      uncrypto: 0.1.3
+      unctx: 2.5.0
+      unenv: 2.0.0-rc.24
+      unimport: 5.7.0
+      unplugin-utils: 0.3.1
+      unstorage: 1.17.4(db0@0.3.4(@electric-sql/pglite@0.3.15)(mysql2@3.15.3))(ioredis@5.10.0)
+      untyped: 2.0.0
+      unwasm: 0.5.3
+      youch: 4.1.0
+      youch-core: 0.3.3
+    transitivePeerDependencies:
+      - '@azure/app-configuration'
+      - '@azure/cosmos'
+      - '@azure/data-tables'
+      - '@azure/identity'
+      - '@azure/keyvault-secrets'
+      - '@azure/storage-blob'
+      - '@capacitor/preferences'
+      - '@deno/kv'
+      - '@electric-sql/pglite'
+      - '@libsql/client'
+      - '@netlify/blobs'
+      - '@planetscale/database'
+      - '@upstash/redis'
+      - '@vercel/blob'
+      - '@vercel/functions'
+      - '@vercel/kv'
+      - aws4fetch
+      - bare-abort-controller
+      - bare-buffer
+      - better-sqlite3
+      - drizzle-orm
+      - encoding
+      - idb-keyval
+      - mysql2
+      - react-native-b4a
+      - rolldown
+      - sqlite3
+      - supports-color
+      - uploadthing
+
+  node-addon-api@7.1.1: {}
+
+  node-fetch-native@1.6.7: {}
+
+  node-fetch@2.7.0:
+    dependencies:
+      whatwg-url: 5.0.0
+
+  node-forge@1.3.3: {}
+
+  node-gyp-build@4.8.4: {}
+
+  node-mock-http@1.0.4: {}
+
+  node-releases@2.0.36: {}
+
+  nopt@8.1.0:
+    dependencies:
+      abbrev: 3.0.1
+
+  normalize-path@3.0.0: {}
+
+  npm-run-path@5.3.0:
+    dependencies:
+      path-key: 4.0.0
+
+  npm-run-path@6.0.0:
+    dependencies:
+      path-key: 4.0.0
+      unicorn-magic: 0.3.0
+
+  nth-check@2.1.1:
+    dependencies:
+      boolbase: 1.0.0
+
+  nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@electric-sql/pglite@0.3.15)(@parcel/watcher@2.5.6)(@pinia/colada@1.0.0(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)))(@types/node@25.5.0)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.3.15)(mysql2@3.15.3))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(mysql2@3.15.3)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rolldown@1.0.0-rc.9)(rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.9)(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(yaml@2.8.2):
+    dependencies:
+      '@dxup/nuxt': 0.4.0(magicast@0.5.2)(typescript@5.9.3)
+      '@nuxt/cli': 3.34.0(@nuxt/schema@4.4.2)(cac@6.7.14)(magicast@0.5.2)
+      '@nuxt/devtools': 3.2.3(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))
+      '@nuxt/kit': 4.4.2(magicast@0.5.2)
+      '@nuxt/nitro-server': 4.4.2(@babel/core@7.29.0)(@electric-sql/pglite@0.3.15)(db0@0.3.4(@electric-sql/pglite@0.3.15)(mysql2@3.15.3))(ioredis@5.10.0)(magicast@0.5.2)(mysql2@3.15.3)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@electric-sql/pglite@0.3.15)(@parcel/watcher@2.5.6)(@pinia/colada@1.0.0(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)))(@types/node@25.5.0)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4(@electric-sql/pglite@0.3.15)(mysql2@3.15.3))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(mysql2@3.15.3)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rolldown@1.0.0-rc.9)(rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.9)(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(yaml@2.8.2))(rolldown@1.0.0-rc.9)(typescript@5.9.3)
+      '@nuxt/schema': 4.4.2
+      '@nuxt/telemetry': 2.7.0(@nuxt/kit@4.4.2(magicast@0.5.2))
+      '@nuxt/vite-builder': 4.4.2(516f12cfe377ad06dd9cf42b8cd2075a)
+      '@unhead/vue': 2.1.12(vue@3.5.30(typescript@5.9.3))
+      '@vue/shared': 3.5.30
+      c12: 3.3.3(magicast@0.5.2)
+      chokidar: 5.0.0
+      compatx: 0.2.0
+      consola: 3.4.2
+      cookie-es: 2.0.0
+      defu: 6.1.4
+      devalue: 5.6.4
+      errx: 0.1.0
+      escape-string-regexp: 5.0.0
+      exsolve: 1.0.8
+      hookable: 6.0.1
+      ignore: 7.0.5
+      impound: 1.1.5
+      jiti: 2.6.1
+      klona: 2.0.6
+      knitwork: 1.3.0
+      magic-string: 0.30.21
+      mlly: 1.8.1
+      nanotar: 0.3.0
+      nypm: 0.6.5
+      ofetch: 1.5.1
+      ohash: 2.0.11
+      on-change: 6.0.2
+      oxc-minify: 0.117.0
+      oxc-parser: 0.117.0
+      oxc-transform: 0.117.0
+      oxc-walker: 0.7.0(oxc-parser@0.117.0)
+      pathe: 2.0.3
+      perfect-debounce: 2.1.0
+      picomatch: 4.0.3
+      pkg-types: 2.3.0
+      rou3: 0.8.1
+      scule: 1.3.0
+      semver: 7.7.4
+      std-env: 4.0.0
+      tinyglobby: 0.2.15
+      ufo: 1.6.3
+      ultrahtml: 1.6.0
+      uncrypto: 0.1.3
+      unctx: 2.5.0
+      unimport: 6.0.1
+      unplugin: 3.0.0
+      unrouting: 0.1.5
+      untyped: 2.0.0
+      vue: 3.5.30(typescript@5.9.3)
+      vue-router: 5.0.3(@pinia/colada@1.0.0(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)))(@vue/compiler-sfc@3.5.30)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))
+    optionalDependencies:
+      '@parcel/watcher': 2.5.6
+      '@types/node': 25.5.0
+    transitivePeerDependencies:
+      - '@azure/app-configuration'
+      - '@azure/cosmos'
+      - '@azure/data-tables'
+      - '@azure/identity'
+      - '@azure/keyvault-secrets'
+      - '@azure/storage-blob'
+      - '@babel/core'
+      - '@babel/plugin-proposal-decorators'
+      - '@babel/plugin-syntax-jsx'
+      - '@biomejs/biome'
+      - '@capacitor/preferences'
+      - '@deno/kv'
+      - '@electric-sql/pglite'
+      - '@libsql/client'
+      - '@netlify/blobs'
+      - '@pinia/colada'
+      - '@planetscale/database'
+      - '@rollup/plugin-babel'
+      - '@upstash/redis'
+      - '@vercel/blob'
+      - '@vercel/functions'
+      - '@vercel/kv'
+      - '@vitejs/devtools'
+      - '@vue/compiler-sfc'
+      - aws4fetch
+      - bare-abort-controller
+      - bare-buffer
+      - better-sqlite3
+      - bufferutil
+      - cac
+      - commander
+      - db0
+      - drizzle-orm
+      - encoding
+      - eslint
+      - idb-keyval
+      - ioredis
+      - less
+      - lightningcss
+      - magicast
+      - meow
+      - mysql2
+      - optionator
+      - oxlint
+      - pinia
+      - react-native-b4a
+      - rolldown
+      - rollup
+      - rollup-plugin-visualizer
+      - sass
+      - sass-embedded
+      - sqlite3
+      - stylelint
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+      - tsx
+      - typescript
+      - uploadthing
+      - utf-8-validate
+      - vite
+      - vls
+      - vti
+      - vue-tsc
+      - xml2js
+      - yaml
+
+  nypm@0.6.5:
+    dependencies:
+      citty: 0.2.1
+      pathe: 2.0.3
+      tinyexec: 1.0.2
+
+  object-assign@4.1.1: {}
+
+  obuf@1.1.2: {}
+
+  obug@2.1.1: {}
+
+  ofetch@1.5.1:
+    dependencies:
+      destr: 2.0.5
+      node-fetch-native: 1.6.7
+      ufo: 1.6.3
+
+  ofetch@2.0.0-alpha.3: {}
+
+  ohash@2.0.11: {}
+
+  on-change@6.0.2: {}
+
+  on-finished@2.4.1:
+    dependencies:
+      ee-first: 1.1.1
+
+  onetime@6.0.0:
+    dependencies:
+      mimic-fn: 4.0.0
+
+  open@10.2.0:
+    dependencies:
+      default-browser: 5.5.0
+      define-lazy-prop: 3.0.0
+      is-inside-container: 1.0.0
+      wsl-utils: 0.1.0
+
+  open@8.4.2:
+    dependencies:
+      define-lazy-prop: 2.0.0
+      is-docker: 2.2.1
+      is-wsl: 2.2.0
+
+  oxc-minify@0.117.0:
+    optionalDependencies:
+      '@oxc-minify/binding-android-arm-eabi': 0.117.0
+      '@oxc-minify/binding-android-arm64': 0.117.0
+      '@oxc-minify/binding-darwin-arm64': 0.117.0
+      '@oxc-minify/binding-darwin-x64': 0.117.0
+      '@oxc-minify/binding-freebsd-x64': 0.117.0
+      '@oxc-minify/binding-linux-arm-gnueabihf': 0.117.0
+      '@oxc-minify/binding-linux-arm-musleabihf': 0.117.0
+      '@oxc-minify/binding-linux-arm64-gnu': 0.117.0
+      '@oxc-minify/binding-linux-arm64-musl': 0.117.0
+      '@oxc-minify/binding-linux-ppc64-gnu': 0.117.0
+      '@oxc-minify/binding-linux-riscv64-gnu': 0.117.0
+      '@oxc-minify/binding-linux-riscv64-musl': 0.117.0
+      '@oxc-minify/binding-linux-s390x-gnu': 0.117.0
+      '@oxc-minify/binding-linux-x64-gnu': 0.117.0
+      '@oxc-minify/binding-linux-x64-musl': 0.117.0
+      '@oxc-minify/binding-openharmony-arm64': 0.117.0
+      '@oxc-minify/binding-wasm32-wasi': 0.117.0
+      '@oxc-minify/binding-win32-arm64-msvc': 0.117.0
+      '@oxc-minify/binding-win32-ia32-msvc': 0.117.0
+      '@oxc-minify/binding-win32-x64-msvc': 0.117.0
+
+  oxc-parser@0.117.0:
+    dependencies:
+      '@oxc-project/types': 0.117.0
+    optionalDependencies:
+      '@oxc-parser/binding-android-arm-eabi': 0.117.0
+      '@oxc-parser/binding-android-arm64': 0.117.0
+      '@oxc-parser/binding-darwin-arm64': 0.117.0
+      '@oxc-parser/binding-darwin-x64': 0.117.0
+      '@oxc-parser/binding-freebsd-x64': 0.117.0
+      '@oxc-parser/binding-linux-arm-gnueabihf': 0.117.0
+      '@oxc-parser/binding-linux-arm-musleabihf': 0.117.0
+      '@oxc-parser/binding-linux-arm64-gnu': 0.117.0
+      '@oxc-parser/binding-linux-arm64-musl': 0.117.0
+      '@oxc-parser/binding-linux-ppc64-gnu': 0.117.0
+      '@oxc-parser/binding-linux-riscv64-gnu': 0.117.0
+      '@oxc-parser/binding-linux-riscv64-musl': 0.117.0
+      '@oxc-parser/binding-linux-s390x-gnu': 0.117.0
+      '@oxc-parser/binding-linux-x64-gnu': 0.117.0
+      '@oxc-parser/binding-linux-x64-musl': 0.117.0
+      '@oxc-parser/binding-openharmony-arm64': 0.117.0
+      '@oxc-parser/binding-wasm32-wasi': 0.117.0
+      '@oxc-parser/binding-win32-arm64-msvc': 0.117.0
+      '@oxc-parser/binding-win32-ia32-msvc': 0.117.0
+      '@oxc-parser/binding-win32-x64-msvc': 0.117.0
+
+  oxc-transform@0.117.0:
+    optionalDependencies:
+      '@oxc-transform/binding-android-arm-eabi': 0.117.0
+      '@oxc-transform/binding-android-arm64': 0.117.0
+      '@oxc-transform/binding-darwin-arm64': 0.117.0
+      '@oxc-transform/binding-darwin-x64': 0.117.0
+      '@oxc-transform/binding-freebsd-x64': 0.117.0
+      '@oxc-transform/binding-linux-arm-gnueabihf': 0.117.0
+      '@oxc-transform/binding-linux-arm-musleabihf': 0.117.0
+      '@oxc-transform/binding-linux-arm64-gnu': 0.117.0
+      '@oxc-transform/binding-linux-arm64-musl': 0.117.0
+      '@oxc-transform/binding-linux-ppc64-gnu': 0.117.0
+      '@oxc-transform/binding-linux-riscv64-gnu': 0.117.0
+      '@oxc-transform/binding-linux-riscv64-musl': 0.117.0
+      '@oxc-transform/binding-linux-s390x-gnu': 0.117.0
+      '@oxc-transform/binding-linux-x64-gnu': 0.117.0
+      '@oxc-transform/binding-linux-x64-musl': 0.117.0
+      '@oxc-transform/binding-openharmony-arm64': 0.117.0
+      '@oxc-transform/binding-wasm32-wasi': 0.117.0
+      '@oxc-transform/binding-win32-arm64-msvc': 0.117.0
+      '@oxc-transform/binding-win32-ia32-msvc': 0.117.0
+      '@oxc-transform/binding-win32-x64-msvc': 0.117.0
+
+  oxc-walker@0.7.0(oxc-parser@0.117.0):
+    dependencies:
+      magic-regexp: 0.10.0
+      oxc-parser: 0.117.0
+
+  package-json-from-dist@1.0.1: {}
+
+  package-manager-detector@1.6.0: {}
+
+  parseley@0.12.1:
+    dependencies:
+      leac: 0.6.0
+      peberminta: 0.9.0
+
+  parseurl@1.3.3: {}
+
+  path-key@3.1.1: {}
+
+  path-key@4.0.0: {}
+
+  path-parse@1.0.7: {}
+
+  path-scurry@1.11.1:
+    dependencies:
+      lru-cache: 10.4.3
+      minipass: 7.1.3
+
+  path-scurry@2.0.2:
+    dependencies:
+      lru-cache: 11.2.6
+      minipass: 7.1.3
+
+  pathe@1.1.2: {}
+
+  pathe@2.0.3: {}
+
+  peberminta@0.9.0: {}
+
+  perfect-debounce@1.0.0: {}
+
+  perfect-debounce@2.1.0: {}
+
+  pg-cloudflare@1.3.0:
+    optional: true
+
+  pg-connection-string@2.12.0: {}
+
+  pg-int8@1.0.1: {}
+
+  pg-numeric@1.0.2: {}
+
+  pg-pool@3.13.0(pg@8.20.0):
+    dependencies:
+      pg: 8.20.0
+
+  pg-protocol@1.13.0: {}
+
+  pg-types@2.2.0:
+    dependencies:
+      pg-int8: 1.0.1
+      postgres-array: 2.0.0
+      postgres-bytea: 1.0.1
+      postgres-date: 1.0.7
+      postgres-interval: 1.2.0
+
+  pg-types@4.1.0:
+    dependencies:
+      pg-int8: 1.0.1
+      pg-numeric: 1.0.2
+      postgres-array: 3.0.4
+      postgres-bytea: 3.0.0
+      postgres-date: 2.1.0
+      postgres-interval: 3.0.0
+      postgres-range: 1.1.4
+
+  pg@8.20.0:
+    dependencies:
+      pg-connection-string: 2.12.0
+      pg-pool: 3.13.0(pg@8.20.0)
+      pg-protocol: 1.13.0
+      pg-types: 2.2.0
+      pgpass: 1.0.5
+    optionalDependencies:
+      pg-cloudflare: 1.3.0
+
+  pgpass@1.0.5:
+    dependencies:
+      split2: 4.2.0
+
+  picocolors@1.1.1: {}
+
+  picomatch@2.3.1: {}
+
+  picomatch@4.0.3: {}
+
+  pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)):
+    dependencies:
+      '@vue/devtools-api': 7.7.9
+      vue: 3.5.30(typescript@5.9.3)
+    optionalDependencies:
+      typescript: 5.9.3
+
+  pkg-types@1.3.1:
+    dependencies:
+      confbox: 0.1.8
+      mlly: 1.8.1
+      pathe: 2.0.3
+
+  pkg-types@2.3.0:
+    dependencies:
+      confbox: 0.2.4
+      exsolve: 1.0.8
+      pathe: 2.0.3
+
+  postcss-calc@10.1.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+      postcss-selector-parser: 7.1.1
+      postcss-value-parser: 4.2.0
+
+  postcss-colormin@7.0.6(postcss@8.5.8):
+    dependencies:
+      browserslist: 4.28.1
+      caniuse-api: 3.0.0
+      colord: 2.9.3
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-convert-values@7.0.9(postcss@8.5.8):
+    dependencies:
+      browserslist: 4.28.1
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-discard-comments@7.0.6(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+      postcss-selector-parser: 7.1.1
+
+  postcss-discard-duplicates@7.0.2(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+
+  postcss-discard-empty@7.0.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+
+  postcss-discard-overridden@7.0.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+
+  postcss-merge-longhand@7.0.5(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+      stylehacks: 7.0.8(postcss@8.5.8)
+
+  postcss-merge-rules@7.0.8(postcss@8.5.8):
+    dependencies:
+      browserslist: 4.28.1
+      caniuse-api: 3.0.0
+      cssnano-utils: 5.0.1(postcss@8.5.8)
+      postcss: 8.5.8
+      postcss-selector-parser: 7.1.1
+
+  postcss-minify-font-values@7.0.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-minify-gradients@7.0.1(postcss@8.5.8):
+    dependencies:
+      colord: 2.9.3
+      cssnano-utils: 5.0.1(postcss@8.5.8)
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-minify-params@7.0.6(postcss@8.5.8):
+    dependencies:
+      browserslist: 4.28.1
+      cssnano-utils: 5.0.1(postcss@8.5.8)
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-minify-selectors@7.0.6(postcss@8.5.8):
+    dependencies:
+      cssesc: 3.0.0
+      postcss: 8.5.8
+      postcss-selector-parser: 7.1.1
+
+  postcss-normalize-charset@7.0.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+
+  postcss-normalize-display-values@7.0.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-normalize-positions@7.0.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-normalize-repeat-style@7.0.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-normalize-string@7.0.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-normalize-timing-functions@7.0.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-normalize-unicode@7.0.6(postcss@8.5.8):
+    dependencies:
+      browserslist: 4.28.1
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-normalize-url@7.0.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-normalize-whitespace@7.0.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-ordered-values@7.0.2(postcss@8.5.8):
+    dependencies:
+      cssnano-utils: 5.0.1(postcss@8.5.8)
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-reduce-initial@7.0.6(postcss@8.5.8):
+    dependencies:
+      browserslist: 4.28.1
+      caniuse-api: 3.0.0
+      postcss: 8.5.8
+
+  postcss-reduce-transforms@7.0.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+
+  postcss-selector-parser@6.0.10:
+    dependencies:
+      cssesc: 3.0.0
+      util-deprecate: 1.0.2
+
+  postcss-selector-parser@7.1.1:
+    dependencies:
+      cssesc: 3.0.0
+      util-deprecate: 1.0.2
+
+  postcss-svgo@7.1.1(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+      postcss-value-parser: 4.2.0
+      svgo: 4.0.1
+
+  postcss-unique-selectors@7.0.5(postcss@8.5.8):
+    dependencies:
+      postcss: 8.5.8
+      postcss-selector-parser: 7.1.1
+
+  postcss-value-parser@4.2.0: {}
+
+  postcss@8.5.8:
+    dependencies:
+      nanoid: 3.3.11
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
+
+  postgres-array@2.0.0: {}
+
+  postgres-array@3.0.4: {}
+
+  postgres-bytea@1.0.1: {}
+
+  postgres-bytea@3.0.0:
+    dependencies:
+      obuf: 1.1.2
+
+  postgres-date@1.0.7: {}
+
+  postgres-date@2.1.0: {}
+
+  postgres-interval@1.2.0:
+    dependencies:
+      xtend: 4.0.2
+
+  postgres-interval@3.0.0: {}
+
+  postgres-range@1.1.4: {}
+
+  postgres@3.4.7: {}
+
+  prettier-plugin-classnames@0.9.0(prettier@3.8.1):
+    dependencies:
+      prettier: 3.8.1
+      zod: 3.22.4
+
+  prettier-plugin-merge@0.10.0(prettier@3.8.1):
+    dependencies:
+      diff: 5.2.2
+      prettier: 3.8.1
+
+  prettier-plugin-prisma@5.0.0(prettier@3.8.1):
+    dependencies:
+      '@prisma/prisma-schema-wasm': 4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584
+      prettier: 3.8.1
+
+  prettier-plugin-tailwindcss@0.7.2(prettier@3.8.1):
+    dependencies:
+      prettier: 3.8.1
+
+  prettier@3.8.1: {}
+
+  pretty-bytes@7.1.0: {}
+
+  primevue@4.5.4(vue@3.5.30(typescript@5.9.3)):
+    dependencies:
+      '@primeuix/styled': 0.7.4
+      '@primeuix/styles': 2.0.3
+      '@primeuix/utils': 0.6.4
+      '@primevue/core': 4.5.4(vue@3.5.30(typescript@5.9.3))
+      '@primevue/icons': 4.5.4(vue@3.5.30(typescript@5.9.3))
+    transitivePeerDependencies:
+      - vue
+
+  prisma@7.5.0(@types/react@19.2.14)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3):
+    dependencies:
+      '@prisma/config': 7.5.0(magicast@0.5.2)
+      '@prisma/dev': 0.20.0(typescript@5.9.3)
+      '@prisma/engines': 7.5.0
+      '@prisma/studio-core': 0.21.1(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+      mysql2: 3.15.3
+      postgres: 3.4.7
+    optionalDependencies:
+      typescript: 5.9.3
+    transitivePeerDependencies:
+      - '@types/react'
+      - magicast
+      - react
+      - react-dom
+
+  process-nextick-args@2.0.1: {}
+
+  process@0.11.10: {}
+
+  proper-lockfile@4.1.2:
+    dependencies:
+      graceful-fs: 4.2.11
+      retry: 0.12.0
+      signal-exit: 3.0.7
+
+  pure-rand@6.1.0: {}
+
+  quansync@0.2.11: {}
+
+  queue-microtask@1.2.3: {}
+
+  radix3@1.1.2: {}
+
+  randombytes@2.1.0:
+    dependencies:
+      safe-buffer: 5.2.1
+
+  range-parser@1.2.1: {}
+
+  rc9@2.1.2:
+    dependencies:
+      defu: 6.1.4
+      destr: 2.0.5
+
+  rc9@3.0.0:
+    dependencies:
+      defu: 6.1.4
+      destr: 2.0.5
+
+  react-dom@19.2.4(react@19.2.4):
+    dependencies:
+      react: 19.2.4
+      scheduler: 0.27.0
+
+  react@19.2.4: {}
+
+  readable-stream@2.3.8:
+    dependencies:
+      core-util-is: 1.0.3
+      inherits: 2.0.4
+      isarray: 1.0.0
+      process-nextick-args: 2.0.1
+      safe-buffer: 5.1.2
+      string_decoder: 1.1.1
+      util-deprecate: 1.0.2
+
+  readable-stream@4.7.0:
+    dependencies:
+      abort-controller: 3.0.0
+      buffer: 6.0.3
+      events: 3.3.0
+      process: 0.11.10
+      string_decoder: 1.3.0
+
+  readdir-glob@1.1.3:
+    dependencies:
+      minimatch: 5.1.9
+
+  readdirp@3.6.0:
+    dependencies:
+      picomatch: 2.3.1
+
+  readdirp@4.1.2: {}
+
+  readdirp@5.0.0: {}
+
+  redis-errors@1.2.0: {}
+
+  redis-parser@3.0.0:
+    dependencies:
+      redis-errors: 1.2.0
+
+  regexp-to-ast@0.5.0: {}
+
+  regexp-tree@0.1.27: {}
+
+  remeda@2.33.4: {}
+
+  require-directory@2.1.1: {}
+
+  resolve-from@5.0.0: {}
+
+  resolve-pkg-maps@1.0.0: {}
+
+  resolve@1.22.11:
+    dependencies:
+      is-core-module: 2.16.1
+      path-parse: 1.0.7
+      supports-preserve-symlinks-flag: 1.0.0
+
+  retry@0.12.0: {}
+
+  reusify@1.1.0: {}
+
+  rfdc@1.4.1: {}
+
+  rolldown@1.0.0-rc.9:
+    dependencies:
+      '@oxc-project/types': 0.115.0
+      '@rolldown/pluginutils': 1.0.0-rc.9
+    optionalDependencies:
+      '@rolldown/binding-android-arm64': 1.0.0-rc.9
+      '@rolldown/binding-darwin-arm64': 1.0.0-rc.9
+      '@rolldown/binding-darwin-x64': 1.0.0-rc.9
+      '@rolldown/binding-freebsd-x64': 1.0.0-rc.9
+      '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.9
+      '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.9
+      '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.9
+      '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.9
+      '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.9
+      '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.9
+      '@rolldown/binding-linux-x64-musl': 1.0.0-rc.9
+      '@rolldown/binding-openharmony-arm64': 1.0.0-rc.9
+      '@rolldown/binding-wasm32-wasi': 1.0.0-rc.9
+      '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.9
+      '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.9
+    optional: true
+
+  rollup-plugin-visualizer@6.0.11(rolldown@1.0.0-rc.9)(rollup@4.59.0):
+    dependencies:
+      open: 8.4.2
+      picomatch: 4.0.3
+      source-map: 0.7.6
+      yargs: 17.7.2
+    optionalDependencies:
+      rolldown: 1.0.0-rc.9
+      rollup: 4.59.0
+
+  rollup@4.59.0:
+    dependencies:
+      '@types/estree': 1.0.8
+    optionalDependencies:
+      '@rollup/rollup-android-arm-eabi': 4.59.0
+      '@rollup/rollup-android-arm64': 4.59.0
+      '@rollup/rollup-darwin-arm64': 4.59.0
+      '@rollup/rollup-darwin-x64': 4.59.0
+      '@rollup/rollup-freebsd-arm64': 4.59.0
+      '@rollup/rollup-freebsd-x64': 4.59.0
+      '@rollup/rollup-linux-arm-gnueabihf': 4.59.0
+      '@rollup/rollup-linux-arm-musleabihf': 4.59.0
+      '@rollup/rollup-linux-arm64-gnu': 4.59.0
+      '@rollup/rollup-linux-arm64-musl': 4.59.0
+      '@rollup/rollup-linux-loong64-gnu': 4.59.0
+      '@rollup/rollup-linux-loong64-musl': 4.59.0
+      '@rollup/rollup-linux-ppc64-gnu': 4.59.0
+      '@rollup/rollup-linux-ppc64-musl': 4.59.0
+      '@rollup/rollup-linux-riscv64-gnu': 4.59.0
+      '@rollup/rollup-linux-riscv64-musl': 4.59.0
+      '@rollup/rollup-linux-s390x-gnu': 4.59.0
+      '@rollup/rollup-linux-x64-gnu': 4.59.0
+      '@rollup/rollup-linux-x64-musl': 4.59.0
+      '@rollup/rollup-openbsd-x64': 4.59.0
+      '@rollup/rollup-openharmony-arm64': 4.59.0
+      '@rollup/rollup-win32-arm64-msvc': 4.59.0
+      '@rollup/rollup-win32-ia32-msvc': 4.59.0
+      '@rollup/rollup-win32-x64-gnu': 4.59.0
+      '@rollup/rollup-win32-x64-msvc': 4.59.0
+      fsevents: 2.3.3
+
+  rou3@0.8.1: {}
+
+  run-applescript@7.1.0: {}
+
+  run-parallel@1.2.0:
+    dependencies:
+      queue-microtask: 1.2.3
+
+  safe-buffer@5.1.2: {}
+
+  safe-buffer@5.2.1: {}
+
+  safer-buffer@2.1.2: {}
+
+  sax@1.5.0: {}
+
+  scheduler@0.27.0: {}
+
+  scule@1.3.0: {}
+
+  selderee@0.11.0:
+    dependencies:
+      parseley: 0.12.1
+
+  semver@6.3.1: {}
+
+  semver@7.7.4: {}
+
+  send@1.2.1:
+    dependencies:
+      debug: 4.4.3
+      encodeurl: 2.0.0
+      escape-html: 1.0.3
+      etag: 1.8.1
+      fresh: 2.0.0
+      http-errors: 2.0.1
+      mime-types: 3.0.2
+      ms: 2.1.3
+      on-finished: 2.4.1
+      range-parser: 1.2.1
+      statuses: 2.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  seq-queue@0.0.5: {}
+
+  serialize-javascript@6.0.2:
+    dependencies:
+      randombytes: 2.1.0
+
+  seroval@1.5.1: {}
+
+  serve-placeholder@2.0.2:
+    dependencies:
+      defu: 6.1.4
+
+  serve-static@2.2.1:
+    dependencies:
+      encodeurl: 2.0.0
+      escape-html: 1.0.3
+      parseurl: 1.3.3
+      send: 1.2.1
+    transitivePeerDependencies:
+      - supports-color
+
+  setprototypeof@1.2.0: {}
+
+  shebang-command@2.0.0:
+    dependencies:
+      shebang-regex: 3.0.0
+
+  shebang-regex@3.0.0: {}
+
+  shell-quote@1.8.3: {}
+
+  signal-exit@3.0.7: {}
+
+  signal-exit@4.1.0: {}
+
+  simple-git@3.33.0:
+    dependencies:
+      '@kwsites/file-exists': 1.1.1
+      '@kwsites/promise-deferred': 1.1.1
+      debug: 4.4.3
+    transitivePeerDependencies:
+      - supports-color
+
+  sirv@3.0.2:
+    dependencies:
+      '@polka/url': 1.0.0-next.29
+      mrmime: 2.0.1
+      totalist: 3.0.1
+
+  sisteransi@1.0.5: {}
+
+  slash@5.1.0: {}
+
+  smob@1.6.1: {}
+
+  socket.io-adapter@2.5.6:
+    dependencies:
+      debug: 4.4.3
+      ws: 8.18.3
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+
+  socket.io-client@4.8.3:
+    dependencies:
+      '@socket.io/component-emitter': 3.1.2
+      debug: 4.4.3
+      engine.io-client: 6.6.4
+      socket.io-parser: 4.2.5
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+
+  socket.io-parser@4.2.5:
+    dependencies:
+      '@socket.io/component-emitter': 3.1.2
+      debug: 4.4.3
+    transitivePeerDependencies:
+      - supports-color
+
+  socket.io@4.8.3:
+    dependencies:
+      accepts: 1.3.8
+      base64id: 2.0.0
+      cors: 2.8.6
+      debug: 4.4.3
+      engine.io: 6.6.6
+      socket.io-adapter: 2.5.6
+      socket.io-parser: 4.2.5
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+
+  source-map-js@1.2.1: {}
+
+  source-map-support@0.5.21:
+    dependencies:
+      buffer-from: 1.1.2
+      source-map: 0.6.1
+
+  source-map@0.6.1: {}
+
+  source-map@0.7.6: {}
+
+  speakingurl@14.0.1: {}
+
+  split2@4.2.0: {}
+
+  sqlstring@2.3.3: {}
+
+  srvx@0.11.9: {}
+
+  standard-as-callback@2.1.0: {}
+
+  statuses@2.0.2: {}
+
+  std-env@3.10.0: {}
+
+  std-env@4.0.0: {}
+
+  streamx@2.23.0:
+    dependencies:
+      events-universal: 1.0.1
+      fast-fifo: 1.3.2
+      text-decoder: 1.2.7
+    transitivePeerDependencies:
+      - bare-abort-controller
+      - react-native-b4a
+
+  string-width@4.2.3:
+    dependencies:
+      emoji-regex: 8.0.0
+      is-fullwidth-code-point: 3.0.0
+      strip-ansi: 6.0.1
+
+  string-width@5.1.2:
+    dependencies:
+      eastasianwidth: 0.2.0
+      emoji-regex: 9.2.2
+      strip-ansi: 7.2.0
+
+  string_decoder@1.1.1:
+    dependencies:
+      safe-buffer: 5.1.2
+
+  string_decoder@1.3.0:
+    dependencies:
+      safe-buffer: 5.2.1
+
+  strip-ansi@6.0.1:
+    dependencies:
+      ansi-regex: 5.0.1
+
+  strip-ansi@7.2.0:
+    dependencies:
+      ansi-regex: 6.2.2
+
+  strip-final-newline@3.0.0: {}
+
+  strip-literal@3.1.0:
+    dependencies:
+      js-tokens: 9.0.1
+
+  structured-clone-es@1.0.0: {}
+
+  stylehacks@7.0.8(postcss@8.5.8):
+    dependencies:
+      browserslist: 4.28.1
+      postcss: 8.5.8
+      postcss-selector-parser: 7.1.1
+
+  superjson@2.2.6:
+    dependencies:
+      copy-anything: 4.0.5
+
+  supports-color@10.2.2: {}
+
+  supports-preserve-symlinks-flag@1.0.0: {}
+
+  svgo@4.0.1:
+    dependencies:
+      commander: 11.1.0
+      css-select: 5.2.2
+      css-tree: 3.2.1
+      css-what: 6.2.2
+      csso: 5.0.5
+      picocolors: 1.1.1
+      sax: 1.5.0
+
+  system-architecture@0.1.0: {}
+
+  tagged-tag@1.0.0: {}
+
+  tailwindcss-primeui@0.6.1(tailwindcss@4.2.1):
+    dependencies:
+      tailwindcss: 4.2.1
+
+  tailwindcss@4.2.1: {}
+
+  tapable@2.3.0: {}
+
+  tar-stream@3.1.8:
+    dependencies:
+      b4a: 1.8.0
+      bare-fs: 4.5.5
+      fast-fifo: 1.3.2
+      streamx: 2.23.0
+    transitivePeerDependencies:
+      - bare-abort-controller
+      - bare-buffer
+      - react-native-b4a
+
+  tar@7.5.11:
+    dependencies:
+      '@isaacs/fs-minipass': 4.0.1
+      chownr: 3.0.0
+      minipass: 7.1.3
+      minizlib: 3.1.0
+      yallist: 5.0.0
+
+  teex@1.0.1:
+    dependencies:
+      streamx: 2.23.0
+    transitivePeerDependencies:
+      - bare-abort-controller
+      - react-native-b4a
+
+  terser@5.46.0:
+    dependencies:
+      '@jridgewell/source-map': 0.3.11
+      acorn: 8.16.0
+      commander: 2.20.3
+      source-map-support: 0.5.21
+
+  text-decoder@1.2.7:
+    dependencies:
+      b4a: 1.8.0
+    transitivePeerDependencies:
+      - react-native-b4a
+
+  tiny-invariant@1.3.3: {}
+
+  tinyclip@0.1.12: {}
+
+  tinyexec@1.0.2: {}
+
+  tinyglobby@0.2.15:
+    dependencies:
+      fdir: 6.5.0(picomatch@4.0.3)
+      picomatch: 4.0.3
+
+  to-regex-range@5.0.1:
+    dependencies:
+      is-number: 7.0.0
+
+  toidentifier@1.0.1: {}
+
+  totalist@3.0.1: {}
+
+  tr46@0.0.3: {}
+
+  tslib@2.8.1:
+    optional: true
+
+  tsx@4.21.0:
+    dependencies:
+      esbuild: 0.27.4
+      get-tsconfig: 4.13.6
+    optionalDependencies:
+      fsevents: 2.3.3
+
+  type-fest@5.4.4:
+    dependencies:
+      tagged-tag: 1.0.0
+
+  type-level-regexp@0.1.17: {}
+
+  typescript@5.9.3: {}
+
+  ufo@1.6.3: {}
+
+  ultrahtml@1.6.0: {}
+
+  uncrypto@0.1.3: {}
+
+  unctx@2.5.0:
+    dependencies:
+      acorn: 8.16.0
+      estree-walker: 3.0.3
+      magic-string: 0.30.21
+      unplugin: 2.3.11
+
+  undici-types@7.18.2: {}
+
+  unenv@2.0.0-rc.24:
+    dependencies:
+      pathe: 2.0.3
+
+  unhead@2.1.12:
+    dependencies:
+      hookable: 6.0.1
+
+  unicorn-magic@0.3.0: {}
+
+  unicorn-magic@0.4.0: {}
+
+  unimport@5.7.0:
+    dependencies:
+      acorn: 8.16.0
+      escape-string-regexp: 5.0.0
+      estree-walker: 3.0.3
+      local-pkg: 1.1.2
+      magic-string: 0.30.21
+      mlly: 1.8.1
+      pathe: 2.0.3
+      picomatch: 4.0.3
+      pkg-types: 2.3.0
+      scule: 1.3.0
+      strip-literal: 3.1.0
+      tinyglobby: 0.2.15
+      unplugin: 2.3.11
+      unplugin-utils: 0.3.1
+
+  unimport@6.0.1:
+    dependencies:
+      acorn: 8.16.0
+      escape-string-regexp: 5.0.0
+      estree-walker: 3.0.3
+      local-pkg: 1.1.2
+      magic-string: 0.30.21
+      mlly: 1.8.1
+      pathe: 2.0.3
+      picomatch: 4.0.3
+      pkg-types: 2.3.0
+      scule: 1.3.0
+      strip-literal: 3.1.0
+      tinyglobby: 0.2.15
+      unplugin: 3.0.0
+      unplugin-utils: 0.3.1
+
+  unplugin-utils@0.2.5:
+    dependencies:
+      pathe: 2.0.3
+      picomatch: 4.0.3
+
+  unplugin-utils@0.3.1:
+    dependencies:
+      pathe: 2.0.3
+      picomatch: 4.0.3
+
+  unplugin-vue-components@28.4.1(@babel/parser@7.29.0)(@nuxt/kit@3.21.2(magicast@0.5.2))(vue@3.5.30(typescript@5.9.3)):
+    dependencies:
+      chokidar: 3.6.0
+      debug: 4.4.3
+      local-pkg: 1.1.2
+      magic-string: 0.30.21
+      mlly: 1.8.1
+      tinyglobby: 0.2.15
+      unplugin: 2.3.11
+      unplugin-utils: 0.2.5
+      vue: 3.5.30(typescript@5.9.3)
+    optionalDependencies:
+      '@babel/parser': 7.29.0
+      '@nuxt/kit': 3.21.2(magicast@0.5.2)
+    transitivePeerDependencies:
+      - supports-color
+
+  unplugin@2.3.11:
+    dependencies:
+      '@jridgewell/remapping': 2.3.5
+      acorn: 8.16.0
+      picomatch: 4.0.3
+      webpack-virtual-modules: 0.6.2
+
+  unplugin@3.0.0:
+    dependencies:
+      '@jridgewell/remapping': 2.3.5
+      picomatch: 4.0.3
+      webpack-virtual-modules: 0.6.2
+
+  unrouting@0.1.5:
+    dependencies:
+      escape-string-regexp: 5.0.0
+      ufo: 1.6.3
+
+  unstorage@1.17.4(db0@0.3.4(@electric-sql/pglite@0.3.15)(mysql2@3.15.3))(ioredis@5.10.0):
+    dependencies:
+      anymatch: 3.1.3
+      chokidar: 5.0.0
+      destr: 2.0.5
+      h3: 1.15.6
+      lru-cache: 11.2.6
+      node-fetch-native: 1.6.7
+      ofetch: 1.5.1
+      ufo: 1.6.3
+    optionalDependencies:
+      db0: 0.3.4(@electric-sql/pglite@0.3.15)(mysql2@3.15.3)
+      ioredis: 5.10.0
+
+  untun@0.1.3:
+    dependencies:
+      citty: 0.1.6
+      consola: 3.4.2
+      pathe: 1.1.2
+
+  untyped@2.0.0:
+    dependencies:
+      citty: 0.1.6
+      defu: 6.1.4
+      jiti: 2.6.1
+      knitwork: 1.3.0
+      scule: 1.3.0
+
+  unwasm@0.5.3:
+    dependencies:
+      exsolve: 1.0.8
+      knitwork: 1.3.0
+      magic-string: 0.30.21
+      mlly: 1.8.1
+      pathe: 2.0.3
+      pkg-types: 2.3.0
+
+  update-browserslist-db@1.2.3(browserslist@4.28.1):
+    dependencies:
+      browserslist: 4.28.1
+      escalade: 3.2.0
+      picocolors: 1.1.1
+
+  uqr@0.1.2: {}
+
+  util-deprecate@1.0.2: {}
+
+  valibot@1.2.0(typescript@5.9.3):
+    optionalDependencies:
+      typescript: 5.9.3
+
+  vary@1.1.2: {}
+
+  vite-dev-rpc@1.1.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)):
+    dependencies:
+      birpc: 2.9.0
+      vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+      vite-hot-client: 2.1.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+
+  vite-hot-client@2.1.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)):
+    dependencies:
+      vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+
+  vite-node@5.3.0(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2):
+    dependencies:
+      cac: 6.7.14
+      es-module-lexer: 2.0.0
+      obug: 2.1.1
+      pathe: 2.0.3
+      vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+    transitivePeerDependencies:
+      - '@types/node'
+      - jiti
+      - less
+      - lightningcss
+      - sass
+      - sass-embedded
+      - stylus
+      - sugarss
+      - terser
+      - tsx
+      - yaml
+
+  vite-plugin-checker@0.12.0(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)):
+    dependencies:
+      '@babel/code-frame': 7.29.0
+      chokidar: 4.0.3
+      npm-run-path: 6.0.0
+      picocolors: 1.1.1
+      picomatch: 4.0.3
+      tiny-invariant: 1.3.3
+      tinyglobby: 0.2.15
+      vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+      vscode-uri: 3.1.0
+    optionalDependencies:
+      typescript: 5.9.3
+
+  vite-plugin-inspect@11.3.3(@nuxt/kit@4.4.2(magicast@0.5.2))(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)):
+    dependencies:
+      ansis: 4.2.0
+      debug: 4.4.3
+      error-stack-parser-es: 1.0.5
+      ohash: 2.0.11
+      open: 10.2.0
+      perfect-debounce: 2.1.0
+      sirv: 3.0.2
+      unplugin-utils: 0.3.1
+      vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+      vite-dev-rpc: 1.1.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))
+    optionalDependencies:
+      '@nuxt/kit': 4.4.2(magicast@0.5.2)
+    transitivePeerDependencies:
+      - supports-color
+
+  vite-plugin-vue-tracer@1.3.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)):
+    dependencies:
+      estree-walker: 3.0.3
+      exsolve: 1.0.8
+      magic-string: 0.30.21
+      pathe: 2.0.3
+      source-map-js: 1.2.1
+      vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)
+      vue: 3.5.30(typescript@5.9.3)
+
+  vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2):
+    dependencies:
+      esbuild: 0.27.4
+      fdir: 6.5.0(picomatch@4.0.3)
+      picomatch: 4.0.3
+      postcss: 8.5.8
+      rollup: 4.59.0
+      tinyglobby: 0.2.15
+    optionalDependencies:
+      '@types/node': 25.5.0
+      fsevents: 2.3.3
+      jiti: 2.6.1
+      lightningcss: 1.32.0
+      terser: 5.46.0
+      tsx: 4.21.0
+      yaml: 2.8.2
+
+  vscode-uri@3.1.0: {}
+
+  vue-bundle-renderer@2.2.0:
+    dependencies:
+      ufo: 1.6.3
+
+  vue-devtools-stub@0.1.0: {}
+
+  vue-router@5.0.3(@pinia/colada@1.0.0(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)))(@vue/compiler-sfc@3.5.30)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)):
+    dependencies:
+      '@babel/generator': 7.29.1
+      '@vue-macros/common': 3.1.2(vue@3.5.30(typescript@5.9.3))
+      '@vue/devtools-api': 8.1.0
+      ast-walker-scope: 0.8.3
+      chokidar: 5.0.0
+      json5: 2.2.3
+      local-pkg: 1.1.2
+      magic-string: 0.30.21
+      mlly: 1.8.1
+      muggle-string: 0.4.1
+      pathe: 2.0.3
+      picomatch: 4.0.3
+      scule: 1.3.0
+      tinyglobby: 0.2.15
+      unplugin: 3.0.0
+      unplugin-utils: 0.3.1
+      vue: 3.5.30(typescript@5.9.3)
+      yaml: 2.8.2
+    optionalDependencies:
+      '@pinia/colada': 1.0.0(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))
+      '@vue/compiler-sfc': 3.5.30
+      pinia: 3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3))
+
+  vue@3.5.30(typescript@5.9.3):
+    dependencies:
+      '@vue/compiler-dom': 3.5.30
+      '@vue/compiler-sfc': 3.5.30
+      '@vue/runtime-dom': 3.5.30
+      '@vue/server-renderer': 3.5.30(vue@3.5.30(typescript@5.9.3))
+      '@vue/shared': 3.5.30
+    optionalDependencies:
+      typescript: 5.9.3
+
+  webidl-conversions@3.0.1: {}
+
+  webpack-virtual-modules@0.6.2: {}
+
+  whatwg-url@5.0.0:
+    dependencies:
+      tr46: 0.0.3
+      webidl-conversions: 3.0.1
+
+  which@2.0.2:
+    dependencies:
+      isexe: 2.0.0
+
+  which@5.0.0:
+    dependencies:
+      isexe: 3.1.5
+
+  wrap-ansi@7.0.0:
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+
+  wrap-ansi@8.1.0:
+    dependencies:
+      ansi-styles: 6.2.3
+      string-width: 5.1.2
+      strip-ansi: 7.2.0
+
+  ws@8.18.3: {}
+
+  ws@8.19.0: {}
+
+  wsl-utils@0.1.0:
+    dependencies:
+      is-wsl: 3.1.1
+
+  xmlhttprequest-ssl@2.1.2: {}
+
+  xtend@4.0.2: {}
+
+  y18n@5.0.8: {}
+
+  yallist@3.1.1: {}
+
+  yallist@5.0.0: {}
+
+  yaml@2.8.2: {}
+
+  yargs-parser@21.1.1: {}
+
+  yargs@17.7.2:
+    dependencies:
+      cliui: 8.0.1
+      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: 21.1.1
+
+  youch-core@0.3.3:
+    dependencies:
+      '@poppinss/exception': 1.2.3
+      error-stack-parser-es: 1.0.5
+
+  youch@4.1.0:
+    dependencies:
+      '@poppinss/colors': 4.1.6
+      '@poppinss/dumper': 0.7.0
+      '@speed-highlight/core': 1.2.14
+      cookie-es: 2.0.0
+      youch-core: 0.3.3
+
+  zeptomatch@2.1.0:
+    dependencies:
+      grammex: 3.1.12
+      graphmatch: 1.1.1
+
+  zip-stream@6.0.1:
+    dependencies:
+      archiver-utils: 5.0.2
+      compress-commons: 6.0.2
+      readable-stream: 4.7.0
+
+  zod@3.22.4: {}
+
+  zod@4.3.6: {}

+ 5 - 0
pnpm-workspace.yaml

@@ -0,0 +1,5 @@
+allowBuilds:
+  '@parcel/watcher': true
+  '@prisma/engines': true
+  esbuild: true
+  prisma: true

+ 25 - 0
prettier.config.js

@@ -0,0 +1,25 @@
+export default {
+  bracketSameLine: false,
+  semi: false,
+  singleAttributePerLine: true,
+  trailingComma: "none",
+
+  // plugins
+  plugins: [
+    "prettier-plugin-prisma",
+    "prettier-plugin-tailwindcss",
+    "prettier-plugin-classnames",
+    "prettier-plugin-merge"
+  ],
+
+  // prettier-plugin-tailwindcss
+  tailwindAttributes: ["pt"],
+  tailwindFunctions: ["tw"],
+  tailwindPreserveWhitespace: true,
+  tailwindStylesheet: "./app/assets/css/main.css",
+
+  // prettier-plugin-classnames
+  customAttributes: ["pt"],
+  customFunctions: ["tw"],
+  endingPosition: "relative"
+}

+ 10 - 0
prisma.config.js

@@ -0,0 +1,10 @@
+import "dotenv/config"
+import { defineConfig, env } from "prisma/config"
+
+export default defineConfig({
+  schema: "./prisma",
+
+  datasource: {
+    url: env("NUXT_PRISMA_DATABASE_URL")
+  }
+})

+ 30 - 0
prisma/schema.prisma

@@ -0,0 +1,30 @@
+generator client {
+  provider = "prisma-client"
+  output   = "./generated/prisma"
+}
+
+datasource db {
+  provider = "postgresql"
+}
+
+model Character {
+  id                   Int      @id @default(autoincrement())
+  player               String   @default("")
+  mortalName           String   @default("")
+  faeName              String   @default("")
+  rank                 String   @default("")
+  kith                 String   @default("")
+  location             String   @default("")
+  position             String   @default("")
+  seeming              String   @default("")
+  house                String   @default("")
+  bannerhouse          String   @default("")
+  description          String   @default("")
+  notes                String   @default("")
+  descriptionPlainText String   @default("")
+  notesPlainText       String   @default("")
+  createdAt            DateTime @default(now()) @db.Timestamp(6)
+  updatedAt            DateTime @updatedAt @db.Timestamp(6)
+
+  @@index([createdAt])
+}

+ 57 - 0
prisma/seed.js

@@ -0,0 +1,57 @@
+import "dotenv/config"
+import { includes, isArray, isPlainObject, map, mapValues } from "lodash-es"
+import prisma from "../server/utils/prisma.js"
+import characters from "./seeds/Character.json" with { type: "json" }
+
+function parseTimestamps(value, key) {
+  if (includes(["createdAt", "updatedAt"], key)) {
+    return new Date(value)
+  } else {
+    return value
+  }
+}
+
+function deepConvertValues(object, converter) {
+  // converter called with (value, key, object)
+  if (isArray(object)) {
+    return map(object, (element) => deepConvertValues(element, converter))
+  } else if (isPlainObject(object)) {
+    return mapValues(
+      object,
+      (value, key, object) => {
+        if (isArray(value) || isPlainObject(value)) {
+          return deepConvertValues(value, converter)
+        } else {
+          return converter(value, key, object)
+        }
+      }
+    )
+  } else {
+    return object
+  }
+}
+
+function deepParseTimestamps(object) {
+  return deepConvertValues(object, parseTimestamps)
+}
+
+async function seedCharacters() {
+  const { count } = await prisma.character.createMany({
+    data: deepParseTimestamps(characters)
+  })
+
+  console.log(`Created ${count} characters.`)
+}
+
+async function main() {
+  await seedCharacters()
+}
+
+main()
+  .catch((error) => {
+    if (error.meta?.message !== "not an error") {
+      console.error(error)
+      process.exit(1)
+    }
+  })
+  .finally(async () => await prisma.$disconnect())

+ 5114 - 0
prisma/seeds/Character.json

@@ -0,0 +1,5114 @@
+[
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Rosalita",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.400487",
+    "updatedAt": "2025-10-30 03:42:14.525000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Marseilles",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Dark Gate",
+    "position": "Hearth",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2021-04-19 00:55:37.936307",
+    "updatedAt": "2025-10-30 03:42:14.535000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Theresa Donaldson",
+    "faeName": "",
+    "rank": "",
+    "kith": "Kinain",
+    "location": "BrightWinds",
+    "position": "Irene's mom",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2022-05-28 23:29:30.265302",
+    "updatedAt": "2025-10-30 03:42:14.537000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Topaz",
+    "rank": "Duke",
+    "kith": "Troll",
+    "location": "Feathered Serpent",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Duke Topaz – Ruler of Feathered Serpent in Mexico City</div>",
+    "notes": "",
+    "descriptionPlainText": "Duke Topaz – Ruler of Feathered Serpent in Mexico City",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.266831",
+    "updatedAt": "2025-10-30 03:42:14.537000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Mallorie Wendel",
+    "faeName": "Melwyn",
+    "rank": "",
+    "kith": "Piskey",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Has a chimerical glass hand</div>",
+    "notes": "",
+    "descriptionPlainText": "Has a chimerical glass hand",
+    "notesPlainText": "",
+    "createdAt": "2021-02-25 16:06:07.132261",
+    "updatedAt": "2025-10-30 03:42:14.539000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Emmitt DeBuke",
+    "rank": "",
+    "kith": "Troll",
+    "location": "DeBuke Farmhold",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.082110",
+    "updatedAt": "2025-10-30 03:42:14.548000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Count Pom Trispeux ap Fiona",
+    "rank": "Count",
+    "kith": "Sidhe",
+    "location": "Spectral Lights",
+    "position": "",
+    "seeming": "",
+    "house": "Fiona",
+    "bannerhouse": "",
+    "description": "<div>County seat set in Marfa, TX.  Brightwinds Barony falls under his purview.  This foppish Fiona count is rumored to favor his court and neglect common folk under his rule.</div>",
+    "notes": "",
+    "descriptionPlainText": "County seat set in Marfa, TX.  Brightwinds Barony falls under his purview.  This foppish Fiona count is rumored to favor his court and neglect common folk under his rule.",
+    "notesPlainText": "",
+    "createdAt": "2022-07-27 13:10:03.356916",
+    "updatedAt": "2025-10-30 03:42:14.566000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Candace Green",
+    "faeName": "Calanthe Falkoner",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "Silverwolf",
+    "position": "Chancellor",
+    "seeming": "Wilder",
+    "house": "Ailil",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.859713",
+    "updatedAt": "2025-10-30 03:42:14.581000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Kourtney DeBuke",
+    "rank": "",
+    "kith": "Troll",
+    "location": "DeBuke Farmhold",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.105720",
+    "updatedAt": "2025-10-30 03:42:14.583000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Lydia",
+    "rank": "",
+    "kith": "Kinain",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Satyr kinain, sister of Zane</div>",
+    "notes": "",
+    "descriptionPlainText": "Satyr kinain, sister of Zane",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.169549",
+    "updatedAt": "2025-10-30 03:42:14.584000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Caspian DeBuke",
+    "rank": "",
+    "kith": "Eshu",
+    "location": "DeBuke Farmhold",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.076359",
+    "updatedAt": "2025-10-30 03:42:14.585000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Zane Wayburton",
+    "faeName": "Zane",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Zane is a wilder satyr, the son of renowned Professor Wayburton, also a satyr.  Zane is a friendly, easy-going lad, but recently has revealed a deeper side as he explores a potential passion involving magic itself. </div>",
+    "notes": "",
+    "descriptionPlainText": "Zane is a wilder satyr, the son of renowned Professor Wayburton, also a satyr.  Zane is a friendly, easy-going lad, but recently has revealed a deeper side as he explores a potential passion involving magic itself. ",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.766770",
+    "updatedAt": "2025-10-30 03:42:14.601000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Viggo",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "Fenix",
+    "position": "Tutor",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2021-07-20 17:31:44.453906",
+    "updatedAt": "2025-10-30 03:42:14.616000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Tziporrah",
+    "faeName": "Tziporrah",
+    "rank": "Fledge",
+    "kith": "Eshu",
+    "location": "Scarsdale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2021-09-02 23:53:39.434434",
+    "updatedAt": "2025-10-30 03:42:14.617000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Spencer DeBuke",
+    "rank": "",
+    "kith": "Troll",
+    "location": "DeBuke Farmhold",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.070325",
+    "updatedAt": "2025-10-30 03:42:14.619000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Alanza",
+    "rank": "",
+    "kith": "Eshu",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.261261",
+    "updatedAt": "2025-10-30 03:42:14.620000"
+  },
+  {
+    "player": "Shady Lady",
+    "mortalName": "William Billingsworth",
+    "faeName": "Emerson Stodgepole",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "KC Necropolis",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>One-Eyed Boggan of some repute, \"Bill-bill\"</div>",
+    "notes": "",
+    "descriptionPlainText": "One-Eyed Boggan of some repute, \"Bill-bill\"",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.222177",
+    "updatedAt": "2025-10-30 03:42:14.623000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Mike",
+    "faeName": "",
+    "rank": "",
+    "kith": "Kinain",
+    "location": "Goldfinch",
+    "position": "Kinain",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Kinain of nocker blood, age 13.</div>",
+    "notes": "<div>Son of Sunny</div>",
+    "descriptionPlainText": "Kinain of nocker blood, age 13.",
+    "notesPlainText": "Son of Sunny",
+    "createdAt": "2021-12-10 20:49:53.797249",
+    "updatedAt": "2025-10-30 03:42:14.624000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Tex",
+    "rank": "",
+    "kith": "Redcap",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2021-12-15 16:48:28.774957",
+    "updatedAt": "2025-10-30 03:42:14.626000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Shalimar",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "EarthRunes",
+    "position": "Court Jester",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>This sweet-scented prankster is always on hand to fullfill the true duty of a court jester - keep the nobility on their toes, and prevent them from getting -too-full of themselves.</div>",
+    "notes": "",
+    "descriptionPlainText": "This sweet-scented prankster is always on hand to fullfill the true duty of a court jester - keep the nobility on their toes, and prevent them from getting -too-full of themselves.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.196270",
+    "updatedAt": "2025-10-30 03:42:14.626000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Brenda Thomas",
+    "faeName": "Brenda",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Satyr, mother to Adam and Lily</div>",
+    "notes": "<div>Reverted to Mortality</div>",
+    "descriptionPlainText": "Satyr, mother to Adam and Lily",
+    "notesPlainText": "Reverted to Mortality",
+    "createdAt": "2020-12-20 18:40:00.085740",
+    "updatedAt": "2025-10-30 03:42:14.634000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Mirwin ap Fiona",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "Alabaster Hollow",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Fiona",
+    "bannerhouse": "",
+    "description": "<div>Former tormentor of August, currently indentured in service to Count Jude.</div>",
+    "notes": "",
+    "descriptionPlainText": "Former tormentor of August, currently indentured in service to Count Jude.",
+    "notesPlainText": "",
+    "createdAt": "2021-03-11 18:25:48.463257",
+    "updatedAt": "2025-10-30 03:42:14.639000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Marzanna",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "Scarsdale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2021-05-25 13:36:29.301445",
+    "updatedAt": "2025-10-30 03:42:14.697000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Audrey",
+    "faeName": "Audrey",
+    "rank": "Fledge",
+    "kith": "Clurichaun",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Twin sister of Nolan</div>",
+    "notes": "",
+    "descriptionPlainText": "Twin sister of Nolan",
+    "notesPlainText": "",
+    "createdAt": "2021-08-05 19:37:21.299406",
+    "updatedAt": "2025-10-30 03:42:14.651000"
+  },
+  {
+    "player": "Catnik",
+    "mortalName": "",
+    "faeName": "Mara DeBuke",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "DeBuke Farmhold",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.099969",
+    "updatedAt": "2025-10-30 03:42:14.506000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Neera",
+    "rank": "",
+    "kith": "Inanimae - Glome (krofted)",
+    "location": "",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Once a figment from the dreaming, Neera became a Glome with Klump's help after being brought to the mortal realms by Symon and the RV motley.  She was found in a dream realm resembling the world of Krynn, where the wilders sought a Dragonlance to assist in the battle against Skallstryke.  Her anchor is a small red fire opal.</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Once a figment from the dreaming, Neera became a Glome with Klump's help after being brought to the mortal realms by Symon and the RV motley.  She was found in a dream realm resembling the world of Krynn, where the wilders sought a Dragonlance to assist in the battle against Skallstryke.  Her anchor is a small red fire opal.",
+    "createdAt": "2021-04-12 16:05:44.991139",
+    "updatedAt": "2025-10-30 03:42:14.508000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "",
+    "faeName": "Vince",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>This larger-than-life Lion Pooka may have wheedled his way into employment, but seems to have the competence to remain in Jack's good graces. If he can only manage to keep himself out of trouble, mischief, and random beds...</div>",
+    "notes": "",
+    "descriptionPlainText": "This larger-than-life Lion Pooka may have wheedled his way into employment, but seems to have the competence to remain in Jack's good graces. If he can only manage to keep himself out of trouble, mischief, and random beds...",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.234531",
+    "updatedAt": "2025-10-30 03:42:14.508000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Dordi Glowfargen",
+    "faeName": "Dordi Glimmerwagon",
+    "rank": "",
+    "kith": "Troll",
+    "location": "EarthRunes",
+    "position": "Carriage driver and guard/Fledge",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Dream Dance July 1st</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Dream Dance July 1st",
+    "createdAt": "2022-07-10 00:30:12.202127",
+    "updatedAt": "2025-10-30 03:42:14.509000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Eglantine",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Mink Pooka</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Mink Pooka",
+    "createdAt": "2022-07-10 00:35:57.918990",
+    "updatedAt": "2025-10-30 03:42:14.510000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Ernest Wiffle",
+    "faeName": "Madern aka \"Mad Ernie\"",
+    "rank": "",
+    "kith": "Piskey",
+    "location": "Silverwolf",
+    "position": "Assistant Steward",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Swept here when the guidestones fell</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Swept here when the guidestones fell",
+    "createdAt": "2022-07-11 05:10:39.217243",
+    "updatedAt": "2025-10-30 03:42:14.511000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Modesty",
+    "faeName": "Temerity",
+    "rank": "Knight",
+    "kith": "Pooka",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Liam",
+    "bannerhouse": "Truthbranch",
+    "description": "<div>Mouse Pooka Knight</div>",
+    "notes": "",
+    "descriptionPlainText": "Mouse Pooka Knight",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.012115",
+    "updatedAt": "2025-10-30 03:42:14.666000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Anne Marie Lee",
+    "faeName": "Anne Marie",
+    "rank": "Dame",
+    "kith": "Boggan",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Grump",
+    "house": "Liam",
+    "bannerhouse": "",
+    "description": "<div>Resident boggan social worker, became Symon's stepmother upon marriage to his mortal father, Bruce.  Dirk is fostered with this family as well. Later Knighted</div>",
+    "notes": "",
+    "descriptionPlainText": "Resident boggan social worker, became Symon's stepmother upon marriage to his mortal father, Bruce.  Dirk is fostered with this family as well. Later Knighted",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.471730",
+    "updatedAt": "2025-10-30 03:42:14.511000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Jerry Post",
+    "faeName": "Jerant",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Rivervale",
+    "position": "Refugee",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Age 18 to 22</div>",
+    "notes": "<div>Was saved by Dagmar and Olgar, was on the trods when Guidestones broke</div>",
+    "descriptionPlainText": "Age 18 to 22",
+    "notesPlainText": "Was saved by Dagmar and Olgar, was on the trods when Guidestones broke",
+    "createdAt": "2022-07-10 00:10:18.560661",
+    "updatedAt": "2025-10-30 03:42:14.512000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Ivanka",
+    "rank": "",
+    "kith": "Kinain",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Sluagh Kinain and new maid</div>",
+    "notes": "",
+    "descriptionPlainText": "Sluagh Kinain and new maid",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.114096",
+    "updatedAt": "2025-10-30 03:42:14.513000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Permaz",
+    "faeName": "Permaz",
+    "rank": "",
+    "kith": "Qareen",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Looks elderly in fae mein save for her eyes, but her mortal age looks closer to 15. Given her kith's birthrights, she's probably far older though</div>",
+    "notes": "<div>Refugee from Afghanistan</div>",
+    "descriptionPlainText": "Looks elderly in fae mein save for her eyes, but her mortal age looks closer to 15. Given her kith's birthrights, she's probably far older though",
+    "notesPlainText": "Refugee from Afghanistan",
+    "createdAt": "2021-08-17 15:56:11.514181",
+    "updatedAt": "2025-10-30 03:42:14.514000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Unknown",
+    "faeName": "Sam",
+    "rank": "Sheriff",
+    "kith": "Pooka",
+    "location": "Lake, The",
+    "position": "Sheriff, big gun, sorcerer",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Eagle pooka </div>",
+    "notes": "<div>Apparently mastered at least 3 different arts. Skycraft among them</div>",
+    "descriptionPlainText": "Eagle pooka ",
+    "notesPlainText": "Apparently mastered at least 3 different arts. Skycraft among them",
+    "createdAt": "2021-10-05 17:19:24.411759",
+    "updatedAt": "2025-10-30 03:42:14.515000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Ham",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Chimp pooka and Observatory professor</div>",
+    "notes": "",
+    "descriptionPlainText": "Chimp pooka and Observatory professor",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.250349",
+    "updatedAt": "2025-10-30 03:42:14.517000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Symond",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Skyhook",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.895931",
+    "updatedAt": "2025-10-30 03:42:14.518000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Cornelius Wayburton",
+    "faeName": "Cornelius Wayburton",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Zane and Lydia's dad, Piper's uncle. A reknowned professor.</div>",
+    "notes": "",
+    "descriptionPlainText": "Zane and Lydia's dad, Piper's uncle. A reknowned professor.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.678490",
+    "updatedAt": "2025-10-30 03:42:14.519000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Bach",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Lake, The",
+    "position": "Cook",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>CHONKY but that just means there is more of him to love!</div>",
+    "notes": "<div>Was framed for a sexual assault by a Fiona lady who didn't want her ailil consort angry at her</div>",
+    "descriptionPlainText": "CHONKY but that just means there is more of him to love!",
+    "notesPlainText": "Was framed for a sexual assault by a Fiona lady who didn't want her ailil consort angry at her",
+    "createdAt": "2021-10-05 17:22:14.125344",
+    "updatedAt": "2025-10-30 03:42:14.520000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Margalita",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.640214",
+    "updatedAt": "2025-10-30 03:42:14.521000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Piper Prudence McCormick",
+    "faeName": "Piper",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Satyr musician and part of Siv and Jonas's Triad.</div>",
+    "notes": "",
+    "descriptionPlainText": "Satyr musician and part of Siv and Jonas's Triad.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.669889",
+    "updatedAt": "2025-10-30 03:42:14.522000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Colton",
+    "rank": "Knight",
+    "kith": "Troll",
+    "location": "Dark Gate",
+    "position": "Storm",
+    "seeming": "",
+    "house": "Liam",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.043556",
+    "updatedAt": "2025-10-30 03:42:14.523000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Taylor",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Aspiring beekeeper - NOT a seamstress!</div>",
+    "notes": "",
+    "descriptionPlainText": "Aspiring beekeeper - NOT a seamstress!",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.989228",
+    "updatedAt": "2025-10-30 03:42:14.524000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Rikki Dyer",
+    "faeName": "Rikki",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Raccoon pooka. This sassy looking girl’s fae seeming almost looks like a make up job around the eyes in the form of a mask. She’s been seen wearing shorts, sneakers, and a crop top that says ‘Good Girls go to Heaven, Bad Girls go everywhere’.</div>",
+    "notes": "",
+    "descriptionPlainText": "Raccoon pooka. This sassy looking girl’s fae seeming almost looks like a make up job around the eyes in the form of a mask. She’s been seen wearing shorts, sneakers, and a crop top that says ‘Good Girls go to Heaven, Bad Girls go everywhere’.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.685896",
+    "updatedAt": "2025-10-30 03:42:14.524000"
+  },
+  {
+    "player": "Shady Lady",
+    "mortalName": "",
+    "faeName": "August Truthbranch",
+    "rank": "Baron",
+    "kith": "Sidhe",
+    "location": "EarthRunes",
+    "position": "Scribe",
+    "seeming": "Wilder",
+    "house": "Liam",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.111494",
+    "updatedAt": "2025-10-30 03:42:14.526000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Clio",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "BrightWinds",
+    "position": "Scribe",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.258116",
+    "updatedAt": "2025-10-30 03:42:14.527000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Marybelle",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>13 year old barely out of childling, and Clarence's niece</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "13 year old barely out of childling, and Clarence's niece",
+    "createdAt": "2021-01-27 14:18:58.046496",
+    "updatedAt": "2025-10-30 03:42:14.528000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Carowyn",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Liam",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.495203",
+    "updatedAt": "2025-10-30 03:42:14.702000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Nadhir the Bountiful",
+    "rank": "",
+    "kith": "Eshu",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Is deaf, but can read lips somewhat, and knows ASL. Appears to be of the Sikh faith</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Is deaf, but can read lips somewhat, and knows ASL. Appears to be of the Sikh faith",
+    "createdAt": "2021-02-16 22:42:37.722676",
+    "updatedAt": "2025-10-30 03:42:14.529000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Vanessa Phillips",
+    "faeName": "Nessa Dawnchaser",
+    "rank": "",
+    "kith": "Centaur",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2021-01-27 13:48:28.690729",
+    "updatedAt": "2025-10-30 03:42:14.530000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Rosalind Phillips",
+    "faeName": "Rose Windfury",
+    "rank": "Squire",
+    "kith": "Centaur",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Grump",
+    "house": "Fiona",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2021-01-27 13:50:05.980813",
+    "updatedAt": "2025-10-30 03:42:14.530000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "G Ladmeer",
+    "faeName": "Gildas",
+    "rank": "Baron",
+    "kith": "Sidhe",
+    "location": "",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Daireann",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2021-03-11 18:28:47.051038",
+    "updatedAt": "2025-10-30 03:42:14.532000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Kenna",
+    "rank": "Baroness",
+    "kith": "Sidhe",
+    "location": "",
+    "position": "Freeholder",
+    "seeming": "Wilder",
+    "house": "Daireann",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2021-03-11 18:29:49.214162",
+    "updatedAt": "2025-10-30 03:42:14.533000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Hardbliss",
+    "rank": "Baron",
+    "kith": "Sidhe",
+    "location": "",
+    "position": "",
+    "seeming": "",
+    "house": "Balor",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2021-03-11 18:30:11.094551",
+    "updatedAt": "2025-10-30 03:42:14.533000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Guzrela",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Scarsdale",
+    "position": "Chancellor",
+    "seeming": "",
+    "house": "Dougal",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2021-03-11 18:32:27.312556",
+    "updatedAt": "2025-10-30 03:42:14.534000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Guzrela",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Alabaster Hollow",
+    "position": "Chancellor",
+    "seeming": "",
+    "house": "Dougal",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2021-03-11 18:33:01.953383",
+    "updatedAt": "2025-10-30 03:42:14.535000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Gerd Hornshield",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Orphaned at a young age, this Troll wilder is the ward of Vali and self-professed big sister to Connor.  She has recently adopted a Gothic fashion and behaviour style following her togail to Wilderhood.  A young master of Wayfare, she is known to Flicker-flash folk into the lake if they are deemed worthy of such treatment. Reincarnated soul of Vergard.</div>",
+    "notes": "",
+    "descriptionPlainText": "Orphaned at a young age, this Troll wilder is the ward of Vali and self-professed big sister to Connor.  She has recently adopted a Gothic fashion and behaviour style following her togail to Wilderhood.  A young master of Wayfare, she is known to Flicker-flash folk into the lake if they are deemed worthy of such treatment. Reincarnated soul of Vergard.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.540667",
+    "updatedAt": "2025-10-30 03:42:14.536000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Danielle Marshall",
+    "faeName": "Danica",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Silverwolf",
+    "position": "Thane",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Blond and nordic twin of Linnea. Danica wears a single braid, tightly wound out of the way when in the line of duty, and fights with two small handaxes. She is a Thane of Silverwolf as well as police Sargeant for Carthage.</div>",
+    "notes": "",
+    "descriptionPlainText": "Blond and nordic twin of Linnea. Danica wears a single braid, tightly wound out of the way when in the line of duty, and fights with two small handaxes. She is a Thane of Silverwolf as well as police Sargeant for Carthage.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.827216",
+    "updatedAt": "2025-10-30 03:42:14.538000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Delores",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "EarthRunes",
+    "position": "Steward",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>This Boggan keeps the rest of the staff at EarthRunes in line under her capable supervision.  Little goes on at the Barony that Delores is unaware of.[/toggle]</div>",
+    "notes": "",
+    "descriptionPlainText": "This Boggan keeps the rest of the staff at EarthRunes in line under her capable supervision.  Little goes on at the Barony that Delores is unaware of.[/toggle]",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.152074",
+    "updatedAt": "2025-10-30 03:42:14.540000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Tim Tremble",
+    "faeName": "Titus Trimblefarhtz",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Lake, The",
+    "position": "Cook, tinkerer",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Typical nocker but more wavy lines than the usual spirals</div>",
+    "notes": "<div>ALSO spent time in Jude's mirror prison for ravaging a target</div>",
+    "descriptionPlainText": "Typical nocker but more wavy lines than the usual spirals",
+    "notesPlainText": "ALSO spent time in Jude's mirror prison for ravaging a target",
+    "createdAt": "2021-10-05 17:29:19.104681",
+    "updatedAt": "2025-10-30 03:42:14.541000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Joe",
+    "faeName": "Rochallor",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A young Shire Horse Pooka, shy.</div>",
+    "notes": "<div>Adopted son of Amy Ryder (kinain daughter of Dolph, boggan hostler) and Nick (mortal).</div>",
+    "descriptionPlainText": "A young Shire Horse Pooka, shy.",
+    "notesPlainText": "Adopted son of Amy Ryder (kinain daughter of Dolph, boggan hostler) and Nick (mortal).",
+    "createdAt": "2021-05-25 17:20:44.602659",
+    "updatedAt": "2025-10-30 03:42:14.542000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Miss Parch",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "",
+    "position": "Steward",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Miss Parch is a rather desiccated looking Sluagh who serves Countess Edrit in Twin Towers.</div>",
+    "notes": "",
+    "descriptionPlainText": "Miss Parch is a rather desiccated looking Sluagh who serves Countess Edrit in Twin Towers.",
+    "notesPlainText": "",
+    "createdAt": "2022-05-27 18:33:39.043866",
+    "updatedAt": "2025-10-30 03:42:14.543000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Selga",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "Twin Towers",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Aesin",
+    "bannerhouse": "",
+    "description": "<div>This Aesin warrior serves Countess Edrit in Twin Towers.</div>",
+    "notes": "",
+    "descriptionPlainText": "This Aesin warrior serves Countess Edrit in Twin Towers.",
+    "notesPlainText": "",
+    "createdAt": "2022-05-27 18:36:15.119404",
+    "updatedAt": "2025-10-30 03:42:14.543000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Fawn",
+    "rank": "",
+    "kith": "Centaur",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div><strong>Fawn </strong>has a name that makes you think young deer, but in truth, she's the old gray mare of those rescued. She's fifty years old, and has a life time of experience, but only recently became a centaur. She rather likes feeling stronger and healthier than before, but wishes it had come to her in her younger years when she could have done more with it. That said, there's a quiet wisdom about her..one that if asked about she dismisses as \"Regret can lead to a sad kind of wisdom I suppose\"  </div>",
+    "notes": "",
+    "descriptionPlainText": "Fawn has a name that makes you think young deer, but in truth, she's the old gray mare of those rescued. She's fifty years old, and has a life time of experience, but only recently became a centaur. She rather likes feeling stronger and healthier than before, but wishes it had come to her in her younger years when she could have done more with it. That said, there's a quiet wisdom about her..one that if asked about she dismisses as \"Regret can lead to a sad kind of wisdom I suppose\"  ",
+    "notesPlainText": "",
+    "createdAt": "2021-05-25 17:18:35.978227",
+    "updatedAt": "2025-10-30 03:42:14.544000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Sergei ap Varich",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "EarthRunes",
+    "position": "Master of Hawk and Hound",
+    "seeming": "Grump",
+    "house": "Varich",
+    "bannerhouse": "",
+    "description": "<div>Doesn't speak much, greybeard of middle ages years. Seems to have a good relationship with Sparrow's Squire and some say he's tutoring the boy.</div>",
+    "notes": "",
+    "descriptionPlainText": "Doesn't speak much, greybeard of middle ages years. Seems to have a good relationship with Sparrow's Squire and some say he's tutoring the boy.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.218729",
+    "updatedAt": "2025-10-30 03:42:14.545000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Tess",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Twin Towers",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>\"Tess\" turns out to be a troll of unusual looks. While not morbidly obese, there is a plumpness to her that makes her look softer than other trolls- at first glance. Of course, a focus to her shoulders or watching her when she lifts trays might reveal that under that doughy outer level, there's still muscle. Troll Birthrights are a thing.</div>",
+    "notes": "<div>Tess is a waitress at the 'Norway Cafe'.</div>",
+    "descriptionPlainText": "\"Tess\" turns out to be a troll of unusual looks. While not morbidly obese, there is a plumpness to her that makes her look softer than other trolls- at first glance. Of course, a focus to her shoulders or watching her when she lifts trays might reveal that under that doughy outer level, there's still muscle. Troll Birthrights are a thing.",
+    "notesPlainText": "Tess is a waitress at the 'Norway Cafe'.",
+    "createdAt": "2022-05-27 18:35:09.693833",
+    "updatedAt": "2025-10-30 03:42:14.546000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Cire",
+    "rank": "",
+    "kith": "Mer",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Childling",
+    "house": "Melusine",
+    "bannerhouse": "",
+    "description": "<div>Cire is a Mer childling who has met the 'Fenix Kids Crew' on occasion. He is of House Melusine, with a Dolphin Apsara.</div>",
+    "notes": "",
+    "descriptionPlainText": "Cire is a Mer childling who has met the 'Fenix Kids Crew' on occasion. He is of House Melusine, with a Dolphin Apsara.",
+    "notesPlainText": "",
+    "createdAt": "2022-10-25 12:44:16.811658",
+    "updatedAt": "2025-10-30 03:42:14.546000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Otem",
+    "rank": "",
+    "kith": "Nunnehi",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Otem is an obsidian-skinned warrior of the Nunnehi</div>",
+    "notes": "",
+    "descriptionPlainText": "Otem is an obsidian-skinned warrior of the Nunnehi",
+    "notesPlainText": "",
+    "createdAt": "2022-10-25 12:50:13.654863",
+    "updatedAt": "2025-10-30 03:42:14.547000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "DeVere",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "DeBuke Farmhold",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.093653",
+    "updatedAt": "2025-10-30 03:42:14.549000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Cassidy Havershorn",
+    "rank": "",
+    "kith": "Clurichaun",
+    "location": "Clutching Rock Barony",
+    "position": "Herald and Messenger",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2021-01-27 13:53:56.098223",
+    "updatedAt": "2025-10-30 03:42:14.550000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Layne",
+    "faeName": "Layne",
+    "rank": "",
+    "kith": "Centaur",
+    "location": "Rivervale",
+    "position": "Fledge",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2021-02-16 03:19:02.067915",
+    "updatedAt": "2025-10-30 03:42:14.551000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Ivory",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Albino Sidhe, brother of Zara</div>",
+    "notes": "",
+    "descriptionPlainText": "Albino Sidhe, brother of Zara",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.004209",
+    "updatedAt": "2025-10-30 03:42:14.673000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Bachdion",
+    "rank": "Knight",
+    "kith": "Satyr",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Grump",
+    "house": "Fiona",
+    "bannerhouse": "",
+    "description": "<div>Satyr Knight, pre saining House tutor to Coradel. While a Grump, Bachdion looks to be in his late thirties and some say if anything age has improved his roguish looks. If Harrison Ford and Pierce Bronson had a love child with horns aged to 40, well, you have a rough idea what the man looks like. While some grumps get melancholy, Bachdion seemed to have embraced his age with eye towards a perpetual bucket list that just keeps on growing, and his idea of teaching is to bring his students along. Mountain climbing, zip lining, and other adventures. His mastery of Wayfare means the world is his oyster, and he sucks it down a plenty. However, ever since his near death by cold iron, more hair is grayer, and he seems a bit less adventurous, but then given his previous behavior 'a bit' means he's still got plenty of kick and zest.</div>",
+    "notes": "",
+    "descriptionPlainText": "Satyr Knight, pre saining House tutor to Coradel. While a Grump, Bachdion looks to be in his late thirties and some say if anything age has improved his roguish looks. If Harrison Ford and Pierce Bronson had a love child with horns aged to 40, well, you have a rough idea what the man looks like. While some grumps get melancholy, Bachdion seemed to have embraced his age with eye towards a perpetual bucket list that just keeps on growing, and his idea of teaching is to bring his students along. Mountain climbing, zip lining, and other adventures. His mastery of Wayfare means the world is his oyster, and he sucks it down a plenty. However, ever since his near death by cold iron, more hair is grayer, and he seems a bit less adventurous, but then given his previous behavior 'a bit' means he's still got plenty of kick and zest.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.203674",
+    "updatedAt": "2025-10-30 03:42:14.552000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Ahpuch",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.915371",
+    "updatedAt": "2025-10-30 03:42:14.552000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Taras Tidemarch",
+    "rank": "Baron",
+    "kith": "Sidhe",
+    "location": "Sunkissed Waves",
+    "position": "",
+    "seeming": "",
+    "house": "Varich",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.947505",
+    "updatedAt": "2025-10-30 03:42:14.553000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Neachdainn",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Ailil",
+    "bannerhouse": "",
+    "description": "<div>Ambitious, perhaps for his own sake, perhaps for his barony. Might be considered reckless in his drive to gather and utilize resources. Biological Brother (Mortal wise) to Nansaidh . Naturally they argue about everything.</div>",
+    "notes": "",
+    "descriptionPlainText": "Ambitious, perhaps for his own sake, perhaps for his barony. Might be considered reckless in his drive to gather and utilize resources. Biological Brother (Mortal wise) to Nansaidh . Naturally they argue about everything.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.211069",
+    "updatedAt": "2025-10-30 03:42:14.554000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Claire",
+    "rank": "",
+    "kith": "Sidhe",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Ailil",
+    "bannerhouse": "",
+    "description": "<div>While this sidhe wilder’s mortal seeming has a silver T shirt that says in black font “I did it 35 minutes ago” and dark gray slacks, her fae mein is plate armor, silver, with the symbol of Ailil only with a black dragon instead of a silver one. A shield on her back, a sword at her side, whatever her title she certainly looks like a lady knight. And what a lady, the classic dark piercing eyes the Ailil are known for, and rather curly blonde hair. Somehow the armor steals nothing from her shape, but that’s chimeric gear for you.</div>",
+    "notes": "",
+    "descriptionPlainText": "While this sidhe wilder’s mortal seeming has a silver T shirt that says in black font “I did it 35 minutes ago” and dark gray slacks, her fae mein is plate armor, silver, with the symbol of Ailil only with a black dragon instead of a silver one. A shield on her back, a sword at her side, whatever her title she certainly looks like a lady knight. And what a lady, the classic dark piercing eyes the Ailil are known for, and rather curly blonde hair. Somehow the armor steals nothing from her shape, but that’s chimeric gear for you.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.117617",
+    "updatedAt": "2025-10-30 03:42:14.555000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Jude",
+    "rank": "",
+    "kith": "Sidhe",
+    "location": "Ardent Harbor",
+    "position": "",
+    "seeming": "",
+    "house": "Liam",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.961065",
+    "updatedAt": "2025-10-30 03:42:14.557000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Vali Gardner",
+    "faeName": "Vali",
+    "rank": "Knight",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Grump",
+    "house": "Beaumayn",
+    "bannerhouse": "",
+    "description": "<div>A newly-grumped troll of house Beaumayn, he works as a French teacher at Pascack Valley High by day, and visionary by night. Lives with his ward, Gerd, fiance, Tiffany, and Margalita.</div>",
+    "notes": "",
+    "descriptionPlainText": "A newly-grumped troll of house Beaumayn, he works as a French teacher at Pascack Valley High by day, and visionary by night. Lives with his ward, Gerd, fiance, Tiffany, and Margalita.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.758293",
+    "updatedAt": "2025-10-30 03:42:14.558000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Basil McCormick",
+    "faeName": "Basil",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>This satyr wilder is the nephew of Viola McCormick.  Having left his hometown to visit Rivervale for protests, he may stick around now that he needs to learn the ins and outs of Satyrhood.  He also expressed dissatisfaction with how his family treated Viola for being in a same-sex relationship, to the point of taking on her married name as his own surname.  His new fae form sports bittersweet dark chocolate fur and golden horns and hooves, complementing his mocha latte skin tone.</div>",
+    "notes": "",
+    "descriptionPlainText": "This satyr wilder is the nephew of Viola McCormick.  Having left his hometown to visit Rivervale for protests, he may stick around now that he needs to learn the ins and outs of Satyrhood.  He also expressed dissatisfaction with how his family treated Viola for being in a same-sex relationship, to the point of taking on her married name as his own surname.  His new fae form sports bittersweet dark chocolate fur and golden horns and hooves, complementing his mocha latte skin tone.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.479324",
+    "updatedAt": "2025-10-30 03:42:14.559000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Lut",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "Thane",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Twin of Tig</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Twin of Tig",
+    "createdAt": "2020-12-20 18:39:59.625755",
+    "updatedAt": "2025-10-30 03:42:14.559000"
+  },
+  {
+    "player": "Catnik",
+    "mortalName": "",
+    "faeName": "Emma",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "EarthRunes",
+    "position": "Healer",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Possom pooka and Herbalist</div>",
+    "notes": "",
+    "descriptionPlainText": "Possom pooka and Herbalist",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.078247",
+    "updatedAt": "2025-10-30 03:42:14.560000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Gideon",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "EarthRunes",
+    "position": "Troubadour",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Gideon's playing lends itself to a more humble folk styling suited to his Boggan nature</div>",
+    "notes": "",
+    "descriptionPlainText": "Gideon's playing lends itself to a more humble folk styling suited to his Boggan nature",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.160497",
+    "updatedAt": "2025-10-30 03:42:14.561000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Velvet",
+    "rank": "Squire",
+    "kith": "Sluagh",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Squire to Baron August</div>",
+    "notes": "",
+    "descriptionPlainText": "Squire to Baron August",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.047778",
+    "updatedAt": "2025-10-30 03:42:14.562000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Diego",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Fenix",
+    "position": "Steward",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Satyr Wilder, Steward of Fenix.  Former rebel leader in Tijuana against Baroness Rathbone, and Jessica’s predecessor.</div>",
+    "notes": "",
+    "descriptionPlainText": "Satyr Wilder, Steward of Fenix.  Former rebel leader in Tijuana against Baroness Rathbone, and Jessica’s predecessor.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.289514",
+    "updatedAt": "2025-10-30 03:42:14.563000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Coy DeBuke",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Fenix",
+    "position": "Thane",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Troll Thane and mentor to Ariel.  Also Constance’s sweetheart.</div>",
+    "notes": "",
+    "descriptionPlainText": "Troll Thane and mentor to Ariel.  Also Constance’s sweetheart.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.351516",
+    "updatedAt": "2025-10-30 03:42:14.563000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Demos",
+    "rank": "",
+    "kith": "Redcap",
+    "location": "Fenix",
+    "position": "Thane",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Unseelie Redcap, brother to Phobos. Thane</div>",
+    "notes": "",
+    "descriptionPlainText": "Unseelie Redcap, brother to Phobos. Thane",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.359373",
+    "updatedAt": "2025-10-30 03:42:14.564000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Constance",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Fenix",
+    "position": "Scribe",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Troll Scribe, dating Coy DeBuke, generally found at the library.</div>",
+    "notes": "",
+    "descriptionPlainText": "Troll Scribe, dating Coy DeBuke, generally found at the library.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.372925",
+    "updatedAt": "2025-10-30 03:42:14.565000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Ariel DeBuke",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Fenix",
+    "position": "Troubadour-in-Training",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Childling satyr, companion to Ellie and Salma, 'Childling Troubadour;</div>",
+    "notes": "",
+    "descriptionPlainText": "Childling satyr, companion to Ellie and Salma, 'Childling Troubadour;",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.381265",
+    "updatedAt": "2025-10-30 03:42:14.567000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Tiffany",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Rivervale",
+    "position": "Thane",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Spaniel Pooka, Vali's fiance</div>",
+    "notes": "",
+    "descriptionPlainText": "Spaniel Pooka, Vali's fiance",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.722288",
+    "updatedAt": "2025-10-30 03:42:14.567000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "",
+    "faeName": "Marigold",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "Silverwolf",
+    "position": "Steward",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A motherly nanny figure who loves to care.</div>",
+    "notes": "",
+    "descriptionPlainText": "A motherly nanny figure who loves to care.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.879379",
+    "updatedAt": "2025-10-30 03:42:14.568000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Olgar Davidson",
+    "faeName": "Olgar",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "Rover",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>This unseelie troll has a blighted face that hides a gentle heart – to those deserving.  Intruders on the trods or to the hold with any ill intent would do well to fear this Ogre. Father of Sylvi, husband of Kerri.</div>",
+    "notes": "",
+    "descriptionPlainText": "This unseelie troll has a blighted face that hides a gentle heart – to those deserving. Intruders on the trods or to the hold with any ill intent would do well to fear this Ogre. Father of Sylvi, husband of Kerri.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.660266",
+    "updatedAt": "2025-10-30 03:42:14.569000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Ross Phillips",
+    "faeName": "Ross Sage-Speaker",
+    "rank": "",
+    "kith": "Centaur",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Soothsay, Skycraft</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Soothsay, Skycraft",
+    "createdAt": "2021-01-27 13:49:05.211255",
+    "updatedAt": "2025-10-30 03:42:14.570000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "",
+    "faeName": "Salma",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Donkey pooka bookworm who consumes new tomes even more quickly than churros. And this burra loves churros.</div>",
+    "notes": "",
+    "descriptionPlainText": "Donkey pooka bookworm who consumes new tomes even more quickly than churros. And this burra loves churros.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.406044",
+    "updatedAt": "2025-10-30 03:42:14.571000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Jacob",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "Scarsdale",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Uncle of Zara and Jacob, \"He-he\"</div>",
+    "notes": "",
+    "descriptionPlainText": "Uncle of Zara and Jacob, \"He-he\"",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.185263",
+    "updatedAt": "2025-10-30 03:42:14.572000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Symon Lee",
+    "faeName": "Symon",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "Rivervale",
+    "position": "Pillar of the Mountain",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A scrawny Korean boy - the word 'pipsqueak' comes to mind.  He looks ripe for the bullying, and does his best to fade into the scenery.  Long, thin black hair falls over his unremarkable features, skin pale and speckled from the visit of the acne fairy.   Fae: The scrawny boy now borders on skeletal, and his eyes are sunken and black.  grey lips extend in a grimace like a frog's mouth, too wide across pale mottled skin, and purplish gums peek from within.  His hair is lank and greasy, going from black to murky shadows, and almost seems to move on it's own, masking his features a bit as he leans to let it fall forward, blissfully covering up his face a bit.  Often in his presence is Lovecraft, a chimerical shadowcat with gleaming eyes of eldritch green, and a penchant for stealing chicken.</div>",
+    "notes": "",
+    "descriptionPlainText": "A scrawny Korean boy - the word 'pipsqueak' comes to mind.  He looks ripe for the bullying, and does his best to fade into the scenery.  Long, thin black hair falls over his unremarkable features, skin pale and speckled from the visit of the acne fairy.  Fae: The scrawny boy now borders on skeletal, and his eyes are sunken and black.  grey lips extend in a grimace like a frog's mouth, too wide across pale mottled skin, and purplish gums peek from within.  His hair is lank and greasy, going from black to murky shadows, and almost seems to move on it's own, masking his features a bit as he leans to let it fall forward, blissfully covering up his face a bit. Often in his presence is Lovecraft, a chimerical shadowcat with gleaming eyes of eldritch green, and a penchant for stealing chicken.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.714693",
+    "updatedAt": "2025-10-30 03:42:14.573000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Lily Thomas",
+    "faeName": "Lily",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Daughter of Brenda and Kyle, Adam's sister</div>",
+    "notes": "",
+    "descriptionPlainText": "Daughter of Brenda and Kyle, Adam's sister",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.159699",
+    "updatedAt": "2025-10-30 03:42:14.573000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Enri",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Poodle Pooka and brother to Isis</div>",
+    "notes": "",
+    "descriptionPlainText": "Poodle Pooka and brother to Isis",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.063336",
+    "updatedAt": "2025-10-30 03:42:14.575000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Delorean",
+    "rank": "Knight",
+    "kith": "Satyr",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Jouster!</div>",
+    "notes": "",
+    "descriptionPlainText": "Jouster!",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.819708",
+    "updatedAt": "2025-10-30 03:42:14.575000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Minerva",
+    "rank": "",
+    "kith": "Sidhe",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.026874",
+    "updatedAt": "2025-10-30 03:42:14.576000"
+  },
+  {
+    "player": "Shady Lady",
+    "mortalName": "",
+    "faeName": "Ratchet",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Scarsdale",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.200223",
+    "updatedAt": "2025-10-30 03:42:14.577000"
+  },
+  {
+    "player": "Shady Lady",
+    "mortalName": "",
+    "faeName": "Miriam",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Scarsdale",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.205656",
+    "updatedAt": "2025-10-30 03:42:14.578000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Lucjan",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Twin of Lauge</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Twin of Lauge",
+    "createdAt": "2020-12-20 18:39:59.618005",
+    "updatedAt": "2025-10-30 03:42:14.579000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Lola",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Satyr lady, sister of Leya. Living at the BAR.</div>",
+    "notes": "",
+    "descriptionPlainText": "Satyr lady, sister of Leya. Living at the BAR.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.602700",
+    "updatedAt": "2025-10-30 03:42:14.579000"
+  },
+  {
+    "player": "Rahne",
+    "mortalName": "Brekke Dierks King",
+    "faeName": "Brekke",
+    "rank": "Baroness",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "Freeholder; Storm",
+    "seeming": "Grump",
+    "house": "Gwydion",
+    "bannerhouse": "",
+    "description": "<div>Chieftain Brekke Dierks King, the Shacklebreaker, Grimhand, Baroness of Rivervale in County Bergen, Kingdom of Apples.<br><br>At over 8′ tall, she is an imposing woman, even moreso than in her youth, her years having tempered her through extremes as a blade in the forge. Age has shot her long blonde four-plaited braid with silver streaks, and her heavy, ridged horns curl back along her head. One of her hands, her left, gleams silver.<br>She wears simple green and brown tunic and trews on most informal occasions. A double-bladed axe is peace-tied by her side; some might remember how once the axe murmured, but it seems to have gone quiet now.<br><br>https://www.heroforge.com/load_config=5350466/</div>",
+    "notes": "",
+    "descriptionPlainText": "Chieftain Brekke Dierks King, the Shacklebreaker, Grimhand, Baroness of Rivervale in County Bergen, Kingdom of Apples.\n\nAt over 8′ tall, she is an imposing woman, even moreso than in her youth, her years having tempered her through extremes as a blade in the forge. Age has shot her long blonde four-plaited braid with silver streaks, and her heavy, ridged horns curl back along her head. One of her hands, her left, gleams silver.\nShe wears simple green and brown tunic and trews on most informal occasions. A double-bladed axe is peace-tied by her side; some might remember how once the axe murmured, but it seems to have gone quiet now.\n\nhttps://www.heroforge.com/load_config=5350466/",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.487037",
+    "updatedAt": "2025-10-30 03:42:14.580000"
+  },
+  {
+    "player": "Catnik",
+    "mortalName": "Samantha King",
+    "faeName": "Dagmar Hammerstrike",
+    "rank": "Knight",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "Crash of the Storm",
+    "seeming": "Wilder",
+    "house": "Gwydion",
+    "bannerhouse": "",
+    "description": "<div>While simply Sam King as a mortal, once touched by glamour and armed with Flyswatter, she takes on any foes as easily as squashing a bug.  Dagmar is solid. And brawny. And tall - pushing seven foot and change in her mien.  A golden falcon is emblazoned across her chest, and she has golden spurs on her heels.  Flyswatter, her halberd, is seldom far from her side.</div>",
+    "notes": "",
+    "descriptionPlainText": "While simply Sam King as a mortal, once touched by glamour and armed with Flyswatter, she takes on any foes as easily as squashing a bug.  Dagmar is solid. And brawny. And tall - pushing seven foot and change in her mien.  A golden falcon is emblazoned across her chest, and she has golden spurs on her heels.  Flyswatter, her halberd, is seldom far from her side.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.510669",
+    "updatedAt": "2025-10-30 03:42:14.582000"
+  },
+  {
+    "player": "Catnik",
+    "mortalName": "Katrina Smyth",
+    "faeName": "Trina",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A new changeling who chrysalized in September 2021.  Trina has an artsy background, or at least she would if not for the influence of an Autumn Person who stunted her emergence and growth as a Changeling.  Her hair is often dyed in any number of bright shades, and the whorls on her pale cheeks seem to shift color to match her mood.</div>",
+    "notes": "",
+    "descriptionPlainText": "A new changeling who chrysalized in September 2021.  Trina has an artsy background, or at least she would if not for the influence of an Autumn Person who stunted her emergence and growth as a Changeling.  Her hair is often dyed in any number of bright shades, and the whorls on her pale cheeks seem to shift color to match her mood.",
+    "notesPlainText": "",
+    "createdAt": "2021-09-14 17:37:13.458823",
+    "updatedAt": "2025-10-30 03:42:14.650000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Holger",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Self-appointed Protector of the young ladies of Fenix</div>",
+    "notes": "",
+    "descriptionPlainText": "Self-appointed Protector of the young ladies of Fenix",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.428721",
+    "updatedAt": "2025-10-30 03:42:14.650000"
+  },
+  {
+    "player": "Shady Lady",
+    "mortalName": "Frank King",
+    "faeName": "Franklyn",
+    "rank": "Knight",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "Mountain",
+    "seeming": "Grump",
+    "house": "Liam",
+    "bannerhouse": "",
+    "description": "<div>A Grump in his late 30's and the Mountain of Rivervale Lodge.  Married to Chieftain Brekke, and father of Siv and Jessica King.<br><br>Blonde and bearded, shot through with threads of silver, blue eyed and clear. Some 9' tall, broad and strong. His horns are massive affairs, curling back from his forehead, thickly ridged. His hands are callused, the knuckles knotted and palms scarred; well suited to physical labor. His frame carries a few extra pounds, perhaps.<br><br>Frank is generally seen around the Lodge dressed in casual work clothes (jeans, flannel, workboots); trews and a warm shirt, boots. He carries no apparent weapon.<br><br>To fae eyes, he wears white pants and a white poet shirt belted with a white belt that bears a troll sized 2 handed sword, the sword hilt resembling a bare tree.  His shoulders are covered with a light blue great cape trimmed with silver-grey fur. Muted silver bracers protect his forearms. Dove grey boots with spurs finish the outfit; there is something a little off about the spurs. The whole affect is of a white Viking, with his beard and hair mixing into the pelt of his cloak.</div>",
+    "notes": "",
+    "descriptionPlainText": "A Grump in his late 30's and the Mountain of Rivervale Lodge.  Married to Chieftain Brekke, and father of Siv and Jessica King.\n\nBlonde and bearded, shot through with threads of silver, blue eyed and clear. Some 9' tall, broad and strong. His horns are massive affairs, curling back from his forehead, thickly ridged. His hands are callused, the knuckles knotted and palms scarred; well suited to physical labor. His frame carries a few extra pounds, perhaps.\n\nFrank is generally seen around the Lodge dressed in casual work clothes (jeans, flannel, workboots); trews and a warm shirt, boots. He carries no apparent weapon.\n\nTo fae eyes, he wears white pants and a white poet shirt belted with a white belt that bears a troll sized 2 handed sword, the sword hilt resembling a bare tree.  His shoulders are covered with a light blue great cape trimmed with silver-grey fur. Muted silver bracers protect his forearms. Dove grey boots with spurs finish the outfit; there is something a little off about the spurs. The whole affect is of a white Viking, with his beard and hair mixing into the pelt of his cloak.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.693954",
+    "updatedAt": "2025-10-30 03:42:14.582000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Maria",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.394718",
+    "updatedAt": "2025-10-30 03:42:14.586000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Azlo",
+    "rank": "",
+    "kith": "Nunnehi",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>local boggan-ish Nunnehi. Childling, or equivalent.</div>",
+    "notes": "",
+    "descriptionPlainText": "local boggan-ish Nunnehi. Childling, or equivalent.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.328243",
+    "updatedAt": "2025-10-30 03:42:14.586000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Fontaine",
+    "rank": "",
+    "kith": "Ondine",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Ondine inanimae, resides largely in the Roman Baths at Fenix.</div>",
+    "notes": "",
+    "descriptionPlainText": "Ondine inanimae, resides largely in the Roman Baths at Fenix.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.336034",
+    "updatedAt": "2025-10-30 03:42:14.588000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Tamarah",
+    "rank": "",
+    "kith": "",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.021521",
+    "updatedAt": "2025-10-30 03:42:14.589000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Etsie",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>An older grump who can still rock electric guitar lixx like a goat a third her age.</div>",
+    "notes": "",
+    "descriptionPlainText": "An older grump who can still rock electric guitar lixx like a goat a third her age.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.533655",
+    "updatedAt": "2025-10-30 03:42:14.589000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Leya",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Satyr lady, sister of Lola. Living at the BAR.</div>",
+    "notes": "",
+    "descriptionPlainText": "Satyr lady, sister of Lola. Living at the BAR.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.595171",
+    "updatedAt": "2025-10-30 03:42:14.590000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Chalknails",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:58.884264",
+    "updatedAt": "2025-10-30 03:42:14.591000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Myrtle Anne",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Boggan grump with a green thumb.  Childhood friends with Anne Marie Lee, and has settled into Rivervale recently and looks to be taking up shop selling herbs, plants and sundries.</div>",
+    "notes": "",
+    "descriptionPlainText": "Boggan grump with a green thumb. Childhood friends with Anne Marie Lee, and has settled into Rivervale recently and looks to be taking up shop selling herbs, plants and sundries.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.645475",
+    "updatedAt": "2025-10-30 03:42:14.592000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "",
+    "faeName": "Bluebell",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A lovely rabbit pooka and graceful dancer.</div>",
+    "notes": "",
+    "descriptionPlainText": "A lovely rabbit pooka and graceful dancer.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.803185",
+    "updatedAt": "2025-10-30 03:42:14.593000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Sally Mae DeBuke",
+    "faeName": "",
+    "rank": "",
+    "kith": "Kinain",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>a member of the DeBuke Troll Clan and troll kinain.  She assists Hearth Kerri at Rivervale.</div>",
+    "notes": "",
+    "descriptionPlainText": "a member of the DeBuke Troll Clan and troll kinain. She assists Hearth Kerri at Rivervale.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.781455",
+    "updatedAt": "2025-10-30 03:42:14.594000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Osborn Dyer",
+    "faeName": "",
+    "rank": "",
+    "kith": "Kinain",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A bearish Kinain and the complex Superintendent.</div>",
+    "notes": "",
+    "descriptionPlainText": "A bearish Kinain and the complex Superintendent.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.788737",
+    "updatedAt": "2025-10-30 03:42:14.595000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Eve",
+    "faeName": "Eden",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Snake pooka. Known to mortals as ‘Eve’, this teen is recently emancipated from her mentally and emotionally abusive family, and works for the Heart of Knight fae transportation company. Currently dating Tikki.</div>",
+    "notes": "",
+    "descriptionPlainText": "Snake pooka. Known to mortals as ‘Eve’, this teen is recently emancipated from her mentally and emotionally abusive family, and works for the Heart of Knight fae transportation company. Currently dating Tikki.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.526324",
+    "updatedAt": "2025-10-30 03:42:14.596000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Jack Torad",
+    "faeName": "Jack Flap",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Satyr childing rescued from a bad situation as part of a street gang in Memphis.  Recently adopted by Torin Torad and Myrtle Anne.</div>",
+    "notes": "",
+    "descriptionPlainText": "Satyr childing rescued from a bad situation as part of a street gang in Memphis. Recently adopted by Torin Torad and Myrtle Anne.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.548077",
+    "updatedAt": "2025-10-30 03:42:14.597000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Jaymes King",
+    "faeName": "Jaymes Ironhawk",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Jaymes is the small business owner of a convenience store in Bergen County and Dagmar's adopted father, mortally and by fae oath.</div>",
+    "notes": "",
+    "descriptionPlainText": "Jaymes is the small business owner of a convenience store in Bergen County and Dagmar's adopted father, mortally and by fae oath.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.555709",
+    "updatedAt": "2025-10-30 03:42:14.598000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Timothy Jameson Smith",
+    "faeName": "Jimmy",
+    "rank": "",
+    "kith": "Piskey",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Who was this guy again?</div>",
+    "notes": "",
+    "descriptionPlainText": "Who was this guy again?",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.562958",
+    "updatedAt": "2025-10-30 03:42:14.599000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Tikki Dyer",
+    "faeName": "Tikki",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Mongoose Pooka, Rikki’s brother and currently dating Eden.</div>",
+    "notes": "",
+    "descriptionPlainText": "Mongoose Pooka, Rikki’s brother and currently dating Eden.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.736945",
+    "updatedAt": "2025-10-30 03:42:14.599000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Torin Torad",
+    "faeName": "Torin",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Troll Grump, father of Tove, adopted Jack Flap along with Myrtle Anne</div>",
+    "notes": "",
+    "descriptionPlainText": "Troll Grump, father of Tove, adopted Jack Flap along with Myrtle Anne",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.743983",
+    "updatedAt": "2025-10-30 03:42:14.600000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "",
+    "faeName": "Alan-a-Dale",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Rooster pooka bard </div>",
+    "notes": "",
+    "descriptionPlainText": "Rooster pooka bard",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.243025",
+    "updatedAt": "2025-10-30 03:42:14.602000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Johnny Twofeather",
+    "rank": "",
+    "kith": "Nunnehi",
+    "location": "Fenix",
+    "position": "Consult",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.466136",
+    "updatedAt": "2025-10-30 03:42:14.603000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Murray DeBuke",
+    "rank": "",
+    "kith": "Troll",
+    "location": "",
+    "position": "Storm",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Brother of Chief Clem</div>",
+    "notes": "",
+    "descriptionPlainText": "Brother of Chief Clem",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.953417",
+    "updatedAt": "2025-10-30 03:42:14.604000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Kyle Thomas",
+    "faeName": "Kyle",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Troll, father to Adam and Lily</div>",
+    "notes": "",
+    "descriptionPlainText": "Troll, father to Adam and Lily",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.177552",
+    "updatedAt": "2025-10-30 03:42:14.605000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Necropsis",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Skyhook",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Spider Pooka, companion to Tweak</div>",
+    "notes": "",
+    "descriptionPlainText": "Spider Pooka, companion to Tweak",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.887451",
+    "updatedAt": "2025-10-30 03:42:14.606000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "CJ King",
+    "faeName": "",
+    "rank": "",
+    "kith": "Kinain",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Just a baby - so far. A big, strong baby!</div>",
+    "notes": "",
+    "descriptionPlainText": "Just a baby - so far. A big, strong baby!",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.774500",
+    "updatedAt": "2025-10-30 03:42:14.607000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Marsha Wayburton",
+    "faeName": "",
+    "rank": "",
+    "kith": "Kinain",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Zane and Lydia's mom, Piper's aunt.</div>",
+    "notes": "",
+    "descriptionPlainText": "Zane and Lydia's mom, Piper's aunt.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.795601",
+    "updatedAt": "2025-10-30 03:42:14.608000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Tove King (Torad)",
+    "faeName": "Tove",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Tove is an accomplished musician and YouTube streamer, daughter of Torin and wife to Jaymes. Mother to Dagmar and CJ.</div>",
+    "notes": "",
+    "descriptionPlainText": "Tove is an accomplished musician and YouTube streamer, daughter of Torin and wife to Jaymes. Mother to Dagmar and CJ.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.751219",
+    "updatedAt": "2025-10-30 03:42:14.609000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Natalie Golde",
+    "faeName": "Natira Gilden",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Necropolis",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Semi-Famous romance author</div>",
+    "notes": "",
+    "descriptionPlainText": "Semi-Famous romance author",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.151052",
+    "updatedAt": "2025-10-30 03:42:14.673000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Ded Romeo",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Sexy Goth guy wilder Sluagh</div>",
+    "notes": "",
+    "descriptionPlainText": "Sexy Goth guy wilder Sluagh",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:58.925827",
+    "updatedAt": "2025-10-30 03:42:14.674000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Wenceslaus",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "BrightWinds",
+    "position": "Reeve",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>The guy who started all this</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "The guy who started all this",
+    "createdAt": "2020-12-20 18:39:59.027387",
+    "updatedAt": "2025-10-30 03:42:14.675000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Inish",
+    "rank": "",
+    "kith": "Clurichaun",
+    "location": "EarthRunes",
+    "position": "Herald",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Not as combative as some of his ilk, this grump of a Clurichaun served the former baron very well. He has a laid back manner, and is willing to abuse his duties to give those he works for breathing space if need be. However, as Coradel is far more open in her court (and has a Chancellor as well) that's not as necessary. He is easing into retirement and looking for an apprentice.[/toggle]</div>",
+    "notes": "",
+    "descriptionPlainText": "Not as combative as some of his ilk, this grump of a Clurichaun served the former baron very well. He has a laid back manner, and is willing to abuse his duties to give those he works for breathing space if need be. However, as Coradel is far more open in her court (and has a Chancellor as well) that's not as necessary. He is easing into retirement and looking for an apprentice.[/toggle]",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.169120",
+    "updatedAt": "2025-10-30 03:42:14.610000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Jack",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "EarthRunes",
+    "position": "Bartender",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>The satyr grump behind the bar does more than dish out drinks, also assisting Delores with planning and stocking for any parties, balls, and festivals held, large or small, with his experience as an expert carouser. He has recently hired an assistant bartender, though whole-heartedly rejects any suggestion that he might be slowing down.</div>",
+    "notes": "",
+    "descriptionPlainText": "The satyr grump behind the bar does more than dish out drinks, also assisting Delores with planning and stocking for any parties, balls, and festivals held, large or small, with his experience as an expert carouser. He has recently hired an assistant bartender, though whole-heartedly rejects any suggestion that he might be slowing down.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.183013",
+    "updatedAt": "2025-10-30 03:42:14.611000"
+  },
+  {
+    "player": "Shady Lady",
+    "mortalName": "Jessica King",
+    "faeName": "Jessica King",
+    "rank": "Countess",
+    "kith": "Troll",
+    "location": "Fenix",
+    "position": "Freeholder",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Lady Flame Free, Jessica King – Countess and current Freeholder of Fenix, in the Renaissance Barony.  Also known as “Westward”, “No Name” and “Blue Tooth”</div>",
+    "notes": "",
+    "descriptionPlainText": "Lady Flame Free, Jessica King – Countess and current Freeholder of Fenix, in the Renaissance Barony. Also known as “Westward”, “No Name” and “Blue Tooth”",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.274329",
+    "updatedAt": "2025-10-30 03:42:14.612000"
+  },
+  {
+    "player": "Rahne",
+    "mortalName": "Kerri Davidson",
+    "faeName": "Kerri",
+    "rank": "Knight",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "Hearth",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Fifteen and tall for her age, she wears her honey-brown hair back in a simple ponytail, with wispy bangs over her forehead.  Her skill with makeup is impeccable. To fae, her horns poke through, narrow fused arcs that crown her head. Mundanely, she wears blue leggings and an oversized sweater, a fleece-lined suede jacket over all. To fae eyes, the top becomes a soft brown suede tunic that laces down the front and sides and is cinched with a leather belt tooled with a snapdragon pattern. A chimeric Bowie knife is sheathed on her belt. She's got a cord around her neck, but whatever pendant hangs from it is hidden inside her tunic.  A baldric crosses over her clothes, a blue sash with a green, gold, and blue badge showing a river winding between two mountains.  Loping along with her is a brown chimeric hare with long floppy ears.</div>",
+    "notes": "",
+    "descriptionPlainText": "Fifteen and tall for her age, she wears her honey-brown hair back in a simple ponytail, with wispy bangs over her forehead.  Her skill with makeup is impeccable. To fae, her horns poke through, narrow fused arcs that crown her head. Mundanely, she wears blue leggings and an oversized sweater, a fleece-lined suede jacket over all. To fae eyes, the top becomes a soft brown suede tunic that laces down the front and sides and is cinched with a leather belt tooled with a snapdragon pattern. A chimeric Bowie knife is sheathed on her belt. She's got a cord around her neck, but whatever pendant hangs from it is hidden inside her tunic.  A baldric crosses over her clothes, a blue sash with a green, gold, and blue badge showing a river winding between two mountains.  Loping along with her is a brown chimeric hare with long floppy ears.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.579580",
+    "updatedAt": "2025-10-30 03:42:14.613000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Jefferson Jameson Jones.",
+    "faeName": "JJJ aka Triple J",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Lake, The",
+    "position": "A friendly face and provider for the kithain at the Lake ",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Once ravaged to save a friend from forgetting himself, not proud of it. Plays the Ukulele. likes upbeat songs. Often can hook you up with drugs but is responsible about it </div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Once ravaged to save a friend from forgetting himself, not proud of it. Plays the Ukulele. likes upbeat songs. Often can hook you up with drugs but is responsible about it ",
+    "createdAt": "2021-10-05 17:17:16.543388",
+    "updatedAt": "2025-10-30 03:42:14.613000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Edrit",
+    "rank": "Countess",
+    "kith": "Sidhe",
+    "location": "Twin Towers",
+    "position": "",
+    "seeming": "Childling",
+    "house": "Aesin",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>This lovely, yet somewhat spoiled childling is the Countess who rules the Duchy of Twin Towers.  Her Tenderpaw companion, Bilbo, helps her keep the welfare of her common folk in mind.</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "This lovely, yet somewhat spoiled childling is the Countess who rules the Duchy of Twin Towers.  Her Tenderpaw companion, Bilbo, helps her keep the welfare of her common folk in mind.",
+    "createdAt": "2022-05-27 18:29:53.543029",
+    "updatedAt": "2025-10-30 03:42:14.614000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Bondraste",
+    "rank": "",
+    "kith": "Sidhe",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Mentor to Adam and mortal Grandmother</div>",
+    "notes": "",
+    "descriptionPlainText": "Mentor to Adam and mortal Grandmother",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.100920",
+    "updatedAt": "2025-10-30 03:42:14.616000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Flo",
+    "faeName": "",
+    "rank": "",
+    "kith": "Kinain",
+    "location": "Silverwolf",
+    "position": "Handmaiden",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Flo, or Florence, is a sidhe kinain with pale skin, long blonde hair, and ears that show just a delicate tip to hint at her heritage.</div>",
+    "notes": "<div>Flo is Nadeen's lady's maid.  Previously a waitress in a Carthage city diner, she now works for Nadeen at Silverwolf Manor as well as at her mortal home.  She has a 2 year old son, Rian (short of Florian).  In the past, she 'belonged' to an unnamed Knight of Leanhaun who is also presumably the father of her son.  He, and the previous hold she served, are back in Hibernia.  She possesses a very minor treasure, a ring that is worn strung as a necklace that provides her with enchantment.</div>",
+    "descriptionPlainText": "Flo, or Florence, is a sidhe kinain with pale skin, long blonde hair, and ears that show just a delicate tip to hint at her heritage.",
+    "notesPlainText": "Flo is Nadeen's lady's maid.  Previously a waitress in a Carthage city diner, she now works for Nadeen at Silverwolf Manor as well as at her mortal home.  She has a 2 year old son, Rian (short of Florian).  In the past, she 'belonged' to an unnamed Knight of Leanhaun who is also presumably the father of her son.  He, and the previous hold she served, are back in Hibernia.  She possesses a very minor treasure, a ring that is worn strung as a necklace that provides her with enchantment.",
+    "createdAt": "2021-08-11 16:42:39.050680",
+    "updatedAt": "2025-10-30 03:42:14.621000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Daria",
+    "rank": "",
+    "kith": "Centaur",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div><strong>Daria </strong>is 15 or sixteen years old. She seems to be almost feral at times, perhaps Unseelie savage. One might call her aggressively skittish! She is slow to trust, and appears to be able to brawl fiercely. She had a nasty gash on her head, and seems to be suffering from some memory loss even after the gash was healed. To those that are patient with her, she confides she is not sure if she wants to be among humans. She knows they don't see her, but she finds their ways 'stupid and limiting'</div>",
+    "notes": "",
+    "descriptionPlainText": "Daria is 15 or sixteen years old. She seems to be almost feral at times, perhaps Unseelie savage. One might call her aggressively skittish! She is slow to trust, and appears to be able to brawl fiercely. She had a nasty gash on her head, and seems to be suffering from some memory loss even after the gash was healed. To those that are patient with her, she confides she is not sure if she wants to be among humans. She knows they don't see her, but she finds their ways 'stupid and limiting'",
+    "notesPlainText": "",
+    "createdAt": "2021-05-25 17:18:14.238803",
+    "updatedAt": "2025-10-30 03:42:14.652000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Bix DeBuke",
+    "rank": "",
+    "kith": "Troll",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Here to help!</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Here to help!",
+    "createdAt": "2020-12-20 18:39:58.870289",
+    "updatedAt": "2025-10-30 03:42:14.721000"
+  },
+  {
+    "player": "Shady Lady",
+    "mortalName": "Adam Thomas",
+    "faeName": "",
+    "rank": "",
+    "kith": "Sidhe",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Fiona",
+    "bannerhouse": "",
+    "description": "<div>Caucasian male. Auburn-brown, short, curly hair, green eyes flecked lightly with gold. Tall with angular features.<br><br>To fae eyes, the kinain gleams with a touch of a Sidhe's majesty, with slightly angular ears and voile that denotes a servant's garb.<br><br>He has been seen accompanied by a small demonic-styled, sexy lady chimera called 'Nabuni'.  Recently appointed as a Thane of Rivervale.  Formerly dated DagmarCaucasian male. Auburn-brown, short, curly hair, green eyes flecked lightly with gold. Tall with angular features. To fae eyes, the kinain gleams with a touch of a Sidhe's majesty, with slightly angular ears and voile that denotes a servant's garb. Adam is partnered by a small demonic-styled, sexy lady chimera called 'Nabuni'.</div>",
+    "notes": "",
+    "descriptionPlainText": "Caucasian male. Auburn-brown, short, curly hair, green eyes flecked lightly with gold. Tall with angular features.\n\nTo fae eyes, the kinain gleams with a touch of a Sidhe's majesty, with slightly angular ears and voile that denotes a servant's garb.\n\nHe has been seen accompanied by a small demonic-styled, sexy lady chimera called 'Nabuni'.  Recently appointed as a Thane of Rivervale.  Formerly dated DagmarCaucasian male. Auburn-brown, short, curly hair, green eyes flecked lightly with gold. Tall with angular features. To fae eyes, the kinain gleams with a touch of a Sidhe's majesty, with slightly angular ears and voile that denotes a servant's garb. Adam is partnered by a small demonic-styled, sexy lady chimera called 'Nabuni'.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.242347",
+    "updatedAt": "2025-10-30 03:42:14.622000"
+  },
+  {
+    "player": "Catnik",
+    "mortalName": "Katrina 'Trina' Smyth",
+    "faeName": "Thistle",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Silverwolf",
+    "position": "Fledge",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A wilder nocker with cheek spirals that shift in shade and hue to match her emotion.  </div>",
+    "notes": "<div>Mother - Diane, lives with her at Whispering Woods Apartments <br>Father - Greg, mortal, well-paid CEO<br>Step-mother - Janice, once Selkie.  Mother of Frankie, Kinain 2nd grader.</div>",
+    "descriptionPlainText": "A wilder nocker with cheek spirals that shift in shade and hue to match her emotion.  ",
+    "notesPlainText": "Mother - Diane, lives with her at Whispering Woods Apartments \nFather - Greg, mortal, well-paid CEO\nStep-mother - Janice, once Selkie.  Mother of Frankie, Kinain 2nd grader.",
+    "createdAt": "2022-02-05 23:48:32.243807",
+    "updatedAt": "2025-10-30 03:42:14.622000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Connor Lowell",
+    "faeName": "Connor",
+    "rank": "Squire",
+    "kith": "Pooka",
+    "location": "Rivervale",
+    "position": "Ember of the Hearth",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Connor is a young, lean lad, placed somewhere in the middling childling range - possibly 8-10 years? His dark brown hair is worn long and shaggy, locks sticking out messily from under his ever-present knit cap.<br>His eyes are striking, one a deep chocolate brown, and the other a pale, icy blue – unnaturally so. Disconcerting, but offset by his shy smile. More shocking is the pair of furry canine ears and plumed, curly tail that sprout from top and bottom of the lad, visible clearly to mortal eyes. (Slipped seeming) The same boy, same irresistible smile and bright, curious eyes, on the upper edge of childling. His blue eye pales even more, and the brown eye dark with little white showing, both cheerful. His nose elongates a touch, and twitches eagerly as he sniffs at this or that. Connor’s voile is simple, matching his guileless nature.</div>",
+    "notes": "",
+    "descriptionPlainText": "Connor is a young, lean lad, placed somewhere in the middling childling range - possibly 8-10 years? His dark brown hair is worn long and shaggy, locks sticking out messily from under his ever-present knit cap.\nHis eyes are striking, one a deep chocolate brown, and the other a pale, icy blue – unnaturally so. Disconcerting, but offset by his shy smile. More shocking is the pair of furry canine ears and plumed, curly tail that sprout from top and bottom of the lad, visible clearly to mortal eyes. (Slipped seeming) The same boy, same irresistible smile and bright, curious eyes, on the upper edge of childling. His blue eye pales even more, and the brown eye dark with little white showing, both cheerful. His nose elongates a touch, and twitches eagerly as he sniffs at this or that. Connor’s voile is simple, matching his guileless nature.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.503218",
+    "updatedAt": "2025-10-30 03:42:14.625000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Dirk",
+    "faeName": "Dirk",
+    "rank": "",
+    "kith": "Redcap",
+    "location": "Rivervale",
+    "position": "Pillar of the Mountain",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>This punk seems easy to discount as another wayward youth destined for Juvie or Jail, but the Chieftain of River Vale seems to have seen something more in this wilder.  Appointed as a Peacekeeper around the lodge, he takes his duties seriously and has been often seen around the grounds and town seeking out and destroying menaces.  He is armed with a mace that appears more like a bat with nails in it to mortal eyes, and when no one is looking, dotes upon an ugly little hairless cat he calls \"Scrot\".  He was recently taken into the Lee household under Ann Marie's supervision.</div>",
+    "notes": "",
+    "descriptionPlainText": "This punk seems easy to discount as another wayward youth destined for Juvie or Jail, but the Chieftain of River Vale seems to have seen something more in this wilder.  Appointed as a Peacekeeper around the lodge, he takes his duties seriously and has been often seen around the grounds and town seeking out and destroying menaces.  He is armed with a mace that appears more like a bat with nails in it to mortal eyes, and when no one is looking, dotes upon an ugly little hairless cat he calls \"Scrot\".  He was recently taken into the Lee household under Ann Marie's supervision.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.518086",
+    "updatedAt": "2025-10-30 03:42:14.627000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Daphne Verbeck",
+    "faeName": "Eryssa",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "KC Necropolis",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>former cheerleader, current trophy wife</div>",
+    "notes": "<div>Few in the high society circles of KC do not know of the Verbecks, who made it big in athletics originally and parlayed it into team ownership. Mr. Ethan Verbeck former NFL player in his 40s, his wife a cheerleader who had the sense to snag him. They have a sixteen year old daughter (Carola) they hope to see as a tennis star, like her maternal aunt (Brandy), who lives with the family. Said sixteen year old daughter has a twin, (Angela) somewhat overlooked for her lack of similar athletic skill. <br><br>In 2022, they were body-jacked by a group of commoner souls, released by Emerson Stodgepole and CC.<br>____________<br>The group's ringleader, also her legacy likely. Potent in Autumn Arts and a bit of Contract (She is cautious about revealing that). Her own treasure is in fact a contract that can, if need be, allow her influence over her motley, and the ability to spy on them at anytime.</div>",
+    "descriptionPlainText": "former cheerleader, current trophy wife",
+    "notesPlainText": "Few in the high society circles of KC do not know of the Verbecks, who made it big in athletics originally and parlayed it into team ownership. Mr. Ethan Verbeck former NFL player in his 40s, his wife a cheerleader who had the sense to snag him. They have a sixteen year old daughter (Carola) they hope to see as a tennis star, like her maternal aunt (Brandy), who lives with the family. Said sixteen year old daughter has a twin, (Angela) somewhat overlooked for her lack of similar athletic skill. \n\nIn 2022, they were body-jacked by a group of commoner souls, released by Emerson Stodgepole and CC.\n____________\nThe group's ringleader, also her legacy likely. Potent in Autumn Arts and a bit of Contract (She is cautious about revealing that). Her own treasure is in fact a contract that can, if need be, allow her influence over her motley, and the ability to spy on them at anytime.",
+    "createdAt": "2022-07-12 20:26:55.697968",
+    "updatedAt": "2025-10-30 03:42:14.628000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Donald Ryder",
+    "faeName": "Dolph",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "Silverwolf",
+    "position": "Hostler",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>This older boggan can still keep up with the sprightly colts and foals.</div>",
+    "notes": "<div>Adopted grandfather to Rochallor.  Father of Amy, boggan kinain.</div>",
+    "descriptionPlainText": "This older boggan can still keep up with the sprightly colts and foals.",
+    "notesPlainText": "Adopted grandfather to Rochallor.  Father of Amy, boggan kinain.",
+    "createdAt": "2020-12-20 18:39:59.835067",
+    "updatedAt": "2025-10-30 03:42:14.628000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Wudlig",
+    "rank": "Journeyman",
+    "kith": "Nocker",
+    "location": "Dark Gate",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "Combcatte",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.049591",
+    "updatedAt": "2025-10-30 03:42:14.722000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Ethan Verbeck",
+    "faeName": "\"Big E\"",
+    "rank": "",
+    "kith": "Redcap",
+    "location": "KC Necropolis",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Father - Ethan, Redcap - former NFL Athlete.</div>",
+    "notes": "<div>Few in the high society circles of KC do not know of the Verbecks, who made it big in athletics originally and parlayed it into team ownership. Mr. Ethan Verbeck former NFL player in his 40s, his wife a cheerleader who had the sense to snag him. They have a sixteen year old daughter (Carola) they hope to see as a tennis star, like her maternal aunt (Brandy), who lives with the family. Said sixteen year old daughter has a twin, (Angela) somewhat overlooked for her lack of similar athletic skill. <br><br>In 2022, they were body-jacked by a group of commoner souls, released by Emerson Stodgepole and CC.<br><br>__________<br><br> He posses a Igorot Headhunting Axe called Giantbreaker. It does extra damage against trolls and ogres, and can even, on a very lucky hit, temporarily rob them of strength. His other big secret? While he knows Primal well, he also has a rudimentary grasp of naming, an art no one wants a redcap to have.</div>",
+    "descriptionPlainText": "Father - Ethan, Redcap - former NFL Athlete.",
+    "notesPlainText": "Few in the high society circles of KC do not know of the Verbecks, who made it big in athletics originally and parlayed it into team ownership. Mr. Ethan Verbeck former NFL player in his 40s, his wife a cheerleader who had the sense to snag him. They have a sixteen year old daughter (Carola) they hope to see as a tennis star, like her maternal aunt (Brandy), who lives with the family. Said sixteen year old daughter has a twin, (Angela) somewhat overlooked for her lack of similar athletic skill. \n\nIn 2022, they were body-jacked by a group of commoner souls, released by Emerson Stodgepole and CC.\n\n__________\n\n He posses a Igorot Headhunting Axe called Giantbreaker. It does extra damage against trolls and ogres, and can even, on a very lucky hit, temporarily rob them of strength. His other big secret? While he knows Primal well, he also has a rudimentary grasp of naming, an art no one wants a redcap to have.",
+    "createdAt": "2022-07-12 20:30:20.633380",
+    "updatedAt": "2025-10-30 03:42:14.629000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Brandy Verbeck",
+    "faeName": "Brandi ",
+    "rank": "",
+    "kith": "Clurichaun",
+    "location": "KC Necropolis",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Aunt - Brandy, Clurichaun, current tennis star<br><br></div>",
+    "notes": "<div>Few in the high society circles of KC do not know of the Verbecks, who made it big in athletics originally and parlayed it into team ownership. Mr. Ethan Verbeck former NFL player in his 40s, his wife a cheerleader who had the sense to snag him. They have a sixteen year old daughter (Carola) they hope to see as a tennis star, like her maternal aunt (Brandy), who lives with the family. Said sixteen year old daughter has a twin, (Angela) somewhat overlooked for her lack of similar athletic skill. <br><br>In 2022, they were body-jacked by a group of commoner souls, released by Emerson Stodgepole and CC. <br><br>-------------<br>Brandy had, in a past life, musical talent and some has gone with her but not enough for her liking.  She collects gems for her hoard, and is now intrigued by 'tennis bracelets'. Brandy dabbles in Soothsay, but her stronger art is Summer. She's a master of neither. She does have the black cordial , which can drive folks unseelie. Even humans temporarily gain the code and a legacy</div>",
+    "descriptionPlainText": "Aunt - Brandy, Clurichaun, current tennis star\n\n",
+    "notesPlainText": "Few in the high society circles of KC do not know of the Verbecks, who made it big in athletics originally and parlayed it into team ownership. Mr. Ethan Verbeck former NFL player in his 40s, his wife a cheerleader who had the sense to snag him. They have a sixteen year old daughter (Carola) they hope to see as a tennis star, like her maternal aunt (Brandy), who lives with the family. Said sixteen year old daughter has a twin, (Angela) somewhat overlooked for her lack of similar athletic skill. \n\nIn 2022, they were body-jacked by a group of commoner souls, released by Emerson Stodgepole and CC. \n\n-------------\nBrandy had, in a past life, musical talent and some has gone with her but not enough for her liking.  She collects gems for her hoard, and is now intrigued by 'tennis bracelets'. Brandy dabbles in Soothsay, but her stronger art is Summer. She's a master of neither. She does have the black cordial , which can drive folks unseelie. Even humans temporarily gain the code and a legacy",
+    "createdAt": "2022-07-12 20:31:17.718256",
+    "updatedAt": "2025-10-30 03:42:14.630000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Miss Trudny Mądrość",
+    "faeName": "Miss Wisdom",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "Rivervale",
+    "position": "Teacher at highschool",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A stern looking woman to mortal eyes, a spindly sluagh with a piercing gaze to the Enchanted/Kithain</div>",
+    "notes": "<div>Teaches American Sign languages and some computer courses at local high school</div>",
+    "descriptionPlainText": "A stern looking woman to mortal eyes, a spindly sluagh with a piercing gaze to the Enchanted/Kithain",
+    "notesPlainText": "Teaches American Sign languages and some computer courses at local high school",
+    "createdAt": "2021-11-08 03:05:20.614628",
+    "updatedAt": "2025-10-30 03:42:14.630000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Carola Verbeck",
+    "faeName": "",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "KC Necropolis",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Twin Sister 1 - Carola, Cat pooka, aspiring tennis prodigy</div>",
+    "notes": "<div>Few in the high society circles of KC do not know of the Verbecks, who made it big in athletics originally and parlayed it into team ownership. Mr. Ethan Verbeck former NFL player in his 40s, his wife a cheerleader who had the sense to snag him. They have a sixteen year old daughter (Carola) they hope to see as a tennis star, like her maternal aunt (Brandy), who lives with the family. Said sixteen year old daughter has a twin, (Angela) somewhat overlooked for her lack of similar athletic skill. <br><br>In 2022, they were body-jacked by a group of commoner souls, released by Emerson Stodgepole and CC. <br> ______<br>As contrary as any mortal feline, Carola is hot and cold as suits her desire, and it is hard for few outside her motley to know what she is thinking.  Within her motley, who knows? They at least <em>pretend</em> to understand to some degree! Her Rogue legacy lends to some feline laziness, but when properly motivated, she is capable of nearly anything she puts her mind to.<br><br>Knows very basic metamorphosis, and delights in using it for simple amusement.  Legerdemain, however, may be her true skill, but this kitty isn't telling any secrets.</div>",
+    "descriptionPlainText": "Twin Sister 1 - Carola, Cat pooka, aspiring tennis prodigy",
+    "notesPlainText": "Few in the high society circles of KC do not know of the Verbecks, who made it big in athletics originally and parlayed it into team ownership. Mr. Ethan Verbeck former NFL player in his 40s, his wife a cheerleader who had the sense to snag him. They have a sixteen year old daughter (Carola) they hope to see as a tennis star, like her maternal aunt (Brandy), who lives with the family. Said sixteen year old daughter has a twin, (Angela) somewhat overlooked for her lack of similar athletic skill.\n\nIn 2022, they were body-jacked by a group of commoner souls, released by Emerson Stodgepole and CC.\n ______\nAs contrary as any mortal feline, Carola is hot and cold as suits her desire, and it is hard for few outside her motley to know what she is thinking.  Within her motley, who knows? They at least pretend to understand to some degree! Her Rogue legacy lends to some feline laziness, but when properly motivated, she is capable of nearly anything she puts her mind to.\n\nKnows very basic metamorphosis, and delights in using it for simple amusement.  Legerdemain, however, may be her true skill, but this kitty isn't telling any secrets.",
+    "createdAt": "2022-07-12 20:32:20.926961",
+    "updatedAt": "2025-10-30 03:42:14.631000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Angela Verbeck",
+    "faeName": "Murmur",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "KC Necropolis",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Twin Sister 2 - Angela, Sluagh, somewhat overlooked</div>",
+    "notes": "<div>Few in the high society circles of KC do not know of the Verbecks, who made it big in athletics originally and parlayed it into team ownership. Mr. Ethan Verbeck former NFL player in his 40s, his wife a cheerleader who had the sense to snag him. They have a sixteen year old daughter (Carola) they hope to see as a tennis star, like her maternal aunt (Brandy), who lives with the family. Said sixteen year old daughter has a twin, (Angela) somewhat overlooked for her lack of similar athletic skill. <br><br>In 2022, they were body-jacked by a group of commoner souls, released by Emerson Stodgepole and CC. <br>______<br>Knows Winter Art beyond what you'd expect of a new arrival. And has Humourdwell, a chimerical spider companion capable of possession</div>",
+    "descriptionPlainText": "Twin Sister 2 - Angela, Sluagh, somewhat overlooked",
+    "notesPlainText": "Few in the high society circles of KC do not know of the Verbecks, who made it big in athletics originally and parlayed it into team ownership. Mr. Ethan Verbeck former NFL player in his 40s, his wife a cheerleader who had the sense to snag him. They have a sixteen year old daughter (Carola) they hope to see as a tennis star, like her maternal aunt (Brandy), who lives with the family. Said sixteen year old daughter has a twin, (Angela) somewhat overlooked for her lack of similar athletic skill. \n\nIn 2022, they were body-jacked by a group of commoner souls, released by Emerson Stodgepole and CC. \n______\nKnows Winter Art beyond what you'd expect of a new arrival. And has Humourdwell, a chimerical spider companion capable of possession",
+    "createdAt": "2022-07-12 20:32:54.264119",
+    "updatedAt": "2025-10-30 03:42:14.632000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Lindsey Marshall",
+    "faeName": "Linnea",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Silverwolf",
+    "position": "Thane",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Blond and nordic twin of Danica. Linnea wears her hair two long braids and wields a warhammer. She is a Thane of Silverwolf as well as private security for the Lowell manor.</div>",
+    "notes": "",
+    "descriptionPlainText": "Blond and nordic twin of Danica. Linnea wears her hair two long braids and wields a warhammer. She is a Thane of Silverwolf as well as private security for the Lowell manor.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.866077",
+    "updatedAt": "2025-10-30 03:42:14.632000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Gwen Locklear",
+    "faeName": "Gladiola (Or Still Gwen)",
+    "rank": "Knight",
+    "kith": "Troll",
+    "location": "Silverwolf",
+    "position": "Kennel Mistress",
+    "seeming": "Wilder",
+    "house": "Daireann",
+    "bannerhouse": "",
+    "description": "<div>Native American Heritage. Stone skin.</div>",
+    "notes": "<div>Was Madigan in a past life. Kennel mistress. Has Magic spear, no magic heelllmet</div>",
+    "descriptionPlainText": "Native American Heritage. Stone skin.",
+    "notesPlainText": "Was Madigan in a past life. Kennel mistress. Has Magic spear, no magic heelllmet",
+    "createdAt": "2020-12-20 18:39:59.843075",
+    "updatedAt": "2025-10-30 03:42:14.633000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Kylie",
+    "faeName": "Kylie Glitzertraum",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "EarthRunes",
+    "position": "Lapidary",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Blue hair and swirls.</div>",
+    "notes": "<div>Has been sained</div>",
+    "descriptionPlainText": "Blue hair and swirls.",
+    "notesPlainText": "Has been sained",
+    "createdAt": "2020-12-20 18:40:00.127794",
+    "updatedAt": "2025-10-30 03:42:14.634000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Zing",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Asian Leopard Cat Pooka</div>",
+    "notes": "<div>Recently Sained</div>",
+    "descriptionPlainText": "Asian Leopard Cat Pooka",
+    "notesPlainText": "Recently Sained",
+    "createdAt": "2020-12-20 18:40:00.135778",
+    "updatedAt": "2025-10-30 03:42:14.635000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Florin Wyltblossom",
+    "rank": "Knight",
+    "kith": "Sluagh",
+    "location": "",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Fiona",
+    "bannerhouse": "",
+    "description": "<div>Sir Florin Wyltblossom, a sluagh knight of Fiona rescued from the clutches of the Varich of Bloody Oak Barony, near Red Oak Iowa.  Has had his hands lopped off in punishment.</div>",
+    "notes": "",
+    "descriptionPlainText": "Sir Florin Wyltblossom, a sluagh knight of Fiona rescued from the clutches of the Varich of Bloody Oak Barony, near Red Oak Iowa.  Has had his hands lopped off in punishment.",
+    "notesPlainText": "",
+    "createdAt": "2022-02-08 14:24:09.682439",
+    "updatedAt": "2025-10-30 03:42:14.636000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Phoebe",
+    "rank": "",
+    "kith": "Kinain",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.436251",
+    "updatedAt": "2025-10-30 03:42:14.722000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Lauge",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Twin of Lucjan</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Twin of Lucjan",
+    "createdAt": "2020-12-20 18:39:59.587677",
+    "updatedAt": "2025-10-30 03:42:14.671000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Father V",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Grump",
+    "house": "Liam",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.389046",
+    "updatedAt": "2025-10-30 03:42:14.697000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Marguerite Harkson",
+    "faeName": "Grete",
+    "rank": "",
+    "kith": "Wichtel",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>The young Wichtel is neither a girly-girl nor a warrior like most of her companions, but enjoys nothing more than wearing boots and overalls and getting down and dirty with rocks and stones.  Short, wiry leaning towards stout, and with cropped brown hair, and usually dirty hands and knees.</div>",
+    "notes": "<div>The daughter of rich and absentee parents, Grete was the niece of Baron Harkkson and coddled until she refused to help him track down underground treasures that would have involved tearing up the Freehold lands.  Imprisoned like so many others, until Freed by Sparrow.  Loves rocks, stones, minerals and gems, and has a pet 'landshark' named Rockhammer.</div>",
+    "descriptionPlainText": "The young Wichtel is neither a girly-girl nor a warrior like most of her companions, but enjoys nothing more than wearing boots and overalls and getting down and dirty with rocks and stones.  Short, wiry leaning towards stout, and with cropped brown hair, and usually dirty hands and knees.",
+    "notesPlainText": "The daughter of rich and absentee parents, Grete was the niece of Baron Harkkson and coddled until she refused to help him track down underground treasures that would have involved tearing up the Freehold lands.  Imprisoned like so many others, until Freed by Sparrow.  Loves rocks, stones, minerals and gems, and has a pet 'landshark' named Rockhammer.",
+    "createdAt": "2022-08-23 19:32:30.516923",
+    "updatedAt": "2025-10-30 03:42:14.636000"
+  },
+  {
+    "player": "Shady Lady",
+    "mortalName": "Wilhelmina Hostlerfrau",
+    "faeName": "Willy",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Mortally, she is ... not stunning. Plain brown hair held back in a messy bun, skin that shows the effect of teenage acne, and teeth that have never seen an orthodontist (but should have). Something in her eyes, though; a spark, a fire that burns through the muddy brown... her body is angular and knobby but there is strength there, muscles. She wears overalls and a corduroy, fleece-lined coat.<br><br>To Fae eyes, she has long white hair in a bun, stands sticking out like static electricity has had it's way with her. Shark-teeth, her pale skin decorated with whorls.</div>",
+    "notes": "",
+    "descriptionPlainText": "Mortally, she is ... not stunning. Plain brown hair held back in a messy bun, skin that shows the effect of teenage acne, and teeth that have never seen an orthodontist (but should have). Something in her eyes, though; a spark, a fire that burns through the muddy brown... her body is angular and knobby but there is strength there, muscles. She wears overalls and a corduroy, fleece-lined coat.\n\nTo Fae eyes, she has long white hair in a bun, stands sticking out like static electricity has had it's way with her. Shark-teeth, her pale skin decorated with whorls.",
+    "notesPlainText": "",
+    "createdAt": "2021-01-27 13:52:11.559426",
+    "updatedAt": "2025-10-30 03:42:14.638000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Marcellus DeBuke",
+    "faeName": "Marcellus ",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Dark Gate",
+    "position": "Hearth",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Arrogant but a damned good cook.</div>",
+    "notes": "",
+    "descriptionPlainText": "Arrogant but a damned good cook.",
+    "notesPlainText": "",
+    "createdAt": "2021-03-22 14:27:30.219319",
+    "updatedAt": "2025-10-30 03:42:14.640000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "",
+    "faeName": "Billy",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A goat pooka grump, Zookeeper and mentor of Childling pooka 'Shawn'</div>",
+    "notes": "",
+    "descriptionPlainText": "A goat pooka grump, Zookeeper and mentor of Childling pooka 'Shawn'",
+    "notesPlainText": "",
+    "createdAt": "2021-05-11 13:36:52.598041",
+    "updatedAt": "2025-10-30 03:42:14.640000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "",
+    "faeName": "Shawn",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A childling sheep pooka, with tight wooly hair and a shy demeanor.  Mentored by Zookeeper Billy.</div>",
+    "notes": "",
+    "descriptionPlainText": "A childling sheep pooka, with tight wooly hair and a shy demeanor.  Mentored by Zookeeper Billy.",
+    "notesPlainText": "",
+    "createdAt": "2021-05-11 13:37:39.822182",
+    "updatedAt": "2025-10-30 03:42:14.642000"
+  },
+  {
+    "player": "Catnik",
+    "mortalName": "",
+    "faeName": "Dru",
+    "rank": "",
+    "kith": "Inanimae",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Kubera",
+    "bannerhouse": "",
+    "description": "<div>Resident of a glade near Silverwolf territory</div>",
+    "notes": "",
+    "descriptionPlainText": "Resident of a glade near Silverwolf territory",
+    "notesPlainText": "",
+    "createdAt": "2021-05-11 13:43:23.846048",
+    "updatedAt": "2025-10-30 03:42:14.643000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "",
+    "faeName": "Zelda Kuchenfritz",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Homegoods specialist, co-owner of A-to-Z Home Services with Adler Steinschlag, Boggan</div>",
+    "notes": "",
+    "descriptionPlainText": "Homegoods specialist, co-owner of A-to-Z Home Services with Adler Steinschlag, Boggan",
+    "notesPlainText": "",
+    "createdAt": "2021-05-11 13:44:58.382466",
+    "updatedAt": "2025-10-30 03:42:14.644000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "",
+    "faeName": "Adler Steinschlag",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Landscaping specialist, co-owner of A-to-Z Home Services with Zelda Kuchenfritz, Nocker</div>",
+    "notes": "",
+    "descriptionPlainText": "Landscaping specialist, co-owner of A-to-Z Home Services with Zelda Kuchenfritz, Nocker",
+    "notesPlainText": "",
+    "createdAt": "2021-05-11 13:45:41.205950",
+    "updatedAt": "2025-10-30 03:42:14.644000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Gluminsky",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Mister Gluminsky keeps the most fascinating shop, where every artifact bears a most tragic history.</div><div><br></div><div><em>\"Every object a tragedy, every tragedy an object lesson\"</em></div>",
+    "notes": "",
+    "descriptionPlainText": "Mister Gluminsky keeps the most fascinating shop, where every artifact bears a most tragic history.\n\n\n\"Every object a tragedy, every tragedy an object lesson\"",
+    "notesPlainText": "",
+    "createdAt": "2021-05-25 13:35:39.828411",
+    "updatedAt": "2025-10-30 03:42:14.645000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Glorian Leech",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>An unsavory sluagh who sought to collect and destroy all centaurs due to an ill-fated prophesy.</div>",
+    "notes": "",
+    "descriptionPlainText": "An unsavory sluagh who sought to collect and destroy all centaurs due to an ill-fated prophesy.",
+    "notesPlainText": "",
+    "createdAt": "2021-05-25 13:39:45.185197",
+    "updatedAt": "2025-10-30 03:42:14.646000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Halina",
+    "rank": "",
+    "kith": "Sidhe",
+    "location": "",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Varich",
+    "bannerhouse": "",
+    "description": "<div>A nearsighted sidhe wilder of House Varich.  One of the rare Seelie of her house, known as the 'Blacksun'.  Previously held prisoner at Bloody Oak Barony.</div>",
+    "notes": "",
+    "descriptionPlainText": "A nearsighted sidhe wilder of House Varich.  One of the rare Seelie of her house, known as the 'Blacksun'.  Previously held prisoner at Bloody Oak Barony.",
+    "notesPlainText": "",
+    "createdAt": "2022-02-08 14:49:31.158002",
+    "updatedAt": "2025-10-30 03:42:14.646000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Sir Paint",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Twin Towers",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Sir Paint is a turtle pooka who serves Countess Edrit in Twin Towers.</div>",
+    "notes": "",
+    "descriptionPlainText": "Sir Paint is a turtle pooka who serves Countess Edrit in Twin Towers.",
+    "notesPlainText": "",
+    "createdAt": "2022-05-27 18:32:50.686495",
+    "updatedAt": "2025-10-30 03:42:14.647000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Eir-Frey",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Spectral Lights",
+    "position": "Healer",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>This aged Troll Granddame is one of the healers under Count Pom Trispeux</div>",
+    "notes": "",
+    "descriptionPlainText": "This aged Troll Granddame is one of the healers under Count Pom Trispeux",
+    "notesPlainText": "",
+    "createdAt": "2022-07-27 13:11:56.035339",
+    "updatedAt": "2025-10-30 03:42:14.648000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Blossom",
+    "rank": "",
+    "kith": "Centaur",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div><strong>Blossom</strong> is an 8 year old little appaloosa style Centaur. She was the only Centaur at the Hunters lodge, not yet delivered to leech. Currency fitting in at Silver Wolf, she already shows a positive response to praise and attention. <br>Update: Now 9 going on 10, she is the one most in charge of hawks and falcons. Still a bit of a brat but proud of the hold and her work.</div>",
+    "notes": "",
+    "descriptionPlainText": "Blossom is an 8 year old little appaloosa style Centaur. She was the only Centaur at the Hunters lodge, not yet delivered to leech. Currency fitting in at Silver Wolf, she already shows a positive response to praise and attention. \nUpdate: Now 9 going on 10, she is the one most in charge of hawks and falcons. Still a bit of a brat but proud of the hold and her work.",
+    "notesPlainText": "",
+    "createdAt": "2021-05-25 17:17:12.967555",
+    "updatedAt": "2025-10-30 03:42:14.648000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Buck",
+    "rank": "",
+    "kith": "Centaur",
+    "location": "DeBuke Farmhold",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Buck<strong> </strong>is a big wilder (Looks to be twenty something) , pure muscle, big even by Centaur standards! While straightforward, he is not a simpleton nor a brute, but he prefers honest words. He was the one Symon spoke too when all were trapped. Now free, he shows signs of being an odd mix of gentle giant and lovable bruiser in turn. </div>",
+    "notes": "",
+    "descriptionPlainText": "Buck is a big wilder (Looks to be twenty something) , pure muscle, big even by Centaur standards! While straightforward, he is not a simpleton nor a brute, but he prefers honest words. He was the one Symon spoke too when all were trapped. Now free, he shows signs of being an odd mix of gentle giant and lovable bruiser in turn. ",
+    "notesPlainText": "",
+    "createdAt": "2021-05-25 17:17:47.262809",
+    "updatedAt": "2025-10-30 03:42:14.649000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Alyce Wilson",
+    "faeName": "Alyce",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Winged Satyr, previously squatting at the BAR</div>",
+    "notes": "",
+    "descriptionPlainText": "Winged Satyr, previously squatting at the BAR",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.263601",
+    "updatedAt": "2025-10-30 03:42:14.672000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Ganbold",
+    "rank": "",
+    "kith": "Centaur",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div><strong>Ganbold </strong>means \"Steel Steel\" which the little Mongolian American Childling Centaur will tell you! He was raised on stories of magic and superstition, he's not really surprised to be a Centaur, though he firmly denies that the dreams are Greek. He boasts about he will be a great Khan, and rise up the tribes to crush all ... then he cheerily goes to do the dishes or other chores he's told to do. A most agreeable future conqueror.</div>",
+    "notes": "",
+    "descriptionPlainText": "Ganbold means \"Steel Steel\" which the little Mongolian American Childling Centaur will tell you! He was raised on stories of magic and superstition, he's not really surprised to be a Centaur, though he firmly denies that the dreams are Greek. He boasts about he will be a great Khan, and rise up the tribes to crush all ... then he cheerily goes to do the dishes or other chores he's told to do. A most agreeable future conqueror.",
+    "notesPlainText": "",
+    "createdAt": "2021-05-25 17:19:01.800313",
+    "updatedAt": "2025-10-30 03:42:14.652000"
+  },
+  {
+    "player": "Rahne",
+    "mortalName": "",
+    "faeName": "Coradel",
+    "rank": "Baroness",
+    "kith": "Sidhe",
+    "location": "EarthRunes",
+    "position": "Freeholder",
+    "seeming": "Wilder",
+    "house": "Fiona",
+    "bannerhouse": "Truthbranch",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.128224",
+    "updatedAt": "2025-10-30 03:42:14.653000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Linwood",
+    "rank": "",
+    "kith": "Centaur",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div><strong>Linwood </strong>is a wilder with amazing piano /keyboard skills. Shy, reserved, but with a joyful face when working at the ivories, Linwood isn't sure what to make of this centaur stuff. Linwood's family has been in something of a panic at the kidnapping.</div>",
+    "notes": "",
+    "descriptionPlainText": "Linwood is a wilder with amazing piano /keyboard skills. Shy, reserved, but with a joyful face when working at the ivories, Linwood isn't sure what to make of this centaur stuff. Linwood's family has been in something of a panic at the kidnapping.",
+    "notesPlainText": "",
+    "createdAt": "2021-05-25 17:19:21.156855",
+    "updatedAt": "2025-10-30 03:42:14.654000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Dubh the Gray",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "BrightWinds",
+    "position": "Chancellor",
+    "seeming": "Wilder",
+    "house": "Scathach",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>One of Sparrow's Seven</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "One of Sparrow's Seven",
+    "createdAt": "2020-12-20 18:39:58.999504",
+    "updatedAt": "2025-10-30 03:42:14.655000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Brynn",
+    "rank": "",
+    "kith": "Sidhe",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Gwydion",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Sidhe Wilder, twin to Bryndan</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Sidhe Wilder, twin to Bryndan",
+    "createdAt": "2020-12-20 18:39:58.983213",
+    "updatedAt": "2025-10-30 03:42:14.656000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Hastien",
+    "rank": "",
+    "kith": "Troll",
+    "location": "BrightWinds",
+    "position": "Rover",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Head of local Rovers at Outpost</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Head of local Rovers at Outpost",
+    "createdAt": "2020-12-20 18:39:58.939545",
+    "updatedAt": "2025-10-30 03:42:14.656000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Little Joe",
+    "rank": "",
+    "kith": "Troll",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>BIG Troll...</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "BIG Troll...",
+    "createdAt": "2020-12-20 18:39:58.959500",
+    "updatedAt": "2025-10-30 03:42:14.657000"
+  },
+  {
+    "player": "Shady Lady",
+    "mortalName": "",
+    "faeName": "Hirim",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Scarsdale",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Uncle of Zara and Jacob</div>",
+    "notes": "",
+    "descriptionPlainText": "Uncle of Zara and Jacob",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.192924",
+    "updatedAt": "2025-10-30 03:42:14.658000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Bevara",
+    "rank": "",
+    "kith": "Sidhe",
+    "location": "Fenix",
+    "position": "Troubadour",
+    "seeming": "Wilder",
+    "house": "Gwydion",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.419566",
+    "updatedAt": "2025-10-30 03:42:14.659000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Stu",
+    "faeName": "Stew",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Owl Pooka</div>",
+    "notes": "",
+    "descriptionPlainText": "Owl Pooka",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.013709",
+    "updatedAt": "2025-10-30 03:42:14.659000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Vashti",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Moth pooka, sister of Zara</div>",
+    "notes": "",
+    "descriptionPlainText": "Moth pooka, sister of Zara",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.996388",
+    "updatedAt": "2025-10-30 03:42:14.660000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "David \"Davey\" ",
+    "rank": "",
+    "kith": "Swanmay",
+    "location": "",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.237578",
+    "updatedAt": "2025-10-30 03:42:14.661000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Isis",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Kitten Pooka and sister to Enri</div>",
+    "notes": "",
+    "descriptionPlainText": "Kitten Pooka and sister to Enri",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.055475",
+    "updatedAt": "2025-10-30 03:42:14.662000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Poppy",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Newly Rejuvenated Hound dog pooka, now Emma's ward</div>",
+    "notes": "",
+    "descriptionPlainText": "Newly Rejuvenated Hound dog pooka, now Emma's ward",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.070673",
+    "updatedAt": "2025-10-30 03:42:14.662000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Lucia",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A boggan teen of Italian-American descent. Her family runs a local restaurant.  Recently returned from a dreaming quest with black feathered wings.</div>",
+    "notes": "",
+    "descriptionPlainText": "A boggan teen of Italian-American descent. Her family runs a local restaurant. Recently returned from a dreaming quest with black feathered wings.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.610427",
+    "updatedAt": "2025-10-30 03:42:14.663000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Lyron",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Satyr from the Carribean and skilled dancer</div>",
+    "notes": "",
+    "descriptionPlainText": "Satyr from the Carribean and skilled dancer",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.633244",
+    "updatedAt": "2025-10-30 03:42:14.664000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Tiara",
+    "rank": "",
+    "kith": "Centaur",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div><strong>Tiara </strong>is a fetching young centauress. She claims she came out of her dream dance with a sword, and spurs ... signs she was a knight in a past life and might be unknowingly sworn to a house. If tested, it turns out she has melee skills that are most impressive and she had memories of a past life, some in battle, some advising an elegant elven woman in grand halls lined with marble. These past life memories and remembrances aside, she knows her mortal life quite well. She's looking for a way to call her mom and dad and assure them she is fine. Apparently she was kidnapped from a private school while they were touring Europe. She's well off.</div>",
+    "notes": "",
+    "descriptionPlainText": "Tiara is a fetching young centauress. She claims she came out of her dream dance with a sword, and spurs ... signs she was a knight in a past life and might be unknowingly sworn to a house. If tested, it turns out she has melee skills that are most impressive and she had memories of a past life, some in battle, some advising an elegant elven woman in grand halls lined with marble. These past life memories and remembrances aside, she knows her mortal life quite well. She's looking for a way to call her mom and dad and assure them she is fine. Apparently she was kidnapped from a private school while they were touring Europe. She's well off.",
+    "notesPlainText": "",
+    "createdAt": "2021-05-25 17:19:54.373034",
+    "updatedAt": "2025-10-30 03:42:14.664000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "",
+    "faeName": "Ace Piquet",
+    "rank": "",
+    "kith": "Piskey",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Ace, also known to go by 'Black Jack', is an attractive male piskey who dresses to emphasize his figure.  A fast talker and ladies man, with light fingers common to his kith.</div>",
+    "notes": "",
+    "descriptionPlainText": "Ace, also known to go by 'Black Jack', is an attractive male piskey who dresses to emphasize his figure.  A fast talker and ladies man, with light fingers common to his kith.",
+    "notesPlainText": "",
+    "createdAt": "2021-08-11 16:44:01.978979",
+    "updatedAt": "2025-10-30 03:42:14.665000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Ramona",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Often times babysitter of the kids at the Lodge.</div>",
+    "notes": "",
+    "descriptionPlainText": "Often times babysitter of the kids at the Lodge.",
+    "notesPlainText": "",
+    "createdAt": "2021-08-22 01:12:05.402722",
+    "updatedAt": "2025-10-30 03:42:14.666000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Jack",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "Fenix",
+    "position": "Reeve",
+    "seeming": "Wilder",
+    "house": "Liam",
+    "bannerhouse": "",
+    "description": "<div>Liam Sidhe, ‘street knight’, Reeve</div>",
+    "notes": "",
+    "descriptionPlainText": "Liam Sidhe, ‘street knight’, Reeve",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.320441",
+    "updatedAt": "2025-10-30 03:42:14.667000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Cassidy Coates",
+    "faeName": "Kassedy",
+    "rank": "Squire",
+    "kith": "Sidhe",
+    "location": "Rivervale",
+    "position": "Squire to Lady Captain Siv",
+    "seeming": "Childling",
+    "house": "Liam",
+    "bannerhouse": "",
+    "description": "<div>Naturally curly hair, roughly 9 years old</div>",
+    "notes": "",
+    "descriptionPlainText": "Naturally curly hair, roughly 9 years old",
+    "notesPlainText": "",
+    "createdAt": "2021-09-25 23:39:27.425313",
+    "updatedAt": "2025-10-30 03:42:14.668000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Florian (Rian)",
+    "faeName": "",
+    "rank": "",
+    "kith": "Kinain",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Sidhe kinain toddler, of Leanhaun ancestry.  Son of Flo (Florence), Nadeen's handmaid.</div>",
+    "notes": "",
+    "descriptionPlainText": "Sidhe kinain toddler, of Leanhaun ancestry.  Son of Flo (Florence), Nadeen's handmaid.",
+    "notesPlainText": "",
+    "createdAt": "2022-02-05 23:43:49.666269",
+    "updatedAt": "2025-10-30 03:42:14.668000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Siv King",
+    "faeName": "Siv Wavebourne",
+    "rank": "Knight",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Fiona",
+    "bannerhouse": "",
+    "description": "<div>Lady Captain! Beloved of Jonas and Piper, and daughter of Frank and Brekke.</div>",
+    "notes": "",
+    "descriptionPlainText": "Lady Captain! Beloved of Jonas and Piper, and daughter of Frank and Brekke.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.701582",
+    "updatedAt": "2025-10-30 03:42:14.669000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Mitra ap Mitras",
+    "rank": "",
+    "kith": "Sidhe",
+    "location": "The Pitt",
+    "position": "Regent",
+    "seeming": "",
+    "house": "Eilunid",
+    "bannerhouse": "",
+    "description": "<div>Eiluned Sidhe, Regent of the Pitt.</div>",
+    "notes": "",
+    "descriptionPlainText": "Eiluned Sidhe, Regent of the Pitt.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.939275",
+    "updatedAt": "2025-10-30 03:42:14.670000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Jonas",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Works with Anne Marie, patrols Rivervale, and Siv and Piper's paramour.  Known to be skilled at the Art of Metamorphosis.</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Works with Anne Marie, patrols Rivervale, and Siv and Piper's paramour. Known to be skilled at the Art of Metamorphosis.",
+    "createdAt": "2020-12-20 18:39:59.570703",
+    "updatedAt": "2025-10-30 03:42:14.671000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Klump",
+    "rank": "",
+    "kith": "Inanimae - Glome (gladeling)",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>A friend to Dagmar, this Glome's anchor is that of a large boulder in the woods near Rivervale.</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "A friend to Dagmar, this Glome's anchor is that of a large boulder in the woods near Rivervale.",
+    "createdAt": "2021-04-12 16:07:30.500535",
+    "updatedAt": "2025-10-30 03:42:14.675000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Eternia",
+    "rank": "",
+    "kith": "Selkie",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Rescued from a Dauntain, now with her seal skin back, she is whole. Still traumatized</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Rescued from a Dauntain, now with her seal skin back, she is whole. Still traumatized",
+    "createdAt": "2021-04-12 16:09:12.799721",
+    "updatedAt": "2025-10-30 03:42:14.676000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Onyx",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Childling",
+    "house": "Ailil",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Traumatized sidhe boy, saved from Dauntain, slowly getting better</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Traumatized sidhe boy, saved from Dauntain, slowly getting better",
+    "createdAt": "2021-04-12 16:12:56.726266",
+    "updatedAt": "2025-10-30 03:42:14.677000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Itzel",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Another rescue from the Gray woman, adapting better than most</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Another rescue from the Gray woman, adapting better than most",
+    "createdAt": "2021-04-12 16:15:37.067963",
+    "updatedAt": "2025-10-30 03:42:14.678000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Adler",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Another sluagh boy, one of those who escaped the gray woman</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Another sluagh boy, one of those who escaped the gray woman",
+    "createdAt": "2021-04-12 16:23:48.143971",
+    "updatedAt": "2025-10-30 03:42:14.678000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Jordan",
+    "faeName": "Jordan",
+    "rank": "",
+    "kith": "Centaur",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Bit of an ass, Unseelie</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Bit of an ass, Unseelie",
+    "createdAt": "2021-05-24 23:26:20.545179",
+    "updatedAt": "2025-10-30 03:42:14.679000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Tonto",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Fenix",
+    "position": "Jester",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Gentle giant of a buffalo pooka. Promises not to harm any local china shops.</div>",
+    "notes": "",
+    "descriptionPlainText": "Gentle giant of a buffalo pooka. Promises not to harm any local china shops.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.313256",
+    "updatedAt": "2025-10-30 03:42:14.680000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Nolan",
+    "faeName": "Nolan",
+    "rank": "Fledge",
+    "kith": "Pooka",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Porcupine Pooka, twin brother of Audrey</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Porcupine Pooka, twin brother of Audrey",
+    "createdAt": "2021-08-05 19:38:49.684242",
+    "updatedAt": "2025-10-30 03:42:14.680000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "",
+    "faeName": "Al Fresco",
+    "rank": "",
+    "kith": "Redcap",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Unseelie diner owner/line cook who runs the 'Chatterbox Diner' in Carthage, NY</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Unseelie diner owner/line cook who runs the 'Chatterbox Diner' in Carthage, NY",
+    "createdAt": "2021-12-14 03:36:48.457547",
+    "updatedAt": "2025-10-30 03:42:14.681000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Tylar",
+    "rank": "Squire",
+    "kith": "Boggan",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Squire to Baron August</div>",
+    "notes": "",
+    "descriptionPlainText": "Squire to Baron August",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.039260",
+    "updatedAt": "2025-10-30 03:42:14.682000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Clarence",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Hope's 2nd in Command</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Hope's 2nd in Command",
+    "createdAt": "2020-12-20 18:39:58.899201",
+    "updatedAt": "2025-10-30 03:42:14.682000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Otha",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "BrightWinds",
+    "position": "Seer",
+    "seeming": "Wilder",
+    "house": "Aesin",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Aesin Volva / Witchwoman</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Aesin Volva / Witchwoman",
+    "createdAt": "2020-12-20 18:39:58.917768",
+    "updatedAt": "2025-10-30 03:42:14.683000"
+  },
+  {
+    "player": "Catnik",
+    "mortalName": "Julia Morton",
+    "faeName": "Derynwydd; Sparrow",
+    "rank": "Baroness",
+    "kith": "Sidhe",
+    "location": "BrightWinds",
+    "position": "Freeholder",
+    "seeming": "Wilder",
+    "house": "Liam",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:58.933709",
+    "updatedAt": "2025-10-30 03:42:14.684000"
+  },
+  {
+    "player": "Catnik",
+    "mortalName": "",
+    "faeName": "Irene Donaldson",
+    "rank": "",
+    "kith": "Piskey",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:58.953861",
+    "updatedAt": "2025-10-30 03:42:14.684000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Felicity",
+    "rank": "Squire",
+    "kith": "Sidhe",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Childling",
+    "house": "Eilunid",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Squire of Sir Morthwyl</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Squire of Sir Morthwyl",
+    "createdAt": "2020-12-20 18:39:58.967487",
+    "updatedAt": "2025-10-30 03:42:14.685000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Byrndan",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Daireann",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Sidhe Wilder twin to Brynn</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Sidhe Wilder twin to Brynn",
+    "createdAt": "2020-12-20 18:39:58.991092",
+    "updatedAt": "2025-10-30 03:42:14.686000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Peter O'Wang",
+    "faeName": "Peter O'Wang",
+    "rank": "",
+    "kith": "Piskey",
+    "location": "BrightWinds",
+    "position": "Kith Rep",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Seems to love trains</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Seems to love trains",
+    "createdAt": "2021-02-25 16:03:08.517142",
+    "updatedAt": "2025-10-30 03:42:14.686000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Bree",
+    "faeName": "Wyldheart",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Dark Gate",
+    "position": "Mountain",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Bastard DeBuke, trained by Emmit</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Bastard DeBuke, trained by Emmit",
+    "createdAt": "2021-03-22 14:33:42.836695",
+    "updatedAt": "2025-10-30 03:42:14.687000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Hughende Pender",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>One of the sluagh rescued from the clutches of the Varich of Bloody Oak Barony.  A dignified older male.</div>",
+    "notes": "",
+    "descriptionPlainText": "One of the sluagh rescued from the clutches of the Varich of Bloody Oak Barony.  A dignified older male.",
+    "notesPlainText": "",
+    "createdAt": "2022-02-08 14:25:11.336085",
+    "updatedAt": "2025-10-30 03:42:14.687000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Lacrima Mourn",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A disturbingly lovely sluagh lady.  Rescued from the clutches of the Varich of Bloody Oak Barony, near Red Oak Iowa.  </div>",
+    "notes": "",
+    "descriptionPlainText": "A disturbingly lovely sluagh lady.  Rescued from the clutches of the Varich of Bloody Oak Barony, near Red Oak Iowa.  ",
+    "notesPlainText": "",
+    "createdAt": "2022-02-08 14:45:14.802693",
+    "updatedAt": "2025-10-30 03:42:14.688000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Enoch Cumberbund",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A youthful wilder male who is covered in old bites that have healed, scars from whip lashes. He must have been a truculent prisoner. Rescued from the clutches of the Varich of Bloody Oak Barony, near Red Oak Iowa.  </div>",
+    "notes": "",
+    "descriptionPlainText": "A youthful wilder male who is covered in old bites that have healed, scars from whip lashes. He must have been a truculent prisoner. Rescued from the clutches of the Varich of Bloody Oak Barony, near Red Oak Iowa.  ",
+    "notesPlainText": "",
+    "createdAt": "2022-02-08 14:47:13.614540",
+    "updatedAt": "2025-10-30 03:42:14.689000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Isephemia Pernicious",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A tiny and traumatized young sluagh.  One of those rescued from the clutches of the Varich of Bloody Oak Barony, near Red Oak Iowa. </div>",
+    "notes": "",
+    "descriptionPlainText": "A tiny and traumatized young sluagh.  One of those rescued from the clutches of the Varich of Bloody Oak Barony, near Red Oak Iowa. ",
+    "notesPlainText": "",
+    "createdAt": "2022-02-08 14:48:25.486646",
+    "updatedAt": "2025-10-30 03:42:14.689000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Njera",
+    "rank": "",
+    "kith": "Eshu",
+    "location": "Lake, The",
+    "position": "Frequent visitor",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Lovely Eshu, tends to favor a sarong but swims in the nude with little shame</div>",
+    "notes": "<div>Has Wayfare 4</div>",
+    "descriptionPlainText": "Lovely Eshu, tends to favor a sarong but swims in the nude with little shame",
+    "notesPlainText": "Has Wayfare 4",
+    "createdAt": "2021-10-05 17:32:24.139117",
+    "updatedAt": "2025-10-30 03:42:14.690000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Spike",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Lake, The",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Satyress with a long mohawk, wears torn jeans and heavy metal t shirts, often vintage</div>",
+    "notes": "<div>Loud mouthed, opinionated, SOMETIMES slips and shows she gives a shit. Mostly wants to party</div>",
+    "descriptionPlainText": "Satyress with a long mohawk, wears torn jeans and heavy metal t shirts, often vintage",
+    "notesPlainText": "Loud mouthed, opinionated, SOMETIMES slips and shows she gives a shit. Mostly wants to party",
+    "createdAt": "2021-10-05 17:36:59.992136",
+    "updatedAt": "2025-10-30 03:42:14.690000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Ryder",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Wheelchair</div>",
+    "notes": "",
+    "descriptionPlainText": "Wheelchair",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:58.975100",
+    "updatedAt": "2025-10-30 03:42:14.691000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Justin Anthony Georgiou",
+    "faeName": "Julius",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "Silverwolf",
+    "position": "Apprentice Steward",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>In training to help take over household/manor duties for Marigold. Fiancé of Bluebell, a rather bookish fellow but not immune to hot-blooded Satyr mood swings, especially where his beloved is concerned.</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "In training to help take over household/manor duties for Marigold. Fiancé of Bluebell, a rather bookish fellow but not immune to hot-blooded Satyr mood swings, especially where his beloved is concerned.",
+    "createdAt": "2020-12-20 18:39:59.851964",
+    "updatedAt": "2025-10-30 03:42:14.692000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Sullivan",
+    "faeName": "Sullivan/Sully",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Dark Gate",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Bald Pooka but with feathered goatee. <br> (Vulture..err Peace Eagle)</div>",
+    "notes": "<div>Co-Owner of local community theatre</div>",
+    "descriptionPlainText": "Bald Pooka but with feathered goatee. \n (Vulture..err Peace Eagle)",
+    "notesPlainText": "Co-Owner of local community theatre",
+    "createdAt": "2021-03-22 14:17:32.664265",
+    "updatedAt": "2025-10-30 03:42:14.692000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Bettie",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.108314",
+    "updatedAt": "2025-10-30 03:42:14.693000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Benny",
+    "rank": "Page",
+    "kith": "",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.121781",
+    "updatedAt": "2025-10-30 03:42:14.694000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Honoria",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Dougal",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.143952",
+    "updatedAt": "2025-10-30 03:42:14.694000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Tierone",
+    "rank": "Duke",
+    "kith": "Sidhe",
+    "location": "",
+    "position": "",
+    "seeming": "",
+    "house": "Liam",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.211084",
+    "updatedAt": "2025-10-30 03:42:14.695000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Tyrnod Redfang",
+    "rank": "",
+    "kith": "Troll",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Hero of the accordance war</div>",
+    "notes": "",
+    "descriptionPlainText": "Hero of the accordance war",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.278194",
+    "updatedAt": "2025-10-30 03:42:14.696000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Tanya Brown",
+    "faeName": "Nadeen Dancingsnow",
+    "rank": "Baroness",
+    "kith": "Sidhe",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Varich",
+    "bannerhouse": "",
+    "description": "<div> Apparent mortal age? 21. Platinum hair, ice blue eyes</div>",
+    "notes": "<div>Baroness, Co ruler  of Silver Wolf</div>",
+    "descriptionPlainText": " Apparent mortal age? 21. Platinum hair, ice blue eyes",
+    "notesPlainText": "Baroness, Co ruler  of Silver Wolf",
+    "createdAt": "2020-12-20 18:39:59.652484",
+    "updatedAt": "2025-10-30 03:42:14.698000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Cleo",
+    "faeName": "Cleo",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A young childling adopted recently by Dame Ann Marie and her mortal husband, Bruce.  Still much of a mystery to foster brothers Symon and Dirk.</div>",
+    "notes": "",
+    "descriptionPlainText": "A young childling adopted recently by Dame Ann Marie and her mortal husband, Bruce.  Still much of a mystery to foster brothers Symon and Dirk.",
+    "notesPlainText": "",
+    "createdAt": "2023-06-26 19:51:27.860033",
+    "updatedAt": "2025-10-30 03:42:14.699000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Mariposa Oruga",
+    "faeName": "Posey",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A caterpillar-themed pooka childling who has recently joined Ellie's Childling Court of Fenix.</div>",
+    "notes": "",
+    "descriptionPlainText": "A caterpillar-themed pooka childling who has recently joined Ellie's Childling Court of Fenix.",
+    "notesPlainText": "",
+    "createdAt": "2023-06-29 17:34:13.992183",
+    "updatedAt": "2025-10-30 03:42:14.700000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Vaeltilde",
+    "rank": "Baroness",
+    "kith": "Sidhe",
+    "location": "Sunkissed Waves",
+    "position": "Heir",
+    "seeming": "Childling",
+    "house": "Aesin",
+    "bannerhouse": "",
+    "description": "<div>Baroness Vaeltilde of Sunkissed Waves  – Aesin Sidhe Childing</div>",
+    "notes": "",
+    "descriptionPlainText": "Baroness Vaeltilde of Sunkissed Waves – Aesin Sidhe Childing",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.923333",
+    "updatedAt": "2025-10-30 03:42:14.700000"
+  },
+  {
+    "player": "Catnik",
+    "mortalName": "",
+    "faeName": "Eleanor Hyacinth de Violette",
+    "rank": "",
+    "kith": "Sidhe",
+    "location": "Fenix",
+    "position": "Heir",
+    "seeming": "Childling",
+    "house": "Beaumayn",
+    "bannerhouse": "",
+    "description": "<div>Beaumayn Sidhe Childling, and current ward of Dame Ash and heir to Fenix.</div>",
+    "notes": "",
+    "descriptionPlainText": "Beaumayn Sidhe Childling, and current ward of Dame Ash and heir to Fenix.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.281626",
+    "updatedAt": "2025-10-30 03:42:14.701000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Brogan",
+    "rank": "Squire",
+    "kith": "Sidhe",
+    "location": "Rivervale",
+    "position": "",
+    "seeming": "Childling",
+    "house": "Daireann",
+    "bannerhouse": "",
+    "description": "<div>Squire to Kerri</div>",
+    "notes": "",
+    "descriptionPlainText": "Squire to Kerri",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.270753",
+    "updatedAt": "2025-10-30 03:42:14.702000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Charles DeBuke",
+    "rank": "Knight",
+    "kith": "Troll",
+    "location": "DeBuke Farmhold",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Fiona",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.087929",
+    "updatedAt": "2025-10-30 03:42:14.703000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Agincourt",
+    "rank": "Knight",
+    "kith": "Boggan",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Grump",
+    "house": "Dougal",
+    "bannerhouse": "",
+    "description": "<div>With leg braces and more common sense than a room full of sidhe, Dame Agincourt is noted for her heroism in the use of siege engines in the last great Thallian attack. More plain spoken than many, even bordering on Earthy, she seems to have the respect of the younger knights and staff alike but prefers to let others stumble ahead before she decides if it needs fixing.</div>",
+    "notes": "",
+    "descriptionPlainText": "With leg braces and more common sense than a room full of sidhe, Dame Agincourt is noted for her heroism in the use of siege engines in the last great Thallian attack. More plain spoken than many, even bordering on Earthy, she seems to have the respect of the younger knights and staff alike but prefers to let others stumble ahead before she decides if it needs fixing.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.134387",
+    "updatedAt": "2025-10-30 03:42:14.704000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Nansaidh",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Gwydion",
+    "bannerhouse": "",
+    "description": "<div>Pro Defense, wants to keep the barony safe, but perhaps is too insular in her policies. mix of warrioress and courtier. Her host is the biological sister of Neachdainn. They naturally argue about everything.</div>",
+    "notes": "",
+    "descriptionPlainText": "Pro Defense, wants to keep the barony safe, but perhaps is too insular in her policies. mix of warrioress and courtier. Her host is the biological sister of Neachdainn. They naturally argue about everything.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.143114",
+    "updatedAt": "2025-10-30 03:42:14.704000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Morthwyl",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Gwydion",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.008066",
+    "updatedAt": "2025-10-30 03:42:14.705000"
+  },
+  {
+    "player": "Catnik",
+    "mortalName": "Zara Schwartz",
+    "faeName": "Zara Manynames",
+    "rank": "",
+    "kith": "Sluagh",
+    "location": "EarthRunes",
+    "position": "Librarian",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.255756",
+    "updatedAt": "2025-10-30 03:42:14.706000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Clementine \"Clem\" DeBuke",
+    "rank": "",
+    "kith": "Troll",
+    "location": "DeBuke Farmhold",
+    "position": "Chieftain",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.055801",
+    "updatedAt": "2025-10-30 03:42:14.706000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Agnes DeBuke",
+    "rank": "",
+    "kith": "Troll",
+    "location": "DeBuke Farmhold",
+    "position": "Hearth",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.063781",
+    "updatedAt": "2025-10-30 03:42:14.707000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Tito-Woden",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Fenix",
+    "position": "Seer",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.367043",
+    "updatedAt": "2025-10-30 03:42:14.708000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Neema",
+    "rank": "",
+    "kith": "Selkie",
+    "location": "Fenix",
+    "position": "Troubadour",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.413489",
+    "updatedAt": "2025-10-30 03:42:14.709000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Stevie",
+    "rank": "",
+    "kith": "Satyr",
+    "location": "EarthRunes",
+    "position": "Troubadour",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Stevie is a country-playing, boot-stomping fiddler</div>",
+    "notes": "",
+    "descriptionPlainText": "Stevie is a country-playing, boot-stomping fiddler",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.226664",
+    "updatedAt": "2025-10-30 03:42:14.709000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Charity",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Misstress of the Laundry</div>",
+    "notes": "",
+    "descriptionPlainText": "Misstress of the Laundry",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.981953",
+    "updatedAt": "2025-10-30 03:42:14.710000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Cesar Carolos",
+    "rank": "",
+    "kith": "",
+    "location": "",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.216594",
+    "updatedAt": "2025-10-30 03:42:14.710000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Caitir",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>One of Sparrow's Seven</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "One of Sparrow's Seven",
+    "createdAt": "2020-12-20 18:39:58.908694",
+    "updatedAt": "2025-10-30 03:42:14.711000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Alan Lowell",
+    "faeName": "Aiden",
+    "rank": "Baron",
+    "kith": "Sidhe",
+    "location": "Silverwolf",
+    "position": "Freeholder",
+    "seeming": "Wilder",
+    "house": "Ailil",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.873839",
+    "updatedAt": "2025-10-30 03:42:14.712000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Phobos",
+    "rank": "",
+    "kith": "Redcap",
+    "location": "Fenix",
+    "position": "Thane, Herald",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Seelie Redcap, brother to Demos. Thane and acting Herald</div>",
+    "notes": "",
+    "descriptionPlainText": "Seelie Redcap, brother to Demos. Thane and acting Herald",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.343723",
+    "updatedAt": "2025-10-30 03:42:14.712000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Sunny Taylor Banks",
+    "faeName": "Sunny",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Goldfinch",
+    "position": "Fledge",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>A fondness for Bright yellows, oranges and reds. Age 35</div>",
+    "notes": "<div>Divorcee. Has a son, Mike</div>",
+    "descriptionPlainText": "A fondness for Bright yellows, oranges and reds. Age 35",
+    "notesPlainText": "Divorcee. Has a son, Mike",
+    "createdAt": "2021-12-10 20:45:05.012185",
+    "updatedAt": "2025-10-30 03:42:14.713000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "Alisa Curtis ",
+    "faeName": "",
+    "rank": "",
+    "kith": "Sidhe",
+    "location": "Rivervale",
+    "position": "Fledge",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Alisa's colors don't really indicate a house, blues and greens and a lot of brown.  The Claymore is a beauty, but no house symbols</div>",
+    "notes": "<div>Fledge as of Jan 5th 2022</div>",
+    "descriptionPlainText": "Alisa's colors don't really indicate a house, blues and greens and a lot of brown.  The Claymore is a beauty, but no house symbols",
+    "notesPlainText": "Fledge as of Jan 5th 2022",
+    "createdAt": "2022-01-08 14:32:48.133549",
+    "updatedAt": "2025-10-30 03:42:14.714000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Aishlyn aka Ash",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Grump",
+    "house": "Beaumayn",
+    "bannerhouse": "",
+    "description": "<div>Dame (Dama) Ash, Beaumayn and Ellie's mentor. former mentor of Vali.</div>",
+    "notes": "",
+    "descriptionPlainText": "Dame (Dama) Ash, Beaumayn and Ellie's mentor. former mentor of Vali.",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.441924",
+    "updatedAt": "2025-10-30 03:42:14.714000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "",
+    "faeName": "Briar",
+    "rank": "",
+    "kith": "Redcap",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Dog-meat girl</div>",
+    "notes": "",
+    "descriptionPlainText": "Dog-meat girl",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.811165",
+    "updatedAt": "2025-10-30 03:42:14.715000"
+  },
+  {
+    "player": "Rae",
+    "mortalName": "Roseanne Morris",
+    "faeName": "Rosemary",
+    "rank": "",
+    "kith": "Clurichaun",
+    "location": "Silverwolf",
+    "position": "",
+    "seeming": "Grump",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Clurichaun Real Estate Agent who resides in Carthage town</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Clurichaun Real Estate Agent who resides in Carthage town",
+    "createdAt": "2023-07-16 21:01:19.680330",
+    "updatedAt": "2025-10-30 03:42:14.716000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Kealan",
+    "rank": "Baron",
+    "kith": "Sidhe",
+    "location": "Teaneck",
+    "position": "",
+    "seeming": "",
+    "house": "Scathach",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Teaneck is a barony and the hold of the same name is the baronial seat. The Baron Kealan ap Scathach rules there.   He is the spymaster for Count Hemlock's court.</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Teaneck is a barony and the hold of the same name is the baronial seat. The Baron Kealan ap Scathach rules there.   He is the spymaster for Count Hemlock's court.",
+    "createdAt": "2023-07-26 16:59:25.106396",
+    "updatedAt": "2025-10-30 03:42:14.716000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Hope",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "BrightWinds",
+    "position": "Steward",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Proprietor of \"Buns and Roses\" coffee shop/cafe </div>",
+    "notes": "",
+    "descriptionPlainText": "Proprietor of \"Buns and Roses\" coffee shop/cafe ",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:58.948048",
+    "updatedAt": "2025-10-30 03:42:14.717000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Leonora",
+    "rank": "",
+    "kith": "Sidhe",
+    "location": "EarthRunes",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "Fiona",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.020076",
+    "updatedAt": "2025-10-30 03:42:14.718000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Hume",
+    "rank": "Lord",
+    "kith": "Sidhe",
+    "location": "EarthRunes",
+    "position": "Heir",
+    "seeming": "Wilder",
+    "house": "Dougal",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>No spine. Master hacker ;)</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "No spine. Master hacker ;)",
+    "createdAt": "2022-09-13 17:05:38.772361",
+    "updatedAt": "2025-10-30 03:42:14.718000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Hamlin Snitch",
+    "rank": "",
+    "kith": "Pooka",
+    "location": "BrightWinds",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Rat pooka troubador</div>",
+    "notes": "",
+    "descriptionPlainText": "Rat pooka troubador",
+    "notesPlainText": "",
+    "createdAt": "2021-02-16 04:04:23.919019",
+    "updatedAt": "2025-10-30 03:42:14.719000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Magnus",
+    "rank": "",
+    "kith": "Sidhe",
+    "location": "EarthRunes",
+    "position": "Reeve",
+    "seeming": "Wilder",
+    "house": "Fiona",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.190784",
+    "updatedAt": "2025-10-30 03:42:14.720000"
+  },
+  {
+    "player": "Rahne",
+    "mortalName": "",
+    "faeName": "Tweak",
+    "rank": "",
+    "kith": "Nocker",
+    "location": "Skyhook",
+    "position": "",
+    "seeming": "",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.902007",
+    "updatedAt": "2025-10-30 03:42:14.720000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Hewitt",
+    "rank": "Baron",
+    "kith": "Troll",
+    "location": "Dark Gate",
+    "position": "Freeholder; Chieftain",
+    "seeming": "",
+    "house": "Dougal",
+    "bannerhouse": "",
+    "description": "<div>A handsome, burly shouldered fellow. Tall, but smithing has built up his arms and shoulders to impressive conditions</div>",
+    "notes": "",
+    "descriptionPlainText": "A handsome, burly shouldered fellow. Tall, but smithing has built up his arms and shoulders to impressive conditions",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.035065",
+    "updatedAt": "2025-10-30 03:42:14.723000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Donelle",
+    "rank": "Knight",
+    "kith": "Sidhe",
+    "location": "Skyhook",
+    "position": "",
+    "seeming": "",
+    "house": "Gwydion",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.907983",
+    "updatedAt": "2025-10-30 03:42:14.724000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Tig",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "Thane",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "<div>Twin of Lut</div>",
+    "descriptionPlainText": "",
+    "notesPlainText": "Twin of Lut",
+    "createdAt": "2020-12-20 18:39:59.729489",
+    "updatedAt": "2025-10-30 03:42:14.725000"
+  },
+  {
+    "player": "Rahne",
+    "mortalName": "Sylvia Davidson",
+    "faeName": "Sylvi",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Rivervale",
+    "position": "Emissary",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.709538",
+    "updatedAt": "2025-10-30 03:42:14.725000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Earl DeBuke",
+    "rank": "Knight",
+    "kith": "Troll",
+    "location": "EarthRunes",
+    "position": "Artist",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.250058",
+    "updatedAt": "2025-10-30 03:42:14.726000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Sayda",
+    "rank": "Baroness",
+    "kith": "Clurichaun",
+    "location": "The Pitt",
+    "position": "Heir",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Clurichaun Childling , heir to the Pitt, granddaughter of the Feathered Dragon</div>",
+    "notes": "",
+    "descriptionPlainText": "Clurichaun Childling , heir to the Pitt, granddaughter of the Feathered Dragon",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.931532",
+    "updatedAt": "2025-10-30 03:42:14.727000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Rollo",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "EarthRunes",
+    "position": "Thane",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "",
+    "notes": "",
+    "descriptionPlainText": "",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.033335",
+    "updatedAt": "2025-10-30 03:42:14.727000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Sonador",
+    "rank": "",
+    "kith": "Boggan",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Childling",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Nephew of Maria, lover of music</div>",
+    "notes": "",
+    "descriptionPlainText": "Nephew of Maria, lover of music",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.457816",
+    "updatedAt": "2025-10-30 03:42:14.728000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Duff",
+    "rank": "",
+    "kith": "Troll",
+    "location": "Fenix",
+    "position": "",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>‘The Illustrated Troll’, companion to Lady Jessica</div>",
+    "notes": "",
+    "descriptionPlainText": "‘The Illustrated Troll’, companion to Lady Jessica",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:39:59.297431",
+    "updatedAt": "2025-10-30 03:42:14.729000"
+  },
+  {
+    "player": "Valley Dweller",
+    "mortalName": "",
+    "faeName": "Oswald",
+    "rank": "",
+    "kith": "Troll",
+    "location": "EarthRunes",
+    "position": "Thane",
+    "seeming": "Wilder",
+    "house": "",
+    "bannerhouse": "",
+    "description": "<div>Star Wars obsessed thane and paramour of Emma</div>",
+    "notes": "",
+    "descriptionPlainText": "Star Wars obsessed thane and paramour of Emma",
+    "notesPlainText": "",
+    "createdAt": "2020-12-20 18:40:00.093346",
+    "updatedAt": "2025-10-30 03:42:14.729000"
+  }
+]

+ 92 - 0
server/plugins/socketio.js

@@ -0,0 +1,92 @@
+// noinspection JSAccessibilityCheck,JSUndefinedPropertyAssignment,JSUnresolvedReference
+
+import { Server as Engine } from "engine.io"
+import { Server } from "socket.io"
+// import * as middlewares from "../socketio/middlewares"
+import * as handlers from "../socketio/handlers"
+
+const LOG_CONNECTIONS = false
+const LOG_EVENTS = false
+
+export default defineNitroPlugin((nitroApp) => {
+  const engine = new Engine()
+
+  const io = new Server({
+    serveClient: false
+
+    // connectionStateRecovery: {
+    //   maxDisconnectionDuration: 2 * 60 * 1000,
+    //   skipMiddlewares: false
+    // }
+  })
+
+  io.bind(engine)
+
+  // register middlewares
+  // _forOwn(middlewares, (middleware) => io.use(middleware))
+
+  // expose server instance
+  nitroApp.hooks.hook("request", (event) => (event.context.io = io))
+
+  io.on("connection", async (socket) => {
+    // register handlers
+    _forOwn(handlers, (handler) => handler(io, socket))
+
+    if (LOG_CONNECTIONS) {
+      // log connection
+      console.log(
+        "[server socketio] [connection]",
+        socket.id,
+        // socket.data.user?.username ?? "unauthenticated"
+      )
+
+      console.log(
+        "[server socketio] [# connected]",
+        io.of("/").sockets.size
+      )
+
+      socket.on("disconnect", (reason) => {
+        console.log(
+          "[server socketio] [disconnect]",
+          reason,
+          socket.id,
+          // socket.data.user?.username ?? "unauthenticated"
+        )
+      })
+    }
+
+    if (LOG_EVENTS) {
+      // log all incoming events
+      socket.onAny((eventName, ...args) =>
+        console.log("[server socketio] [incoming]", eventName, ..._initial(args))
+      )
+
+      // log all outgoing events
+      socket.onAnyOutgoing((eventName, ...args) =>
+        console.log("[server socketio] [outgoing]", eventName, args)
+      )
+    }
+  })
+
+  nitroApp.router.use(
+    "/socket.io/",
+
+    defineEventHandler({
+      handler: (event) => {
+        engine.handleRequest(event.node.req, event.node.res)
+        event._handled = true
+      },
+
+      websocket: {
+        open(peer) {
+          engine.prepare(peer._internal.nodeReq)
+          engine.onWebSocket(
+            peer._internal.nodeReq,
+            peer._internal.nodeReq.socket,
+            peer.websocket
+          )
+        }
+      }
+    })
+  )
+})

+ 95 - 0
server/socketio/handlers/characterHandlers.js

@@ -0,0 +1,95 @@
+export function characterHandlers(_io, socket) {
+  socket.on("character:read", readCharacter)
+  socket.on("character:list", listCharacters)
+  socket.on("character:delete", deleteCharacter)
+  socket.on("character:create", createCharacter)
+  socket.on("character:update", updateCharacter)
+  socket.on("character:options", fetchCharacterOptions)
+
+  const characterHandlerOptions = {
+    user: socket.data?.user,
+    resource: "character",
+    idValidator: characterSchema.shape.id.parse
+  }
+
+  async function readCharacter(id, callback) {
+    await characterHandler({
+      callback,
+      id,
+      query: ({ id }) => prisma.character.findUnique({ where: { id } })
+    })
+  }
+
+  async function listCharacters(callback) {
+    await characterHandler({
+      callback,
+      query: () =>
+        prisma.character.findMany({ orderBy: [{ createdAt: "asc" }] })
+    })
+  }
+
+  async function deleteCharacter(id, callback) {
+    await characterHandler({
+      callback,
+      permissions: ["delete"],
+      id,
+      mutator: (rawResult) => _pick(rawResult, ["id"]),
+      query: ({ id }) => prisma.character.delete({ where: { id } })
+    })
+
+    socket.broadcast.emit("character:delete", id)
+  }
+
+  async function createCharacter(payload, callback) {
+    const character = await characterHandler({
+      callback,
+      permissions: ["create"],
+      data: withPlainTextFields(payload),
+      validator: createCharacterSchema.parse,
+      query: ({ data }) => prisma.character.create({ data })
+    })
+
+    socket.broadcast.emit("character:create", character)
+  }
+
+  async function updateCharacter(id, payload, callback) {
+    const character = await characterHandler({
+      callback,
+      permissions: ["update"],
+      id,
+      data: withPlainTextFields(payload),
+      validator: updateCharacterSchema.parse,
+      query: ({ id, data }) => prisma.character.update({ where: { id }, data })
+    })
+
+    socket.broadcast.emit("character:update", character)
+  }
+
+  async function fetchCharacterOptions(callback) {
+    const columns = _keys(categoryFields)
+
+    const fetchColumnOptions = async (column) => {
+      return prisma.character.groupBy({
+        by: column,
+        where: { [column]: { not: "" } },
+        orderBy: { [column]: "asc" }
+      })
+    }
+
+    await characterHandler({
+      callback,
+
+      query: () => Promise.all(_map(columns, (column) => fetchColumnOptions(column))),
+
+      mutator: (rawResult) =>
+        _zipObject(
+          columns,
+          _map(rawResult, (group) => _flatMap(group, _values))
+        )
+    })
+  }
+
+  async function characterHandler(options) {
+    return await executeQuery({ ...characterHandlerOptions, ...options })
+  }
+}

+ 2 - 0
server/socketio/handlers/index.js

@@ -0,0 +1,2 @@
+export * from "./characterHandlers.js"
+// export * from "./userHandlers.js"

+ 100 - 0
server/socketio/handlers/userHandlers.js

@@ -0,0 +1,100 @@
+export function userHandlers(_io, socket) {
+  socket.on("user:read", readUser)
+  socket.on("user:list", listUsers)
+  socket.on("user:paginate", paginateUsers)
+  socket.on("user:count", countUsers)
+  socket.on("user:delete", deleteUser)
+  socket.on("user:create", createUser)
+  socket.on("user:update", updateUser)
+
+  const userHandlerOptions = {
+    user: socket.data?.user,
+    resource: "user",
+    idValidator: userSchema.shape.id.parse
+  }
+
+  async function readUser(id, callback) {
+    await userHandler({
+      id,
+      callback,
+
+      query: ({ id }) =>
+        prisma.user.findUnique({
+          omit: { banned: true, banReason: true, banExpires: true },
+          where: { id }
+        })
+    })
+  }
+
+  async function listUsers(callback) {
+    await userHandler({
+      callback,
+
+      query: () =>
+        prisma.user.findMany({
+          omit: { banned: true, banReason: true, banExpires: true },
+          orderBy: [{ createdAt: "asc" }]
+        })
+    })
+  }
+
+  async function paginateUsers(skip, take, callback) {
+    await userHandler({
+      callback,
+
+      query: () =>
+        prisma.user.findMany({
+          omit: { banned: true, banReason: true, banExpires: true },
+          orderBy: [{ createdAt: "asc" }],
+          skip,
+          take
+        })
+    })
+  }
+
+  async function countUsers(callback) {
+    await userHandler({ callback, query: () => prisma.user.count() })
+  }
+
+  async function deleteUser(id, callback) {
+    await userHandler({
+      callback,
+      permissions: ["delete"],
+      id,
+      mutator: (rawResult) => _pick(rawResult, ["id"]),
+      query: ({ id }) => prisma.user.delete({ where: { id } })
+    })
+  }
+
+  async function createUser(data, callback) {
+    await userHandler({
+      callback,
+      permissions: ["create"],
+      data,
+      validator: createUserSchema.parse,
+
+      query: ({ data }) =>
+        serverAuth().api.createUser({
+          body: {
+            ..._omit(data, "username"),
+            data: { username: data.username }
+          }
+        })
+    })
+  }
+
+  async function updateUser(id, data, callback) {
+    await userHandler({
+      callback,
+      permissions: ["update"],
+      id,
+      data,
+      validator: updateUserSchema.parse,
+      query: ({ id, data }) => prisma.user.update({ where: { id }, data })
+    })
+  }
+
+  async function userHandler(options) {
+    return await executeQuery({ ...userHandlerOptions, ...options })
+  }
+}

+ 16 - 0
server/socketio/middlewares/authMiddleware.js

@@ -0,0 +1,16 @@
+// noinspection JSUnusedGlobalSymbols
+export async function authMiddleware(socket, next) {
+  // noinspection JSUnresolvedReference
+  const session = await auth.api.getSession({
+    headers: socket.handshake.headers
+  })
+
+  if (session) {
+    socket.data = {
+      session: session.session,
+      user: session.user
+    }
+  }
+
+  next()
+}

+ 1 - 0
server/socketio/middlewares/index.js

@@ -0,0 +1 @@
+export * from "./authMiddleware.js"

+ 45 - 0
server/utils/executeQuery.js

@@ -0,0 +1,45 @@
+const LOG_RESULT = false
+
+export default async function executeQuery({
+  callback,
+  // user,
+  // resource,
+  // permissions,
+  id,
+  data,
+  idValidator = _identity,
+  validator = _identity,
+  mutator = _identity,
+  query = _noop
+}) {
+  try {
+    // if (permissions) {
+    //   await authorize(user, resource, permissions)
+    // }
+
+    let validId, validData
+
+    if (id) {
+      validId = idValidator(id)
+    }
+
+    if (data) {
+      validData = validator(data)
+    }
+
+    const rawResult = await query({ id: validId, data: validData })
+    const result = mutator(rawResult)
+
+    if (LOG_RESULT) {
+      console.log("[executeQuery]")
+      console.dir(result)
+    }
+
+    callback({ data: result })
+    return result
+  } catch (error) {
+    console.error(error)
+
+    callback({ error })
+  }
+}

+ 5 - 0
server/utils/htmlToPlainText.js

@@ -0,0 +1,5 @@
+import { convert } from "html-to-text"
+
+export default function htmlToPlainText(html) {
+  return convert(html, { wordwrap: false })
+}

+ 9 - 0
server/utils/prisma.js

@@ -0,0 +1,9 @@
+import "dotenv/config"
+import { PrismaClient } from "../../prisma/generated/prisma/client.ts"
+import { PrismaPg } from "@prisma/adapter-pg"
+
+const adapter = new PrismaPg({
+  connectionString: process.env.NUXT_PRISMA_DATABASE_URL
+})
+
+export default new PrismaClient({ adapter })

+ 15 - 0
server/utils/withPlainTextFields.js

@@ -0,0 +1,15 @@
+export default function withPlainTextFields(character) {
+  const result = _clone(character)
+
+  _forOwn(character, (value, field) => {
+    if (characterFields[field]?.type === "richText") {
+      _set(
+        result,
+        `${field}PlainText`,
+        _isEmpty(value) ? "" : htmlToPlainText(value)
+      )
+    }
+  })
+
+  return result
+}

+ 25 - 0
shared/utils/characterFields.js

@@ -0,0 +1,25 @@
+export const characterFields = {
+  faeName: { type: "text", initialValue: "", showColumn: true },
+  mortalName: { type: "text", initialValue: "", showColumn: true },
+  player: { type: "autocomplete", initialValue: "", showColumn: true },
+  kith: { type: "autocomplete", initialValue: "", showColumn: true },
+  house: { type: "autocomplete", initialValue: "", showColumn: false },
+  bannerhouse: { type: "autocomplete", initialValue: "", showColumn: false },
+  seeming: { type: "autocomplete", initialValue: "", showColumn: true },
+  rank: { type: "autocomplete", initialValue: "", showColumn: true },
+  location: { type: "autocomplete", initialValue: "", showColumn: true },
+  position: { type: "autocomplete", initialValue: "", showColumn: true },
+  description: { type: "richText", initialValue: "", showColumn: false },
+  notes: { type: "richText", initialValue: "", showColumn: false }
+}
+
+export const nameFields = _pickBy(characterFields, { type: "text" })
+export const categoryFields = _pickBy(characterFields, { type: "autocomplete" })
+export const richTextFields = _pickBy(characterFields, { type: "richText" })
+export const columnFields = _pickBy(characterFields, { showColumn: true })
+export const optionsFields = _pickBy(columnFields, { type: "autocomplete" })
+
+export const globalFilterFieldNames = _map(
+  characterFields,
+  ({ type }, field) => (type === "richText" ? `${field}PlainText` : field)
+)

+ 2 - 0
shared/utils/schema.js

@@ -0,0 +1,2 @@
+export * from "./schema/character.js"
+// export * from "./schema/user.js"

+ 18 - 0
shared/utils/schema/character.js

@@ -0,0 +1,18 @@
+export const characterSchema = z.object({
+  id: z.coerce.number().int().positive(),
+  player: z.string().trim().min(1),
+  mortalName: z.string().trim(),
+  faeName: z.string().trim(),
+  rank: z.string().trim(),
+  kith: z.string().trim(),
+  location: z.string().trim(),
+  position: z.string().trim(),
+  seeming: z.string().trim(),
+  house: z.string().trim(),
+  bannerhouse: z.string().trim(),
+  description: z.string().trim(),
+  notes: z.string().trim()
+})
+
+export const createCharacterSchema = characterSchema.omit({ id: true })
+export const updateCharacterSchema = createCharacterSchema.partial()

+ 14 - 0
shared/utils/schema/user.js

@@ -0,0 +1,14 @@
+export const userSchema = z.object({
+  id: z.uuidv4("Invalid id."),
+  name: z.string().trim().min(2),
+  email: z.email("Must be a valid email address.").trim(),
+  role: z.enum(["user", "admin"], "Must be either 'user' or 'admin'."),
+  username: z.string().trim().min(2),
+  password: z.string().min(12)
+})
+
+export const createUserSchema = userSchema.omit({ id: true })
+
+export const updateUserSchema = createUserSchema
+  .omit({ password: true })
+  .partial()

+ 18 - 0
shared/utils/z.js

@@ -0,0 +1,18 @@
+import * as z from "zod"
+
+z.config({
+  customError: (issue) => {
+    switch (issue.code) {
+      case "too_small":
+        if (issue.origin === "string" && _isEmpty(issue.input)) {
+          return "Cannot be blank."
+        } else {
+          return `Must be at least ${issue.minimum} characters.`
+        }
+      case "too_big":
+        return `Cannot be longer than ${issue.maximum} characters.`
+    }
+  }
+})
+
+export default z

+ 18 - 0
tsconfig.json

@@ -0,0 +1,18 @@
+{
+  // https://nuxt.com/docs/guide/concepts/typescript
+  "files": [],
+  "references": [
+    {
+      "path": "./.nuxt/tsconfig.app.json"
+    },
+    {
+      "path": "./.nuxt/tsconfig.server.json"
+    },
+    {
+      "path": "./.nuxt/tsconfig.shared.json"
+    },
+    {
+      "path": "./.nuxt/tsconfig.node.json"
+    }
+  ]
+}