@genispace/geniapp 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/MultiPageRenderer-DftFCAIJ.js +550 -0
- package/dist/MultiPageRenderer-DftFCAIJ.js.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/layout.js +1 -1
- package/dist/components/runtime/GeniAppWorkbench.d.ts +3 -1
- package/dist/components/runtime/MultiPageRenderer.d.ts +11 -0
- package/dist/components/runtime/PageRenderer.d.ts +9 -0
- package/dist/components/standalone.js +6948 -6924
- package/dist/components.js +314 -305
- package/dist/components.js.map +1 -1
- package/package.json +1 -1
- package/dist/MultiPageRenderer-B4G9Oswj.js +0 -535
- package/dist/MultiPageRenderer-B4G9Oswj.js.map +0 -1
package/dist/components.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.js","sources":["../src/components/themes/classic.ts","../src/components/themes/inkOnyx.ts","../src/components/themes/index.ts","../src/components/lib/theme/themeUtils.ts","../src/components/contexts/WorkbenchThemeContext.tsx","../src/components/runtime/GeniAppComponentProvider.tsx","../src/components/mobile/utils/mobileBottomNav.ts","../src/components/runtime/GeniAppWorkbench.tsx","../src/components/adapters/platform.ts"],"sourcesContent":["/* eslint-disable custom/no-hardcoded-text -- Registered theme catalogue labels (UI uses zh/en helpers). */\n\nimport type { Theme } from './types'\n\n/**\n * Mirrors `packages/shared-ui/src/styles/base.css` semantic tokens.\n * Runtime injection is handled by `buildWorkbenchPaletteCss` (see themeUtils classic branch).\n */\nexport const classicTheme: Theme = {\n id: 'classic',\n name: '经典',\n nameEn: 'Classic',\n preview: 'hsl(217, 91%, 60%)',\n tokens: {\n light: {\n '--color-primary': 'hsl(217, 91%, 60%)',\n '--color-primary-hover': 'hsl(217, 91%, 52%)',\n '--color-primary-foreground': 'hsl(0, 0%, 100%)',\n '--color-secondary': 'hsl(0, 0%, 96.1%)',\n '--color-secondary-foreground': 'hsl(0, 0%, 14.9%)',\n '--color-muted': 'hsl(210, 40%, 96.1%)',\n '--color-muted-foreground': 'hsl(0, 0%, 25.1%)',\n '--color-accent': 'hsl(210, 40%, 96.1%)',\n '--color-accent-foreground': 'hsl(222.2, 47.4%, 11.2%)',\n '--color-destructive': 'hsl(0, 84.2%, 60.2%)',\n '--color-destructive-foreground': 'hsl(0, 0%, 100%)',\n '--color-background': 'hsl(0, 0%, 100%)',\n '--color-foreground': 'hsl(0, 0%, 9%)',\n '--color-card': 'hsl(0, 0%, 100%)',\n '--color-card-foreground': 'hsl(0, 0%, 9%)',\n '--color-popover': 'hsl(0, 0%, 100%)',\n '--color-popover-foreground': 'hsl(0, 0%, 9%)',\n '--color-border': 'hsl(214.3, 31.8%, 91.4%)',\n '--color-input': 'hsl(214.3, 31.8%, 91.4%)',\n '--color-ring': 'hsl(217, 91%, 60%)',\n '--radius': '0.5rem',\n '--shadow-card': '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n '--shadow-dropdown': '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n },\n dark: {\n '--color-primary': 'hsl(0, 0%, 98%)',\n '--color-primary-hover': 'hsl(0, 0%, 90%)',\n '--color-primary-foreground': 'hsl(0, 0%, 9%)',\n '--color-secondary': 'hsl(0, 0%, 14.9%)',\n '--color-secondary-foreground': 'hsl(0, 0%, 98%)',\n '--color-muted': 'hsl(0, 0%, 14.9%)',\n '--color-muted-foreground': 'hsl(0, 0%, 63.9%)',\n '--color-accent': 'hsl(0, 0%, 14.9%)',\n '--color-accent-foreground': 'hsl(0, 0%, 98%)',\n '--color-destructive': 'hsl(0, 84.2%, 60.2%)',\n '--color-destructive-foreground': 'hsl(0, 0%, 100%)',\n '--color-background': 'hsl(0, 0%, 3.9%)',\n '--color-foreground': 'hsl(0, 0%, 98%)',\n '--color-card': 'hsl(0, 0%, 3.9%)',\n '--color-card-foreground': 'hsl(0, 0%, 98%)',\n '--color-popover': 'hsl(0, 0%, 3.9%)',\n '--color-popover-foreground': 'hsl(0, 0%, 98%)',\n '--color-border': 'hsl(0, 0%, 14.9%)',\n '--color-input': 'hsl(0, 0%, 14.9%)',\n '--color-ring': 'hsl(0, 0%, 83.1%)',\n '--radius': '0.5rem',\n '--shadow-card': '0 2px 8px hsla(0, 0%, 0%, 0.35)',\n '--shadow-dropdown': '0 12px 40px hsla(0, 0%, 0%, 0.45)',\n },\n },\n}\n","/* eslint-disable custom/no-hardcoded-text -- Registered theme catalogue labels (UI uses zh/en helpers). */\n\nimport type { Theme } from './types'\n\nexport const inkOnyxTheme: Theme = {\n id: 'inkOnyx',\n name: '墨黑',\n nameEn: 'Ink Onyx',\n preview: '#000000',\n tokens: {\n light: {\n '--color-primary': 'hsl(0, 0%, 0%)',\n '--color-primary-hover': 'hsl(0, 0%, 16%)',\n '--color-primary-foreground': 'hsl(0, 0%, 100%)',\n '--color-secondary': 'hsl(0, 0%, 100%)',\n '--color-secondary-foreground': 'hsl(220, 20%, 12%)',\n '--color-muted': 'hsl(220, 15%, 94%)',\n '--color-muted-foreground': 'hsl(220, 15%, 45%)',\n '--color-accent': 'hsl(220, 15%, 92%)',\n '--color-accent-foreground': 'hsl(0, 0%, 12%)',\n '--color-destructive': 'hsl(350, 80%, 60%)',\n '--color-destructive-foreground': 'hsl(0, 0%, 100%)',\n '--color-background': 'hsl(220, 15%, 96%)',\n '--color-foreground': 'hsl(220, 20%, 12%)',\n '--color-card': 'hsl(0, 0%, 100%)',\n '--color-card-foreground': 'hsl(220, 20%, 12%)',\n '--color-popover': 'hsl(0, 0%, 100%)',\n '--color-popover-foreground': 'hsl(220, 20%, 12%)',\n '--color-border': 'hsl(220, 15%, 88%)',\n '--color-input': 'hsl(220, 15%, 90%)',\n '--color-ring': 'hsl(0, 0%, 0%)',\n '--radius': '0.5rem',\n '--shadow-card': '0 2px 16px hsla(220, 20%, 12%, 0.04)',\n '--shadow-dropdown': '0 8px 32px hsla(220, 20%, 12%, 0.12)',\n },\n dark: {\n '--color-primary': 'hsl(0, 0%, 100%)',\n '--color-primary-hover': 'hsl(0, 0%, 90%)',\n '--color-primary-foreground': 'hsl(0, 0%, 9%)',\n '--color-secondary': 'hsl(220, 20%, 12%)',\n '--color-secondary-foreground': 'hsl(220, 15%, 95%)',\n '--color-muted': 'hsl(220, 15%, 14%)',\n '--color-muted-foreground': 'hsl(220, 15%, 65%)',\n '--color-accent': 'hsl(220, 15%, 16%)',\n '--color-accent-foreground': 'hsl(220, 15%, 95%)',\n '--color-destructive': 'hsl(350, 60%, 50%)',\n '--color-destructive-foreground': 'hsl(0, 0%, 100%)',\n '--color-background': 'hsl(220, 15%, 6%)',\n '--color-foreground': 'hsl(220, 15%, 95%)',\n '--color-card': 'hsl(220, 20%, 10%)',\n '--color-card-foreground': 'hsl(220, 15%, 95%)',\n '--color-popover': 'hsl(220, 20%, 10%)',\n '--color-popover-foreground': 'hsl(220, 15%, 95%)',\n '--color-border': 'hsl(220, 15%, 20%)',\n '--color-input': 'hsl(220, 15%, 20%)',\n '--color-ring': 'hsl(0, 0%, 98%)',\n '--radius': '0.5rem',\n '--shadow-card': '0 2px 16px hsla(220, 20%, 12%, 0.2)',\n '--shadow-dropdown': '0 8px 32px hsla(220, 20%, 12%, 0.3)',\n },\n },\n}\n","import type { Theme } from './types'\nimport { classicTheme } from './classic'\nimport { inkOnyxTheme } from './inkOnyx'\n\n/** @deprecated Use `inkOnyxTheme`. */\nexport const financeTheme = inkOnyxTheme\n\nexport { classicTheme, inkOnyxTheme }\nexport type { Theme, ThemeTokenSet, ThemeTokens } from './types'\n\nconst LEGACY_THEME_ID_MAP: Record<string, string> = {\n /** Persisted before canonical id `inkOnyx`. */\n finance: inkOnyxTheme.id,\n}\n\nexport const themes: Record<string, Theme> = {\n [classicTheme.id]: classicTheme,\n [inkOnyxTheme.id]: inkOnyxTheme,\n}\n\nexport type ThemeId = string\n\nexport const defaultThemeId: ThemeId = classicTheme.id\n\n/** Normalize server/local persisted `themeId` (maps deprecated keys to the built-in registry). */\nexport function resolveThemeId(id: string | undefined | null): ThemeId {\n if (!id || id.trim() === '') return defaultThemeId\n const mapped = LEGACY_THEME_ID_MAP[id] ?? id\n return themes[mapped] ? mapped : defaultThemeId\n}\n\n/** Mirrors spec `GET /api/themes`; runs fully client-side against the built-in registry. */\nexport function listRegisteredThemes(): Theme[] {\n return Object.values(themes)\n}\n","import type { Theme, ThemeTokenSet } from '@/themes'\nimport { classicTheme } from '@/themes/classic'\n\n/**\n * Parses `hsl(h, s%, l%)` / `hsl(h s l)` into Tailwind-compatible channel triplets `\"h s l\"`.\n */\nexport function hslFunctionalToChannels(fn: string): string | null {\n const trimmed = fn.trim()\n const m = trimmed.match(\n /^hsl\\(\\s*([\\d.]+)\\s*(?:[,]\\s*|\\s+)([\\d.]+%)\\s*(?:[,]\\s*|\\s+)([\\d.]+%)\\s*\\)$/i,\n )\n if (!m) return null\n return `${m[1]} ${m[2]} ${m[3]}`.replace(/,/g, '').trim()\n}\n\nfunction tokenSetToDeclarations(tokens: ThemeTokenSet): Record<string, string> {\n const ch = {\n bg: hslFunctionalToChannels(tokens['--color-background']),\n fg: hslFunctionalToChannels(tokens['--color-foreground']),\n card: hslFunctionalToChannels(tokens['--color-card']),\n cardFg: hslFunctionalToChannels(tokens['--color-card-foreground']),\n pop: hslFunctionalToChannels(tokens['--color-popover']),\n popFg: hslFunctionalToChannels(tokens['--color-popover-foreground']),\n primary: hslFunctionalToChannels(tokens['--color-primary']),\n priFg: hslFunctionalToChannels(tokens['--color-primary-foreground']),\n secondary: hslFunctionalToChannels(tokens['--color-secondary']),\n secFg: hslFunctionalToChannels(tokens['--color-secondary-foreground']),\n muted: hslFunctionalToChannels(tokens['--color-muted']),\n mutFg: hslFunctionalToChannels(tokens['--color-muted-foreground']),\n accent: hslFunctionalToChannels(tokens['--color-accent']),\n accFg: hslFunctionalToChannels(tokens['--color-accent-foreground']),\n destructive: hslFunctionalToChannels(tokens['--color-destructive']),\n desFg: hslFunctionalToChannels(tokens['--color-destructive-foreground']),\n border: hslFunctionalToChannels(tokens['--color-border']),\n input: hslFunctionalToChannels(tokens['--color-input']),\n ring: hslFunctionalToChannels(tokens['--color-ring']),\n }\n const out: Record<string, string> = {\n ...Object.fromEntries(\n (Object.entries(tokens) as [string, string][]).filter(([k]) => k.startsWith('--color')),\n ),\n ...(ch.bg ? { '--background': ch.bg } : {}),\n ...(ch.fg ? { '--foreground': ch.fg } : {}),\n ...(ch.card ? { '--card': ch.card } : {}),\n ...(ch.cardFg ? { '--card-foreground': ch.cardFg } : {}),\n ...(ch.pop ? { '--popover': ch.pop } : {}),\n ...(ch.popFg ? { '--popover-foreground': ch.popFg } : {}),\n ...(ch.primary ? { '--primary': ch.primary } : {}),\n ...(ch.priFg ? { '--primary-foreground': ch.priFg } : {}),\n ...(ch.secondary ? { '--secondary': ch.secondary } : {}),\n ...(ch.secFg ? { '--secondary-foreground': ch.secFg } : {}),\n ...(ch.muted ? { '--muted': ch.muted } : {}),\n ...(ch.mutFg ? { '--muted-foreground': ch.mutFg } : {}),\n ...(ch.accent ? { '--accent': ch.accent } : {}),\n ...(ch.accFg ? { '--accent-foreground': ch.accFg } : {}),\n ...(ch.destructive ? { '--destructive': ch.destructive } : {}),\n ...(ch.desFg ? { '--destructive-foreground': ch.desFg } : {}),\n ...(ch.border ? { '--border': ch.border } : {}),\n ...(ch.input ? { '--input': ch.input } : {}),\n ...(ch.ring ? { '--ring': ch.ring } : {}),\n '--radius': tokens['--radius'],\n }\n\n const sbBg = ch.muted ?? ch.secondary\n const sbFg = ch.fg ?? ch.secFg\n const sbAccent = ch.accent ?? ch.muted\n const sbAccentFg = ch.accFg ?? ch.fg\n\n Object.assign(out, {\n ...(sbBg ? { '--sidebar-background': sbBg } : {}),\n ...(sbFg ? { '--sidebar-foreground': sbFg } : {}),\n ...(ch.primary ? { '--sidebar-primary': ch.primary } : {}),\n ...(ch.priFg ? { '--sidebar-primary-foreground': ch.priFg } : {}),\n ...(sbAccent ? { '--sidebar-accent': sbAccent } : {}),\n ...(sbAccentFg ? { '--sidebar-accent-foreground': sbAccentFg } : {}),\n ...(ch.border ? { '--sidebar-border': ch.border } : {}),\n ...(ch.ring ? { '--sidebar-ring': ch.ring } : {}),\n ...(ch.primary\n ? {\n '--chart-1': ch.primary,\n ...(ch.ring ? { '--chart-2': ch.ring } : {}),\n ...(ch.accent ? { '--chart-3': ch.accent } : {}),\n ...(ch.secondary ? { '--chart-4': ch.secondary } : {}),\n ...(ch.muted ? { '--chart-5': ch.muted } : {}),\n }\n : {}),\n })\n\n return out\n}\n\n/**\n * Same as {@link tokenSetToDeclarations} but keeps sidebar + chart tokens aligned with\n * `packages/shared-ui/src/styles/base.css` (pre–multi-theme workbench look).\n */\nfunction tokenSetToDeclarationsSharedUiBase(\n tokens: ThemeTokenSet,\n mode: 'light' | 'dark',\n): Record<string, string> {\n const ch = {\n bg: hslFunctionalToChannels(tokens['--color-background']),\n fg: hslFunctionalToChannels(tokens['--color-foreground']),\n card: hslFunctionalToChannels(tokens['--color-card']),\n cardFg: hslFunctionalToChannels(tokens['--color-card-foreground']),\n pop: hslFunctionalToChannels(tokens['--color-popover']),\n popFg: hslFunctionalToChannels(tokens['--color-popover-foreground']),\n primary: hslFunctionalToChannels(tokens['--color-primary']),\n priFg: hslFunctionalToChannels(tokens['--color-primary-foreground']),\n secondary: hslFunctionalToChannels(tokens['--color-secondary']),\n secFg: hslFunctionalToChannels(tokens['--color-secondary-foreground']),\n muted: hslFunctionalToChannels(tokens['--color-muted']),\n mutFg: hslFunctionalToChannels(tokens['--color-muted-foreground']),\n accent: hslFunctionalToChannels(tokens['--color-accent']),\n accFg: hslFunctionalToChannels(tokens['--color-accent-foreground']),\n destructive: hslFunctionalToChannels(tokens['--color-destructive']),\n desFg: hslFunctionalToChannels(tokens['--color-destructive-foreground']),\n border: hslFunctionalToChannels(tokens['--color-border']),\n input: hslFunctionalToChannels(tokens['--color-input']),\n ring: hslFunctionalToChannels(tokens['--color-ring']),\n }\n const out: Record<string, string> = {\n ...Object.fromEntries(\n (Object.entries(tokens) as [string, string][]).filter(([k]) => k.startsWith('--color')),\n ),\n ...(ch.bg ? { '--background': ch.bg } : {}),\n ...(ch.fg ? { '--foreground': ch.fg } : {}),\n ...(ch.card ? { '--card': ch.card } : {}),\n ...(ch.cardFg ? { '--card-foreground': ch.cardFg } : {}),\n ...(ch.pop ? { '--popover': ch.pop } : {}),\n ...(ch.popFg ? { '--popover-foreground': ch.popFg } : {}),\n ...(ch.primary ? { '--primary': ch.primary } : {}),\n ...(ch.priFg ? { '--primary-foreground': ch.priFg } : {}),\n ...(ch.secondary ? { '--secondary': ch.secondary } : {}),\n ...(ch.secFg ? { '--secondary-foreground': ch.secFg } : {}),\n ...(ch.muted ? { '--muted': ch.muted } : {}),\n ...(ch.mutFg ? { '--muted-foreground': ch.mutFg } : {}),\n ...(ch.accent ? { '--accent': ch.accent } : {}),\n ...(ch.accFg ? { '--accent-foreground': ch.accFg } : {}),\n ...(ch.destructive ? { '--destructive': ch.destructive } : {}),\n ...(ch.desFg ? { '--destructive-foreground': ch.desFg } : {}),\n ...(ch.border ? { '--border': ch.border } : {}),\n ...(ch.input ? { '--input': ch.input } : {}),\n ...(ch.ring ? { '--ring': ch.ring } : {}),\n '--radius': tokens['--radius'],\n }\n\n if (mode === 'light') {\n Object.assign(out, {\n '--sidebar-background': '0 0% 98%',\n '--sidebar-foreground': '0 0% 9%',\n '--sidebar-primary': '0 0% 9%',\n '--sidebar-primary-foreground': '0 0% 98%',\n '--sidebar-accent': '0 0% 96.1%',\n '--sidebar-accent-foreground': '0 0% 9%',\n '--sidebar-border': '0 0% 89.8%',\n '--sidebar-ring': '0 0% 9%',\n })\n } else {\n Object.assign(out, {\n '--sidebar-background': '0 0% 9%',\n '--sidebar-foreground': '0 0% 98%',\n '--sidebar-primary': '0 0% 98%',\n '--sidebar-primary-foreground': '0 0% 9%',\n '--sidebar-accent': '0 0% 14.9%',\n '--sidebar-accent-foreground': '0 0% 98%',\n '--sidebar-border': '0 0% 14.9%',\n '--sidebar-ring': '0 0% 83.1%',\n })\n }\n\n if (ch.primary) {\n Object.assign(out, {\n '--chart-1': ch.primary,\n ...(ch.ring ? { '--chart-2': ch.ring } : {}),\n ...(ch.accent ? { '--chart-3': ch.accent } : {}),\n ...(ch.secondary ? { '--chart-4': ch.secondary } : {}),\n ...(ch.muted ? { '--chart-5': ch.muted } : {}),\n })\n }\n\n return out\n}\n\nexport function flattenDeclarations(decl: Record<string, string>): string {\n return Object.entries(decl)\n .filter(([, v]) => v != null && v !== '')\n .map(([k, v]) => `${k}: ${v}`)\n .join('; ')\n}\n\n/**\n * Builds CSS for injecting into `#workbench-theme-variables`.\n * Overrides base semantic tokens (`--primary`, ...) and keeps `--color-*` for themed CSS such as inkOnyx.css.\n */\nexport function buildWorkbenchPaletteCss(theme: Theme): string {\n if (theme.id === classicTheme.id) {\n const light = flattenDeclarations(\n tokenSetToDeclarationsSharedUiBase(theme.tokens.light, 'light'),\n )\n const dark = flattenDeclarations(tokenSetToDeclarationsSharedUiBase(theme.tokens.dark, 'dark'))\n return `:root { ${light} }\\n:root.dark { ${dark} }\\n.dark { ${dark} }\\n`\n }\n const light = flattenDeclarations(tokenSetToDeclarations(theme.tokens.light))\n const dark = flattenDeclarations(tokenSetToDeclarations(theme.tokens.dark))\n return `:root { ${light} }\\n:root.dark { ${dark} }\\n.dark { ${dark} }\\n`\n}\n\nexport function listRegisteredThemes(themeMap: Record<string, Theme>): Theme[] {\n return Object.values(themeMap)\n}\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react'\nimport { themes, ThemeId, defaultThemeId, resolveThemeId } from '@/themes'\nimport type { Theme } from '@/themes'\nimport { buildWorkbenchPaletteCss } from '@/lib/theme/themeUtils'\nimport { toast } from '@genispace/shared-ui'\nimport { tabIsolation } from '@/utils/tabIsolation'\nimport inkOnyxCss from '@/themes/inkOnyx.css?inline'\n\nconst STYLE_EL_ID = 'workbench-theme-variables'\nconst STORAGE_PREFIX = 'workbench-theme-preferences:'\n\ninterface WorkbenchThemeContextValue {\n themeId: ThemeId\n setThemeId: (id: ThemeId) => Promise<void>\n theme: Theme\n isDark: boolean\n}\n\nconst WorkbenchThemeContext = createContext<WorkbenchThemeContextValue | null>(null)\n\nfunction readLocalThemePreference(workbenchId: string | undefined): ThemeId | undefined {\n if (!workbenchId) return undefined\n try {\n const raw = tabIsolation.getItem(`${STORAGE_PREFIX}${workbenchId}`)\n return raw ? resolveThemeId(raw) : undefined\n } catch {\n return undefined\n }\n}\n\nfunction writeLocalThemePreference(workbenchId: string | undefined, id: ThemeId) {\n if (!workbenchId) return\n try {\n tabIsolation.setItem(`${STORAGE_PREFIX}${workbenchId}`, id)\n } catch {\n /* ignore quota */\n }\n}\n\n/** Observes `.dark` on `<html>` (shared-ui color scheme toggle). */\nfunction useWorkbenchHtmlDarkPreference(): boolean {\n const [isDark, setIsDark] = useState(() =>\n typeof document !== 'undefined' ? document.documentElement.classList.contains('dark') : false,\n )\n\n useEffect(() => {\n const el = document.documentElement\n const sync = () => setIsDark(el.classList.contains('dark'))\n sync()\n const observer = new MutationObserver(sync)\n observer.observe(el, { attributes: true, attributeFilter: ['class'] })\n return () => observer.disconnect()\n }, [])\n\n return isDark\n}\n\nexport interface WorkbenchThemeProviderProps {\n children: ReactNode\n workbenchId?: string\n serverThemeId?: string | undefined\n /**\n * Persist theme into `Workbench.config` (merge `{ ...config, themeId }`).\n * When omitted, viewers prefer locally saved preferences before server defaults.\n */\n onPersistTheme?: (themeId: ThemeId) => Promise<void>\n}\n\nexport function WorkbenchThemeProvider({\n children,\n workbenchId,\n serverThemeId,\n onPersistTheme,\n}: WorkbenchThemeProviderProps) {\n const persistEnabled = typeof onPersistTheme === 'function'\n const isDarkPref = useWorkbenchHtmlDarkPreference()\n\n const [themeId, setThemeIdState] = useState<ThemeId>(defaultThemeId)\n\n /** Resolve theme when navigating workbenches or when server pushes `themeId`. */\n useEffect(() => {\n const fromServer =\n typeof serverThemeId === 'string' && serverThemeId.trim() !== ''\n ? resolveThemeId(serverThemeId)\n : undefined\n const fromLocal = readLocalThemePreference(workbenchId)\n\n const next = persistEnabled\n ? resolveThemeId(fromServer ?? fromLocal ?? defaultThemeId)\n : resolveThemeId(fromLocal ?? fromServer ?? defaultThemeId)\n\n setThemeIdState(next)\n writeLocalThemePreference(workbenchId, next)\n }, [serverThemeId, workbenchId, persistEnabled])\n\n const resolvedThemeId = resolveThemeId(themeId)\n const theme = themes[resolvedThemeId] ?? themes[defaultThemeId]\n\n useEffect(() => {\n document.documentElement.setAttribute('data-workbench-appearance', resolvedThemeId)\n return () => {\n document.documentElement.removeAttribute('data-workbench-appearance')\n }\n }, [resolvedThemeId])\n\n useEffect(() => {\n const palette = themes[resolvedThemeId] ?? themes[defaultThemeId]\n let styleEl = document.getElementById(STYLE_EL_ID) as HTMLStyleElement | null\n if (!styleEl) {\n styleEl = document.createElement('style')\n styleEl.id = STYLE_EL_ID\n document.head.appendChild(styleEl)\n }\n styleEl.textContent = buildWorkbenchPaletteCss(palette)\n\n return () => {\n const existing = document.getElementById(STYLE_EL_ID)\n existing?.parentNode?.removeChild(existing)\n }\n }, [resolvedThemeId])\n\n useEffect(() => {\n const INK_ONYX_CSS_ID = 'inkOnyx-theme-css'\n const isInkOnyx = resolvedThemeId === 'inkOnyx'\n\n if (isInkOnyx) {\n let styleEl = document.getElementById(INK_ONYX_CSS_ID) as HTMLStyleElement | null\n if (!styleEl) {\n styleEl = document.createElement('style')\n styleEl.id = INK_ONYX_CSS_ID\n styleEl.textContent = inkOnyxCss\n document.head.appendChild(styleEl)\n }\n } else {\n const existing = document.getElementById(INK_ONYX_CSS_ID)\n existing?.parentNode?.removeChild(existing)\n }\n\n return () => {\n const existing = document.getElementById(INK_ONYX_CSS_ID)\n existing?.parentNode?.removeChild(existing)\n }\n }, [resolvedThemeId])\n\n useEffect(() => {\n document.documentElement.setAttribute('data-theme', resolvedThemeId)\n return () => document.documentElement.removeAttribute('data-theme')\n }, [resolvedThemeId])\n\n const setThemeId = useCallback(\n async (nextRaw: ThemeId) => {\n const next = resolveThemeId(nextRaw)\n setThemeIdState(next)\n writeLocalThemePreference(workbenchId, next)\n\n if (onPersistTheme) {\n try {\n await onPersistTheme(next)\n } catch (e: unknown) {\n console.warn('[WorkbenchTheme] persist theme failed', e)\n const message =\n typeof e === 'object' &&\n e &&\n 'response' in e &&\n (e as { response?: { data?: { message?: string } } }).response?.data?.message\n\n toast({\n variant: 'destructive',\n title: 'Theme',\n description:\n typeof message === 'string'\n ? message\n : 'Could not save theme to the server. Preference kept locally for this browser.',\n })\n }\n }\n },\n [onPersistTheme, workbenchId],\n )\n\n const value = useMemo(\n (): WorkbenchThemeContextValue => ({\n themeId: resolvedThemeId,\n setThemeId,\n theme,\n isDark: isDarkPref,\n }),\n [resolvedThemeId, setThemeId, theme, isDarkPref],\n )\n\n return <WorkbenchThemeContext.Provider value={value}>{children}</WorkbenchThemeContext.Provider>\n}\n\n/** Appearance package (`classic` / `inkOnyx`, …); unrelated to `@genispace/shared-ui` light/dark controls. */\nexport function useWorkbenchTheme(): WorkbenchThemeContextValue {\n const ctx = useContext(WorkbenchThemeContext)\n if (!ctx) {\n throw new Error('useWorkbenchTheme must be used within WorkbenchThemeProvider')\n }\n return ctx\n}\n","import { useEffect, useLayoutEffect, useMemo, type ReactNode } from 'react';\nimport { I18nextProvider } from 'react-i18next';\nimport type { i18n as I18nInstance } from 'i18next';\nimport { configureGeniAppHostAdapters } from '../adapters/host';\nimport type { GeniAppHostAdapters } from '../types/host-adapters';\nimport { WorkbenchConfigLocaleProvider } from '../contexts/WorkbenchConfigLocaleContext';\nimport { WorkbenchThemeProvider } from '../contexts/WorkbenchThemeContext';\nimport { ViewportProvider } from '../contexts/ViewportContext';\nimport { PageFullscreenProvider } from '../contexts/PageFullscreenContext';\nimport { MobileFlowLayoutProvider } from '../mobile/mobileFlowLayoutContext';\nimport { createGeniAppI18n, normalizeGeniAppLocale } from './i18n';\nimport { useViewport } from '../contexts/ViewportContext';\n\nconst useIsomorphicLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\nexport interface GeniAppComponentProviderProps {\n children: ReactNode;\n adapters?: GeniAppHostAdapters;\n locale?: string;\n i18n?: I18nInstance;\n localeMetadata?: Record<string, unknown>;\n applicationId?: string;\n themeId?: string;\n /** Override the detected Workbench viewport. Omit for automatic mobile/desktop behavior. */\n mobile?: boolean;\n fullscreen?: boolean;\n /** Set false when the host already owns the document-level Workbench appearance. */\n provideAppearance?: boolean;\n}\n\nfunction RuntimeContexts({\n children,\n mobile,\n fullscreen,\n}: Pick<GeniAppComponentProviderProps, 'children' | 'mobile' | 'fullscreen'>) {\n const viewport = useViewport();\n return (\n <MobileFlowLayoutProvider value={mobile ?? viewport.isMobile}>\n <PageFullscreenProvider value={fullscreen ?? false}>\n {children}\n </PageFullscreenProvider>\n </MobileFlowLayoutProvider>\n );\n}\n\n/**\n * Runtime boundary shared by Workbench view mode and standalone GeniApps.\n * It provides the exact locale, appearance, viewport and platform adapter\n * contexts consumed by the public renderer tree.\n */\nexport function GeniAppComponentProvider({\n children,\n adapters = {},\n locale = 'en',\n i18n,\n localeMetadata,\n applicationId,\n themeId,\n mobile,\n fullscreen = false,\n provideAppearance = true,\n}: GeniAppComponentProviderProps) {\n const ownedI18n = useMemo(() => i18n ?? createGeniAppI18n(locale), [i18n]);\n\n useIsomorphicLayoutEffect(\n () => configureGeniAppHostAdapters(adapters),\n [adapters],\n );\n\n useEffect(() => {\n const nextLocale = normalizeGeniAppLocale(locale);\n if (ownedI18n.language !== nextLocale) void ownedI18n.changeLanguage(nextLocale);\n }, [locale, ownedI18n]);\n\n const localizedRuntime = (\n <WorkbenchConfigLocaleProvider metadata={localeMetadata as never}>\n <RuntimeContexts mobile={mobile} fullscreen={fullscreen}>\n {children}\n </RuntimeContexts>\n </WorkbenchConfigLocaleProvider>\n );\n\n return (\n <I18nextProvider i18n={ownedI18n}>\n <ViewportProvider>\n {provideAppearance ? (\n <WorkbenchThemeProvider\n workbenchId={applicationId}\n serverThemeId={themeId}\n >\n {localizedRuntime}\n </WorkbenchThemeProvider>\n ) : localizedRuntime}\n </ViewportProvider>\n </I18nextProvider>\n );\n}\n","import type { NavigationItem } from '@/types';\nimport {\n filterNavigationItemsForMember,\n getNavigationTargetPageId,\n} from '@/utils/navigationUtils';\nimport { resolveBilingualText } from '@/utils/workbenchDisplayLocale';\nimport type { VisibleWhenContext } from '@/utils/visibleWhen';\n\nexport interface MobileBottomNavTab {\n key: string;\n label: string;\n icon?: string;\n pageId: string;\n pageParameters?: Record<string, unknown>;\n}\n\nexport function resolveTabPageId(item: NavigationItem): string | null {\n if (typeof item.linkedPage === 'string' && item.linkedPage.trim() !== '') {\n return item.linkedPage;\n }\n\n if (item.children?.length) {\n for (const child of item.children) {\n const childPageId = resolveTabPageId(child);\n if (childPageId) {\n return childPageId;\n }\n }\n return null;\n }\n\n return getNavigationTargetPageId(item);\n}\n\nexport function resolveMobileBottomNavTabs(\n items: NavigationItem[] | undefined | null,\n currentMemberId?: string | null,\n language = 'zh',\n visibleWhenContext?: VisibleWhenContext\n): MobileBottomNavTab[] {\n if (!items?.length) {\n return [];\n }\n\n const visibleItems = filterNavigationItemsForMember(items, currentMemberId, 'mobile', visibleWhenContext);\n\n return visibleItems.reduce<MobileBottomNavTab[]>((tabs, item) => {\n const pageId = resolveTabPageId(item);\n if (!pageId) {\n return tabs;\n }\n\n tabs.push({\n key: item.key,\n label: resolveBilingualText(item.title, language),\n icon: item.icon,\n pageId,\n pageParameters: item.pageParameters,\n });\n\n return tabs;\n }, []);\n}\n\nfunction collectPageIdsForTab(\n item: NavigationItem,\n pageIds: Set<string>\n): void {\n const pageId = getNavigationTargetPageId(item);\n if (pageId) {\n pageIds.add(pageId);\n }\n item.children?.forEach((child) => collectPageIdsForTab(child, pageIds));\n}\n\nexport function isMobileBottomNavTabActive(\n tab: MobileBottomNavTab,\n currentPageId: string | undefined,\n navigationItems: NavigationItem[] | undefined | null\n): boolean {\n if (!currentPageId) {\n return false;\n }\n\n if (tab.pageId === currentPageId) {\n return true;\n }\n\n const rootItem = navigationItems?.find((item) => item.key === tab.key);\n if (!rootItem) {\n return false;\n }\n\n const pageIds = new Set<string>();\n collectPageIdsForTab(rootItem, pageIds);\n return pageIds.has(currentPageId);\n}\n","import { useCallback, useEffect, useMemo, type ReactNode } from 'react';\nimport { Globe2, Moon, PanelsTopLeft, Sun } from 'lucide-react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\nimport { AppSidebar } from '../../ui/components/features/app/Sidebar';\nimport { cn } from '../../utils/utils/cn';\nimport { setTheme } from '../../utils/cookieSettings';\nimport { GeniAppShellBridge } from '../../shell';\nimport { MultiPageRenderer } from './MultiPageRenderer';\nimport { renderLucideIcon } from '../utils/iconUtils';\nimport {\n filterNavigationItemsForMember,\n getNavigationTargetPageId,\n resolveDefaultWorkbenchLanding,\n serializeWorkbenchUrlSearchParams,\n} from '../utils/navigationUtils';\nimport { resolveMobileBottomNavTabs } from '../mobile/utils/mobileBottomNav';\nimport { ParameterUtils } from '../utils/parameterUtils';\nimport { useWorkbenchConfigLocale } from '../contexts/WorkbenchConfigLocaleContext';\nimport { useViewport } from '../contexts/ViewportContext';\nimport { useCurrentUser } from '../hooks/useCurrentUser';\nimport { useVisibleWhenContext } from '../hooks/useVisibleWhenContext';\nimport type { WorkbenchConfig } from '../types/components';\nimport type { NavigationItem } from '../types';\n\nexport interface GeniAppWorkbenchConfig extends WorkbenchConfig {\n name?: string;\n description?: string;\n geniappRuntime?: {\n datasourceIdentifiers?: Record<string, string>;\n };\n}\n\nexport interface GeniAppWorkbenchProps {\n identifier: string;\n config: GeniAppWorkbenchConfig;\n name?: string;\n allowedShellOrigins?: string[];\n headerIcon?: ReactNode;\n showRuntimeControls?: boolean;\n}\n\nfunction parsePageParams(search: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n new URLSearchParams(search).forEach((value, key) => {\n result[key] = ParameterUtils.inferParameterType(value);\n });\n return result;\n}\n\nfunction pathnamePageId(pathname: string, pages: Record<string, unknown>): string | null {\n const segments = pathname.split('/').filter(Boolean);\n for (let index = segments.length - 1; index >= 0; index -= 1) {\n const candidate = decodeURIComponent(segments[index]);\n if (pages[candidate]) return candidate;\n }\n return null;\n}\n\nfunction navigationPath(identifier: string, pageId: string, params: Record<string, unknown> = {}): string {\n const query = serializeWorkbenchUrlSearchParams(params);\n return `/${encodeURIComponent(identifier)}/${encodeURIComponent(pageId)}${query ? `?${query}` : ''}`;\n}\n\nfunction NavigationRows({\n items,\n activePageId,\n collapsed,\n depth = 0,\n onNavigate,\n resolveTitle,\n}: {\n items: NavigationItem[];\n activePageId: string;\n collapsed: boolean;\n depth?: number;\n onNavigate: (item: NavigationItem) => void;\n resolveTitle: (value: unknown) => string;\n}) {\n return (\n <div className={depth === 0 ? 'space-y-1' : 'mt-1 space-y-1'}>\n {items.map((item) => {\n const targetPageId = getNavigationTargetPageId(item);\n const isNavigable = Boolean(targetPageId && (!item.children?.length || item.linkedPage));\n const active = targetPageId === activePageId;\n const title = resolveTitle(item.title);\n return (\n <div key={item.key}>\n <button\n type=\"button\"\n title={collapsed ? title : undefined}\n disabled={!isNavigable}\n onClick={() => isNavigable && onNavigate(item)}\n className={cn(\n 'flex min-h-10 w-full items-center rounded-lg text-sm font-medium transition-colors',\n collapsed ? 'justify-center px-2' : 'gap-3 px-3 text-left',\n active\n ? 'bg-primary text-primary-foreground'\n : isNavigable\n ? 'text-muted-foreground hover:bg-accent hover:text-accent-foreground'\n : 'cursor-default text-muted-foreground',\n )}\n style={!collapsed && depth > 0 ? { paddingLeft: `${12 + depth * 16}px` } : undefined}\n aria-current={active ? 'page' : undefined}\n >\n <span className=\"shrink-0\">\n {renderLucideIcon(item.icon || (item.children?.length ? 'folder' : 'layout-grid'), 'h-4 w-4')}\n </span>\n {!collapsed && <span className=\"min-w-0 truncate\">{title}</span>}\n </button>\n {!collapsed && item.children?.length ? (\n <NavigationRows\n items={item.children}\n activePageId={activePageId}\n collapsed={false}\n depth={depth + 1}\n onNavigate={onNavigate}\n resolveTitle={resolveTitle}\n />\n ) : null}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction RuntimeControls() {\n const { i18n } = useTranslation();\n const isDark = typeof document !== 'undefined' && document.documentElement.classList.contains('dark');\n const switchLanguage = () => {\n const next = i18n.language.startsWith('zh') ? 'en' : 'zh';\n localStorage.setItem('i18nextLng', next);\n void i18n.changeLanguage(next);\n };\n const switchTheme = () => setTheme(isDark ? 'light' : 'dark');\n\n return (\n <div className=\"space-y-1\">\n <button\n type=\"button\"\n onClick={switchLanguage}\n className=\"flex min-h-10 w-full items-center gap-3 rounded-lg px-3 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground\"\n >\n <Globe2 className=\"h-4 w-4\" />\n <span>{i18n.language.startsWith('zh') ? 'English' : '中文'}</span>\n </button>\n <button\n type=\"button\"\n onClick={switchTheme}\n className=\"flex min-h-10 w-full items-center gap-3 rounded-lg px-3 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground\"\n >\n {isDark ? <Sun className=\"h-4 w-4\" /> : <Moon className=\"h-4 w-4\" />}\n <span>{isDark ? 'Light' : 'Dark'}</span>\n </button>\n </div>\n );\n}\n\nfunction MobileNavigation({\n items,\n activePageId,\n onNavigate,\n}: {\n items: NavigationItem[];\n activePageId: string;\n onNavigate: (pageId: string, key: string, params?: Record<string, unknown>) => void;\n}) {\n const { language } = useWorkbenchConfigLocale();\n const tabs = useMemo(() => resolveMobileBottomNavTabs(items, null, language), [items, language]);\n if (tabs.length === 0) return null;\n\n return (\n <nav\n aria-label=\"Application bottom navigation\"\n className=\"workbench-bottom-tab-nav relative shrink-0 border-t border-neutral-200/80 bg-white pt-2 dark:border-neutral-700/80 dark:bg-neutral-950\"\n style={{ paddingBottom: 'max(env(safe-area-inset-bottom, 0px), 0.75rem)' }}\n >\n <div className=\"flex h-14 items-stretch\">\n {tabs.map((tab) => {\n const active = tab.pageId === activePageId;\n return (\n <button\n key={tab.key}\n type=\"button\"\n aria-label={tab.label}\n aria-current={active ? 'page' : undefined}\n onClick={() => onNavigate(tab.pageId, tab.key, tab.pageParameters)}\n className={cn(\n 'flex min-w-0 flex-1 flex-col items-center justify-center gap-0.5 px-1 py-1 transition-colors duration-200',\n active ? 'text-indigo-600 dark:text-indigo-400' : 'text-slate-400 dark:text-neutral-400',\n )}\n >\n {tab.icon ? renderLucideIcon(tab.icon, 'h-7 w-7 shrink-0') : null}\n <span className=\"w-full truncate px-0.5 text-center text-[11px] font-medium\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n </nav>\n );\n}\n\n/** Complete routed shell for a downloaded Workbench GeniApp. */\nexport function GeniAppWorkbench({\n identifier,\n config,\n name,\n allowedShellOrigins,\n headerIcon,\n showRuntimeControls = true,\n}: GeniAppWorkbenchProps) {\n const location = useLocation();\n const navigate = useNavigate();\n const viewport = useViewport();\n const { currentUser } = useCurrentUser();\n const visibleWhenContext = useVisibleWhenContext(parsePageParams(location.search));\n const { localizeAppConfig, resolveBilingualText } = useWorkbenchConfigLocale();\n const pages = config.pages ?? {};\n const localizedAppConfig = localizeAppConfig(config.appConfig as unknown as Record<string, unknown>) as unknown as WorkbenchConfig['appConfig'];\n const navigationItems = localizedAppConfig?.navigation?.items ?? [];\n const visibleNavigation = useMemo(\n () => filterNavigationItemsForMember(\n navigationItems,\n currentUser?.id,\n viewport.isMobile ? 'mobile' : 'desktop',\n visibleWhenContext,\n ),\n [currentUser?.id, navigationItems, viewport.isMobile, visibleWhenContext],\n );\n\n const landing = useMemo(\n () => resolveDefaultWorkbenchLanding(localizedAppConfig, pages, currentUser?.id, { visibleWhenContext }),\n [currentUser?.id, localizedAppConfig, pages, visibleWhenContext],\n );\n const activePageId = pathnamePageId(location.pathname, pages)\n ?? landing?.pageId\n ?? Object.keys(pages)[0]\n ?? '';\n\n const goToPage = useCallback((pageId: string, params: Record<string, unknown> = {}) => {\n if (!pages[pageId]) return;\n navigate(navigationPath(identifier, pageId, params));\n }, [identifier, navigate, pages]);\n\n const goToItem = useCallback((item: NavigationItem) => {\n const pageId = getNavigationTargetPageId(item);\n if (!pageId) return;\n goToPage(pageId, { ...(item.pageParameters ?? {}), _nav: item.key });\n }, [goToPage]);\n\n useEffect(() => {\n if (pathnamePageId(location.pathname, pages) || !activePageId) return;\n navigate(navigationPath(identifier, activePageId, landing ? parsePageParams(landing.queryString) : {}), { replace: true });\n }, [activePageId, identifier, landing, location.pathname, navigate, pages]);\n\n useEffect(() => {\n const openPage = (event: Event) => {\n const detail = (event as CustomEvent<Record<string, unknown>>).detail ?? {};\n const pageId = typeof detail.pageId === 'string' ? detail.pageId : '';\n const params = detail.urlParams && typeof detail.urlParams === 'object'\n ? detail.urlParams as Record<string, unknown>\n : {};\n goToPage(pageId, params);\n };\n window.addEventListener('workbench-open-tab', openPage);\n return () => window.removeEventListener('workbench-open-tab', openPage);\n }, [goToPage]);\n\n const pageConfig = pages[activePageId];\n const tab = pageConfig ? [{\n id: `${activePageId}:${location.search}`,\n pageId: activePageId,\n title: pageConfig.title,\n isActive: true,\n pageConfig,\n isLoading: false,\n urlParams: parsePageParams(location.search),\n }] : [];\n const appName = name || config.name || localizedAppConfig?.appId || identifier;\n const content = (\n <div className=\"h-dvh min-h-0 w-full overflow-hidden bg-neutral-50 dark:bg-neutral-950\">\n <MultiPageRenderer tabs={tab} activeTabId={tab[0]?.id ?? null} appConfig={localizedAppConfig} />\n </div>\n );\n\n return (\n <>\n <GeniAppShellBridge identifier={identifier} allowedShellOrigins={allowedShellOrigins} />\n {viewport.isMobile ? (\n <div className=\"flex h-dvh min-h-0 flex-col overflow-hidden bg-neutral-50 dark:bg-neutral-950\">\n <div className=\"min-h-0 flex-1\">{content}</div>\n <MobileNavigation\n items={visibleNavigation}\n activePageId={activePageId}\n onNavigate={(pageId, key, params) => goToPage(pageId, { ...(params ?? {}), _nav: key })}\n />\n </div>\n ) : (\n <AppSidebar\n collapsible\n storageKey={`${identifier}:sidebar-collapsed`}\n navAriaLabel=\"Application navigation\"\n sidebarHeader={(collapsed) => (\n <div className={cn('flex min-w-0 items-center', collapsed ? 'justify-center' : 'gap-3')}>\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center overflow-hidden rounded-xl bg-primary text-primary-foreground\">\n {headerIcon ?? (localizedAppConfig?.logo\n ? <img src={localizedAppConfig.logo} alt=\"\" className=\"h-full w-full object-cover\" />\n : <PanelsTopLeft className=\"h-5 w-5\" />)}\n </span>\n {!collapsed && <span className=\"truncate text-sm font-semibold text-foreground\">{appName}</span>}\n </div>\n )}\n sidebarNav={(collapsed) => (\n <NavigationRows\n items={visibleNavigation}\n activePageId={activePageId}\n collapsed={collapsed}\n onNavigate={goToItem}\n resolveTitle={resolveBilingualText}\n />\n )}\n sidebarFooter={showRuntimeControls ? (collapsed) => collapsed ? null : <RuntimeControls /> : undefined}\n >\n {content}\n </AppSidebar>\n )}\n </>\n );\n}\n","import { createResolveApiRoot } from '../../hooks/shell/resolveApiRoot';\nimport type {\n GeniAppHostAdapters,\n GeniAppHostRequest,\n GeniAppHostResponse,\n} from '../types/host-adapters';\n\nexport interface CreatePlatformHostAdaptersOptions {\n apiRoot?: string | (() => string);\n tokenStorageKey?: string;\n languageStorageKey?: string;\n applicationIdentifier?: string;\n /** Source datasource UUID -> installed managed datasource identifier. */\n datasourceIdentifiers?: Record<string, string>;\n}\n\nconst isAbsoluteUrl = (value: string) => /^https?:\\/\\//iu.test(value);\n\nfunction joinApiUrl(root: string, path: string): string {\n if (isAbsoluteUrl(path)) return path;\n const normalizedRoot = root.replace(/\\/$/u, '');\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n return `${normalizedRoot}${normalizedPath}`;\n}\n\nfunction appendParams(url: string, params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) return url;\n const parsed = new URL(url, typeof window === 'undefined' ? 'http://localhost' : window.location.origin);\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null) return;\n parsed.searchParams.append(key, String(value));\n });\n return isAbsoluteUrl(url) ? parsed.toString() : `${parsed.pathname}${parsed.search}${parsed.hash}`;\n}\n\nfunction readStorage(storage: Storage | undefined, key: string): string | null {\n try {\n return storage?.getItem(key) ?? null;\n } catch {\n return null;\n }\n}\n\nfunction responseError(\n response: Response,\n payload: unknown,\n): Error & { code: number; response: { status: number; data: unknown } } {\n const record = payload && typeof payload === 'object' ? payload as Record<string, unknown> : undefined;\n const message = typeof record?.message === 'string'\n ? record.message\n : typeof payload === 'string' && payload.trim()\n ? payload\n : response.statusText || `HTTP ${response.status}`;\n return Object.assign(new Error(message), {\n code: response.status,\n response: { status: response.status, data: payload },\n });\n}\n\n/**\n * Default browser adapter for an installed GeniApp. It consumes the API root and\n * access token injected by the platform shell and keeps renderer transport out of\n * the generated application's source tree.\n */\nexport function createPlatformHostAdapters(\n options: CreatePlatformHostAdaptersOptions = {},\n): GeniAppHostAdapters {\n const resolveDefaultRoot = createResolveApiRoot();\n const configuredRoot = options.apiRoot;\n const resolveRoot = typeof configuredRoot === 'function'\n ? configuredRoot\n : () => configuredRoot?.trim() || resolveDefaultRoot();\n const tokenStorageKey = options.tokenStorageKey ?? 'token';\n const languageStorageKey = options.languageStorageKey ?? 'i18nextLng';\n const resolvedDatasourceIds = new Map<string, Promise<string>>();\n\n const resolveDatasourceUrl = async (\n rawUrl: string,\n headers: Headers,\n ): Promise<string> => {\n const match = rawUrl.match(/\\/datasources\\/([^/?#]+)(?=\\/|\\?|#|$)/u);\n if (!match || !options.applicationIdentifier) return rawUrl;\n const sourceId = decodeURIComponent(match[1]);\n const datasourceIdentifier = options.datasourceIdentifiers?.[sourceId];\n if (!datasourceIdentifier) return rawUrl;\n\n let resolution = resolvedDatasourceIds.get(sourceId);\n if (!resolution) {\n resolution = (async () => {\n const params = new URLSearchParams({\n applicationIdentifier: options.applicationIdentifier || '',\n datasourceIdentifier,\n });\n const response = await fetch(\n joinApiUrl(resolveRoot(), `/datasources/managed/resolve?${params}`),\n { headers, credentials: 'same-origin' },\n );\n const payload = await response.json() as {\n data?: { datasourceId?: string };\n message?: string;\n };\n const datasourceId = payload.data?.datasourceId;\n if (!response.ok || !datasourceId) throw responseError(response, payload);\n return datasourceId;\n })();\n resolvedDatasourceIds.set(sourceId, resolution);\n }\n\n try {\n const datasourceId = await resolution;\n return rawUrl.replace(match[1], encodeURIComponent(datasourceId));\n } catch (error) {\n resolvedDatasourceIds.delete(sourceId);\n throw error;\n }\n };\n\n const request = async <T = unknown>({\n url,\n method,\n body,\n params,\n headers: suppliedHeaders,\n responseType = 'json',\n signal,\n }: GeniAppHostRequest): Promise<GeniAppHostResponse<T>> => {\n const headers = new Headers(suppliedHeaders);\n const token = typeof localStorage === 'undefined'\n ? null\n : readStorage(localStorage, tokenStorageKey);\n const language = typeof localStorage === 'undefined'\n ? null\n : readStorage(localStorage, languageStorageKey);\n\n if (token && !headers.has('Authorization')) headers.set('Authorization', `Bearer ${token}`);\n if (language && !headers.has('X-Language')) headers.set('X-Language', language);\n const resolvedUrl = await resolveDatasourceUrl(url, headers);\n const finalUrl = appendParams(joinApiUrl(resolveRoot(), resolvedUrl), params);\n\n const isFormData = typeof FormData !== 'undefined' && body instanceof FormData;\n if (body !== undefined && !isFormData && !headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n if (isFormData) headers.delete('Content-Type');\n\n const response = await fetch(finalUrl, {\n method,\n headers,\n signal,\n credentials: 'same-origin',\n body: body === undefined\n ? undefined\n : isFormData || typeof body === 'string' || body instanceof Blob\n ? body as BodyInit\n : JSON.stringify(body),\n });\n\n let payload: unknown;\n if (responseType === 'blob') {\n payload = await response.blob();\n } else if (responseType === 'text') {\n payload = await response.text();\n } else {\n const text = await response.text();\n try {\n payload = text ? JSON.parse(text) : undefined;\n } catch {\n payload = text;\n }\n }\n\n if (!response.ok) throw responseError(response, payload);\n\n if (payload && typeof payload === 'object' && 'success' in payload) {\n return payload as GeniAppHostResponse<T>;\n }\n\n return {\n success: true,\n data: payload as T,\n code: response.status,\n message: response.statusText || 'Success',\n timestamp: new Date().toISOString(),\n };\n };\n\n return {\n request,\n navigate(path, navigationOptions) {\n if (navigationOptions?.replace) window.history.replaceState(navigationOptions.state, '', path);\n else window.history.pushState(navigationOptions?.state, '', path);\n window.dispatchEvent(new PopStateEvent('popstate'));\n },\n storage: typeof localStorage === 'undefined' ? undefined : localStorage,\n };\n}\n"],"names":["classicTheme","inkOnyxTheme","LEGACY_THEME_ID_MAP","themes","defaultThemeId","resolveThemeId","id","mapped","hslFunctionalToChannels","fn","m","tokenSetToDeclarations","tokens","ch","out","k","sbBg","sbFg","sbAccent","sbAccentFg","tokenSetToDeclarationsSharedUiBase","mode","flattenDeclarations","decl","v","buildWorkbenchPaletteCss","theme","light","dark","STYLE_EL_ID","STORAGE_PREFIX","WorkbenchThemeContext","createContext","readLocalThemePreference","workbenchId","raw","tabIsolation","writeLocalThemePreference","useWorkbenchHtmlDarkPreference","isDark","setIsDark","useState","useEffect","el","sync","observer","WorkbenchThemeProvider","children","serverThemeId","onPersistTheme","persistEnabled","isDarkPref","themeId","setThemeIdState","fromServer","fromLocal","next","resolvedThemeId","palette","styleEl","existing","INK_ONYX_CSS_ID","inkOnyxCss","setThemeId","useCallback","nextRaw","e","message","toast","value","useMemo","jsx","useWorkbenchTheme","ctx","useContext","useIsomorphicLayoutEffect","useLayoutEffect","RuntimeContexts","mobile","fullscreen","viewport","useViewport","MobileFlowLayoutProvider","PageFullscreenProvider","GeniAppComponentProvider","adapters","locale","i18n","localeMetadata","applicationId","provideAppearance","ownedI18n","createGeniAppI18n","configureGeniAppHostAdapters","nextLocale","normalizeGeniAppLocale","localizedRuntime","WorkbenchConfigLocaleProvider","I18nextProvider","ViewportProvider","resolveTabPageId","item","child","childPageId","getNavigationTargetPageId","resolveMobileBottomNavTabs","items","currentMemberId","language","visibleWhenContext","filterNavigationItemsForMember","tabs","pageId","resolveBilingualText","parsePageParams","search","result","key","ParameterUtils","pathnamePageId","pathname","pages","segments","index","candidate","navigationPath","identifier","params","query","serializeWorkbenchUrlSearchParams","NavigationRows","activePageId","collapsed","depth","onNavigate","resolveTitle","targetPageId","isNavigable","active","title","jsxs","cn","renderLucideIcon","RuntimeControls","useTranslation","switchLanguage","switchTheme","setTheme","Globe2","Sun","Moon","MobileNavigation","useWorkbenchConfigLocale","tab","GeniAppWorkbench","config","name","allowedShellOrigins","headerIcon","showRuntimeControls","location","useLocation","navigate","useNavigate","currentUser","useCurrentUser","useVisibleWhenContext","localizeAppConfig","localizedAppConfig","navigationItems","visibleNavigation","landing","resolveDefaultWorkbenchLanding","goToPage","goToItem","openPage","event","detail","pageConfig","appName","content","MultiPageRenderer","Fragment","GeniAppShellBridge","AppSidebar","PanelsTopLeft","isAbsoluteUrl","joinApiUrl","root","path","normalizedRoot","normalizedPath","appendParams","url","parsed","readStorage","storage","responseError","response","payload","record","createPlatformHostAdapters","options","resolveDefaultRoot","createResolveApiRoot","configuredRoot","resolveRoot","tokenStorageKey","languageStorageKey","resolvedDatasourceIds","resolveDatasourceUrl","rawUrl","headers","match","sourceId","datasourceIdentifier","resolution","datasourceId","error","method","body","suppliedHeaders","responseType","signal","token","resolvedUrl","finalUrl","isFormData","text","navigationOptions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components.js","sources":["../src/components/themes/classic.ts","../src/components/themes/inkOnyx.ts","../src/components/themes/index.ts","../src/components/lib/theme/themeUtils.ts","../src/components/contexts/WorkbenchThemeContext.tsx","../src/components/runtime/GeniAppComponentProvider.tsx","../src/components/mobile/utils/mobileBottomNav.ts","../src/components/runtime/GeniAppWorkbench.tsx","../src/components/adapters/platform.ts"],"sourcesContent":["/* eslint-disable custom/no-hardcoded-text -- Registered theme catalogue labels (UI uses zh/en helpers). */\n\nimport type { Theme } from './types'\n\n/**\n * Mirrors `packages/shared-ui/src/styles/base.css` semantic tokens.\n * Runtime injection is handled by `buildWorkbenchPaletteCss` (see themeUtils classic branch).\n */\nexport const classicTheme: Theme = {\n id: 'classic',\n name: '经典',\n nameEn: 'Classic',\n preview: 'hsl(217, 91%, 60%)',\n tokens: {\n light: {\n '--color-primary': 'hsl(217, 91%, 60%)',\n '--color-primary-hover': 'hsl(217, 91%, 52%)',\n '--color-primary-foreground': 'hsl(0, 0%, 100%)',\n '--color-secondary': 'hsl(0, 0%, 96.1%)',\n '--color-secondary-foreground': 'hsl(0, 0%, 14.9%)',\n '--color-muted': 'hsl(210, 40%, 96.1%)',\n '--color-muted-foreground': 'hsl(0, 0%, 25.1%)',\n '--color-accent': 'hsl(210, 40%, 96.1%)',\n '--color-accent-foreground': 'hsl(222.2, 47.4%, 11.2%)',\n '--color-destructive': 'hsl(0, 84.2%, 60.2%)',\n '--color-destructive-foreground': 'hsl(0, 0%, 100%)',\n '--color-background': 'hsl(0, 0%, 100%)',\n '--color-foreground': 'hsl(0, 0%, 9%)',\n '--color-card': 'hsl(0, 0%, 100%)',\n '--color-card-foreground': 'hsl(0, 0%, 9%)',\n '--color-popover': 'hsl(0, 0%, 100%)',\n '--color-popover-foreground': 'hsl(0, 0%, 9%)',\n '--color-border': 'hsl(214.3, 31.8%, 91.4%)',\n '--color-input': 'hsl(214.3, 31.8%, 91.4%)',\n '--color-ring': 'hsl(217, 91%, 60%)',\n '--radius': '0.5rem',\n '--shadow-card': '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n '--shadow-dropdown': '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n },\n dark: {\n '--color-primary': 'hsl(0, 0%, 98%)',\n '--color-primary-hover': 'hsl(0, 0%, 90%)',\n '--color-primary-foreground': 'hsl(0, 0%, 9%)',\n '--color-secondary': 'hsl(0, 0%, 14.9%)',\n '--color-secondary-foreground': 'hsl(0, 0%, 98%)',\n '--color-muted': 'hsl(0, 0%, 14.9%)',\n '--color-muted-foreground': 'hsl(0, 0%, 63.9%)',\n '--color-accent': 'hsl(0, 0%, 14.9%)',\n '--color-accent-foreground': 'hsl(0, 0%, 98%)',\n '--color-destructive': 'hsl(0, 84.2%, 60.2%)',\n '--color-destructive-foreground': 'hsl(0, 0%, 100%)',\n '--color-background': 'hsl(0, 0%, 3.9%)',\n '--color-foreground': 'hsl(0, 0%, 98%)',\n '--color-card': 'hsl(0, 0%, 3.9%)',\n '--color-card-foreground': 'hsl(0, 0%, 98%)',\n '--color-popover': 'hsl(0, 0%, 3.9%)',\n '--color-popover-foreground': 'hsl(0, 0%, 98%)',\n '--color-border': 'hsl(0, 0%, 14.9%)',\n '--color-input': 'hsl(0, 0%, 14.9%)',\n '--color-ring': 'hsl(0, 0%, 83.1%)',\n '--radius': '0.5rem',\n '--shadow-card': '0 2px 8px hsla(0, 0%, 0%, 0.35)',\n '--shadow-dropdown': '0 12px 40px hsla(0, 0%, 0%, 0.45)',\n },\n },\n}\n","/* eslint-disable custom/no-hardcoded-text -- Registered theme catalogue labels (UI uses zh/en helpers). */\n\nimport type { Theme } from './types'\n\nexport const inkOnyxTheme: Theme = {\n id: 'inkOnyx',\n name: '墨黑',\n nameEn: 'Ink Onyx',\n preview: '#000000',\n tokens: {\n light: {\n '--color-primary': 'hsl(0, 0%, 0%)',\n '--color-primary-hover': 'hsl(0, 0%, 16%)',\n '--color-primary-foreground': 'hsl(0, 0%, 100%)',\n '--color-secondary': 'hsl(0, 0%, 100%)',\n '--color-secondary-foreground': 'hsl(220, 20%, 12%)',\n '--color-muted': 'hsl(220, 15%, 94%)',\n '--color-muted-foreground': 'hsl(220, 15%, 45%)',\n '--color-accent': 'hsl(220, 15%, 92%)',\n '--color-accent-foreground': 'hsl(0, 0%, 12%)',\n '--color-destructive': 'hsl(350, 80%, 60%)',\n '--color-destructive-foreground': 'hsl(0, 0%, 100%)',\n '--color-background': 'hsl(220, 15%, 96%)',\n '--color-foreground': 'hsl(220, 20%, 12%)',\n '--color-card': 'hsl(0, 0%, 100%)',\n '--color-card-foreground': 'hsl(220, 20%, 12%)',\n '--color-popover': 'hsl(0, 0%, 100%)',\n '--color-popover-foreground': 'hsl(220, 20%, 12%)',\n '--color-border': 'hsl(220, 15%, 88%)',\n '--color-input': 'hsl(220, 15%, 90%)',\n '--color-ring': 'hsl(0, 0%, 0%)',\n '--radius': '0.5rem',\n '--shadow-card': '0 2px 16px hsla(220, 20%, 12%, 0.04)',\n '--shadow-dropdown': '0 8px 32px hsla(220, 20%, 12%, 0.12)',\n },\n dark: {\n '--color-primary': 'hsl(0, 0%, 100%)',\n '--color-primary-hover': 'hsl(0, 0%, 90%)',\n '--color-primary-foreground': 'hsl(0, 0%, 9%)',\n '--color-secondary': 'hsl(220, 20%, 12%)',\n '--color-secondary-foreground': 'hsl(220, 15%, 95%)',\n '--color-muted': 'hsl(220, 15%, 14%)',\n '--color-muted-foreground': 'hsl(220, 15%, 65%)',\n '--color-accent': 'hsl(220, 15%, 16%)',\n '--color-accent-foreground': 'hsl(220, 15%, 95%)',\n '--color-destructive': 'hsl(350, 60%, 50%)',\n '--color-destructive-foreground': 'hsl(0, 0%, 100%)',\n '--color-background': 'hsl(220, 15%, 6%)',\n '--color-foreground': 'hsl(220, 15%, 95%)',\n '--color-card': 'hsl(220, 20%, 10%)',\n '--color-card-foreground': 'hsl(220, 15%, 95%)',\n '--color-popover': 'hsl(220, 20%, 10%)',\n '--color-popover-foreground': 'hsl(220, 15%, 95%)',\n '--color-border': 'hsl(220, 15%, 20%)',\n '--color-input': 'hsl(220, 15%, 20%)',\n '--color-ring': 'hsl(0, 0%, 98%)',\n '--radius': '0.5rem',\n '--shadow-card': '0 2px 16px hsla(220, 20%, 12%, 0.2)',\n '--shadow-dropdown': '0 8px 32px hsla(220, 20%, 12%, 0.3)',\n },\n },\n}\n","import type { Theme } from './types'\nimport { classicTheme } from './classic'\nimport { inkOnyxTheme } from './inkOnyx'\n\n/** @deprecated Use `inkOnyxTheme`. */\nexport const financeTheme = inkOnyxTheme\n\nexport { classicTheme, inkOnyxTheme }\nexport type { Theme, ThemeTokenSet, ThemeTokens } from './types'\n\nconst LEGACY_THEME_ID_MAP: Record<string, string> = {\n /** Persisted before canonical id `inkOnyx`. */\n finance: inkOnyxTheme.id,\n}\n\nexport const themes: Record<string, Theme> = {\n [classicTheme.id]: classicTheme,\n [inkOnyxTheme.id]: inkOnyxTheme,\n}\n\nexport type ThemeId = string\n\nexport const defaultThemeId: ThemeId = classicTheme.id\n\n/** Normalize server/local persisted `themeId` (maps deprecated keys to the built-in registry). */\nexport function resolveThemeId(id: string | undefined | null): ThemeId {\n if (!id || id.trim() === '') return defaultThemeId\n const mapped = LEGACY_THEME_ID_MAP[id] ?? id\n return themes[mapped] ? mapped : defaultThemeId\n}\n\n/** Mirrors spec `GET /api/themes`; runs fully client-side against the built-in registry. */\nexport function listRegisteredThemes(): Theme[] {\n return Object.values(themes)\n}\n","import type { Theme, ThemeTokenSet } from '@/themes'\nimport { classicTheme } from '@/themes/classic'\n\n/**\n * Parses `hsl(h, s%, l%)` / `hsl(h s l)` into Tailwind-compatible channel triplets `\"h s l\"`.\n */\nexport function hslFunctionalToChannels(fn: string): string | null {\n const trimmed = fn.trim()\n const m = trimmed.match(\n /^hsl\\(\\s*([\\d.]+)\\s*(?:[,]\\s*|\\s+)([\\d.]+%)\\s*(?:[,]\\s*|\\s+)([\\d.]+%)\\s*\\)$/i,\n )\n if (!m) return null\n return `${m[1]} ${m[2]} ${m[3]}`.replace(/,/g, '').trim()\n}\n\nfunction tokenSetToDeclarations(tokens: ThemeTokenSet): Record<string, string> {\n const ch = {\n bg: hslFunctionalToChannels(tokens['--color-background']),\n fg: hslFunctionalToChannels(tokens['--color-foreground']),\n card: hslFunctionalToChannels(tokens['--color-card']),\n cardFg: hslFunctionalToChannels(tokens['--color-card-foreground']),\n pop: hslFunctionalToChannels(tokens['--color-popover']),\n popFg: hslFunctionalToChannels(tokens['--color-popover-foreground']),\n primary: hslFunctionalToChannels(tokens['--color-primary']),\n priFg: hslFunctionalToChannels(tokens['--color-primary-foreground']),\n secondary: hslFunctionalToChannels(tokens['--color-secondary']),\n secFg: hslFunctionalToChannels(tokens['--color-secondary-foreground']),\n muted: hslFunctionalToChannels(tokens['--color-muted']),\n mutFg: hslFunctionalToChannels(tokens['--color-muted-foreground']),\n accent: hslFunctionalToChannels(tokens['--color-accent']),\n accFg: hslFunctionalToChannels(tokens['--color-accent-foreground']),\n destructive: hslFunctionalToChannels(tokens['--color-destructive']),\n desFg: hslFunctionalToChannels(tokens['--color-destructive-foreground']),\n border: hslFunctionalToChannels(tokens['--color-border']),\n input: hslFunctionalToChannels(tokens['--color-input']),\n ring: hslFunctionalToChannels(tokens['--color-ring']),\n }\n const out: Record<string, string> = {\n ...Object.fromEntries(\n (Object.entries(tokens) as [string, string][]).filter(([k]) => k.startsWith('--color')),\n ),\n ...(ch.bg ? { '--background': ch.bg } : {}),\n ...(ch.fg ? { '--foreground': ch.fg } : {}),\n ...(ch.card ? { '--card': ch.card } : {}),\n ...(ch.cardFg ? { '--card-foreground': ch.cardFg } : {}),\n ...(ch.pop ? { '--popover': ch.pop } : {}),\n ...(ch.popFg ? { '--popover-foreground': ch.popFg } : {}),\n ...(ch.primary ? { '--primary': ch.primary } : {}),\n ...(ch.priFg ? { '--primary-foreground': ch.priFg } : {}),\n ...(ch.secondary ? { '--secondary': ch.secondary } : {}),\n ...(ch.secFg ? { '--secondary-foreground': ch.secFg } : {}),\n ...(ch.muted ? { '--muted': ch.muted } : {}),\n ...(ch.mutFg ? { '--muted-foreground': ch.mutFg } : {}),\n ...(ch.accent ? { '--accent': ch.accent } : {}),\n ...(ch.accFg ? { '--accent-foreground': ch.accFg } : {}),\n ...(ch.destructive ? { '--destructive': ch.destructive } : {}),\n ...(ch.desFg ? { '--destructive-foreground': ch.desFg } : {}),\n ...(ch.border ? { '--border': ch.border } : {}),\n ...(ch.input ? { '--input': ch.input } : {}),\n ...(ch.ring ? { '--ring': ch.ring } : {}),\n '--radius': tokens['--radius'],\n }\n\n const sbBg = ch.muted ?? ch.secondary\n const sbFg = ch.fg ?? ch.secFg\n const sbAccent = ch.accent ?? ch.muted\n const sbAccentFg = ch.accFg ?? ch.fg\n\n Object.assign(out, {\n ...(sbBg ? { '--sidebar-background': sbBg } : {}),\n ...(sbFg ? { '--sidebar-foreground': sbFg } : {}),\n ...(ch.primary ? { '--sidebar-primary': ch.primary } : {}),\n ...(ch.priFg ? { '--sidebar-primary-foreground': ch.priFg } : {}),\n ...(sbAccent ? { '--sidebar-accent': sbAccent } : {}),\n ...(sbAccentFg ? { '--sidebar-accent-foreground': sbAccentFg } : {}),\n ...(ch.border ? { '--sidebar-border': ch.border } : {}),\n ...(ch.ring ? { '--sidebar-ring': ch.ring } : {}),\n ...(ch.primary\n ? {\n '--chart-1': ch.primary,\n ...(ch.ring ? { '--chart-2': ch.ring } : {}),\n ...(ch.accent ? { '--chart-3': ch.accent } : {}),\n ...(ch.secondary ? { '--chart-4': ch.secondary } : {}),\n ...(ch.muted ? { '--chart-5': ch.muted } : {}),\n }\n : {}),\n })\n\n return out\n}\n\n/**\n * Same as {@link tokenSetToDeclarations} but keeps sidebar + chart tokens aligned with\n * `packages/shared-ui/src/styles/base.css` (pre–multi-theme workbench look).\n */\nfunction tokenSetToDeclarationsSharedUiBase(\n tokens: ThemeTokenSet,\n mode: 'light' | 'dark',\n): Record<string, string> {\n const ch = {\n bg: hslFunctionalToChannels(tokens['--color-background']),\n fg: hslFunctionalToChannels(tokens['--color-foreground']),\n card: hslFunctionalToChannels(tokens['--color-card']),\n cardFg: hslFunctionalToChannels(tokens['--color-card-foreground']),\n pop: hslFunctionalToChannels(tokens['--color-popover']),\n popFg: hslFunctionalToChannels(tokens['--color-popover-foreground']),\n primary: hslFunctionalToChannels(tokens['--color-primary']),\n priFg: hslFunctionalToChannels(tokens['--color-primary-foreground']),\n secondary: hslFunctionalToChannels(tokens['--color-secondary']),\n secFg: hslFunctionalToChannels(tokens['--color-secondary-foreground']),\n muted: hslFunctionalToChannels(tokens['--color-muted']),\n mutFg: hslFunctionalToChannels(tokens['--color-muted-foreground']),\n accent: hslFunctionalToChannels(tokens['--color-accent']),\n accFg: hslFunctionalToChannels(tokens['--color-accent-foreground']),\n destructive: hslFunctionalToChannels(tokens['--color-destructive']),\n desFg: hslFunctionalToChannels(tokens['--color-destructive-foreground']),\n border: hslFunctionalToChannels(tokens['--color-border']),\n input: hslFunctionalToChannels(tokens['--color-input']),\n ring: hslFunctionalToChannels(tokens['--color-ring']),\n }\n const out: Record<string, string> = {\n ...Object.fromEntries(\n (Object.entries(tokens) as [string, string][]).filter(([k]) => k.startsWith('--color')),\n ),\n ...(ch.bg ? { '--background': ch.bg } : {}),\n ...(ch.fg ? { '--foreground': ch.fg } : {}),\n ...(ch.card ? { '--card': ch.card } : {}),\n ...(ch.cardFg ? { '--card-foreground': ch.cardFg } : {}),\n ...(ch.pop ? { '--popover': ch.pop } : {}),\n ...(ch.popFg ? { '--popover-foreground': ch.popFg } : {}),\n ...(ch.primary ? { '--primary': ch.primary } : {}),\n ...(ch.priFg ? { '--primary-foreground': ch.priFg } : {}),\n ...(ch.secondary ? { '--secondary': ch.secondary } : {}),\n ...(ch.secFg ? { '--secondary-foreground': ch.secFg } : {}),\n ...(ch.muted ? { '--muted': ch.muted } : {}),\n ...(ch.mutFg ? { '--muted-foreground': ch.mutFg } : {}),\n ...(ch.accent ? { '--accent': ch.accent } : {}),\n ...(ch.accFg ? { '--accent-foreground': ch.accFg } : {}),\n ...(ch.destructive ? { '--destructive': ch.destructive } : {}),\n ...(ch.desFg ? { '--destructive-foreground': ch.desFg } : {}),\n ...(ch.border ? { '--border': ch.border } : {}),\n ...(ch.input ? { '--input': ch.input } : {}),\n ...(ch.ring ? { '--ring': ch.ring } : {}),\n '--radius': tokens['--radius'],\n }\n\n if (mode === 'light') {\n Object.assign(out, {\n '--sidebar-background': '0 0% 98%',\n '--sidebar-foreground': '0 0% 9%',\n '--sidebar-primary': '0 0% 9%',\n '--sidebar-primary-foreground': '0 0% 98%',\n '--sidebar-accent': '0 0% 96.1%',\n '--sidebar-accent-foreground': '0 0% 9%',\n '--sidebar-border': '0 0% 89.8%',\n '--sidebar-ring': '0 0% 9%',\n })\n } else {\n Object.assign(out, {\n '--sidebar-background': '0 0% 9%',\n '--sidebar-foreground': '0 0% 98%',\n '--sidebar-primary': '0 0% 98%',\n '--sidebar-primary-foreground': '0 0% 9%',\n '--sidebar-accent': '0 0% 14.9%',\n '--sidebar-accent-foreground': '0 0% 98%',\n '--sidebar-border': '0 0% 14.9%',\n '--sidebar-ring': '0 0% 83.1%',\n })\n }\n\n if (ch.primary) {\n Object.assign(out, {\n '--chart-1': ch.primary,\n ...(ch.ring ? { '--chart-2': ch.ring } : {}),\n ...(ch.accent ? { '--chart-3': ch.accent } : {}),\n ...(ch.secondary ? { '--chart-4': ch.secondary } : {}),\n ...(ch.muted ? { '--chart-5': ch.muted } : {}),\n })\n }\n\n return out\n}\n\nexport function flattenDeclarations(decl: Record<string, string>): string {\n return Object.entries(decl)\n .filter(([, v]) => v != null && v !== '')\n .map(([k, v]) => `${k}: ${v}`)\n .join('; ')\n}\n\n/**\n * Builds CSS for injecting into `#workbench-theme-variables`.\n * Overrides base semantic tokens (`--primary`, ...) and keeps `--color-*` for themed CSS such as inkOnyx.css.\n */\nexport function buildWorkbenchPaletteCss(theme: Theme): string {\n if (theme.id === classicTheme.id) {\n const light = flattenDeclarations(\n tokenSetToDeclarationsSharedUiBase(theme.tokens.light, 'light'),\n )\n const dark = flattenDeclarations(tokenSetToDeclarationsSharedUiBase(theme.tokens.dark, 'dark'))\n return `:root { ${light} }\\n:root.dark { ${dark} }\\n.dark { ${dark} }\\n`\n }\n const light = flattenDeclarations(tokenSetToDeclarations(theme.tokens.light))\n const dark = flattenDeclarations(tokenSetToDeclarations(theme.tokens.dark))\n return `:root { ${light} }\\n:root.dark { ${dark} }\\n.dark { ${dark} }\\n`\n}\n\nexport function listRegisteredThemes(themeMap: Record<string, Theme>): Theme[] {\n return Object.values(themeMap)\n}\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react'\nimport { themes, ThemeId, defaultThemeId, resolveThemeId } from '@/themes'\nimport type { Theme } from '@/themes'\nimport { buildWorkbenchPaletteCss } from '@/lib/theme/themeUtils'\nimport { toast } from '@genispace/shared-ui'\nimport { tabIsolation } from '@/utils/tabIsolation'\nimport inkOnyxCss from '@/themes/inkOnyx.css?inline'\n\nconst STYLE_EL_ID = 'workbench-theme-variables'\nconst STORAGE_PREFIX = 'workbench-theme-preferences:'\n\ninterface WorkbenchThemeContextValue {\n themeId: ThemeId\n setThemeId: (id: ThemeId) => Promise<void>\n theme: Theme\n isDark: boolean\n}\n\nconst WorkbenchThemeContext = createContext<WorkbenchThemeContextValue | null>(null)\n\nfunction readLocalThemePreference(workbenchId: string | undefined): ThemeId | undefined {\n if (!workbenchId) return undefined\n try {\n const raw = tabIsolation.getItem(`${STORAGE_PREFIX}${workbenchId}`)\n return raw ? resolveThemeId(raw) : undefined\n } catch {\n return undefined\n }\n}\n\nfunction writeLocalThemePreference(workbenchId: string | undefined, id: ThemeId) {\n if (!workbenchId) return\n try {\n tabIsolation.setItem(`${STORAGE_PREFIX}${workbenchId}`, id)\n } catch {\n /* ignore quota */\n }\n}\n\n/** Observes `.dark` on `<html>` (shared-ui color scheme toggle). */\nfunction useWorkbenchHtmlDarkPreference(): boolean {\n const [isDark, setIsDark] = useState(() =>\n typeof document !== 'undefined' ? document.documentElement.classList.contains('dark') : false,\n )\n\n useEffect(() => {\n const el = document.documentElement\n const sync = () => setIsDark(el.classList.contains('dark'))\n sync()\n const observer = new MutationObserver(sync)\n observer.observe(el, { attributes: true, attributeFilter: ['class'] })\n return () => observer.disconnect()\n }, [])\n\n return isDark\n}\n\nexport interface WorkbenchThemeProviderProps {\n children: ReactNode\n workbenchId?: string\n serverThemeId?: string | undefined\n /**\n * Persist theme into `Workbench.config` (merge `{ ...config, themeId }`).\n * When omitted, viewers prefer locally saved preferences before server defaults.\n */\n onPersistTheme?: (themeId: ThemeId) => Promise<void>\n}\n\nexport function WorkbenchThemeProvider({\n children,\n workbenchId,\n serverThemeId,\n onPersistTheme,\n}: WorkbenchThemeProviderProps) {\n const persistEnabled = typeof onPersistTheme === 'function'\n const isDarkPref = useWorkbenchHtmlDarkPreference()\n\n const [themeId, setThemeIdState] = useState<ThemeId>(defaultThemeId)\n\n /** Resolve theme when navigating workbenches or when server pushes `themeId`. */\n useEffect(() => {\n const fromServer =\n typeof serverThemeId === 'string' && serverThemeId.trim() !== ''\n ? resolveThemeId(serverThemeId)\n : undefined\n const fromLocal = readLocalThemePreference(workbenchId)\n\n const next = persistEnabled\n ? resolveThemeId(fromServer ?? fromLocal ?? defaultThemeId)\n : resolveThemeId(fromLocal ?? fromServer ?? defaultThemeId)\n\n setThemeIdState(next)\n writeLocalThemePreference(workbenchId, next)\n }, [serverThemeId, workbenchId, persistEnabled])\n\n const resolvedThemeId = resolveThemeId(themeId)\n const theme = themes[resolvedThemeId] ?? themes[defaultThemeId]\n\n useEffect(() => {\n document.documentElement.setAttribute('data-workbench-appearance', resolvedThemeId)\n return () => {\n document.documentElement.removeAttribute('data-workbench-appearance')\n }\n }, [resolvedThemeId])\n\n useEffect(() => {\n const palette = themes[resolvedThemeId] ?? themes[defaultThemeId]\n let styleEl = document.getElementById(STYLE_EL_ID) as HTMLStyleElement | null\n if (!styleEl) {\n styleEl = document.createElement('style')\n styleEl.id = STYLE_EL_ID\n document.head.appendChild(styleEl)\n }\n styleEl.textContent = buildWorkbenchPaletteCss(palette)\n\n return () => {\n const existing = document.getElementById(STYLE_EL_ID)\n existing?.parentNode?.removeChild(existing)\n }\n }, [resolvedThemeId])\n\n useEffect(() => {\n const INK_ONYX_CSS_ID = 'inkOnyx-theme-css'\n const isInkOnyx = resolvedThemeId === 'inkOnyx'\n\n if (isInkOnyx) {\n let styleEl = document.getElementById(INK_ONYX_CSS_ID) as HTMLStyleElement | null\n if (!styleEl) {\n styleEl = document.createElement('style')\n styleEl.id = INK_ONYX_CSS_ID\n styleEl.textContent = inkOnyxCss\n document.head.appendChild(styleEl)\n }\n } else {\n const existing = document.getElementById(INK_ONYX_CSS_ID)\n existing?.parentNode?.removeChild(existing)\n }\n\n return () => {\n const existing = document.getElementById(INK_ONYX_CSS_ID)\n existing?.parentNode?.removeChild(existing)\n }\n }, [resolvedThemeId])\n\n useEffect(() => {\n document.documentElement.setAttribute('data-theme', resolvedThemeId)\n return () => document.documentElement.removeAttribute('data-theme')\n }, [resolvedThemeId])\n\n const setThemeId = useCallback(\n async (nextRaw: ThemeId) => {\n const next = resolveThemeId(nextRaw)\n setThemeIdState(next)\n writeLocalThemePreference(workbenchId, next)\n\n if (onPersistTheme) {\n try {\n await onPersistTheme(next)\n } catch (e: unknown) {\n console.warn('[WorkbenchTheme] persist theme failed', e)\n const message =\n typeof e === 'object' &&\n e &&\n 'response' in e &&\n (e as { response?: { data?: { message?: string } } }).response?.data?.message\n\n toast({\n variant: 'destructive',\n title: 'Theme',\n description:\n typeof message === 'string'\n ? message\n : 'Could not save theme to the server. Preference kept locally for this browser.',\n })\n }\n }\n },\n [onPersistTheme, workbenchId],\n )\n\n const value = useMemo(\n (): WorkbenchThemeContextValue => ({\n themeId: resolvedThemeId,\n setThemeId,\n theme,\n isDark: isDarkPref,\n }),\n [resolvedThemeId, setThemeId, theme, isDarkPref],\n )\n\n return <WorkbenchThemeContext.Provider value={value}>{children}</WorkbenchThemeContext.Provider>\n}\n\n/** Appearance package (`classic` / `inkOnyx`, …); unrelated to `@genispace/shared-ui` light/dark controls. */\nexport function useWorkbenchTheme(): WorkbenchThemeContextValue {\n const ctx = useContext(WorkbenchThemeContext)\n if (!ctx) {\n throw new Error('useWorkbenchTheme must be used within WorkbenchThemeProvider')\n }\n return ctx\n}\n","import { useEffect, useLayoutEffect, useMemo, type ReactNode } from 'react';\nimport { I18nextProvider } from 'react-i18next';\nimport type { i18n as I18nInstance } from 'i18next';\nimport { configureGeniAppHostAdapters } from '../adapters/host';\nimport type { GeniAppHostAdapters } from '../types/host-adapters';\nimport { WorkbenchConfigLocaleProvider } from '../contexts/WorkbenchConfigLocaleContext';\nimport { WorkbenchThemeProvider } from '../contexts/WorkbenchThemeContext';\nimport { ViewportProvider } from '../contexts/ViewportContext';\nimport { PageFullscreenProvider } from '../contexts/PageFullscreenContext';\nimport { MobileFlowLayoutProvider } from '../mobile/mobileFlowLayoutContext';\nimport { createGeniAppI18n, normalizeGeniAppLocale } from './i18n';\nimport { useViewport } from '../contexts/ViewportContext';\n\nconst useIsomorphicLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect;\n\nexport interface GeniAppComponentProviderProps {\n children: ReactNode;\n adapters?: GeniAppHostAdapters;\n locale?: string;\n i18n?: I18nInstance;\n localeMetadata?: Record<string, unknown>;\n applicationId?: string;\n themeId?: string;\n /** Override the detected Workbench viewport. Omit for automatic mobile/desktop behavior. */\n mobile?: boolean;\n fullscreen?: boolean;\n /** Set false when the host already owns the document-level Workbench appearance. */\n provideAppearance?: boolean;\n}\n\nfunction RuntimeContexts({\n children,\n mobile,\n fullscreen,\n}: Pick<GeniAppComponentProviderProps, 'children' | 'mobile' | 'fullscreen'>) {\n const viewport = useViewport();\n return (\n <MobileFlowLayoutProvider value={mobile ?? viewport.isMobile}>\n <PageFullscreenProvider value={fullscreen ?? false}>\n {children}\n </PageFullscreenProvider>\n </MobileFlowLayoutProvider>\n );\n}\n\n/**\n * Runtime boundary shared by Workbench view mode and standalone GeniApps.\n * It provides the exact locale, appearance, viewport and platform adapter\n * contexts consumed by the public renderer tree.\n */\nexport function GeniAppComponentProvider({\n children,\n adapters = {},\n locale = 'en',\n i18n,\n localeMetadata,\n applicationId,\n themeId,\n mobile,\n fullscreen = false,\n provideAppearance = true,\n}: GeniAppComponentProviderProps) {\n const ownedI18n = useMemo(() => i18n ?? createGeniAppI18n(locale), [i18n]);\n\n useIsomorphicLayoutEffect(\n () => configureGeniAppHostAdapters(adapters),\n [adapters],\n );\n\n useEffect(() => {\n const nextLocale = normalizeGeniAppLocale(locale);\n if (ownedI18n.language !== nextLocale) void ownedI18n.changeLanguage(nextLocale);\n }, [locale, ownedI18n]);\n\n const localizedRuntime = (\n <WorkbenchConfigLocaleProvider metadata={localeMetadata as never}>\n <RuntimeContexts mobile={mobile} fullscreen={fullscreen}>\n {children}\n </RuntimeContexts>\n </WorkbenchConfigLocaleProvider>\n );\n\n return (\n <I18nextProvider i18n={ownedI18n}>\n <ViewportProvider>\n {provideAppearance ? (\n <WorkbenchThemeProvider\n workbenchId={applicationId}\n serverThemeId={themeId}\n >\n {localizedRuntime}\n </WorkbenchThemeProvider>\n ) : localizedRuntime}\n </ViewportProvider>\n </I18nextProvider>\n );\n}\n","import type { NavigationItem } from '@/types';\nimport {\n filterNavigationItemsForMember,\n getNavigationTargetPageId,\n} from '@/utils/navigationUtils';\nimport { resolveBilingualText } from '@/utils/workbenchDisplayLocale';\nimport type { VisibleWhenContext } from '@/utils/visibleWhen';\n\nexport interface MobileBottomNavTab {\n key: string;\n label: string;\n icon?: string;\n pageId: string;\n pageParameters?: Record<string, unknown>;\n}\n\nexport function resolveTabPageId(item: NavigationItem): string | null {\n if (typeof item.linkedPage === 'string' && item.linkedPage.trim() !== '') {\n return item.linkedPage;\n }\n\n if (item.children?.length) {\n for (const child of item.children) {\n const childPageId = resolveTabPageId(child);\n if (childPageId) {\n return childPageId;\n }\n }\n return null;\n }\n\n return getNavigationTargetPageId(item);\n}\n\nexport function resolveMobileBottomNavTabs(\n items: NavigationItem[] | undefined | null,\n currentMemberId?: string | null,\n language = 'zh',\n visibleWhenContext?: VisibleWhenContext\n): MobileBottomNavTab[] {\n if (!items?.length) {\n return [];\n }\n\n const visibleItems = filterNavigationItemsForMember(items, currentMemberId, 'mobile', visibleWhenContext);\n\n return visibleItems.reduce<MobileBottomNavTab[]>((tabs, item) => {\n const pageId = resolveTabPageId(item);\n if (!pageId) {\n return tabs;\n }\n\n tabs.push({\n key: item.key,\n label: resolveBilingualText(item.title, language),\n icon: item.icon,\n pageId,\n pageParameters: item.pageParameters,\n });\n\n return tabs;\n }, []);\n}\n\nfunction collectPageIdsForTab(\n item: NavigationItem,\n pageIds: Set<string>\n): void {\n const pageId = getNavigationTargetPageId(item);\n if (pageId) {\n pageIds.add(pageId);\n }\n item.children?.forEach((child) => collectPageIdsForTab(child, pageIds));\n}\n\nexport function isMobileBottomNavTabActive(\n tab: MobileBottomNavTab,\n currentPageId: string | undefined,\n navigationItems: NavigationItem[] | undefined | null\n): boolean {\n if (!currentPageId) {\n return false;\n }\n\n if (tab.pageId === currentPageId) {\n return true;\n }\n\n const rootItem = navigationItems?.find((item) => item.key === tab.key);\n if (!rootItem) {\n return false;\n }\n\n const pageIds = new Set<string>();\n collectPageIdsForTab(rootItem, pageIds);\n return pageIds.has(currentPageId);\n}\n","import { useCallback, useEffect, useMemo, type ReactNode } from 'react';\nimport { Globe2, Moon, PanelsTopLeft, Sun } from 'lucide-react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { useTranslation } from 'react-i18next';\nimport { AppSidebar } from '../../ui/components/features/app/Sidebar';\nimport { cn } from '../../utils/utils/cn';\nimport { setTheme } from '../../utils/cookieSettings';\nimport { GeniAppShellBridge } from '../../shell';\nimport { MultiPageRenderer, type RenderGeniAppPage } from './MultiPageRenderer';\nimport { renderLucideIcon } from '../utils/iconUtils';\nimport {\n filterNavigationItemsForMember,\n getNavigationTargetPageId,\n resolveDefaultWorkbenchLanding,\n serializeWorkbenchUrlSearchParams,\n} from '../utils/navigationUtils';\nimport { resolveMobileBottomNavTabs } from '../mobile/utils/mobileBottomNav';\nimport { ParameterUtils } from '../utils/parameterUtils';\nimport { useWorkbenchConfigLocale } from '../contexts/WorkbenchConfigLocaleContext';\nimport { useViewport } from '../contexts/ViewportContext';\nimport { useCurrentUser } from '../hooks/useCurrentUser';\nimport { useVisibleWhenContext } from '../hooks/useVisibleWhenContext';\nimport type { WorkbenchConfig } from '../types/components';\nimport type { NavigationItem } from '../types';\n\nexport interface GeniAppWorkbenchConfig extends WorkbenchConfig {\n name?: string;\n description?: string;\n geniappRuntime?: {\n datasourceIdentifiers?: Record<string, string>;\n };\n}\n\nexport interface GeniAppWorkbenchProps {\n identifier: string;\n config: GeniAppWorkbenchConfig;\n name?: string;\n allowedShellOrigins?: string[];\n headerIcon?: ReactNode;\n showRuntimeControls?: boolean;\n renderPage?: RenderGeniAppPage;\n}\n\nfunction parsePageParams(search: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n new URLSearchParams(search).forEach((value, key) => {\n result[key] = ParameterUtils.inferParameterType(value);\n });\n return result;\n}\n\nfunction pathnamePageId(pathname: string, pages: Record<string, unknown>): string | null {\n const segments = pathname.split('/').filter(Boolean);\n for (let index = segments.length - 1; index >= 0; index -= 1) {\n const candidate = decodeURIComponent(segments[index]);\n if (pages[candidate]) return candidate;\n }\n return null;\n}\n\nfunction navigationPath(identifier: string, pageId: string, params: Record<string, unknown> = {}): string {\n const query = serializeWorkbenchUrlSearchParams(params);\n return `/${encodeURIComponent(identifier)}/${encodeURIComponent(pageId)}${query ? `?${query}` : ''}`;\n}\n\nfunction NavigationRows({\n items,\n activePageId,\n collapsed,\n depth = 0,\n onNavigate,\n resolveTitle,\n}: {\n items: NavigationItem[];\n activePageId: string;\n collapsed: boolean;\n depth?: number;\n onNavigate: (item: NavigationItem) => void;\n resolveTitle: (value: unknown) => string;\n}) {\n return (\n <div className={depth === 0 ? 'space-y-1' : 'mt-1 space-y-1'}>\n {items.map((item) => {\n const targetPageId = getNavigationTargetPageId(item);\n const isNavigable = Boolean(targetPageId && (!item.children?.length || item.linkedPage));\n const active = targetPageId === activePageId;\n const title = resolveTitle(item.title);\n return (\n <div key={item.key}>\n <button\n type=\"button\"\n title={collapsed ? title : undefined}\n disabled={!isNavigable}\n onClick={() => isNavigable && onNavigate(item)}\n className={cn(\n 'flex min-h-10 w-full items-center rounded-lg text-sm font-medium transition-colors',\n collapsed ? 'justify-center px-2' : 'gap-3 px-3 text-left',\n active\n ? 'bg-primary text-primary-foreground'\n : isNavigable\n ? 'text-muted-foreground hover:bg-accent hover:text-accent-foreground'\n : 'cursor-default text-muted-foreground',\n )}\n style={!collapsed && depth > 0 ? { paddingLeft: `${12 + depth * 16}px` } : undefined}\n aria-current={active ? 'page' : undefined}\n >\n <span className=\"shrink-0\">\n {renderLucideIcon(item.icon || (item.children?.length ? 'folder' : 'layout-grid'), 'h-4 w-4')}\n </span>\n {!collapsed && <span className=\"min-w-0 truncate\">{title}</span>}\n </button>\n {!collapsed && item.children?.length ? (\n <NavigationRows\n items={item.children}\n activePageId={activePageId}\n collapsed={false}\n depth={depth + 1}\n onNavigate={onNavigate}\n resolveTitle={resolveTitle}\n />\n ) : null}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction RuntimeControls() {\n const { i18n } = useTranslation();\n const isDark = typeof document !== 'undefined' && document.documentElement.classList.contains('dark');\n const switchLanguage = () => {\n const next = i18n.language.startsWith('zh') ? 'en' : 'zh';\n localStorage.setItem('i18nextLng', next);\n void i18n.changeLanguage(next);\n };\n const switchTheme = () => setTheme(isDark ? 'light' : 'dark');\n\n return (\n <div className=\"space-y-1\">\n <button\n type=\"button\"\n onClick={switchLanguage}\n className=\"flex min-h-10 w-full items-center gap-3 rounded-lg px-3 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground\"\n >\n <Globe2 className=\"h-4 w-4\" />\n <span>{i18n.language.startsWith('zh') ? 'English' : '中文'}</span>\n </button>\n <button\n type=\"button\"\n onClick={switchTheme}\n className=\"flex min-h-10 w-full items-center gap-3 rounded-lg px-3 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground\"\n >\n {isDark ? <Sun className=\"h-4 w-4\" /> : <Moon className=\"h-4 w-4\" />}\n <span>{isDark ? 'Light' : 'Dark'}</span>\n </button>\n </div>\n );\n}\n\nfunction MobileNavigation({\n items,\n activePageId,\n onNavigate,\n}: {\n items: NavigationItem[];\n activePageId: string;\n onNavigate: (pageId: string, key: string, params?: Record<string, unknown>) => void;\n}) {\n const { language } = useWorkbenchConfigLocale();\n const tabs = useMemo(() => resolveMobileBottomNavTabs(items, null, language), [items, language]);\n if (tabs.length === 0) return null;\n\n return (\n <nav\n aria-label=\"Application bottom navigation\"\n className=\"workbench-bottom-tab-nav relative shrink-0 border-t border-neutral-200/80 bg-white pt-2 dark:border-neutral-700/80 dark:bg-neutral-950\"\n style={{ paddingBottom: 'max(env(safe-area-inset-bottom, 0px), 0.75rem)' }}\n >\n <div className=\"flex h-14 items-stretch\">\n {tabs.map((tab) => {\n const active = tab.pageId === activePageId;\n return (\n <button\n key={tab.key}\n type=\"button\"\n aria-label={tab.label}\n aria-current={active ? 'page' : undefined}\n onClick={() => onNavigate(tab.pageId, tab.key, tab.pageParameters)}\n className={cn(\n 'flex min-w-0 flex-1 flex-col items-center justify-center gap-0.5 px-1 py-1 transition-colors duration-200',\n active ? 'text-indigo-600 dark:text-indigo-400' : 'text-slate-400 dark:text-neutral-400',\n )}\n >\n {tab.icon ? renderLucideIcon(tab.icon, 'h-7 w-7 shrink-0') : null}\n <span className=\"w-full truncate px-0.5 text-center text-[11px] font-medium\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n </nav>\n );\n}\n\n/** Complete routed shell for a downloaded Workbench GeniApp. */\nexport function GeniAppWorkbench({\n identifier,\n config,\n name,\n allowedShellOrigins,\n headerIcon,\n showRuntimeControls = true,\n renderPage,\n}: GeniAppWorkbenchProps) {\n const location = useLocation();\n const navigate = useNavigate();\n const viewport = useViewport();\n const { currentUser } = useCurrentUser();\n const visibleWhenContext = useVisibleWhenContext(parsePageParams(location.search));\n const { localizeAppConfig, resolveBilingualText } = useWorkbenchConfigLocale();\n const pages = config.pages ?? {};\n const localizedAppConfig = localizeAppConfig(config.appConfig as unknown as Record<string, unknown>) as unknown as WorkbenchConfig['appConfig'];\n const navigationItems = localizedAppConfig?.navigation?.items ?? [];\n const visibleNavigation = useMemo(\n () => filterNavigationItemsForMember(\n navigationItems,\n currentUser?.id,\n viewport.isMobile ? 'mobile' : 'desktop',\n visibleWhenContext,\n ),\n [currentUser?.id, navigationItems, viewport.isMobile, visibleWhenContext],\n );\n\n const landing = useMemo(\n () => resolveDefaultWorkbenchLanding(localizedAppConfig, pages, currentUser?.id, { visibleWhenContext }),\n [currentUser?.id, localizedAppConfig, pages, visibleWhenContext],\n );\n const activePageId = pathnamePageId(location.pathname, pages)\n ?? landing?.pageId\n ?? Object.keys(pages)[0]\n ?? '';\n\n const goToPage = useCallback((pageId: string, params: Record<string, unknown> = {}) => {\n if (!pages[pageId]) return;\n navigate(navigationPath(identifier, pageId, params));\n }, [identifier, navigate, pages]);\n\n const goToItem = useCallback((item: NavigationItem) => {\n const pageId = getNavigationTargetPageId(item);\n if (!pageId) return;\n goToPage(pageId, { ...(item.pageParameters ?? {}), _nav: item.key });\n }, [goToPage]);\n\n useEffect(() => {\n if (pathnamePageId(location.pathname, pages) || !activePageId) return;\n navigate(navigationPath(identifier, activePageId, landing ? parsePageParams(landing.queryString) : {}), { replace: true });\n }, [activePageId, identifier, landing, location.pathname, navigate, pages]);\n\n useEffect(() => {\n const openPage = (event: Event) => {\n const detail = (event as CustomEvent<Record<string, unknown>>).detail ?? {};\n const pageId = typeof detail.pageId === 'string' ? detail.pageId : '';\n const params = detail.urlParams && typeof detail.urlParams === 'object'\n ? detail.urlParams as Record<string, unknown>\n : {};\n goToPage(pageId, params);\n };\n window.addEventListener('workbench-open-tab', openPage);\n return () => window.removeEventListener('workbench-open-tab', openPage);\n }, [goToPage]);\n\n const pageConfig = pages[activePageId];\n const tab = pageConfig ? [{\n id: `${activePageId}:${location.search}`,\n pageId: activePageId,\n title: pageConfig.title,\n isActive: true,\n pageConfig,\n isLoading: false,\n urlParams: parsePageParams(location.search),\n }] : [];\n const appName = name || config.name || localizedAppConfig?.appId || identifier;\n const content = (\n <div className=\"h-dvh min-h-0 w-full overflow-hidden bg-neutral-50 dark:bg-neutral-950\">\n <MultiPageRenderer\n tabs={tab}\n activeTabId={tab[0]?.id ?? null}\n appConfig={localizedAppConfig}\n renderPage={renderPage}\n />\n </div>\n );\n\n return (\n <>\n <GeniAppShellBridge identifier={identifier} allowedShellOrigins={allowedShellOrigins} />\n {viewport.isMobile ? (\n <div className=\"flex h-dvh min-h-0 flex-col overflow-hidden bg-neutral-50 dark:bg-neutral-950\">\n <div className=\"min-h-0 flex-1\">{content}</div>\n <MobileNavigation\n items={visibleNavigation}\n activePageId={activePageId}\n onNavigate={(pageId, key, params) => goToPage(pageId, { ...(params ?? {}), _nav: key })}\n />\n </div>\n ) : (\n <AppSidebar\n collapsible\n storageKey={`${identifier}:sidebar-collapsed`}\n navAriaLabel=\"Application navigation\"\n sidebarHeader={(collapsed) => (\n <div className={cn('flex min-w-0 items-center', collapsed ? 'justify-center' : 'gap-3')}>\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center overflow-hidden rounded-xl bg-primary text-primary-foreground\">\n {headerIcon ?? (localizedAppConfig?.logo\n ? <img src={localizedAppConfig.logo} alt=\"\" className=\"h-full w-full object-cover\" />\n : <PanelsTopLeft className=\"h-5 w-5\" />)}\n </span>\n {!collapsed && <span className=\"truncate text-sm font-semibold text-foreground\">{appName}</span>}\n </div>\n )}\n sidebarNav={(collapsed) => (\n <NavigationRows\n items={visibleNavigation}\n activePageId={activePageId}\n collapsed={collapsed}\n onNavigate={goToItem}\n resolveTitle={resolveBilingualText}\n />\n )}\n sidebarFooter={showRuntimeControls ? (collapsed) => collapsed ? null : <RuntimeControls /> : undefined}\n >\n {content}\n </AppSidebar>\n )}\n </>\n );\n}\n","import { createResolveApiRoot } from '../../hooks/shell/resolveApiRoot';\nimport type {\n GeniAppHostAdapters,\n GeniAppHostRequest,\n GeniAppHostResponse,\n} from '../types/host-adapters';\n\nexport interface CreatePlatformHostAdaptersOptions {\n apiRoot?: string | (() => string);\n tokenStorageKey?: string;\n languageStorageKey?: string;\n applicationIdentifier?: string;\n /** Source datasource UUID -> installed managed datasource identifier. */\n datasourceIdentifiers?: Record<string, string>;\n}\n\nconst isAbsoluteUrl = (value: string) => /^https?:\\/\\//iu.test(value);\n\nfunction joinApiUrl(root: string, path: string): string {\n if (isAbsoluteUrl(path)) return path;\n const normalizedRoot = root.replace(/\\/$/u, '');\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n return `${normalizedRoot}${normalizedPath}`;\n}\n\nfunction appendParams(url: string, params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) return url;\n const parsed = new URL(url, typeof window === 'undefined' ? 'http://localhost' : window.location.origin);\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null) return;\n parsed.searchParams.append(key, String(value));\n });\n return isAbsoluteUrl(url) ? parsed.toString() : `${parsed.pathname}${parsed.search}${parsed.hash}`;\n}\n\nfunction readStorage(storage: Storage | undefined, key: string): string | null {\n try {\n return storage?.getItem(key) ?? null;\n } catch {\n return null;\n }\n}\n\nfunction responseError(\n response: Response,\n payload: unknown,\n): Error & { code: number; response: { status: number; data: unknown } } {\n const record = payload && typeof payload === 'object' ? payload as Record<string, unknown> : undefined;\n const message = typeof record?.message === 'string'\n ? record.message\n : typeof payload === 'string' && payload.trim()\n ? payload\n : response.statusText || `HTTP ${response.status}`;\n return Object.assign(new Error(message), {\n code: response.status,\n response: { status: response.status, data: payload },\n });\n}\n\n/**\n * Default browser adapter for an installed GeniApp. It consumes the API root and\n * access token injected by the platform shell and keeps renderer transport out of\n * the generated application's source tree.\n */\nexport function createPlatformHostAdapters(\n options: CreatePlatformHostAdaptersOptions = {},\n): GeniAppHostAdapters {\n const resolveDefaultRoot = createResolveApiRoot();\n const configuredRoot = options.apiRoot;\n const resolveRoot = typeof configuredRoot === 'function'\n ? configuredRoot\n : () => configuredRoot?.trim() || resolveDefaultRoot();\n const tokenStorageKey = options.tokenStorageKey ?? 'token';\n const languageStorageKey = options.languageStorageKey ?? 'i18nextLng';\n const resolvedDatasourceIds = new Map<string, Promise<string>>();\n\n const resolveDatasourceUrl = async (\n rawUrl: string,\n headers: Headers,\n ): Promise<string> => {\n const match = rawUrl.match(/\\/datasources\\/([^/?#]+)(?=\\/|\\?|#|$)/u);\n if (!match || !options.applicationIdentifier) return rawUrl;\n const sourceId = decodeURIComponent(match[1]);\n const datasourceIdentifier = options.datasourceIdentifiers?.[sourceId];\n if (!datasourceIdentifier) return rawUrl;\n\n let resolution = resolvedDatasourceIds.get(sourceId);\n if (!resolution) {\n resolution = (async () => {\n const params = new URLSearchParams({\n applicationIdentifier: options.applicationIdentifier || '',\n datasourceIdentifier,\n });\n const response = await fetch(\n joinApiUrl(resolveRoot(), `/datasources/managed/resolve?${params}`),\n { headers, credentials: 'same-origin' },\n );\n const payload = await response.json() as {\n data?: { datasourceId?: string };\n message?: string;\n };\n const datasourceId = payload.data?.datasourceId;\n if (!response.ok || !datasourceId) throw responseError(response, payload);\n return datasourceId;\n })();\n resolvedDatasourceIds.set(sourceId, resolution);\n }\n\n try {\n const datasourceId = await resolution;\n return rawUrl.replace(match[1], encodeURIComponent(datasourceId));\n } catch (error) {\n resolvedDatasourceIds.delete(sourceId);\n throw error;\n }\n };\n\n const request = async <T = unknown>({\n url,\n method,\n body,\n params,\n headers: suppliedHeaders,\n responseType = 'json',\n signal,\n }: GeniAppHostRequest): Promise<GeniAppHostResponse<T>> => {\n const headers = new Headers(suppliedHeaders);\n const token = typeof localStorage === 'undefined'\n ? null\n : readStorage(localStorage, tokenStorageKey);\n const language = typeof localStorage === 'undefined'\n ? null\n : readStorage(localStorage, languageStorageKey);\n\n if (token && !headers.has('Authorization')) headers.set('Authorization', `Bearer ${token}`);\n if (language && !headers.has('X-Language')) headers.set('X-Language', language);\n const resolvedUrl = await resolveDatasourceUrl(url, headers);\n const finalUrl = appendParams(joinApiUrl(resolveRoot(), resolvedUrl), params);\n\n const isFormData = typeof FormData !== 'undefined' && body instanceof FormData;\n if (body !== undefined && !isFormData && !headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n if (isFormData) headers.delete('Content-Type');\n\n const response = await fetch(finalUrl, {\n method,\n headers,\n signal,\n credentials: 'same-origin',\n body: body === undefined\n ? undefined\n : isFormData || typeof body === 'string' || body instanceof Blob\n ? body as BodyInit\n : JSON.stringify(body),\n });\n\n let payload: unknown;\n if (responseType === 'blob') {\n payload = await response.blob();\n } else if (responseType === 'text') {\n payload = await response.text();\n } else {\n const text = await response.text();\n try {\n payload = text ? JSON.parse(text) : undefined;\n } catch {\n payload = text;\n }\n }\n\n if (!response.ok) throw responseError(response, payload);\n\n if (payload && typeof payload === 'object' && 'success' in payload) {\n return payload as GeniAppHostResponse<T>;\n }\n\n return {\n success: true,\n data: payload as T,\n code: response.status,\n message: response.statusText || 'Success',\n timestamp: new Date().toISOString(),\n };\n };\n\n return {\n request,\n navigate(path, navigationOptions) {\n if (navigationOptions?.replace) window.history.replaceState(navigationOptions.state, '', path);\n else window.history.pushState(navigationOptions?.state, '', path);\n window.dispatchEvent(new PopStateEvent('popstate'));\n },\n storage: typeof localStorage === 'undefined' ? undefined : localStorage,\n };\n}\n"],"names":["classicTheme","inkOnyxTheme","LEGACY_THEME_ID_MAP","themes","defaultThemeId","resolveThemeId","id","mapped","hslFunctionalToChannels","fn","m","tokenSetToDeclarations","tokens","ch","out","k","sbBg","sbFg","sbAccent","sbAccentFg","tokenSetToDeclarationsSharedUiBase","mode","flattenDeclarations","decl","v","buildWorkbenchPaletteCss","theme","light","dark","STYLE_EL_ID","STORAGE_PREFIX","WorkbenchThemeContext","createContext","readLocalThemePreference","workbenchId","raw","tabIsolation","writeLocalThemePreference","useWorkbenchHtmlDarkPreference","isDark","setIsDark","useState","useEffect","el","sync","observer","WorkbenchThemeProvider","children","serverThemeId","onPersistTheme","persistEnabled","isDarkPref","themeId","setThemeIdState","fromServer","fromLocal","next","resolvedThemeId","palette","styleEl","existing","INK_ONYX_CSS_ID","inkOnyxCss","setThemeId","useCallback","nextRaw","e","message","toast","value","useMemo","jsx","useWorkbenchTheme","ctx","useContext","useIsomorphicLayoutEffect","useLayoutEffect","RuntimeContexts","mobile","fullscreen","viewport","useViewport","MobileFlowLayoutProvider","PageFullscreenProvider","GeniAppComponentProvider","adapters","locale","i18n","localeMetadata","applicationId","provideAppearance","ownedI18n","createGeniAppI18n","configureGeniAppHostAdapters","nextLocale","normalizeGeniAppLocale","localizedRuntime","WorkbenchConfigLocaleProvider","I18nextProvider","ViewportProvider","resolveTabPageId","item","child","childPageId","getNavigationTargetPageId","resolveMobileBottomNavTabs","items","currentMemberId","language","visibleWhenContext","filterNavigationItemsForMember","tabs","pageId","resolveBilingualText","parsePageParams","search","result","key","ParameterUtils","pathnamePageId","pathname","pages","segments","index","candidate","navigationPath","identifier","params","query","serializeWorkbenchUrlSearchParams","NavigationRows","activePageId","collapsed","depth","onNavigate","resolveTitle","targetPageId","isNavigable","active","title","jsxs","cn","renderLucideIcon","RuntimeControls","useTranslation","switchLanguage","switchTheme","setTheme","Globe2","Sun","Moon","MobileNavigation","useWorkbenchConfigLocale","tab","GeniAppWorkbench","config","name","allowedShellOrigins","headerIcon","showRuntimeControls","renderPage","location","useLocation","navigate","useNavigate","currentUser","useCurrentUser","useVisibleWhenContext","localizeAppConfig","localizedAppConfig","navigationItems","visibleNavigation","landing","resolveDefaultWorkbenchLanding","goToPage","goToItem","openPage","event","detail","pageConfig","appName","content","MultiPageRenderer","Fragment","GeniAppShellBridge","AppSidebar","PanelsTopLeft","isAbsoluteUrl","joinApiUrl","root","path","normalizedRoot","normalizedPath","appendParams","url","parsed","readStorage","storage","responseError","response","payload","record","createPlatformHostAdapters","options","resolveDefaultRoot","createResolveApiRoot","configuredRoot","resolveRoot","tokenStorageKey","languageStorageKey","resolvedDatasourceIds","resolveDatasourceUrl","rawUrl","headers","match","sourceId","datasourceIdentifier","resolution","datasourceId","error","method","body","suppliedHeaders","responseType","signal","token","resolvedUrl","finalUrl","isFormData","text","navigationOptions"],"mappings":";;;;;;;;;;;;;;;;;AAQO,MAAMA,IAAsB;AAAA,EACjC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,OAAO;AAAA,MACL,mBAAmB;AAAA,MACnB,yBAAyB;AAAA,MACzB,8BAA8B;AAAA,MAC9B,qBAAqB;AAAA,MACrB,gCAAgC;AAAA,MAChC,iBAAiB;AAAA,MACjB,4BAA4B;AAAA,MAC5B,kBAAkB;AAAA,MAClB,6BAA6B;AAAA,MAC7B,uBAAuB;AAAA,MACvB,kCAAkC;AAAA,MAClC,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,gBAAgB;AAAA,MAChB,2BAA2B;AAAA,MAC3B,mBAAmB;AAAA,MACnB,8BAA8B;AAAA,MAC9B,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,IAAA;AAAA,IAEvB,MAAM;AAAA,MACJ,mBAAmB;AAAA,MACnB,yBAAyB;AAAA,MACzB,8BAA8B;AAAA,MAC9B,qBAAqB;AAAA,MACrB,gCAAgC;AAAA,MAChC,iBAAiB;AAAA,MACjB,4BAA4B;AAAA,MAC5B,kBAAkB;AAAA,MAClB,6BAA6B;AAAA,MAC7B,uBAAuB;AAAA,MACvB,kCAAkC;AAAA,MAClC,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,gBAAgB;AAAA,MAChB,2BAA2B;AAAA,MAC3B,mBAAmB;AAAA,MACnB,8BAA8B;AAAA,MAC9B,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,IAAA;AAAA,EACvB;AAEJ,GC7DaC,IAAsB;AAAA,EACjC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,IACN,OAAO;AAAA,MACL,mBAAmB;AAAA,MACnB,yBAAyB;AAAA,MACzB,8BAA8B;AAAA,MAC9B,qBAAqB;AAAA,MACrB,gCAAgC;AAAA,MAChC,iBAAiB;AAAA,MACjB,4BAA4B;AAAA,MAC5B,kBAAkB;AAAA,MAClB,6BAA6B;AAAA,MAC7B,uBAAuB;AAAA,MACvB,kCAAkC;AAAA,MAClC,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,gBAAgB;AAAA,MAChB,2BAA2B;AAAA,MAC3B,mBAAmB;AAAA,MACnB,8BAA8B;AAAA,MAC9B,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,IAAA;AAAA,IAEvB,MAAM;AAAA,MACJ,mBAAmB;AAAA,MACnB,yBAAyB;AAAA,MACzB,8BAA8B;AAAA,MAC9B,qBAAqB;AAAA,MACrB,gCAAgC;AAAA,MAChC,iBAAiB;AAAA,MACjB,4BAA4B;AAAA,MAC5B,kBAAkB;AAAA,MAClB,6BAA6B;AAAA,MAC7B,uBAAuB;AAAA,MACvB,kCAAkC;AAAA,MAClC,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,gBAAgB;AAAA,MAChB,2BAA2B;AAAA,MAC3B,mBAAmB;AAAA,MACnB,8BAA8B;AAAA,MAC9B,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,IAAA;AAAA,EACvB;AAEJ,GCnDMC,KAA8C;AAAA;AAAA,EAElD,SAASD,EAAa;AACxB,GAEaE,IAAgC;AAAA,EAC3C,CAACH,EAAa,EAAE,GAAGA;AAAA,EACnB,CAACC,EAAa,EAAE,GAAGA;AACrB,GAIaG,IAA0BJ,EAAa;AAG7C,SAASK,EAAeC,GAAwC;AACrE,MAAI,CAACA,KAAMA,EAAG,KAAA,MAAW,GAAI,QAAOF;AACpC,QAAMG,IAASL,GAAoBI,CAAE,KAAKA;AAC1C,SAAOH,EAAOI,CAAM,IAAIA,IAASH;AACnC;ACvBO,SAASI,EAAwBC,GAA2B;AAEjE,QAAMC,IADUD,EAAG,KAAA,EACD;AAAA,IAChB;AAAA,EAAA;AAEF,SAAKC,IACE,GAAGA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,IAAIA,EAAE,CAAC,CAAC,GAAG,QAAQ,MAAM,EAAE,EAAE,KAAA,IADpC;AAEjB;AAEA,SAASC,EAAuBC,GAA+C;AAC7E,QAAMC,IAAK;AAAA,IACT,IAAIL,EAAwBI,EAAO,oBAAoB,CAAC;AAAA,IACxD,IAAIJ,EAAwBI,EAAO,oBAAoB,CAAC;AAAA,IACxD,MAAMJ,EAAwBI,EAAO,cAAc,CAAC;AAAA,IACpD,QAAQJ,EAAwBI,EAAO,yBAAyB,CAAC;AAAA,IACjE,KAAKJ,EAAwBI,EAAO,iBAAiB,CAAC;AAAA,IACtD,OAAOJ,EAAwBI,EAAO,4BAA4B,CAAC;AAAA,IACnE,SAASJ,EAAwBI,EAAO,iBAAiB,CAAC;AAAA,IAC1D,OAAOJ,EAAwBI,EAAO,4BAA4B,CAAC;AAAA,IACnE,WAAWJ,EAAwBI,EAAO,mBAAmB,CAAC;AAAA,IAC9D,OAAOJ,EAAwBI,EAAO,8BAA8B,CAAC;AAAA,IACrE,OAAOJ,EAAwBI,EAAO,eAAe,CAAC;AAAA,IACtD,OAAOJ,EAAwBI,EAAO,0BAA0B,CAAC;AAAA,IACjE,QAAQJ,EAAwBI,EAAO,gBAAgB,CAAC;AAAA,IACxD,OAAOJ,EAAwBI,EAAO,2BAA2B,CAAC;AAAA,IAClE,aAAaJ,EAAwBI,EAAO,qBAAqB,CAAC;AAAA,IAClE,OAAOJ,EAAwBI,EAAO,gCAAgC,CAAC;AAAA,IACvE,QAAQJ,EAAwBI,EAAO,gBAAgB,CAAC;AAAA,IACxD,OAAOJ,EAAwBI,EAAO,eAAe,CAAC;AAAA,IACtD,MAAMJ,EAAwBI,EAAO,cAAc,CAAC;AAAA,EAAA,GAEhDE,IAA8B;AAAA,IAClC,GAAG,OAAO;AAAA,MACP,OAAO,QAAQF,CAAM,EAAyB,OAAO,CAAC,CAACG,CAAC,MAAMA,EAAE,WAAW,SAAS,CAAC;AAAA,IAAA;AAAA,IAExF,GAAIF,EAAG,KAAK,EAAE,gBAAgBA,EAAG,GAAA,IAAO,CAAA;AAAA,IACxC,GAAIA,EAAG,KAAK,EAAE,gBAAgBA,EAAG,GAAA,IAAO,CAAA;AAAA,IACxC,GAAIA,EAAG,OAAO,EAAE,UAAUA,EAAG,KAAA,IAAS,CAAA;AAAA,IACtC,GAAIA,EAAG,SAAS,EAAE,qBAAqBA,EAAG,OAAA,IAAW,CAAA;AAAA,IACrD,GAAIA,EAAG,MAAM,EAAE,aAAaA,EAAG,IAAA,IAAQ,CAAA;AAAA,IACvC,GAAIA,EAAG,QAAQ,EAAE,wBAAwBA,EAAG,MAAA,IAAU,CAAA;AAAA,IACtD,GAAIA,EAAG,UAAU,EAAE,aAAaA,EAAG,QAAA,IAAY,CAAA;AAAA,IAC/C,GAAIA,EAAG,QAAQ,EAAE,wBAAwBA,EAAG,MAAA,IAAU,CAAA;AAAA,IACtD,GAAIA,EAAG,YAAY,EAAE,eAAeA,EAAG,UAAA,IAAc,CAAA;AAAA,IACrD,GAAIA,EAAG,QAAQ,EAAE,0BAA0BA,EAAG,MAAA,IAAU,CAAA;AAAA,IACxD,GAAIA,EAAG,QAAQ,EAAE,WAAWA,EAAG,MAAA,IAAU,CAAA;AAAA,IACzC,GAAIA,EAAG,QAAQ,EAAE,sBAAsBA,EAAG,MAAA,IAAU,CAAA;AAAA,IACpD,GAAIA,EAAG,SAAS,EAAE,YAAYA,EAAG,OAAA,IAAW,CAAA;AAAA,IAC5C,GAAIA,EAAG,QAAQ,EAAE,uBAAuBA,EAAG,MAAA,IAAU,CAAA;AAAA,IACrD,GAAIA,EAAG,cAAc,EAAE,iBAAiBA,EAAG,YAAA,IAAgB,CAAA;AAAA,IAC3D,GAAIA,EAAG,QAAQ,EAAE,4BAA4BA,EAAG,MAAA,IAAU,CAAA;AAAA,IAC1D,GAAIA,EAAG,SAAS,EAAE,YAAYA,EAAG,OAAA,IAAW,CAAA;AAAA,IAC5C,GAAIA,EAAG,QAAQ,EAAE,WAAWA,EAAG,MAAA,IAAU,CAAA;AAAA,IACzC,GAAIA,EAAG,OAAO,EAAE,UAAUA,EAAG,KAAA,IAAS,CAAA;AAAA,IACtC,YAAYD,EAAO,UAAU;AAAA,EAAA,GAGzBI,IAAOH,EAAG,SAASA,EAAG,WACtBI,IAAOJ,EAAG,MAAMA,EAAG,OACnBK,IAAWL,EAAG,UAAUA,EAAG,OAC3BM,IAAaN,EAAG,SAASA,EAAG;AAElC,gBAAO,OAAOC,GAAK;AAAA,IACjB,GAAIE,IAAO,EAAE,wBAAwBA,EAAA,IAAS,CAAA;AAAA,IAC9C,GAAIC,IAAO,EAAE,wBAAwBA,EAAA,IAAS,CAAA;AAAA,IAC9C,GAAIJ,EAAG,UAAU,EAAE,qBAAqBA,EAAG,QAAA,IAAY,CAAA;AAAA,IACvD,GAAIA,EAAG,QAAQ,EAAE,gCAAgCA,EAAG,MAAA,IAAU,CAAA;AAAA,IAC9D,GAAIK,IAAW,EAAE,oBAAoBA,EAAA,IAAa,CAAA;AAAA,IAClD,GAAIC,IAAa,EAAE,+BAA+BA,EAAA,IAAe,CAAA;AAAA,IACjE,GAAIN,EAAG,SAAS,EAAE,oBAAoBA,EAAG,OAAA,IAAW,CAAA;AAAA,IACpD,GAAIA,EAAG,OAAO,EAAE,kBAAkBA,EAAG,KAAA,IAAS,CAAA;AAAA,IAC9C,GAAIA,EAAG,UACH;AAAA,MACE,aAAaA,EAAG;AAAA,MAChB,GAAIA,EAAG,OAAO,EAAE,aAAaA,EAAG,KAAA,IAAS,CAAA;AAAA,MACzC,GAAIA,EAAG,SAAS,EAAE,aAAaA,EAAG,OAAA,IAAW,CAAA;AAAA,MAC7C,GAAIA,EAAG,YAAY,EAAE,aAAaA,EAAG,UAAA,IAAc,CAAA;AAAA,MACnD,GAAIA,EAAG,QAAQ,EAAE,aAAaA,EAAG,MAAA,IAAU,CAAA;AAAA,IAAC,IAE9C,CAAA;AAAA,EAAC,CACN,GAEMC;AACT;AAMA,SAASM,EACPR,GACAS,GACwB;AACxB,QAAMR,IAAK;AAAA,IACT,IAAIL,EAAwBI,EAAO,oBAAoB,CAAC;AAAA,IACxD,IAAIJ,EAAwBI,EAAO,oBAAoB,CAAC;AAAA,IACxD,MAAMJ,EAAwBI,EAAO,cAAc,CAAC;AAAA,IACpD,QAAQJ,EAAwBI,EAAO,yBAAyB,CAAC;AAAA,IACjE,KAAKJ,EAAwBI,EAAO,iBAAiB,CAAC;AAAA,IACtD,OAAOJ,EAAwBI,EAAO,4BAA4B,CAAC;AAAA,IACnE,SAASJ,EAAwBI,EAAO,iBAAiB,CAAC;AAAA,IAC1D,OAAOJ,EAAwBI,EAAO,4BAA4B,CAAC;AAAA,IACnE,WAAWJ,EAAwBI,EAAO,mBAAmB,CAAC;AAAA,IAC9D,OAAOJ,EAAwBI,EAAO,8BAA8B,CAAC;AAAA,IACrE,OAAOJ,EAAwBI,EAAO,eAAe,CAAC;AAAA,IACtD,OAAOJ,EAAwBI,EAAO,0BAA0B,CAAC;AAAA,IACjE,QAAQJ,EAAwBI,EAAO,gBAAgB,CAAC;AAAA,IACxD,OAAOJ,EAAwBI,EAAO,2BAA2B,CAAC;AAAA,IAClE,aAAaJ,EAAwBI,EAAO,qBAAqB,CAAC;AAAA,IAClE,OAAOJ,EAAwBI,EAAO,gCAAgC,CAAC;AAAA,IACvE,QAAQJ,EAAwBI,EAAO,gBAAgB,CAAC;AAAA,IACxD,OAAOJ,EAAwBI,EAAO,eAAe,CAAC;AAAA,IACtD,MAAMJ,EAAwBI,EAAO,cAAc,CAAC;AAAA,EAAA,GAEhDE,IAA8B;AAAA,IAClC,GAAG,OAAO;AAAA,MACP,OAAO,QAAQF,CAAM,EAAyB,OAAO,CAAC,CAACG,CAAC,MAAMA,EAAE,WAAW,SAAS,CAAC;AAAA,IAAA;AAAA,IAExF,GAAIF,EAAG,KAAK,EAAE,gBAAgBA,EAAG,GAAA,IAAO,CAAA;AAAA,IACxC,GAAIA,EAAG,KAAK,EAAE,gBAAgBA,EAAG,GAAA,IAAO,CAAA;AAAA,IACxC,GAAIA,EAAG,OAAO,EAAE,UAAUA,EAAG,KAAA,IAAS,CAAA;AAAA,IACtC,GAAIA,EAAG,SAAS,EAAE,qBAAqBA,EAAG,OAAA,IAAW,CAAA;AAAA,IACrD,GAAIA,EAAG,MAAM,EAAE,aAAaA,EAAG,IAAA,IAAQ,CAAA;AAAA,IACvC,GAAIA,EAAG,QAAQ,EAAE,wBAAwBA,EAAG,MAAA,IAAU,CAAA;AAAA,IACtD,GAAIA,EAAG,UAAU,EAAE,aAAaA,EAAG,QAAA,IAAY,CAAA;AAAA,IAC/C,GAAIA,EAAG,QAAQ,EAAE,wBAAwBA,EAAG,MAAA,IAAU,CAAA;AAAA,IACtD,GAAIA,EAAG,YAAY,EAAE,eAAeA,EAAG,UAAA,IAAc,CAAA;AAAA,IACrD,GAAIA,EAAG,QAAQ,EAAE,0BAA0BA,EAAG,MAAA,IAAU,CAAA;AAAA,IACxD,GAAIA,EAAG,QAAQ,EAAE,WAAWA,EAAG,MAAA,IAAU,CAAA;AAAA,IACzC,GAAIA,EAAG,QAAQ,EAAE,sBAAsBA,EAAG,MAAA,IAAU,CAAA;AAAA,IACpD,GAAIA,EAAG,SAAS,EAAE,YAAYA,EAAG,OAAA,IAAW,CAAA;AAAA,IAC5C,GAAIA,EAAG,QAAQ,EAAE,uBAAuBA,EAAG,MAAA,IAAU,CAAA;AAAA,IACrD,GAAIA,EAAG,cAAc,EAAE,iBAAiBA,EAAG,YAAA,IAAgB,CAAA;AAAA,IAC3D,GAAIA,EAAG,QAAQ,EAAE,4BAA4BA,EAAG,MAAA,IAAU,CAAA;AAAA,IAC1D,GAAIA,EAAG,SAAS,EAAE,YAAYA,EAAG,OAAA,IAAW,CAAA;AAAA,IAC5C,GAAIA,EAAG,QAAQ,EAAE,WAAWA,EAAG,MAAA,IAAU,CAAA;AAAA,IACzC,GAAIA,EAAG,OAAO,EAAE,UAAUA,EAAG,KAAA,IAAS,CAAA;AAAA,IACtC,YAAYD,EAAO,UAAU;AAAA,EAAA;AAG/B,SAAIS,MAAS,UACX,OAAO,OAAOP,GAAK;AAAA,IACjB,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,gCAAgC;AAAA,IAChC,oBAAoB;AAAA,IACpB,+BAA+B;AAAA,IAC/B,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,EAAA,CACnB,IAED,OAAO,OAAOA,GAAK;AAAA,IACjB,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,gCAAgC;AAAA,IAChC,oBAAoB;AAAA,IACpB,+BAA+B;AAAA,IAC/B,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,EAAA,CACnB,GAGCD,EAAG,WACL,OAAO,OAAOC,GAAK;AAAA,IACjB,aAAaD,EAAG;AAAA,IAChB,GAAIA,EAAG,OAAO,EAAE,aAAaA,EAAG,KAAA,IAAS,CAAA;AAAA,IACzC,GAAIA,EAAG,SAAS,EAAE,aAAaA,EAAG,OAAA,IAAW,CAAA;AAAA,IAC7C,GAAIA,EAAG,YAAY,EAAE,aAAaA,EAAG,UAAA,IAAc,CAAA;AAAA,IACnD,GAAIA,EAAG,QAAQ,EAAE,aAAaA,EAAG,MAAA,IAAU,CAAA;AAAA,EAAC,CAC7C,GAGIC;AACT;AAEO,SAASQ,EAAoBC,GAAsC;AACxE,SAAO,OAAO,QAAQA,CAAI,EACvB,OAAO,CAAC,CAAA,EAAGC,CAAC,MAAMA,KAAK,QAAQA,MAAM,EAAE,EACvC,IAAI,CAAC,CAACT,GAAGS,CAAC,MAAM,GAAGT,CAAC,KAAKS,CAAC,EAAE,EAC5B,KAAK,IAAI;AACd;AAMO,SAASC,GAAyBC,GAAsB;AAC7D,MAAIA,EAAM,OAAO1B,EAAa,IAAI;AAChC,UAAM2B,IAAQL;AAAA,MACZF,EAAmCM,EAAM,OAAO,OAAO,OAAO;AAAA,IAAA,GAE1DE,IAAON,EAAoBF,EAAmCM,EAAM,OAAO,MAAM,MAAM,CAAC;AAC9F,WAAO,WAAWC,CAAK;AAAA,eAAoBC,CAAI;AAAA,UAAeA,CAAI;AAAA;AAAA,EACpE;AACA,QAAMD,IAAQL,EAAoBX,EAAuBe,EAAM,OAAO,KAAK,CAAC,GACtEE,IAAON,EAAoBX,EAAuBe,EAAM,OAAO,IAAI,CAAC;AAC1E,SAAO,WAAWC,CAAK;AAAA,eAAoBC,CAAI;AAAA,UAAeA,CAAI;AAAA;AACpE;ommCC7LMC,IAAc,6BACdC,KAAiB,gCASjBC,KAAwBC,GAAiD,IAAI;AAEnF,SAASC,GAAyBC,GAAsD;AACtF,MAAKA;AACL,QAAI;AACF,YAAMC,IAAMC,EAAa,QAAQ,GAAGN,EAAc,GAAGI,CAAW,EAAE;AAClE,aAAOC,IAAM9B,EAAe8B,CAAG,IAAI;AAAA,IACrC,QAAQ;AACN;AAAA,IACF;AACF;AAEA,SAASE,EAA0BH,GAAiC5B,GAAa;AAC/E,MAAK4B;AACL,QAAI;AACF,MAAAE,EAAa,QAAQ,GAAGN,EAAc,GAAGI,CAAW,IAAI5B,CAAE;AAAA,IAC5D,QAAQ;AAAA,IAER;AACF;AAGA,SAASgC,KAA0C;AACjD,QAAM,CAACC,GAAQC,CAAS,IAAIC;AAAA,IAAS,MACnC,OAAO,WAAa,MAAc,SAAS,gBAAgB,UAAU,SAAS,MAAM,IAAI;AAAA,EAAA;AAG1F,SAAAC,EAAU,MAAM;AACd,UAAMC,IAAK,SAAS,iBACdC,IAAO,MAAMJ,EAAUG,EAAG,UAAU,SAAS,MAAM,CAAC;AAC1D,IAAAC,EAAA;AACA,UAAMC,IAAW,IAAI,iBAAiBD,CAAI;AAC1C,WAAAC,EAAS,QAAQF,GAAI,EAAE,YAAY,IAAM,iBAAiB,CAAC,OAAO,GAAG,GAC9D,MAAME,EAAS,WAAA;AAAA,EACxB,GAAG,CAAA,CAAE,GAEEN;AACT;AAaO,SAASO,GAAuB;AAAA,EACrC,UAAAC;AAAA,EACA,aAAAb;AAAA,EACA,eAAAc;AAAA,EACA,gBAAAC;AACF,GAAgC;AAC9B,QAAMC,IAAiB,OAAOD,KAAmB,YAC3CE,IAAab,GAAA,GAEb,CAACc,GAASC,CAAe,IAAIZ,GAAkBrC,CAAc;AAGnE,EAAAsC,EAAU,MAAM;AACd,UAAMY,IACJ,OAAON,KAAkB,YAAYA,EAAc,WAAW,KAC1D3C,EAAe2C,CAAa,IAC5B,QACAO,IAAYtB,GAAyBC,CAAW,GAEhDsB,IACFnD,EADS6C,IACMI,KAAcC,KAAanD,IAC3BmD,KAAaD,KAAclD,CADc;AAG5D,IAAAiD,EAAgBG,CAAI,GACpBnB,EAA0BH,GAAasB,CAAI;AAAA,EAC7C,GAAG,CAACR,GAAed,GAAagB,CAAc,CAAC;AAE/C,QAAMO,IAAkBpD,EAAe+C,CAAO,GACxC1B,IAAQvB,EAAOsD,CAAe,KAAKtD,EAAOC,CAAc;AAE9D,EAAAsC,EAAU,OACR,SAAS,gBAAgB,aAAa,6BAA6Be,CAAe,GAC3E,MAAM;AACX,aAAS,gBAAgB,gBAAgB,2BAA2B;AAAA,EACtE,IACC,CAACA,CAAe,CAAC,GAEpBf,EAAU,MAAM;AACd,UAAMgB,IAAUvD,EAAOsD,CAAe,KAAKtD,EAAOC,CAAc;AAChE,QAAIuD,IAAU,SAAS,eAAe9B,CAAW;AACjD,WAAK8B,MACHA,IAAU,SAAS,cAAc,OAAO,GACxCA,EAAQ,KAAK9B,GACb,SAAS,KAAK,YAAY8B,CAAO,IAEnCA,EAAQ,cAAclC,GAAyBiC,CAAO,GAE/C,MAAM;AACX,YAAME,IAAW,SAAS,eAAe/B,CAAW;AACpD,MAAA+B,GAAU,YAAY,YAAYA,CAAQ;AAAA,IAC5C;AAAA,EACF,GAAG,CAACH,CAAe,CAAC,GAEpBf,EAAU,MAAM;AACd,UAAMmB,IAAkB;AAGxB,QAFkBJ,MAAoB,WAEvB;AACb,UAAIE,IAAU,SAAS,eAAeE,CAAe;AACrD,MAAKF,MACHA,IAAU,SAAS,cAAc,OAAO,GACxCA,EAAQ,KAAKE,GACbF,EAAQ,cAAcG,IACtB,SAAS,KAAK,YAAYH,CAAO;AAAA,IAErC,OAAO;AACL,YAAMC,IAAW,SAAS,eAAeC,CAAe;AACxD,MAAAD,GAAU,YAAY,YAAYA,CAAQ;AAAA,IAC5C;AAEA,WAAO,MAAM;AACX,YAAMA,IAAW,SAAS,eAAeC,CAAe;AACxD,MAAAD,GAAU,YAAY,YAAYA,CAAQ;AAAA,IAC5C;AAAA,EACF,GAAG,CAACH,CAAe,CAAC,GAEpBf,EAAU,OACR,SAAS,gBAAgB,aAAa,cAAce,CAAe,GAC5D,MAAM,SAAS,gBAAgB,gBAAgB,YAAY,IACjE,CAACA,CAAe,CAAC;AAEpB,QAAMM,IAAaC;AAAA,IACjB,OAAOC,MAAqB;AAC1B,YAAMT,IAAOnD,EAAe4D,CAAO;AAInC,UAHAZ,EAAgBG,CAAI,GACpBnB,EAA0BH,GAAasB,CAAI,GAEvCP;AACF,YAAI;AACF,gBAAMA,EAAeO,CAAI;AAAA,QAC3B,SAASU,GAAY;AACnB,kBAAQ,KAAK,yCAAyCA,CAAC;AACvD,gBAAMC,IACJ,OAAOD,KAAM,YACbA,KACA,cAAcA,KACbA,EAAqD,UAAU,MAAM;AAExE,UAAAE,GAAM;AAAA,YACJ,SAAS;AAAA,YACT,OAAO;AAAA,YACP,aACE,OAAOD,KAAY,WACfA,IACA;AAAA,UAAA,CACP;AAAA,QACH;AAAA,IAEJ;AAAA,IACA,CAAClB,GAAgBf,CAAW;AAAA,EAAA,GAGxBmC,IAAQC;AAAA,IACZ,OAAmC;AAAA,MACjC,SAASb;AAAA,MACT,YAAAM;AAAA,MACA,OAAArC;AAAA,MACA,QAAQyB;AAAA,IAAA;AAAA,IAEV,CAACM,GAAiBM,GAAYrC,GAAOyB,CAAU;AAAA,EAAA;AAGjD,SAAO,gBAAAoB,EAACxC,GAAsB,UAAtB,EAA+B,OAAAsC,GAAe,UAAAtB,EAAA,CAAS;AACjE;AAGO,SAASyB,KAAgD;AAC9D,QAAMC,IAAMC,GAAW3C,EAAqB;AAC5C,MAAI,CAAC0C;AACH,UAAM,IAAI,MAAM,8DAA8D;AAEhF,SAAOA;AACT;ACnMA,MAAME,KAA4B,OAAO,SAAW,MAAcjC,IAAYkC;AAiB9E,SAASC,GAAgB;AAAA,EACvB,UAAA9B;AAAA,EACA,QAAA+B;AAAA,EACA,YAAAC;AACF,GAA8E;AAC5E,QAAMC,IAAWC,GAAA;AACjB,SACE,gBAAAV,EAACW,IAAA,EAAyB,OAAOJ,KAAUE,EAAS,UAClD,UAAA,gBAAAT,EAACY,IAAA,EAAuB,OAAOJ,KAAc,IAC1C,UAAAhC,EAAA,CACH,GACF;AAEJ;AAOO,SAASqC,GAAyB;AAAA,EACvC,UAAArC;AAAA,EACA,UAAAsC,IAAW,CAAA;AAAA,EACX,QAAAC,IAAS;AAAA,EACT,MAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,SAAArC;AAAA,EACA,QAAA0B;AAAA,EACA,YAAAC,IAAa;AAAA,EACb,mBAAAW,IAAoB;AACtB,GAAkC;AAChC,QAAMC,IAAYrB,EAAQ,MAAMiB,KAAQK,GAAkBN,CAAM,GAAG,CAACC,CAAI,CAAC;AAEzE,EAAAZ;AAAA,IACE,MAAMkB,GAA6BR,CAAQ;AAAA,IAC3C,CAACA,CAAQ;AAAA,EAAA,GAGX3C,EAAU,MAAM;AACd,UAAMoD,IAAaC,GAAuBT,CAAM;AAChD,IAAIK,EAAU,aAAaG,KAAiBH,EAAU,eAAeG,CAAU;AAAA,EACjF,GAAG,CAACR,GAAQK,CAAS,CAAC;AAEtB,QAAMK,IACJ,gBAAAzB,EAAC0B,IAAA,EAA8B,UAAUT,GACvC,4BAACX,IAAA,EAAgB,QAAAC,GAAgB,YAAAC,GAC9B,UAAAhC,EAAA,CACH,EAAA,CACF;AAGF,2BACGmD,IAAA,EAAgB,MAAMP,GACrB,UAAA,gBAAApB,EAAC4B,MACE,UAAAT,IACC,gBAAAnB;AAAA,IAACzB;AAAA,IAAA;AAAA,MACC,aAAa2C;AAAA,MACb,eAAerC;AAAA,MAEd,UAAA4C;AAAA,IAAA;AAAA,EAAA,IAEDA,GACN,GACF;AAEJ;AChFO,SAASI,GAAiBC,GAAqC;AACpE,MAAI,OAAOA,EAAK,cAAe,YAAYA,EAAK,WAAW,KAAA,MAAW;AACpE,WAAOA,EAAK;AAGd,MAAIA,EAAK,UAAU,QAAQ;AACzB,eAAWC,KAASD,EAAK,UAAU;AACjC,YAAME,IAAcH,GAAiBE,CAAK;AAC1C,UAAIC;AACF,eAAOA;AAAA,IAEX;AACA,WAAO;AAAA,EACT;AAEA,SAAOC,EAA0BH,CAAI;AACvC;AAEO,SAASI,GACdC,GACAC,GACAC,IAAW,MACXC,GACsB;AACtB,SAAKH,GAAO,SAISI,GAA+BJ,GAAOC,GAAiB,UAAUE,CAAkB,EAEpF,OAA6B,CAACE,GAAMV,MAAS;AAC/D,UAAMW,IAASZ,GAAiBC,CAAI;AACpC,WAAKW,KAILD,EAAK,KAAK;AAAA,MACR,KAAKV,EAAK;AAAA,MACV,OAAOY,GAAqBZ,EAAK,OAAOO,CAAQ;AAAA,MAChD,MAAMP,EAAK;AAAA,MACX,QAAAW;AAAA,MACA,gBAAgBX,EAAK;AAAA,IAAA,CACtB,GAEMU;AAAA,EACT,GAAG,CAAA,CAAE,IApBI,CAAA;AAqBX;ACnBA,SAASG,EAAgBC,GAAyC;AAChE,QAAMC,IAAkC,CAAA;AACxC,aAAI,gBAAgBD,CAAM,EAAE,QAAQ,CAAC9C,GAAOgD,MAAQ;AAClD,IAAAD,EAAOC,CAAG,IAAIC,GAAe,mBAAmBjD,CAAK;AAAA,EACvD,CAAC,GACM+C;AACT;AAEA,SAASG,EAAeC,GAAkBC,GAA+C;AACvF,QAAMC,IAAWF,EAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AACnD,WAASG,IAAQD,EAAS,SAAS,GAAGC,KAAS,GAAGA,KAAS,GAAG;AAC5D,UAAMC,IAAY,mBAAmBF,EAASC,CAAK,CAAC;AACpD,QAAIF,EAAMG,CAAS,EAAG,QAAOA;AAAA,EAC/B;AACA,SAAO;AACT;AAEA,SAASC,EAAeC,GAAoBd,GAAgBe,IAAkC,CAAA,GAAY;AACxG,QAAMC,IAAQC,GAAkCF,CAAM;AACtD,SAAO,IAAI,mBAAmBD,CAAU,CAAC,IAAI,mBAAmBd,CAAM,CAAC,GAAGgB,IAAQ,IAAIA,CAAK,KAAK,EAAE;AACpG;AAEA,SAASE,GAAe;AAAA,EACtB,OAAAxB;AAAA,EACA,cAAAyB;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,YAAAC;AAAA,EACA,cAAAC;AACF,GAOG;AACD,SACE,gBAAAhE,EAAC,OAAA,EAAI,WAAW8D,MAAU,IAAI,cAAc,kBACzC,UAAA3B,EAAM,IAAI,CAACL,MAAS;AACnB,UAAMmC,IAAehC,EAA0BH,CAAI,GAC7CoC,IAAc,GAAQD,MAAiB,CAACnC,EAAK,UAAU,UAAUA,EAAK,cACtEqC,IAASF,MAAiBL,GAC1BQ,IAAQJ,EAAalC,EAAK,KAAK;AACrC,6BACG,OAAA,EACC,UAAA;AAAA,MAAA,gBAAAuC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAOR,IAAYO,IAAQ;AAAA,UAC3B,UAAU,CAACF;AAAA,UACX,SAAS,MAAMA,KAAeH,EAAWjC,CAAI;AAAA,UAC7C,WAAWwC;AAAA,YACT;AAAA,YACAT,IAAY,wBAAwB;AAAA,YACpCM,IACI,uCACAD,IACE,uEACA;AAAA,UAAA;AAAA,UAER,OAAO,CAACL,KAAaC,IAAQ,IAAI,EAAE,aAAa,GAAG,KAAKA,IAAQ,EAAE,KAAA,IAAS;AAAA,UAC3E,gBAAcK,IAAS,SAAS;AAAA,UAEhC,UAAA;AAAA,YAAA,gBAAAnE,EAAC,QAAA,EAAK,WAAU,YACb,UAAAuE,GAAiBzC,EAAK,SAASA,EAAK,UAAU,SAAS,WAAW,gBAAgB,SAAS,GAC9F;AAAA,YACC,CAAC+B,KAAa,gBAAA7D,EAAC,QAAA,EAAK,WAAU,oBAAoB,UAAAoE,EAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAE1D,CAACP,KAAa/B,EAAK,UAAU,SAC5B,gBAAA9B;AAAA,QAAC2D;AAAA,QAAA;AAAA,UACC,OAAO7B,EAAK;AAAA,UACZ,cAAA8B;AAAA,UACA,WAAW;AAAA,UACX,OAAOE,IAAQ;AAAA,UACf,YAAAC;AAAA,UACA,cAAAC;AAAA,QAAA;AAAA,MAAA,IAEA;AAAA,IAAA,EAAA,GAhCIlC,EAAK,GAiCf;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;AAEA,SAAS0C,KAAkB;AACzB,QAAM,EAAE,MAAAxD,EAAA,IAASyD,GAAA,GACXzG,IAAS,OAAO,WAAa,OAAe,SAAS,gBAAgB,UAAU,SAAS,MAAM,GAC9F0G,IAAiB,MAAM;AAC3B,UAAMzF,IAAO+B,EAAK,SAAS,WAAW,IAAI,IAAI,OAAO;AACrD,iBAAa,QAAQ,cAAc/B,CAAI,GAClC+B,EAAK,eAAe/B,CAAI;AAAA,EAC/B,GACM0F,IAAc,MAAMC,GAAS5G,IAAS,UAAU,MAAM;AAE5D,SACE,gBAAAqG,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAASK;AAAA,QACT,WAAU;AAAA,QAEV,UAAA;AAAA,UAAA,gBAAA1E,EAAC6E,IAAA,EAAO,WAAU,UAAA,CAAU;AAAA,UAC5B,gBAAA7E,EAAC,UAAM,UAAAgB,EAAK,SAAS,WAAW,IAAI,IAAI,YAAY,KAAA,CAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAE3D,gBAAAqD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAASM;AAAA,QACT,WAAU;AAAA,QAET,UAAA;AAAA,UAAA3G,IAAS,gBAAAgC,EAAC8E,MAAI,WAAU,UAAA,CAAU,IAAK,gBAAA9E,EAAC+E,IAAA,EAAK,WAAU,UAAA,CAAU;AAAA,UAClE,gBAAA/E,EAAC,QAAA,EAAM,UAAAhC,IAAS,UAAU,OAAA,CAAO;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACnC,GACF;AAEJ;AAEA,SAASgH,GAAiB;AAAA,EACxB,OAAA7C;AAAA,EACA,cAAAyB;AAAA,EACA,YAAAG;AACF,GAIG;AACD,QAAM,EAAE,UAAA1B,EAAA,IAAa4C,GAAA,GACfzC,IAAOzC,EAAQ,MAAMmC,GAA2BC,GAAO,MAAME,CAAQ,GAAG,CAACF,GAAOE,CAAQ,CAAC;AAC/F,SAAIG,EAAK,WAAW,IAAU,OAG5B,gBAAAxC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,cAAW;AAAA,MACX,WAAU;AAAA,MACV,OAAO,EAAE,eAAe,iDAAA;AAAA,MAExB,4BAAC,OAAA,EAAI,WAAU,2BACZ,UAAAwC,EAAK,IAAI,CAAC0C,MAAQ;AACjB,cAAMf,IAASe,EAAI,WAAWtB;AAC9B,eACE,gBAAAS;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,cAAYa,EAAI;AAAA,YAChB,gBAAcf,IAAS,SAAS;AAAA,YAChC,SAAS,MAAMJ,EAAWmB,EAAI,QAAQA,EAAI,KAAKA,EAAI,cAAc;AAAA,YACjE,WAAWZ;AAAA,cACT;AAAA,cACAH,IAAS,yCAAyC;AAAA,YAAA;AAAA,YAGnD,UAAA;AAAA,cAAAe,EAAI,OAAOX,GAAiBW,EAAI,MAAM,kBAAkB,IAAI;AAAA,cAC7D,gBAAAlF,EAAC,QAAA,EAAK,WAAU,8DAA8D,YAAI,MAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAXnFkF,EAAI;AAAA,QAAA;AAAA,MAcf,CAAC,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN;AAGO,SAASC,GAAiB;AAAA,EAC/B,YAAA5B;AAAA,EACA,QAAA6B;AAAA,EACA,MAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,qBAAAC,IAAsB;AAAA,EACtB,YAAAC;AACF,GAA0B;AACxB,QAAMC,IAAWC,GAAA,GACXC,IAAWC,GAAA,GACXpF,IAAWC,GAAA,GACX,EAAE,aAAAoF,EAAA,IAAgBC,GAAA,GAClBzD,IAAqB0D,GAAsBrD,EAAgB+C,EAAS,MAAM,CAAC,GAC3E,EAAE,mBAAAO,GAAmB,sBAAAvD,EAAA,IAAyBuC,GAAA,GAC9C/B,IAAQkC,EAAO,SAAS,CAAA,GACxBc,IAAqBD,EAAkBb,EAAO,SAA+C,GAC7Fe,IAAkBD,GAAoB,YAAY,SAAS,CAAA,GAC3DE,IAAoBrG;AAAA,IACxB,MAAMwC;AAAA,MACJ4D;AAAA,MACAL,GAAa;AAAA,MACbrF,EAAS,WAAW,WAAW;AAAA,MAC/B6B;AAAA,IAAA;AAAA,IAEF,CAACwD,GAAa,IAAIK,GAAiB1F,EAAS,UAAU6B,CAAkB;AAAA,EAAA,GAGpE+D,IAAUtG;AAAA,IACd,MAAMuG,GAA+BJ,GAAoBhD,GAAO4C,GAAa,IAAI,EAAE,oBAAAxD,GAAoB;AAAA,IACvG,CAACwD,GAAa,IAAII,GAAoBhD,GAAOZ,CAAkB;AAAA,EAAA,GAE3DsB,IAAeZ,EAAe0C,EAAS,UAAUxC,CAAK,KACvDmD,GAAS,UACT,OAAO,KAAKnD,CAAK,EAAE,CAAC,KACpB,IAECqD,IAAW9G,EAAY,CAACgD,GAAgBe,IAAkC,CAAA,MAAO;AACrF,IAAKN,EAAMT,CAAM,KACjBmD,EAAStC,EAAeC,GAAYd,GAAQe,CAAM,CAAC;AAAA,EACrD,GAAG,CAACD,GAAYqC,GAAU1C,CAAK,CAAC,GAE1BsD,IAAW/G,EAAY,CAACqC,MAAyB;AACrD,UAAMW,IAASR,EAA0BH,CAAI;AAC7C,IAAKW,KACL8D,EAAS9D,GAAQ,EAAE,GAAIX,EAAK,kBAAkB,CAAA,GAAK,MAAMA,EAAK,KAAK;AAAA,EACrE,GAAG,CAACyE,CAAQ,CAAC;AAEb,EAAApI,EAAU,MAAM;AACd,IAAI6E,EAAe0C,EAAS,UAAUxC,CAAK,KAAK,CAACU,KACjDgC,EAAStC,EAAeC,GAAYK,GAAcyC,IAAU1D,EAAgB0D,EAAQ,WAAW,IAAI,CAAA,CAAE,GAAG,EAAE,SAAS,IAAM;AAAA,EAC3H,GAAG,CAACzC,GAAcL,GAAY8C,GAASX,EAAS,UAAUE,GAAU1C,CAAK,CAAC,GAE1E/E,EAAU,MAAM;AACd,UAAMsI,IAAW,CAACC,MAAiB;AACjC,YAAMC,IAAUD,EAA+C,UAAU,CAAA,GACnEjE,KAAS,OAAOkE,EAAO,UAAW,WAAWA,EAAO,SAAS,IAC7DnD,KAASmD,EAAO,aAAa,OAAOA,EAAO,aAAc,WAC3DA,EAAO,YACP,CAAA;AACJ,MAAAJ,EAAS9D,IAAQe,EAAM;AAAA,IACzB;AACA,kBAAO,iBAAiB,sBAAsBiD,CAAQ,GAC/C,MAAM,OAAO,oBAAoB,sBAAsBA,CAAQ;AAAA,EACxE,GAAG,CAACF,CAAQ,CAAC;AAEb,QAAMK,IAAa1D,EAAMU,CAAY,GAC/BsB,IAAM0B,IAAa,CAAC;AAAA,IACxB,IAAI,GAAGhD,CAAY,IAAI8B,EAAS,MAAM;AAAA,IACtC,QAAQ9B;AAAA,IACR,OAAOgD,EAAW;AAAA,IAClB,UAAU;AAAA,IACV,YAAAA;AAAA,IACA,WAAW;AAAA,IACX,WAAWjE,EAAgB+C,EAAS,MAAM;AAAA,EAAA,CAC3C,IAAI,CAAA,GACCmB,IAAUxB,KAAQD,EAAO,QAAQc,GAAoB,SAAS3C,GAC9DuD,IACJ,gBAAA9G,EAAC,OAAA,EAAI,WAAU,0EACb,UAAA,gBAAAA;AAAA,IAAC+G;AAAA,IAAA;AAAA,MACC,MAAM7B;AAAA,MACN,aAAaA,EAAI,CAAC,GAAG,MAAM;AAAA,MAC3B,WAAWgB;AAAA,MACX,YAAAT;AAAA,IAAA;AAAA,EAAA,GAEJ;AAGF,SACE,gBAAApB,EAAA2C,IAAA,EACE,UAAA;AAAA,IAAA,gBAAAhH,EAACiH,IAAA,EAAmB,YAAA1D,GAAwB,qBAAA+B,EAAA,CAA0C;AAAA,IACrF7E,EAAS,WACR,gBAAA4D,EAAC,OAAA,EAAI,WAAU,iFACb,UAAA;AAAA,MAAA,gBAAArE,EAAC,OAAA,EAAI,WAAU,kBAAkB,UAAA8G,GAAQ;AAAA,MACzC,gBAAA9G;AAAA,QAACgF;AAAA,QAAA;AAAA,UACC,OAAOoB;AAAA,UACP,cAAAxC;AAAA,UACA,YAAY,CAACnB,GAAQK,GAAKU,MAAW+C,EAAS9D,GAAQ,EAAE,GAAIe,KAAU,IAAK,MAAMV,GAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IACxF,EAAA,CACF,IAEA,gBAAA9C;AAAA,MAACkH;AAAA,MAAA;AAAA,QACC,aAAW;AAAA,QACX,YAAY,GAAG3D,CAAU;AAAA,QACzB,cAAa;AAAA,QACb,eAAe,CAACM,MACd,gBAAAQ,EAAC,OAAA,EAAI,WAAWC,EAAG,6BAA6BT,IAAY,mBAAmB,OAAO,GACpF,UAAA;AAAA,UAAA,gBAAA7D,EAAC,QAAA,EAAK,WAAU,mHACb,UAAAuF,MAAeW,GAAoB,OAChC,gBAAAlG,EAAC,SAAI,KAAKkG,EAAmB,MAAM,KAAI,IAAG,WAAU,6BAAA,CAA6B,sBAChFiB,IAAA,EAAc,WAAU,WAAU,GAAA,CACzC;AAAA,UACC,CAACtD,KAAa,gBAAA7D,EAAC,QAAA,EAAK,WAAU,kDAAkD,UAAA6G,EAAA,CAAQ;AAAA,QAAA,GAC3F;AAAA,QAEF,YAAY,CAAChD,MACX,gBAAA7D;AAAA,UAAC2D;AAAA,UAAA;AAAA,YACC,OAAOyC;AAAA,YACP,cAAAxC;AAAA,YACA,WAAAC;AAAA,YACA,YAAY2C;AAAA,YACZ,cAAc9D;AAAA,UAAA;AAAA,QAAA;AAAA,QAGlB,eAAe8C,IAAsB,CAAC3B,MAAcA,IAAY,OAAO,gBAAA7D,EAACwE,MAAgB,IAAK;AAAA,QAE5F,UAAAsC;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GAEJ;AAEJ;AChUA,MAAMM,KAAgB,CAACtH,MAAkB,iBAAiB,KAAKA,CAAK;AAEpE,SAASuH,EAAWC,GAAcC,GAAsB;AACtD,MAAIH,GAAcG,CAAI,EAAG,QAAOA;AAChC,QAAMC,IAAiBF,EAAK,QAAQ,QAAQ,EAAE,GACxCG,IAAiBF,EAAK,WAAW,GAAG,IAAIA,IAAO,IAAIA,CAAI;AAC7D,SAAO,GAAGC,CAAc,GAAGC,CAAc;AAC3C;AAEA,SAASC,GAAaC,GAAanE,GAA0C;AAC3E,MAAI,CAACA,KAAU,OAAO,KAAKA,CAAM,EAAE,WAAW,EAAG,QAAOmE;AACxD,QAAMC,IAAS,IAAI,IAAID,GAAK,OAAO,SAAW,MAAc,qBAAqB,OAAO,SAAS,MAAM;AACvG,gBAAO,QAAQnE,CAAM,EAAE,QAAQ,CAAC,CAACV,GAAKhD,CAAK,MAAM;AAC/C,IAA2BA,KAAU,QACrC8H,EAAO,aAAa,OAAO9E,GAAK,OAAOhD,CAAK,CAAC;AAAA,EAC/C,CAAC,GACMsH,GAAcO,CAAG,IAAIC,EAAO,aAAa,GAAGA,EAAO,QAAQ,GAAGA,EAAO,MAAM,GAAGA,EAAO,IAAI;AAClG;AAEA,SAASC,EAAYC,GAA8BhF,GAA4B;AAC7E,MAAI;AACF,WAAOgF,GAAS,QAAQhF,CAAG,KAAK;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASiF,EACPC,GACAC,GACuE;AACvE,QAAMC,IAASD,KAAW,OAAOA,KAAY,WAAWA,IAAqC,QACvFrI,IAAU,OAAOsI,GAAQ,WAAY,WACvCA,EAAO,UACP,OAAOD,KAAY,YAAYA,EAAQ,SACrCA,IACAD,EAAS,cAAc,QAAQA,EAAS,MAAM;AACpD,SAAO,OAAO,OAAO,IAAI,MAAMpI,CAAO,GAAG;AAAA,IACvC,MAAMoI,EAAS;AAAA,IACf,UAAU,EAAE,QAAQA,EAAS,QAAQ,MAAMC,EAAA;AAAA,EAAQ,CACpD;AACH;AAOO,SAASE,GACdC,IAA6C,IACxB;AACrB,QAAMC,IAAqBC,GAAA,GACrBC,IAAiBH,EAAQ,SACzBI,IAAc,OAAOD,KAAmB,aAC1CA,IACA,MAAMA,GAAgB,KAAA,KAAUF,EAAA,GAC9BI,IAAkBL,EAAQ,mBAAmB,SAC7CM,IAAqBN,EAAQ,sBAAsB,cACnDO,wBAA4B,IAAA,GAE5BC,IAAuB,OAC3BC,GACAC,MACoB;AACpB,UAAMC,IAAQF,EAAO,MAAM,wCAAwC;AACnE,QAAI,CAACE,KAAS,CAACX,EAAQ,sBAAuB,QAAOS;AACrD,UAAMG,IAAW,mBAAmBD,EAAM,CAAC,CAAC,GACtCE,IAAuBb,EAAQ,wBAAwBY,CAAQ;AACrE,QAAI,CAACC,EAAsB,QAAOJ;AAElC,QAAIK,IAAaP,EAAsB,IAAIK,CAAQ;AACnD,IAAKE,MACHA,KAAc,YAAY;AACxB,YAAM1F,IAAS,IAAI,gBAAgB;AAAA,QACjC,uBAAuB4E,EAAQ,yBAAyB;AAAA,QACxD,sBAAAa;AAAA,MAAA,CACD,GACKjB,IAAW,MAAM;AAAA,QACrBX,EAAWmB,EAAA,GAAe,gCAAgChF,CAAM,EAAE;AAAA,QAClE,EAAE,SAAAsF,GAAS,aAAa,cAAA;AAAA,MAAc,GAElCb,IAAU,MAAMD,EAAS,KAAA,GAIzBmB,IAAelB,EAAQ,MAAM;AACnC,UAAI,CAACD,EAAS,MAAM,CAACmB,EAAc,OAAMpB,EAAcC,GAAUC,CAAO;AACxE,aAAOkB;AAAA,IACT,GAAA,GACAR,EAAsB,IAAIK,GAAUE,CAAU;AAGhD,QAAI;AACF,YAAMC,IAAe,MAAMD;AAC3B,aAAOL,EAAO,QAAQE,EAAM,CAAC,GAAG,mBAAmBI,CAAY,CAAC;AAAA,IAClE,SAASC,GAAO;AACd,YAAAT,EAAsB,OAAOK,CAAQ,GAC/BI;AAAA,IACR;AAAA,EACF;AAuEA,SAAO;AAAA,IACL,SAtEc,OAAoB;AAAA,MAClC,KAAAzB;AAAA,MACA,QAAA0B;AAAA,MACA,MAAAC;AAAA,MACA,QAAA9F;AAAA,MACA,SAAS+F;AAAA,MACT,cAAAC,IAAe;AAAA,MACf,QAAAC;AAAA,IAAA,MACyD;AACzD,YAAMX,IAAU,IAAI,QAAQS,CAAe,GACrCG,IAAQ,OAAO,eAAiB,MAClC,OACA7B,EAAY,cAAcY,CAAe,GACvCpG,IAAW,OAAO,eAAiB,MACrC,OACAwF,EAAY,cAAca,CAAkB;AAEhD,MAAIgB,KAAS,CAACZ,EAAQ,IAAI,eAAe,KAAGA,EAAQ,IAAI,iBAAiB,UAAUY,CAAK,EAAE,GACtFrH,KAAY,CAACyG,EAAQ,IAAI,YAAY,KAAGA,EAAQ,IAAI,cAAczG,CAAQ;AAC9E,YAAMsH,IAAc,MAAMf,EAAqBjB,GAAKmB,CAAO,GACrDc,IAAWlC,GAAaL,EAAWmB,KAAemB,CAAW,GAAGnG,CAAM,GAEtEqG,IAAa,OAAO,WAAa,OAAeP,aAAgB;AACtE,MAAIA,MAAS,UAAa,CAACO,KAAc,CAACf,EAAQ,IAAI,cAAc,KAClEA,EAAQ,IAAI,gBAAgB,kBAAkB,GAE5Ce,KAAYf,EAAQ,OAAO,cAAc;AAE7C,YAAMd,IAAW,MAAM,MAAM4B,GAAU;AAAA,QACrC,QAAAP;AAAA,QACA,SAAAP;AAAA,QACA,QAAAW;AAAA,QACA,aAAa;AAAA,QACb,MAAMH,MAAS,SACX,SACAO,KAAc,OAAOP,KAAS,YAAYA,aAAgB,OACxDA,IACA,KAAK,UAAUA,CAAI;AAAA,MAAA,CAC1B;AAED,UAAIrB;AACJ,UAAIuB,MAAiB;AACnB,QAAAvB,IAAU,MAAMD,EAAS,KAAA;AAAA,eAChBwB,MAAiB;AAC1B,QAAAvB,IAAU,MAAMD,EAAS,KAAA;AAAA,WACpB;AACL,cAAM8B,IAAO,MAAM9B,EAAS,KAAA;AAC5B,YAAI;AACF,UAAAC,IAAU6B,IAAO,KAAK,MAAMA,CAAI,IAAI;AAAA,QACtC,QAAQ;AACN,UAAA7B,IAAU6B;AAAA,QACZ;AAAA,MACF;AAEA,UAAI,CAAC9B,EAAS,GAAI,OAAMD,EAAcC,GAAUC,CAAO;AAEvD,aAAIA,KAAW,OAAOA,KAAY,YAAY,aAAaA,IAClDA,IAGF;AAAA,QACL,SAAS;AAAA,QACT,MAAMA;AAAA,QACN,MAAMD,EAAS;AAAA,QACf,SAASA,EAAS,cAAc;AAAA,QAChC,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,MAAY;AAAA,IAEtC;AAAA,IAIE,SAAST,GAAMwC,GAAmB;AAChC,MAAIA,GAAmB,UAAS,OAAO,QAAQ,aAAaA,EAAkB,OAAO,IAAIxC,CAAI,WACjF,QAAQ,UAAUwC,GAAmB,OAAO,IAAIxC,CAAI,GAChE,OAAO,cAAc,IAAI,cAAc,UAAU,CAAC;AAAA,IACpD;AAAA,IACA,SAAS,OAAO,eAAiB,MAAc,SAAY;AAAA,EAAA;AAE/D;"}
|