@brainst0rm/cli 0.13.0 → 0.14.0
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/{App-SSKWB7CT.js → App-HGJSYIVS.js} +133 -62
- package/dist/App-HGJSYIVS.js.map +1 -0
- package/dist/{App-DPXJYXKH.js → App-XCJW3A4I.js} +133 -62
- package/dist/App-XCJW3A4I.js.map +1 -0
- package/dist/brainstorm.js +1428 -150
- package/dist/brainstorm.js.map +1 -1
- package/dist/{chunk-7D4SUZUM.js → chunk-PR4QN5HX.js} +6 -1
- package/dist/{chunk-ZWE3DS7E.js → chunk-SEGVTWSK.js} +6 -1
- package/dist/{chunk-5NA3GH6X.js → chunk-WYQU3HAB.js} +175 -10
- package/dist/chunk-WYQU3HAB.js.map +1 -0
- package/dist/{chunk-55ITCWZZ.js → chunk-Z2QIGVYT.js} +175 -10
- package/dist/chunk-Z2QIGVYT.js.map +1 -0
- package/dist/{dist-GNHTH2DH.js → dist-3BC75XHW.js} +2 -2
- package/dist/dist-42TQFHMB.js +1640 -0
- package/dist/dist-42TQFHMB.js.map +1 -0
- package/dist/dist-BULARAL3.js +7308 -0
- package/dist/dist-BULARAL3.js.map +1 -0
- package/dist/{dist-JUDVPE7G.js → dist-ET6CSS7O.js} +2 -2
- package/dist/{dist-DUDO3RDM.js → dist-GVK5Q4YK.js} +62 -16
- package/dist/{dist-V5DTSTKJ.js.map → dist-GVK5Q4YK.js.map} +1 -1
- package/dist/{dist-V5DTSTKJ.js → dist-K7BDAMTO.js} +62 -16
- package/dist/{dist-DUDO3RDM.js.map → dist-K7BDAMTO.js.map} +1 -1
- package/dist/{dist-WLTQTLFO.js → dist-OYQTULIU.js} +2 -2
- package/dist/dist-S5JYXFUW.js +7307 -0
- package/dist/dist-S5JYXFUW.js.map +1 -0
- package/dist/{dist-YIGU37Q2.js → dist-Y25MC2VO.js} +2 -2
- package/dist/dist-Z4SBSK4Q.js +1639 -0
- package/dist/dist-Z4SBSK4Q.js.map +1 -0
- package/dist/index.js +1428 -150
- package/dist/index.js.map +1 -1
- package/dist/mcp-server-CROPNYHI.js +4252 -0
- package/dist/mcp-server-CROPNYHI.js.map +1 -0
- package/dist/mcp-server-IJVEG6CS.js +4251 -0
- package/dist/mcp-server-IJVEG6CS.js.map +1 -0
- package/dist/{recorder-D6ILEOZP.js → recorder-33N4U6TO.js} +2 -2
- package/dist/{recorder-SPYYF4DL.js → recorder-APOOXJYA.js} +2 -2
- package/dist/{roles-2DGF4PZU.js → roles-GKDCLP5G.js} +2 -2
- package/dist/{roles-UIPX7GBC.js → roles-UUIISXEW.js} +2 -2
- package/dist/{slash-PDWKCZOQ.js → slash-4XSR3SJD.js} +3 -3
- package/dist/{slash-ZDC4DKL4.js → slash-CVWH3LTR.js} +3 -3
- package/package.json +4 -2
- package/dist/App-DPXJYXKH.js.map +0 -1
- package/dist/App-SSKWB7CT.js.map +0 -1
- package/dist/chunk-55ITCWZZ.js.map +0 -1
- package/dist/chunk-5NA3GH6X.js.map +0 -1
- /package/dist/{chunk-7D4SUZUM.js.map → chunk-PR4QN5HX.js.map} +0 -0
- /package/dist/{chunk-ZWE3DS7E.js.map → chunk-SEGVTWSK.js.map} +0 -0
- /package/dist/{dist-GNHTH2DH.js.map → dist-3BC75XHW.js.map} +0 -0
- /package/dist/{dist-JUDVPE7G.js.map → dist-ET6CSS7O.js.map} +0 -0
- /package/dist/{dist-WLTQTLFO.js.map → dist-OYQTULIU.js.map} +0 -0
- /package/dist/{dist-YIGU37Q2.js.map → dist-Y25MC2VO.js.map} +0 -0
- /package/dist/{recorder-D6ILEOZP.js.map → recorder-33N4U6TO.js.map} +0 -0
- /package/dist/{recorder-SPYYF4DL.js.map → recorder-APOOXJYA.js.map} +0 -0
- /package/dist/{roles-2DGF4PZU.js.map → roles-GKDCLP5G.js.map} +0 -0
- /package/dist/{roles-UIPX7GBC.js.map → roles-UUIISXEW.js.map} +0 -0
- /package/dist/{slash-PDWKCZOQ.js.map → slash-4XSR3SJD.js.map} +0 -0
- /package/dist/{slash-ZDC4DKL4.js.map → slash-CVWH3LTR.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/App.tsx","../src/hooks/useMode.ts","../src/hooks/useBRData.ts","../src/components/ModeBar.tsx","../src/components/KeyHint.tsx","../src/components/ChatApp.tsx","../src/components/MessageList.tsx","../src/components/TaskList.tsx","../src/components/StreamingMessage.tsx","../src/components/ToolCallDisplay.tsx","../src/components/SelectPrompt.tsx","../src/components/Autocomplete.tsx","../src/keybindings.ts","../src/input-history.ts","../src/components/modes/DashboardMode.tsx","../src/components/viz/Gauge.tsx","../src/components/viz/Sparkline.tsx","../src/theme.ts","../src/components/modes/ModelsMode.tsx","../src/components/modes/ConfigMode.tsx","../src/components/modes/PlanningMode.tsx","../src/components/planning/PlanTree.tsx","../src/components/ShortcutOverlay.tsx"],"sourcesContent":["/**\n * Top-level App — Mode switcher for the multi-pane TUI.\n *\n * Renders ModeBar + active mode content + KeyHint.\n * Mode 1 (Chat) delegates to ChatApp. Other modes are dashboard views.\n */\n\nimport React, { useState, useRef } from \"react\";\nimport { Box, useApp, useInput } from \"ink\";\nimport { useMode, type TUIMode } from \"../hooks/useMode.js\";\nimport { useBRData } from \"../hooks/useBRData.js\";\nimport { ModeBar } from \"./ModeBar.js\";\nimport { KeyHint } from \"./KeyHint.js\";\nimport { ChatApp } from \"./ChatApp.js\";\nimport { DashboardMode } from \"./modes/DashboardMode.js\";\nimport { ModelsMode } from \"./modes/ModelsMode.js\";\nimport { ConfigMode } from \"./modes/ConfigMode.js\";\nimport { PlanningMode } from \"./modes/PlanningMode.js\";\nimport { ShortcutOverlay } from \"./ShortcutOverlay.js\";\nimport type { AgentEvent, AgentTask } from \"@brainst0rm/shared\";\n\ninterface AppProps {\n // Chat mode props (passed through to ChatApp)\n strategy: string;\n modelCount: { local: number; cloud: number };\n onSendMessage: (text: string) => AsyncGenerator<AgentEvent>;\n onAbort?: () => void;\n slashCallbacks?: any;\n // Data for other modes\n models?: Array<{\n id: string;\n name: string;\n provider: string;\n qualityTier: number;\n speedTier: number;\n pricing: { input: number; output: number };\n status: string;\n }>;\n configInfo?: {\n strategy: string;\n permissionMode: string;\n outputStyle: string;\n sandbox: string;\n };\n vaultInfo?: {\n exists: boolean;\n isOpen: boolean;\n keyCount: number;\n keys: string[];\n createdAt: string | null;\n opAvailable: boolean;\n resolvedKeys: string[];\n };\n /** BrainstormRouter gateway client for dashboard data */\n gateway?: any;\n /** Memory info for Config mode */\n memoryInfo?: { localCount: number; types: Record<string, number> };\n /** God Mode connection data for Dashboard */\n godModeInfo?: {\n connectedSystems: Array<{\n name: string;\n displayName: string;\n capabilities: string[];\n latencyMs: number;\n toolCount: number;\n }>;\n errors: Array<{ name: string; error: string }>;\n totalTools: number;\n };\n}\n\ninterface RoutingEntry {\n model: string;\n strategy: string;\n reason: string;\n timestamp: number;\n}\n\ninterface ToolStat {\n name: string;\n calls: number;\n successes: number;\n lastDuration?: number;\n}\n\nexport function App(props: AppProps) {\n const { exit } = useApp();\n const { mode, setMode, cycleMode, setModeByKey } = useMode(\"chat\");\n const [sessionCost, setSessionCost] = useState(0);\n const [tokenCount, setTokenCount] = useState({ input: 0, output: 0 });\n const [currentModel, setCurrentModel] = useState<string | undefined>();\n const [currentRole, setCurrentRole] = useState<string | undefined>();\n const [isProcessing, setIsProcessing] = useState(false);\n const [routingHistory, setRoutingHistory] = useState<RoutingEntry[]>([]);\n const [toolStats, setToolStats] = useState<Map<string, ToolStat>>(new Map());\n const [turnCount, setTurnCount] = useState(0);\n const [sessionStart] = useState(Date.now());\n const { data: brData, refresh: refreshBR } = useBRData(props.gateway ?? null);\n const [lastCtrlD, setLastCtrlD] = useState(0);\n const [guardianStatus, setGuardianStatus] = useState<string | undefined>();\n const [showShortcuts, setShowShortcuts] = useState(false);\n const abortTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Global key handler for mode switching\n //\n // Pattern: Escape toggles between Chat and other modes.\n // In Chat: Escape (when idle) → Dashboard. Escape (when processing) → abort.\n // In other modes: Escape → Chat. Number keys 1-4 switch modes. Arrows navigate.\n useInput((input, key) => {\n if (key.escape) {\n if (mode === \"chat\") {\n // In chat: Escape while processing aborts; while idle opens dashboard\n if (isProcessing) {\n props.onAbort?.();\n if (abortTimeoutRef.current) clearTimeout(abortTimeoutRef.current);\n abortTimeoutRef.current = setTimeout(() => {\n setIsProcessing(false);\n abortTimeoutRef.current = null;\n }, 5000);\n } else {\n setMode(\"dashboard\");\n }\n } else {\n // In any other mode: Escape returns to chat\n setMode(\"chat\");\n }\n return;\n }\n\n // ? shows shortcut overlay (from any non-chat mode)\n if (input === \"?\" && mode !== \"chat\") {\n setShowShortcuts(true);\n return;\n }\n\n // In non-chat modes: number keys switch modes, Tab cycles, r refreshes\n if (mode !== \"chat\") {\n if (setModeByKey(input)) return;\n if (key.tab) {\n cycleMode();\n return;\n }\n if (input === \"r\" && mode === \"dashboard\") {\n refreshBR();\n return;\n }\n }\n\n // Ctrl+D: double-press within 2s to exit\n if (input === \"d\" && key.ctrl) {\n const now = Date.now();\n if (lastCtrlD > 0 && now - lastCtrlD < 2000) {\n exit();\n } else {\n setLastCtrlD(now);\n }\n return;\n }\n });\n\n const termHeight = process.stdout.rows || 24;\n\n // Wrap ChatApp's callbacks to capture shared state\n const wrappedSlashCallbacks = {\n ...props.slashCallbacks,\n gateway: props.gateway,\n setModel: (model: string) => {\n props.slashCallbacks?.setModel?.(model);\n const name = model.split(\"/\").pop() ?? model;\n setCurrentModel(name);\n },\n setActiveRole: (role: string | undefined) => {\n props.slashCallbacks?.setActiveRole?.(role);\n setCurrentRole(role);\n },\n };\n\n // Wrap onSendMessage to capture cost/token updates\n function wrappedSendMessage(text: string): AsyncGenerator<AgentEvent> {\n const gen = props.onSendMessage(text);\n let lastRequestId: string | undefined;\n let lastModelUsed: string | undefined;\n\n return (async function* () {\n setIsProcessing(true);\n try {\n for await (const event of gen) {\n // Capture shared state from events\n if (event.type === \"routing\") {\n lastModelUsed =\n event.decision.model.id ?? event.decision.model.name;\n setCurrentModel(event.decision.model.name);\n setRoutingHistory((prev) => [\n {\n model: event.decision.model.name,\n strategy: event.decision.strategy,\n reason: event.decision.reason,\n timestamp: Date.now(),\n },\n ...prev.slice(0, 9),\n ]);\n }\n if (event.type === \"tool-call-start\") {\n setToolStats((prev) => {\n const next = new Map(prev);\n const existing = next.get(event.toolName) ?? {\n name: event.toolName,\n calls: 0,\n successes: 0,\n };\n next.set(event.toolName, {\n ...existing,\n calls: existing.calls + 1,\n });\n return next;\n });\n }\n if (event.type === \"tool-call-result\") {\n setToolStats((prev) => {\n const next = new Map(prev);\n const existing = next.get(event.toolName);\n if (existing) {\n next.set(event.toolName, {\n ...existing,\n successes: existing.successes + 1,\n });\n }\n return next;\n });\n }\n // Capture gateway feedback: request ID + live cost + guardian status\n if (event.type === \"gateway-feedback\") {\n lastRequestId = (event as any).feedback?.requestId;\n const actualCost = (event as any).feedback?.actualCost;\n if (typeof actualCost === \"number\" && actualCost > 0) {\n setSessionCost((prev) => Math.max(prev, actualCost));\n }\n const guardian = (event as any).feedback?.guardianStatus;\n if (guardian) setGuardianStatus(guardian);\n }\n if (event.type === \"done\") {\n setSessionCost(event.totalCost);\n if (event.totalTokens) setTokenCount(event.totalTokens);\n setTurnCount((prev) => prev + 1);\n // Auto-report outcome to BR for routing improvement\n if (props.gateway && lastRequestId) {\n props.gateway\n .reportOutcome(lastRequestId, {\n success: true,\n signals: {},\n model_used: lastModelUsed,\n })\n .catch(() => {}); // fire-and-forget\n }\n }\n yield event;\n }\n } finally {\n setIsProcessing(false);\n }\n })();\n }\n\n return (\n <Box flexDirection=\"column\" height={termHeight}>\n <ModeBar\n activeMode={mode}\n model={currentModel}\n cost={sessionCost}\n role={currentRole}\n guardianStatus={guardianStatus}\n />\n\n {/* ChatApp is always mounted to preserve conversation state.\n Hidden via display:none when other modes are active. */}\n <Box\n flexDirection=\"column\"\n flexGrow={mode === \"chat\" ? 1 : 0}\n display={mode === \"chat\" ? \"flex\" : \"none\"}\n >\n <ChatApp\n strategy={props.strategy}\n modelCount={props.modelCount}\n onSendMessage={wrappedSendMessage}\n onAbort={props.onAbort}\n isActive={mode === \"chat\"}\n slashCallbacks={wrappedSlashCallbacks}\n />\n </Box>\n\n {mode === \"dashboard\" && (\n <DashboardMode\n sessionCost={sessionCost}\n tokenCount={tokenCount}\n modelCount={props.modelCount}\n routingHistory={routingHistory}\n toolStats={Array.from(toolStats.values())}\n turnCount={turnCount}\n sessionStart={sessionStart}\n brData={brData}\n onRefreshBR={refreshBR}\n godModeInfo={props.godModeInfo}\n />\n )}\n\n {mode === \"models\" && (\n <ModelsMode\n models={props.models ?? []}\n currentModelId={currentModel}\n onSelectModel={(id) => {\n props.slashCallbacks?.setModel?.(id);\n const name = id.split(\"/\").pop() ?? id;\n setCurrentModel(name);\n setMode(\"chat\");\n }}\n />\n )}\n\n {mode === \"config\" && (\n <ConfigMode\n strategy={props.configInfo?.strategy ?? props.strategy}\n permissionMode={props.configInfo?.permissionMode ?? \"confirm\"}\n outputStyle={props.configInfo?.outputStyle ?? \"concise\"}\n sandbox={props.configInfo?.sandbox ?? \"none\"}\n role={currentRole}\n modelCount={props.modelCount}\n turnCount={turnCount}\n sessionCost={sessionCost}\n vaultInfo={props.vaultInfo}\n memoryInfo={props.memoryInfo}\n />\n )}\n\n {mode === \"planning\" && <PlanningMode />}\n\n <KeyHint mode={mode} isProcessing={isProcessing} />\n\n {/* Shortcut overlay */}\n {showShortcuts && (\n <ShortcutOverlay onDismiss={() => setShowShortcuts(false)} />\n )}\n </Box>\n );\n}\n","/**\n * Mode state management for the multi-mode TUI.\n * Modes: chat (1), dashboard (2), models (3), config (4)\n */\n\nimport { useState, useCallback } from \"react\";\n\nexport type TUIMode = \"chat\" | \"dashboard\" | \"models\" | \"config\" | \"planning\";\n\nconst MODE_ORDER: TUIMode[] = [\n \"chat\",\n \"dashboard\",\n \"models\",\n \"config\",\n \"planning\",\n];\n\nexport const MODE_LABELS: Record<\n TUIMode,\n { label: string; key: string; color: string }\n> = {\n chat: { label: \"Chat\", key: \"1\", color: \"green\" },\n dashboard: { label: \"Dashboard\", key: \"2\", color: \"blue\" },\n models: { label: \"Models\", key: \"3\", color: \"yellow\" },\n config: { label: \"Config\", key: \"4\", color: \"magenta\" },\n planning: { label: \"Planning\", key: \"5\", color: \"cyan\" },\n};\n\nexport function useMode(initial: TUIMode = \"chat\") {\n const [mode, setMode] = useState<TUIMode>(initial);\n\n const cycleMode = useCallback(() => {\n setMode((prev) => {\n const idx = MODE_ORDER.indexOf(prev);\n return MODE_ORDER[(idx + 1) % MODE_ORDER.length];\n });\n }, []);\n\n const setModeByKey = useCallback((key: string): boolean => {\n const idx = parseInt(key, 10) - 1;\n if (idx >= 0 && idx < MODE_ORDER.length) {\n setMode(MODE_ORDER[idx]);\n return true;\n }\n return false;\n }, []);\n\n return { mode, setMode, cycleMode, setModeByKey };\n}\n","/**\n * Hook to lazily fetch BrainstormRouter dashboard data.\n * Caches results and refreshes on demand.\n */\n\nimport { useState, useCallback } from \"react\";\n\nexport interface BRDashboardData {\n leaderboard: Array<{\n model: string;\n provider: string;\n quality_rank: number;\n speed_rank: number;\n value_rank: number;\n request_count: number;\n avg_latency_ms: number;\n }>;\n waste: {\n total_waste_usd: number;\n suggestions: Array<{\n description: string;\n savings_usd: number;\n action: string;\n }>;\n } | null;\n forecast: {\n current_spend: number;\n budget_limit: number;\n projected_spend: number;\n will_exceed: boolean;\n days_remaining: number;\n } | null;\n audit: Array<{\n request_id: string;\n timestamp: string;\n model: string;\n cost_usd: number;\n latency_ms: number;\n guardian_status: string;\n }>;\n dailyTrend: Array<{\n date: string;\n cost_usd: number;\n request_count: number;\n }>;\n lastFetched: number;\n loading: boolean;\n error: string | null;\n}\n\nconst EMPTY_DATA: BRDashboardData = {\n leaderboard: [],\n waste: null,\n forecast: null,\n audit: [],\n dailyTrend: [],\n lastFetched: 0,\n loading: false,\n error: null,\n};\n\n/**\n * Fetch BR dashboard data using the gateway client.\n * Pass null if no gateway is available (no BR key).\n */\nexport function useBRData(gateway: any | null) {\n const [data, setData] = useState<BRDashboardData>(EMPTY_DATA);\n\n const refresh = useCallback(async () => {\n if (!gateway) {\n setData((prev) => ({\n ...prev,\n error: \"No BrainstormRouter API key configured\",\n }));\n return;\n }\n\n setData((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n // Fetch all endpoints in parallel (best-effort for each)\n const [leaderboard, waste, forecast, audit, daily] =\n await Promise.allSettled([\n gateway.getLeaderboard(),\n gateway.getWasteInsights(),\n gateway.getForecast(),\n gateway.getCompletionAudit(\"24h\"),\n gateway.getDailyInsights(),\n ]);\n\n setData({\n leaderboard:\n leaderboard.status === \"fulfilled\" ? leaderboard.value : [],\n waste: waste.status === \"fulfilled\" ? waste.value : null,\n forecast: forecast.status === \"fulfilled\" ? forecast.value : null,\n audit: audit.status === \"fulfilled\" ? audit.value.slice(0, 10) : [],\n dailyTrend: daily.status === \"fulfilled\" ? daily.value.slice(0, 7) : [],\n lastFetched: Date.now(),\n loading: false,\n error: null,\n });\n } catch (err: any) {\n setData((prev) => ({ ...prev, loading: false, error: err.message }));\n }\n }, [gateway]);\n\n return { data, refresh };\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport { MODE_LABELS, type TUIMode } from \"../hooks/useMode.js\";\n\ninterface ModeBarProps {\n activeMode: TUIMode;\n /** Condensed status info shown on the right */\n model?: string;\n cost?: number;\n role?: string;\n guardianStatus?: string;\n}\n\nexport function ModeBar({\n activeMode,\n model,\n cost,\n role,\n guardianStatus,\n}: ModeBarProps) {\n return (\n <Box flexDirection=\"row\" justifyContent=\"space-between\" paddingX={1}>\n <Box>\n {(\n Object.entries(MODE_LABELS) as [\n TUIMode,\n (typeof MODE_LABELS)[TUIMode],\n ][]\n ).map(([id, meta]) => {\n const isActive = id === activeMode;\n return (\n <Box key={id} marginRight={1}>\n <Text color=\"gray\" dimColor={!isActive}>\n [\n </Text>\n <Text\n color={isActive ? meta.color : \"gray\"}\n bold={isActive}\n dimColor={!isActive}\n >\n {meta.key}\n </Text>\n <Text color=\"gray\" dimColor={!isActive}>\n ]\n </Text>\n <Text\n color={isActive ? meta.color : \"gray\"}\n bold={isActive}\n dimColor={!isActive}\n >\n {\" \"}\n {meta.label}\n </Text>\n </Box>\n );\n })}\n </Box>\n <Box>\n {role && (\n <>\n <Text color=\"magenta\" bold>\n {role}\n </Text>\n <Text color=\"gray\"> │ </Text>\n </>\n )}\n {model && (\n <>\n <Text color=\"green\">{model}</Text>\n <Text color=\"gray\"> │ </Text>\n </>\n )}\n <Text color={cost && cost > 0.01 ? \"yellow\" : \"green\"}>\n ${(cost ?? 0).toFixed(4)}\n </Text>\n {guardianStatus && (\n <>\n <Text color=\"gray\"> │ </Text>\n <Text\n color={\n guardianStatus === \"safe\"\n ? \"green\"\n : guardianStatus === \"flagged\"\n ? \"yellow\"\n : \"red\"\n }\n >\n {guardianStatus === \"safe\" ? \"●\" : \"⚠\"}\n </Text>\n </>\n )}\n </Box>\n </Box>\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { TUIMode } from \"../hooks/useMode.js\";\n\ninterface KeyHintProps {\n mode: TUIMode;\n isProcessing?: boolean;\n}\n\nconst HINTS: Record<TUIMode, string> = {\n chat: \"Esc dashboard │ ↑↓ history │ Shift+↑↓ scroll │ Ctrl+D×2 exit\",\n dashboard: \"1-4 switch │ Tab cycle │ r refresh │ Esc chat │ Ctrl+D×2 exit\",\n models: \"1-4 switch │ ↑↓ navigate │ Enter select │ Esc chat\",\n config: \"1-5 switch │ Esc chat │ Ctrl+D×2 exit\",\n planning:\n \"1-5 switch │ ↑↓/jk navigate │ Enter expand │ [] switch plan │ Esc chat\",\n};\n\nconst PROCESSING_HINT = \"Esc abort │ Shift+↑↓ scroll\";\n\nexport function KeyHint({ mode, isProcessing }: KeyHintProps) {\n return (\n <Box paddingX={2}>\n <Text color=\"gray\">{isProcessing ? PROCESSING_HINT : HINTS[mode]}</Text>\n </Box>\n );\n}\n","import React, {\n useState,\n useCallback,\n useMemo,\n useEffect,\n useRef,\n} from \"react\";\nimport { Box, Text, useApp, useInput } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport { StatusBar } from \"./StatusBar.js\";\nimport { MessageList, type ChatMessage } from \"./MessageList.js\";\nimport { TaskList } from \"./TaskList.js\";\nimport { StreamingMessage } from \"./StreamingMessage.js\";\nimport { ToolCallList, type ToolCallState } from \"./ToolCallDisplay.js\";\nimport { SelectPrompt, type SelectOption } from \"./SelectPrompt.js\";\nimport { Autocomplete, type AutocompleteItem } from \"./Autocomplete.js\";\nimport { getSlashCommands } from \"../commands/slash.js\";\nimport {\n isSlashCommand,\n executeSlashCommand,\n type SlashContext,\n} from \"../commands/slash.js\";\nimport { resolveKeyAction } from \"../keybindings.js\";\nimport { InputHistory } from \"../input-history.js\";\nimport type {\n AgentEvent,\n AgentTask,\n RoutingDecision,\n} from \"@brainst0rm/shared\";\n\ninterface ChatAppProps {\n strategy: string;\n modelCount: { local: number; cloud: number };\n onSendMessage: (text: string) => AsyncGenerator<AgentEvent>;\n onAbort?: () => void;\n /** When false, ChatApp ignores keyboard input (hidden behind another mode). */\n isActive?: boolean;\n /** Mutable context for slash commands — callbacks that affect session state */\n slashCallbacks?: {\n setModel?: (model: string) => void;\n setStrategy?: (strategy: string) => void;\n getStrategy?: () => string;\n setMode?: (mode: string) => void;\n getMode?: () => string;\n rebuildSystemPrompt?: (basePromptOverride?: string) => void;\n getActiveRole?: () => string | undefined;\n setActiveRole?: (role: string | undefined) => void;\n setOutputStyle?: (style: string) => void;\n getOutputStyle?: () => string;\n getBudget?: () => { remaining: number; limit: number } | null;\n compact?: () => Promise<void>;\n dream?: () => Promise<string>;\n vault?: (action: string, args: string) => Promise<string>;\n getContextWindow?: () => number;\n gateway?: any;\n };\n}\n\nexport function ChatApp({\n strategy,\n modelCount,\n onSendMessage,\n onAbort,\n isActive = true,\n slashCallbacks,\n}: ChatAppProps) {\n const { exit } = useApp();\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [input, setInput] = useState(\"\");\n const [streamingText, setStreamingText] = useState<string | undefined>(\n undefined,\n );\n const [currentModel, setCurrentModel] = useState<string | undefined>(\n undefined,\n );\n const [sessionCost, setSessionCost] = useState(0);\n const [isProcessing, setIsProcessing] = useState(false);\n const [tasks, setTasks] = useState<AgentTask[]>([]);\n const [tokenCount, setTokenCount] = useState<{\n input: number;\n output: number;\n }>({ input: 0, output: 0 });\n const [thinkingPhase, setThinkingPhase] = useState<string | undefined>(\n undefined,\n );\n const [activeTools, setActiveTools] = useState<ToolCallState[]>([]);\n const [scrollOffset, setScrollOffset] = useState(0);\n const [askUserPrompt, setAskUserPrompt] = useState<{\n question: string;\n options: SelectOption[];\n } | null>(null);\n const [showAutocomplete, setShowAutocomplete] = useState(false);\n\n // Inline prompt queue — any command/tool can push interactive prompts\n // Each prompt shows a SelectPrompt. User picks, callback fires, next prompt shows.\n const [promptQueue, setPromptQueue] = useState<\n Array<{\n question: string;\n options: SelectOption[];\n resolve: (value: string) => void;\n }>\n >([]);\n const [history] = useState(() => new InputHistory());\n const abortTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const toolIdCounter = useRef(0);\n\n /**\n * Push an inline prompt and wait for the user's selection.\n * Used by slash commands, tools, and any interactive flow.\n */\n const pushPrompt = useCallback(\n (question: string, options: SelectOption[]): Promise<string> => {\n return new Promise<string>((resolve) => {\n setPromptQueue((prev) => [...prev, { question, options, resolve }]);\n });\n },\n [],\n );\n\n // Build slash command autocomplete items once\n const slashItems = useMemo<AutocompleteItem[]>(() => {\n return getSlashCommands().map((cmd) => ({\n label: cmd.name,\n description: cmd.description,\n prefix: \"/\",\n }));\n }, []);\n\n // Listen for ask_user tool events\n useEffect(() => {\n const handler = (data: any) => {\n if (data?.question && data?.options) {\n setAskUserPrompt({\n question: data.question,\n options: data.options.map((o: any) => ({\n label: o.label ?? o,\n value: o.label ?? o,\n description: o.description,\n recommended: o.recommended,\n })),\n });\n }\n };\n process.on(\"brainstorm:ask-user\" as any, handler);\n return () => {\n process.removeListener(\"brainstorm:ask-user\" as any, handler);\n };\n }, []);\n\n // Keybinding handler + input history navigation + scrolling\n useInput((inputChar, key) => {\n // Skip all input when ChatApp is not the active mode\n if (!isActive) return;\n\n // Shift+Up/Down for scrolling message history\n if (key.upArrow && key.shift) {\n setScrollOffset((prev) =>\n Math.min(prev + 3, Math.max(0, messages.length - 3)),\n );\n return;\n }\n if (key.downArrow && key.shift) {\n setScrollOffset((prev) => Math.max(0, prev - 3));\n return;\n }\n\n // Up/Down arrow for input history\n if (key.upArrow && !isProcessing) {\n const prev = history.up(input);\n if (prev !== null) setInput(prev);\n return;\n }\n if (key.downArrow && !isProcessing) {\n const next = history.down();\n if (next !== null) setInput(next);\n return;\n }\n\n const action = resolveKeyAction(inputChar, key as any);\n if (!action) return;\n\n switch (action) {\n case \"abort\":\n if (isProcessing) {\n onAbort?.();\n // Clear any previous abort timeout to prevent accumulation\n if (abortTimeoutRef.current) clearTimeout(abortTimeoutRef.current);\n // Safety fallback: force-reset if generator doesn't complete in 5s\n abortTimeoutRef.current = setTimeout(() => {\n setIsProcessing(false);\n setStreamingText(undefined);\n setThinkingPhase(undefined);\n abortTimeoutRef.current = null;\n }, 5000);\n }\n break;\n case \"exit\":\n exit();\n break;\n case \"clear-screen\":\n process.stdout.write(\"\\x1B[2J\\x1B[0f\");\n break;\n case \"clear-chat\":\n setMessages([]);\n setStreamingText(undefined);\n break;\n case \"cycle-mode\": {\n const modes = [\"auto\", \"confirm\", \"plan\"] as const;\n const current = slashCallbacks?.getMode?.() ?? \"confirm\";\n const idx = modes.indexOf(current as any);\n const next = modes[(idx + 1) % modes.length];\n slashCallbacks?.setMode?.(next);\n // Show mode change as routing message\n const labels: Record<string, string> = {\n auto: \"auto (all tools allowed)\",\n confirm: \"confirm (ask before writes)\",\n plan: \"plan (read-only)\",\n };\n setMessages((prev) => [\n ...prev,\n { role: \"routing\", content: `Mode: ${labels[next] ?? next}` },\n ]);\n break;\n }\n }\n });\n\n const slashCtx: SlashContext = useMemo(\n () => ({\n getModel: () => currentModel,\n getSessionCost: () => sessionCost,\n getTokenCount: () => tokenCount,\n exit: () => exit(),\n clearHistory: () => {\n setMessages([]);\n setStreamingText(undefined);\n },\n setModel: (model: string) => {\n slashCallbacks?.setModel?.(model);\n // Update displayed model name immediately (don't wait for routing event)\n const name = model.split(\"/\").pop() ?? model;\n setCurrentModel(name);\n },\n setStrategy: slashCallbacks?.setStrategy,\n getStrategy: slashCallbacks?.getStrategy,\n setMode: slashCallbacks?.setMode,\n getMode: slashCallbacks?.getMode,\n setOutputStyle: slashCallbacks?.setOutputStyle,\n getOutputStyle: slashCallbacks?.getOutputStyle,\n getBudget: slashCallbacks?.getBudget,\n compact: slashCallbacks?.compact,\n getContextWindow: slashCallbacks?.getContextWindow,\n prompt: pushPrompt,\n dream: slashCallbacks?.dream,\n vault: slashCallbacks?.vault,\n rebuildSystemPrompt: slashCallbacks?.rebuildSystemPrompt,\n undoLastTurn: () => {\n // Find last user message and remove it + everything after\n let removed = 0;\n setMessages((prev) => {\n const lastUserIdx = prev.findLastIndex((m) => m.role === \"user\");\n if (lastUserIdx < 0) return prev;\n removed = prev.length - lastUserIdx;\n return prev.slice(0, lastUserIdx);\n });\n return removed;\n },\n getActiveRole: slashCallbacks?.getActiveRole,\n setActiveRole: slashCallbacks?.setActiveRole,\n gateway: slashCallbacks?.gateway,\n }),\n [currentModel, sessionCost, tokenCount, exit, slashCallbacks],\n );\n\n const handleSubmit = useCallback(\n async (text: string) => {\n if (isProcessing) return;\n if (!text.trim()) {\n // Brief hint for empty input\n setMessages((prev) => [\n ...prev,\n {\n role: \"routing\",\n content: \"Type a message or use /help for commands\",\n },\n ]);\n return;\n }\n history.push(text.trim());\n\n // Handle slash commands\n if (isSlashCommand(text)) {\n setInput(\"\");\n const result = await executeSlashCommand(text, slashCtx);\n // Use 'assistant' role for readable output (not dim 'routing')\n setMessages((prev) => [\n ...prev,\n { role: \"assistant\", content: result },\n ]);\n return;\n }\n\n setInput(\"\");\n setMessages((prev) => [...prev, { role: \"user\", content: text.trim() }]);\n setIsProcessing(true);\n setStreamingText(\"\");\n setTasks([]);\n setActiveTools([]);\n setScrollOffset(0);\n\n let fullResponse = \"\";\n let model: string | undefined;\n let cost = 0;\n const costBefore = sessionCost;\n\n try {\n for await (const event of onSendMessage(text.trim())) {\n switch (event.type) {\n case \"thinking\":\n setThinkingPhase(event.phase);\n break;\n case \"routing\":\n model = event.decision.model.name;\n setCurrentModel(model);\n setThinkingPhase(undefined);\n const est = event.decision.estimatedCost;\n const estStr = est > 0 ? ` ~$${est.toFixed(3)}` : \"\";\n const fb = event.decision.fallbacks?.length ?? 0;\n const fbStr =\n fb > 0 ? ` (${fb} fallback${fb > 1 ? \"s\" : \"\"})` : \"\";\n setMessages((prev) => [\n ...prev,\n {\n role: \"routing\",\n content: `→ ${model} via ${event.decision.strategy}${estStr}${fbStr}`,\n },\n ]);\n break;\n case \"text-delta\":\n setThinkingPhase(undefined);\n fullResponse += event.delta;\n setStreamingText(fullResponse);\n break;\n case \"reasoning\":\n setMessages((prev) => [\n ...prev,\n { role: \"reasoning\", content: event.content },\n ]);\n break;\n case \"tool-call-start\":\n setActiveTools((prev) => [\n ...prev,\n {\n id: `tc-${++toolIdCounter.current}-${event.toolName}`,\n toolName: event.toolName,\n args: (event.args ?? {}) as Record<string, unknown>,\n status: \"running\",\n startTime: Date.now(),\n },\n ]);\n break;\n case \"tool-call-result\":\n setActiveTools((prev) => {\n // Find the most recent running tool with this name\n const idx = prev.findLastIndex(\n (t) =>\n t.status === \"running\" && t.toolName === event.toolName,\n );\n if (idx < 0) return prev;\n const updated = [...prev];\n updated[idx] = {\n ...updated[idx],\n status: \"done\",\n duration: Date.now() - updated[idx].startTime,\n ok: true,\n };\n return updated;\n });\n break;\n case \"compaction\":\n setMessages((prev) => [\n ...prev,\n {\n role: \"routing\",\n content: `context compacted — ${event.removed} messages summarized (${event.tokensBefore.toLocaleString()} → ${event.tokensAfter.toLocaleString()} tokens)`,\n },\n ]);\n break;\n case \"subagent-result\":\n setMessages((prev) => [\n ...prev,\n {\n role: \"routing\",\n content: `subagent [${event.subagentType}] → ${event.model} ($${event.cost.toFixed(4)}, ${event.toolCalls.length} tool calls)`,\n },\n ]);\n break;\n case \"task-created\":\n setTasks((prev) => [...prev, event.task]);\n break;\n case \"task-updated\":\n setTasks((prev) =>\n prev.map((t) => (t.id === event.task.id ? event.task : t)),\n );\n break;\n case \"background-complete\":\n setMessages((prev) => [\n ...prev,\n {\n role: \"routing\",\n content: `[bg] ${event.taskId} completed (exit ${event.exitCode}): ${event.command.slice(0, 60)}`,\n },\n ]);\n break;\n case \"model-retry\":\n setCurrentModel(event.toModel);\n setMessages((prev) => [\n ...prev,\n {\n role: \"routing\",\n content: `↻ retry: ${event.fromModel} → ${event.toModel} (${event.reason})`,\n },\n ]);\n break;\n case \"fallback-exhausted\":\n setMessages((prev) => [\n ...prev,\n {\n role: \"routing\",\n content: `⚠ all models failed: ${event.modelsTried.join(\", \")}`,\n },\n ]);\n break;\n case \"budget-warning\":\n setMessages((prev) => [\n ...prev,\n {\n role: \"routing\",\n content: `⚠ budget: $${event.used.toFixed(4)} / $${event.limit.toFixed(4)} ($${event.remaining.toFixed(4)} remaining)`,\n },\n ]);\n break;\n case \"context-budget\":\n setMessages((prev) => [\n ...prev,\n {\n role: \"routing\",\n content: `context: ${event.percent}% (${event.used.toLocaleString()} / ${event.limit.toLocaleString()} tokens)`,\n },\n ]);\n break;\n case \"loop-warning\":\n // Loop warnings are injected into model context, not shown to user.\n // They clutter the UI with internal guidance like \"file_read called 3 times\".\n break;\n case \"empty-response\":\n setMessages((prev) => [\n ...prev,\n {\n role: \"routing\",\n content: `⚠ empty response from ${event.modelId}`,\n },\n ]);\n break;\n case \"gateway-feedback\":\n // Silently update — displayed in StatusBar in future\n break;\n case \"tool-output-partial\":\n // Live tool output — update active tool display in future\n break;\n case \"interrupted\":\n setMessages((prev) => [\n ...prev,\n { role: \"routing\", content: \"interrupted\" },\n ]);\n break;\n case \"done\":\n cost = event.totalCost - costBefore; // Per-turn cost delta\n setSessionCost(event.totalCost);\n if (event.totalTokens) setTokenCount(event.totalTokens);\n break;\n case \"error\": {\n // Categorize error for better UX\n const msg = event.error.message ?? \"\";\n const category =\n msg.includes(\"fetch\") || msg.includes(\"ECONNREFUSED\")\n ? \"NETWORK\"\n : msg.includes(\"Budget\") || msg.includes(\"budget\")\n ? \"BUDGET\"\n : msg.includes(\"Unauthorized\") || msg.includes(\"401\")\n ? \"AUTH\"\n : msg.includes(\"No models\")\n ? \"MODEL\"\n : \"ERROR\";\n const hint =\n category === \"NETWORK\"\n ? \"\\nCheck your internet connection.\"\n : category === \"BUDGET\"\n ? \"\\nRun /budget to check. Adjust in config.toml.\"\n : category === \"AUTH\"\n ? \"\\nRun /vault list to check API keys.\"\n : category === \"MODEL\"\n ? \"\\nRun /model to switch or check available models.\"\n : \"\";\n setMessages((prev) => [\n ...prev,\n {\n role: \"error\" as any,\n content: `[${category}] ${msg}${hint}`,\n model,\n },\n ]);\n break;\n }\n }\n }\n } catch (err: any) {\n fullResponse = `Error: ${err.message}`;\n } finally {\n setStreamingText(undefined);\n setThinkingPhase(undefined);\n setIsProcessing(false);\n }\n\n // Always show assistant message — even empty responses should display cost\n setMessages((prev) => [\n ...prev,\n {\n role: \"assistant\",\n content: fullResponse || \"(No response received)\",\n model,\n cost,\n },\n ]);\n },\n [isProcessing, onSendMessage, exit, slashCtx],\n );\n\n // Compute available height for messages (App manages outer height)\n const termHeight = process.stdout.rows || 24;\n const footerHeight = 4; // Input box + key hints\n const toolsHeight =\n activeTools.filter((t) => t.status === \"running\").length > 0 ? 4 : 0;\n const tasksHeight = tasks.length > 0 ? Math.min(tasks.length + 1, 5) : 0;\n const messageHeight = Math.max(\n 5,\n termHeight - 2 - footerHeight - toolsHeight - tasksHeight,\n );\n\n return (\n <Box flexDirection=\"column\" flexGrow={1}>\n <MessageList\n messages={messages}\n maxHeight={messageHeight}\n scrollOffset={scrollOffset}\n />\n {(streamingText !== undefined || thinkingPhase) && (\n <StreamingMessage\n content={streamingText ?? \"\"}\n isStreaming={isProcessing}\n phase={thinkingPhase}\n model={currentModel}\n />\n )}\n <ToolCallList tools={activeTools} />\n {tasks.length > 0 && <TaskList tasks={tasks} />}\n {/* Slash command autocomplete */}\n {showAutocomplete && !isProcessing && !askUserPrompt && (\n <Autocomplete\n query={input.slice(1)}\n items={slashItems}\n onAccept={(label) => {\n setInput(`/${label} `);\n setShowAutocomplete(false);\n }}\n onDismiss={() => setShowAutocomplete(false)}\n />\n )}\n\n {/* Interactive selection prompt (from ask_user tool) */}\n {askUserPrompt && (\n <SelectPrompt\n message={askUserPrompt.question}\n options={askUserPrompt.options}\n onSelect={async (value) => {\n const { resolveAskUser } = await import(\"@brainst0rm/tools\");\n resolveAskUser(value);\n setAskUserPrompt(null);\n setMessages((prev) => [\n ...prev,\n { role: \"routing\", content: `Selected: ${value}` },\n ]);\n }}\n onCancel={async () => {\n const { resolveAskUser } = await import(\"@brainst0rm/tools\");\n resolveAskUser(askUserPrompt.options[0]?.value ?? \"\");\n setAskUserPrompt(null);\n }}\n />\n )}\n {/* Inline prompt queue (from slash commands, /build, etc.) */}\n {promptQueue.length > 0 && !askUserPrompt && (\n <SelectPrompt\n message={promptQueue[0].question}\n options={promptQueue[0].options}\n onSelect={(value) => {\n const current = promptQueue[0];\n setPromptQueue((prev) => prev.slice(1));\n setMessages((prev) => [\n ...prev,\n { role: \"routing\", content: `→ ${value}` },\n ]);\n current.resolve(value);\n }}\n onCancel={() => {\n const current = promptQueue[0];\n setPromptQueue([]);\n current.resolve(current.options[0]?.value ?? \"\");\n }}\n />\n )}\n <Box flexDirection=\"column\">\n <Box\n borderStyle=\"single\"\n borderColor={isProcessing ? \"gray\" : \"cyan\"}\n paddingX={1}\n >\n <Text color={isProcessing ? \"gray\" : \"cyan\"} bold>\n {\"> \"}\n </Text>\n <TextInput\n value={input}\n onChange={(val) => {\n setInput(val);\n // Show autocomplete when typing a slash command\n setShowAutocomplete(\n val.startsWith(\"/\") && val.length > 1 && !val.includes(\" \"),\n );\n }}\n onSubmit={(val) => {\n setShowAutocomplete(false);\n // Backslash continuation: \\ at end of line adds newline instead of submitting\n if (val.endsWith(\"\\\\\")) {\n setInput(val.slice(0, -1) + \"\\n\");\n return;\n }\n handleSubmit(val);\n }}\n placeholder={\n isProcessing\n ? \"Thinking...\"\n : \"Type a message... (/ commands, @file to include)\"\n }\n />\n </Box>\n <Box paddingX={2}>\n <Text color=\"gray\" dimColor>\n {isProcessing\n ? \"Esc abort │ Shift+↑↓ scroll\"\n : \"/help │ Shift+Tab mode │ ↑↓ history │ Ctrl+D exit\"}\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import React, { useMemo } from \"react\";\nimport { Box, Text } from \"ink\";\nimport { MarkdownRenderer } from \"./MarkdownRenderer.js\";\n\nexport interface ChatMessage {\n role: \"user\" | \"assistant\" | \"system\" | \"routing\" | \"reasoning\" | \"error\";\n content: string;\n model?: string;\n cost?: number;\n}\n\ninterface MessageListProps {\n messages: ChatMessage[];\n /** Maximum visible height in terminal rows. Messages auto-scroll to bottom. */\n maxHeight?: number;\n /** Scroll offset from bottom (0 = at bottom, positive = scrolled up). */\n scrollOffset?: number;\n}\n\nexport function MessageList({\n messages,\n maxHeight,\n scrollOffset = 0,\n}: MessageListProps) {\n // When maxHeight is provided, show only the tail of messages\n const visibleMessages = useMemo(() => {\n if (!maxHeight || messages.length <= 5) return messages;\n\n // Show last N messages that fit approximately\n // Rough heuristic: 2-3 lines per message on average\n const estimatedVisible = Math.max(5, Math.floor(maxHeight / 3));\n const startIdx = Math.max(\n 0,\n messages.length - estimatedVisible - scrollOffset,\n );\n const endIdx = messages.length - scrollOffset;\n return messages.slice(startIdx, endIdx > 0 ? endIdx : undefined);\n }, [messages, maxHeight, scrollOffset]);\n\n const hiddenAbove = messages.length - visibleMessages.length - scrollOffset;\n\n return (\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n {hiddenAbove > 0 && (\n <Text color=\"gray\">\n {\" \"}↑ {hiddenAbove} earlier message{hiddenAbove > 1 ? \"s\" : \"\"}{\" \"}\n (Shift+↑ to scroll)\n </Text>\n )}\n {visibleMessages.map((msg, i) => (\n <MessageBubble key={i} message={msg} />\n ))}\n </Box>\n );\n}\n\nconst MessageBubble = React.memo(function MessageBubble({\n message,\n}: {\n message: ChatMessage;\n}) {\n switch (message.role) {\n case \"user\":\n return (\n <Box\n marginBottom={1}\n borderStyle=\"single\"\n borderColor=\"blue\"\n borderLeft\n borderRight={false}\n borderTop={false}\n borderBottom={false}\n paddingLeft={1}\n >\n <Text color=\"blue\" bold>\n you{\" \"}\n </Text>\n <Text>{message.content}</Text>\n </Box>\n );\n\n case \"assistant\":\n return (\n <Box\n flexDirection=\"column\"\n marginBottom={1}\n borderStyle=\"single\"\n borderColor=\"green\"\n borderLeft\n borderRight={false}\n borderTop={false}\n borderBottom={false}\n paddingLeft={1}\n >\n <Box>\n <Text color=\"green\" bold>\n brainstorm{\" \"}\n </Text>\n {message.model && (\n <Text color=\"gray\" dimColor>\n [{message.model}]{\" \"}\n </Text>\n )}\n </Box>\n <Box paddingLeft={0}>\n <MarkdownRenderer content={message.content} />\n </Box>\n {message.cost !== undefined && message.cost > 0 && (\n <Text color=\"gray\" dimColor>\n {\" \"}\n ${message.cost.toFixed(4)}\n </Text>\n )}\n </Box>\n );\n\n case \"reasoning\":\n return (\n <Box marginBottom={0} paddingLeft={2}>\n <Text color=\"gray\" dimColor italic>\n ▸{\" \"}\n {message.content.length > 200\n ? message.content.slice(0, 200) + \"...\"\n : message.content}\n </Text>\n </Box>\n );\n\n case \"routing\": {\n // Determine icon based on content\n const content = message.content;\n let icon = \"→\";\n let color: string = \"gray\";\n if (content.startsWith(\"↻\")) {\n icon = \"\";\n color = \"yellow\";\n } else if (content.startsWith(\"⚠\")) {\n icon = \"\";\n color = \"yellow\";\n } else if (content.includes(\"tool:\") || content.includes(\"subagent\")) {\n icon = \"⚙\";\n } else if (content.includes(\"compacted\")) {\n icon = \"◇\";\n } else if (content.includes(\"[bg]\")) {\n icon = \"◆\";\n }\n\n return (\n <Box marginBottom={0} paddingLeft={2}>\n <Text color={color} dimColor>\n {icon ? `${icon} ` : \"\"}\n {content}\n </Text>\n </Box>\n );\n }\n\n case \"error\":\n return (\n <Box\n flexDirection=\"column\"\n marginBottom={1}\n borderStyle=\"single\"\n borderColor=\"red\"\n borderLeft\n borderRight={false}\n borderTop={false}\n borderBottom={false}\n paddingLeft={1}\n >\n <Text color=\"red\" bold>\n error{\" \"}\n </Text>\n <Text>{message.content}</Text>\n </Box>\n );\n\n default:\n return null;\n }\n});\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { AgentTask } from \"@brainst0rm/shared\";\n\nconst STATUS_ICONS: Record<string, { icon: string; color: string }> = {\n pending: { icon: \"○\", color: \"gray\" },\n in_progress: { icon: \"◉\", color: \"yellow\" },\n completed: { icon: \"●\", color: \"green\" },\n failed: { icon: \"✗\", color: \"red\" },\n};\n\ninterface TaskListProps {\n tasks: AgentTask[];\n}\n\nexport function TaskList({ tasks }: TaskListProps) {\n if (tasks.length === 0) return null;\n\n const completed = tasks.filter((t) => t.status === \"completed\").length;\n const failed = tasks.filter((t) => t.status === \"failed\").length;\n const total = tasks.length;\n const allDone = completed + failed === total;\n\n // Hide when all tasks are done (after a brief display)\n if (allDone && completed === total) return null;\n\n return (\n <Box flexDirection=\"column\" paddingX={1} marginBottom={0}>\n <Text color=\"gray\" dimColor>\n {\" \"}tasks ({completed}/{total} complete\n {failed > 0 ? `, ${failed} failed` : \"\"})\n </Text>\n {tasks.map((task) => {\n const { icon, color } =\n STATUS_ICONS[task.status] ?? STATUS_ICONS.pending;\n const isDone = task.status === \"completed\";\n return (\n <Box key={task.id}>\n <Text color={color}>{` ${icon} `}</Text>\n <Text color={isDone ? \"gray\" : undefined} dimColor={isDone}>\n {task.description}\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport Spinner from \"ink-spinner\";\nimport { MarkdownRenderer } from \"./MarkdownRenderer.js\";\n\nconst PHASE_LABELS: Record<string, string> = {\n classifying: \"Analyzing\",\n routing: \"Selecting model\",\n connecting: \"Connecting\",\n streaming: \"Streaming\",\n};\n\ninterface StreamingMessageProps {\n /** Text accumulated so far (grows as deltas arrive). */\n content: string;\n /** Whether the message is still streaming. */\n isStreaming: boolean;\n /** Current thinking phase (classifying, routing, connecting, streaming). */\n phase?: string;\n /** Active model name. */\n model?: string;\n}\n\nexport const StreamingMessage = React.memo(function StreamingMessage({\n content,\n isStreaming,\n phase,\n model,\n}: StreamingMessageProps) {\n // No content yet — show spinner with phase\n if (!content && isStreaming) {\n const label = phase ? (PHASE_LABELS[phase] ?? phase) : \"Thinking\";\n return (\n <Box paddingLeft={1}>\n <Text color=\"cyan\">\n <Spinner type=\"dots\" />\n </Text>\n <Text color=\"gray\" dimColor>\n {\" \"}\n {label}\n {model ? ` · ${model}` : \"\"}\n {\"...\"}\n </Text>\n </Box>\n );\n }\n\n // Content is streaming — render only the tail to prevent Ink buffer overflow\n if (content && isStreaming) {\n // Truncate to last ~2000 chars for rendering performance\n const MAX_STREAM_RENDER = 2000;\n const truncated = content.length > MAX_STREAM_RENDER;\n let visibleContent = truncated\n ? content.slice(-MAX_STREAM_RENDER)\n : content;\n\n // Ensure no unclosed code blocks (causes markdown parser hangs)\n if (truncated) {\n const backtickCount = (visibleContent.match(/```/g) || []).length;\n if (backtickCount % 2 === 1) {\n const lastOpen = visibleContent.lastIndexOf(\"```\");\n if (lastOpen >= 0) {\n // Trim at the unclosed fence, or append a closing one if trimming\n // would remove too much content\n if (lastOpen > 50) {\n visibleContent = visibleContent.slice(0, lastOpen);\n } else {\n visibleContent += \"\\n```\";\n }\n }\n }\n }\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color=\"green\" bold>\n {\"brainstorm \"}\n </Text>\n {model && (\n <Text color=\"gray\" dimColor>\n [{model}]{\" \"}\n </Text>\n )}\n {truncated && (\n <Text color=\"gray\" dimColor>\n ({content.length} chars, showing tail)\n </Text>\n )}\n </Box>\n <Box paddingLeft={0}>\n <MarkdownRenderer content={visibleContent} />\n <Text color=\"cyan\" bold>\n {\"▌\"}\n </Text>\n </Box>\n </Box>\n );\n }\n\n return null;\n});\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport Spinner from \"ink-spinner\";\n\nexport interface ToolCallState {\n id: string;\n toolName: string;\n args: Record<string, unknown>;\n status: \"running\" | \"done\" | \"error\";\n startTime: number;\n duration?: number;\n result?: string;\n ok?: boolean;\n}\n\n// Extract a human-readable summary of tool args\nfunction summarizeArgs(\n toolName: string,\n args: Record<string, unknown>,\n): string {\n switch (toolName) {\n case \"file_read\":\n case \"file_write\":\n case \"file_edit\":\n return String(args.file_path ?? args.path ?? \"\")\n .split(\"/\")\n .slice(-2)\n .join(\"/\");\n case \"multi_edit\":\n case \"batch_edit\":\n return `${Array.isArray(args.edits) ? args.edits.length : \"?\"} edits`;\n case \"shell\":\n return String(args.command ?? \"\").slice(0, 60);\n case \"grep\":\n return `/${args.pattern ?? \"\"}/ ${args.path ?? \"\"}`.slice(0, 50);\n case \"glob\":\n return String(args.pattern ?? \"\").slice(0, 50);\n case \"web_search\":\n return String(args.query ?? \"\").slice(0, 50);\n case \"web_fetch\":\n return String(args.url ?? \"\").slice(0, 50);\n case \"git_commit\":\n return String(args.message ?? \"\").slice(0, 50);\n case \"subagent\":\n return `[${args.type ?? \"general\"}] ${String(args.task ?? \"\").slice(0, 40)}`;\n default:\n return \"\";\n }\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\ninterface ToolCallDisplayProps {\n tool: ToolCallState;\n}\n\nexport function ToolCallDisplay({ tool }: ToolCallDisplayProps) {\n const argSummary = summarizeArgs(tool.toolName, tool.args);\n\n if (tool.status === \"running\") {\n const elapsed = Date.now() - tool.startTime;\n return (\n <Box paddingLeft={2}>\n <Text color=\"yellow\">\n <Spinner type=\"dots\" />\n </Text>\n <Text color=\"yellow\" bold>\n {\" \"}\n {tool.toolName}\n </Text>\n {argSummary && <Text color=\"gray\"> {argSummary}</Text>}\n <Text color=\"gray\" dimColor>\n {\" \"}\n ({formatDuration(elapsed)})\n </Text>\n </Box>\n );\n }\n\n const icon = tool.ok !== false ? \"✓\" : \"✗\";\n const color = tool.ok !== false ? \"green\" : \"red\";\n\n return (\n <Box paddingLeft={2}>\n <Text color={color}>{icon}</Text>\n <Text color=\"gray\"> {tool.toolName}</Text>\n {argSummary && (\n <Text color=\"gray\" dimColor>\n {\" \"}\n {argSummary}\n </Text>\n )}\n {tool.duration !== undefined && (\n <Text color=\"gray\" dimColor>\n {\" \"}\n ({formatDuration(tool.duration)})\n </Text>\n )}\n </Box>\n );\n}\n\ninterface ToolCallListProps {\n tools: ToolCallState[];\n}\n\nexport function ToolCallList({ tools }: ToolCallListProps) {\n if (tools.length === 0) return null;\n\n const running = tools.filter((t) => t.status === \"running\");\n const completed = tools.filter((t) => t.status !== \"running\");\n const hiddenCount = Math.max(0, completed.length - 2);\n const recentCompleted = completed.slice(-2);\n const visible = [...recentCompleted, ...running];\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n {hiddenCount > 0 && (\n <Box paddingLeft={2}>\n <Text color=\"gray\">\n {hiddenCount} earlier tool call{hiddenCount > 1 ? \"s\" : \"\"}{\" \"}\n completed\n </Text>\n </Box>\n )}\n {visible.map((tool) => (\n <ToolCallDisplay key={tool.id} tool={tool} />\n ))}\n </Box>\n );\n}\n","/**\n * SelectPrompt — Interactive selection UI for the terminal.\n *\n * Arrow keys navigate, Enter selects, Esc cancels.\n * Supports single-select and multi-select (Space to toggle).\n * Can show recommended options and descriptions.\n */\n\nimport React, { useState } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\n\nexport interface SelectOption {\n label: string;\n value: string;\n description?: string;\n recommended?: boolean;\n}\n\ninterface SelectPromptProps {\n /** Question to display above options */\n message: string;\n /** Available options */\n options: SelectOption[];\n /** Called when user selects an option (Enter) */\n onSelect: (value: string) => void;\n /** Called when user cancels (Esc) */\n onCancel?: () => void;\n /** Allow multiple selection with Space */\n multiSelect?: boolean;\n /** Called with selected values in multi-select mode */\n onMultiSelect?: (values: string[]) => void;\n}\n\nexport function SelectPrompt({\n message,\n options,\n onSelect,\n onCancel,\n multiSelect = false,\n onMultiSelect,\n}: SelectPromptProps) {\n const [cursor, setCursor] = useState(0);\n const [selected, setSelected] = useState<Set<string>>(new Set());\n\n useInput((input, key) => {\n if (key.downArrow || input === \"j\") {\n setCursor((prev) => Math.min(prev + 1, options.length - 1));\n }\n if (key.upArrow || input === \"k\") {\n setCursor((prev) => Math.max(prev - 1, 0));\n }\n if (key.escape) {\n onCancel?.();\n }\n if (key.return) {\n if (multiSelect && onMultiSelect) {\n onMultiSelect(Array.from(selected));\n } else {\n onSelect(options[cursor].value);\n }\n }\n if (input === \" \" && multiSelect) {\n const val = options[cursor].value;\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(val)) next.delete(val);\n else next.add(val);\n return next;\n });\n }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={1} marginBottom={1}>\n <Box marginBottom={1}>\n <Text color=\"cyan\" bold>\n ◆{\" \"}\n </Text>\n <Text bold>{message}</Text>\n </Box>\n {options.map((opt, i) => {\n const isCursor = i === cursor;\n const isSelected = selected.has(opt.value);\n const indicator = multiSelect\n ? isSelected\n ? \"◉\"\n : \"○\"\n : isCursor\n ? \"▸\"\n : \" \";\n const indicatorColor = multiSelect\n ? isSelected\n ? \"green\"\n : \"gray\"\n : isCursor\n ? \"cyan\"\n : \"gray\";\n\n return (\n <Box key={opt.value} flexDirection=\"column\">\n <Box>\n <Text color={indicatorColor}>{indicator} </Text>\n <Text color={isCursor ? \"white\" : \"gray\"} bold={isCursor}>\n {opt.label}\n </Text>\n {opt.recommended && (\n <Text color=\"green\" dimColor>\n {\" \"}\n (recommended)\n </Text>\n )}\n </Box>\n {opt.description && isCursor && (\n <Box paddingLeft={3}>\n <Text color=\"gray\">{opt.description}</Text>\n </Box>\n )}\n </Box>\n );\n })}\n <Box marginTop={1}>\n <Text color=\"gray\">\n {multiSelect\n ? \"↑↓ navigate │ Space toggle │ Enter confirm │ Esc cancel\"\n : \"↑↓ navigate │ Enter select │ Esc cancel\"}\n </Text>\n </Box>\n </Box>\n );\n}\n","/**\n * Autocomplete — dropdown suggestion list for slash commands and @file paths.\n *\n * Renders below the input box. Arrow keys navigate, Tab/Enter accepts,\n * Esc dismisses. Filters suggestions as user types.\n */\n\nimport React, { useState, useMemo } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\n\nexport interface AutocompleteItem {\n label: string;\n description?: string;\n prefix?: string;\n}\n\ninterface AutocompleteProps {\n /** Current input text to match against */\n query: string;\n /** All possible suggestions */\n items: AutocompleteItem[];\n /** Called when user accepts a suggestion */\n onAccept: (label: string) => void;\n /** Called when user dismisses (Esc or type past suggestions) */\n onDismiss: () => void;\n /** Max items to show */\n maxVisible?: number;\n}\n\nexport function Autocomplete({\n query,\n items,\n onAccept,\n onDismiss,\n maxVisible = 8,\n}: AutocompleteProps) {\n const [cursor, setCursor] = useState(0);\n\n const filtered = useMemo(() => {\n const q = query.toLowerCase();\n return items\n .filter((item) => item.label.toLowerCase().includes(q))\n .slice(0, maxVisible);\n }, [query, items, maxVisible]);\n\n useInput((input, key) => {\n if (key.downArrow) {\n setCursor((prev) => Math.min(prev + 1, filtered.length - 1));\n return;\n }\n if (key.upArrow) {\n setCursor((prev) => Math.max(prev - 1, 0));\n return;\n }\n if (key.tab || key.return) {\n if (filtered[cursor]) {\n onAccept(filtered[cursor].label);\n }\n return;\n }\n if (key.escape) {\n onDismiss();\n return;\n }\n });\n\n if (filtered.length === 0) return null;\n\n return (\n <Box flexDirection=\"column\" paddingX={2} marginBottom={0}>\n {filtered.map((item, i) => {\n const isActive = i === cursor;\n return (\n <Box key={item.label}>\n <Text color={isActive ? \"cyan\" : \"gray\"}>\n {isActive ? \"▸ \" : \" \"}\n </Text>\n <Text color={isActive ? \"white\" : \"gray\"} bold={isActive}>\n {item.prefix ?? \"\"}\n {item.label}\n </Text>\n {item.description && (\n <Text color=\"gray\" dimColor={!isActive}>\n {\" \"}\n {item.description}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n );\n}\n","/**\n * Keybinding registry with default bindings.\n *\n * Each binding maps a key combination to an action name.\n * The ChatApp component handles actions via its useInput hook.\n */\n\nexport type KeyAction =\n | 'abort' // Interrupt current operation\n | 'exit' // Exit Brainstorm\n | 'clear-screen' // Clear terminal\n | 'clear-chat' // Clear conversation history\n | 'cycle-mode'; // Cycle permission mode (auto → confirm → plan)\n\nexport interface KeyBinding {\n action: KeyAction;\n description: string;\n /** Match function: returns true if the key event matches */\n match: (input: string, key: KeyEvent) => boolean;\n}\n\n/** Ink useInput key event shape */\nexport interface KeyEvent {\n upArrow: boolean;\n downArrow: boolean;\n leftArrow: boolean;\n rightArrow: boolean;\n return: boolean;\n escape: boolean;\n ctrl: boolean;\n shift: boolean;\n tab: boolean;\n backspace: boolean;\n delete: boolean;\n meta: boolean;\n}\n\nexport const DEFAULT_KEYBINDINGS: KeyBinding[] = [\n {\n action: 'abort',\n description: 'Interrupt current operation',\n match: (_input, key) => key.escape,\n },\n {\n action: 'exit',\n description: 'Exit Brainstorm',\n // Ink sends empty string for Ctrl+D when input is empty (standard EOF)\n match: (input, key) => key.ctrl && (input === 'd' || input === ''),\n },\n {\n action: 'clear-screen',\n description: 'Clear terminal screen',\n match: (input, key) => key.ctrl && (input === 'l' || input === '\\f'),\n },\n {\n action: 'clear-chat',\n description: 'Clear conversation history',\n match: (input, key) => key.ctrl && (input === 'k' || input === '\\x0b'),\n },\n {\n action: 'cycle-mode',\n description: 'Cycle permission mode (auto → confirm → plan)',\n match: (_input, key) => key.shift && key.tab,\n },\n];\n\n/**\n * Resolve which action (if any) a key event triggers.\n */\nexport function resolveKeyAction(input: string, key: KeyEvent, bindings = DEFAULT_KEYBINDINGS): KeyAction | null {\n for (const binding of bindings) {\n if (binding.match(input, key)) return binding.action;\n }\n return null;\n}\n\n/**\n * Get a human-readable description of all keybindings.\n */\nexport function formatKeybindings(bindings = DEFAULT_KEYBINDINGS): string {\n const labels: Record<string, string> = {\n abort: 'Escape',\n exit: 'Ctrl+D',\n 'clear-screen': 'Ctrl+L',\n 'clear-chat': 'Ctrl+K',\n 'cycle-mode': 'Shift+Tab',\n };\n\n return bindings\n .map((b) => ` ${(labels[b.action] ?? b.action).padEnd(15)} ${b.description}`)\n .join('\\n');\n}\n","/**\n * Input history with persistence.\n *\n * Keeps the last N inputs in memory and persists to disk.\n * Up/Down arrow navigation cycles through previous inputs.\n */\n\nimport { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst HISTORY_DIR = join(homedir(), '.brainstorm');\nconst HISTORY_FILE = join(HISTORY_DIR, 'input-history.json');\nconst MAX_MEMORY = 100;\nconst MAX_PERSIST = 500;\n\nexport class InputHistory {\n private entries: string[] = [];\n private cursor = -1;\n private draft = '';\n\n constructor() {\n this.load();\n }\n\n /**\n * Add an input to history. Deduplicates consecutive identical entries.\n */\n push(input: string): void {\n const trimmed = input.trim();\n if (!trimmed) return;\n\n // Don't add if identical to most recent\n if (this.entries.length > 0 && this.entries[this.entries.length - 1] === trimmed) {\n this.resetCursor();\n return;\n }\n\n this.entries.push(trimmed);\n\n // Trim memory buffer\n if (this.entries.length > MAX_MEMORY) {\n this.entries = this.entries.slice(-MAX_MEMORY);\n }\n\n this.resetCursor();\n this.save();\n }\n\n /**\n * Navigate up (older). Returns the entry to display, or null if at the end.\n */\n up(currentInput: string): string | null {\n if (this.entries.length === 0) return null;\n\n // Save current input as draft on first up\n if (this.cursor === -1) {\n this.draft = currentInput;\n }\n\n const nextCursor = this.cursor === -1 ? this.entries.length - 1 : this.cursor - 1;\n if (nextCursor < 0) return null;\n\n this.cursor = nextCursor;\n return this.entries[this.cursor];\n }\n\n /**\n * Navigate down (newer). Returns the entry to display, or the draft if at bottom.\n */\n down(): string | null {\n if (this.cursor === -1) return null;\n\n this.cursor += 1;\n\n if (this.cursor >= this.entries.length) {\n this.cursor = -1;\n return this.draft;\n }\n\n return this.entries[this.cursor];\n }\n\n /**\n * Reset cursor position (called after submitting input).\n */\n resetCursor(): void {\n this.cursor = -1;\n this.draft = '';\n }\n\n /**\n * Get all entries (for debugging/export).\n */\n getAll(): string[] {\n return [...this.entries];\n }\n\n private load(): void {\n try {\n if (existsSync(HISTORY_FILE)) {\n const data = JSON.parse(readFileSync(HISTORY_FILE, 'utf-8'));\n if (Array.isArray(data)) {\n this.entries = data.slice(-MAX_MEMORY);\n }\n }\n } catch {\n // Corrupt file — start fresh\n this.entries = [];\n }\n }\n\n private save(): void {\n try {\n if (!existsSync(HISTORY_DIR)) mkdirSync(HISTORY_DIR, { recursive: true });\n\n // Load full history from disk, append new entries, trim\n let fullHistory: string[] = [];\n try {\n if (existsSync(HISTORY_FILE)) {\n const data = JSON.parse(readFileSync(HISTORY_FILE, 'utf-8'));\n if (Array.isArray(data)) fullHistory = data;\n }\n } catch {\n // Start fresh\n }\n\n // Merge: disk history + memory entries (deduped at tail)\n const merged = [...fullHistory];\n for (const entry of this.entries) {\n if (merged[merged.length - 1] !== entry) {\n merged.push(entry);\n }\n }\n\n const trimmed = merged.slice(-MAX_PERSIST);\n // Atomic write: temp file + rename prevents corruption on crash\n const tmpFile = HISTORY_FILE + '.tmp';\n writeFileSync(tmpFile, JSON.stringify(trimmed), 'utf-8');\n renameSync(tmpFile, HISTORY_FILE);\n } catch {\n // Non-fatal — history is a convenience feature\n }\n }\n}\n","/**\n * Dashboard Mode — Full Ecosystem Inventory\n *\n * Three panels showing everything registered in the Brainstorm platform:\n * Left: Connected systems with health + routing history\n * Center: Tool registry grouped by domain + tool health\n * Right: Audit trail + cost trends\n *\n * Data sources:\n * - godModeInfo: from ProductConnector discovery at boot\n * - toolStats: captured from agent loop events\n * - brData: fetched from BrainstormRouter API\n * - routingHistory: captured from routing decisions\n */\n\nimport React, { useEffect } from \"react\";\nimport { Box, Text } from \"ink\";\nimport { Gauge } from \"../viz/Gauge.js\";\nimport { Sparkline } from \"../viz/Sparkline.js\";\nimport { getProviderColor } from \"../../theme.js\";\nimport type { BRDashboardData } from \"../../hooks/useBRData.js\";\n\ninterface RoutingEntry {\n model: string;\n strategy: string;\n reason: string;\n timestamp: number;\n}\n\ninterface ToolStat {\n name: string;\n calls: number;\n successes: number;\n}\n\ninterface ConnectedSystem {\n name: string;\n displayName: string;\n capabilities: string[];\n latencyMs: number;\n toolCount: number;\n}\n\ninterface DashboardModeProps {\n sessionCost: number;\n tokenCount: { input: number; output: number };\n modelCount: { local: number; cloud: number };\n routingHistory: RoutingEntry[];\n toolStats: ToolStat[];\n turnCount: number;\n sessionStart: number;\n brData?: BRDashboardData;\n onRefreshBR?: () => void;\n godModeInfo?: {\n connectedSystems: ConnectedSystem[];\n errors: Array<{ name: string; error: string }>;\n totalTools: number;\n };\n}\n\nfunction formatElapsed(ms: number): string {\n const mins = Math.floor(ms / 60000);\n if (mins < 1) return \"<1m\";\n if (mins < 60) return `${mins}m`;\n return `${Math.floor(mins / 60)}h ${mins % 60}m`;\n}\n\nfunction formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;\n return String(n);\n}\n\nfunction timeAgo(ts: number): string {\n const secs = Math.floor((Date.now() - ts) / 1000);\n if (secs < 60) return `${secs}s ago`;\n return `${Math.floor(secs / 60)}m ago`;\n}\n\n/** Group tools by their product prefix (msp_, br_, gtm_, etc.). */\nfunction groupToolsByDomain(\n systems: ConnectedSystem[],\n): Array<{ domain: string; product: string; count: number }> {\n const groups: Array<{ domain: string; product: string; count: number }> = [];\n for (const sys of systems) {\n for (const cap of sys.capabilities) {\n groups.push({\n domain: cap,\n product: sys.name,\n count: Math.ceil(sys.toolCount / Math.max(sys.capabilities.length, 1)),\n });\n }\n }\n return groups;\n}\n\nexport function DashboardMode({\n sessionCost,\n tokenCount,\n modelCount,\n routingHistory,\n toolStats,\n turnCount,\n sessionStart,\n brData,\n onRefreshBR,\n godModeInfo,\n}: DashboardModeProps) {\n const elapsed = Date.now() - sessionStart;\n const costPerHour = elapsed > 60000 ? (sessionCost / elapsed) * 3600000 : 0;\n const gm = godModeInfo;\n const domainGroups = gm ? groupToolsByDomain(gm.connectedSystems) : [];\n\n useEffect(() => {\n if (onRefreshBR && (!brData || brData.lastFetched === 0)) {\n onRefreshBR();\n }\n }, []);\n\n return (\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n {/* Row 1: Session Stats + Platform Stats */}\n <Box\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={1}\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n >\n <Box flexDirection=\"column\">\n <Text color=\"gray\">Session</Text>\n <Text color=\"yellow\" bold>\n ${sessionCost.toFixed(4)}\n </Text>\n </Box>\n <Box flexDirection=\"column\">\n <Text color=\"gray\">Tokens</Text>\n <Text>\n {formatTokens(tokenCount.input)}\n <Text color=\"gray\">↑</Text> {formatTokens(tokenCount.output)}\n <Text color=\"gray\">↓</Text>\n </Text>\n </Box>\n <Box flexDirection=\"column\">\n <Text color=\"gray\">Turns</Text>\n <Text bold>{turnCount}</Text>\n </Box>\n <Box flexDirection=\"column\">\n <Text color=\"gray\">Elapsed</Text>\n <Text>{formatElapsed(elapsed)}</Text>\n </Box>\n <Box flexDirection=\"column\">\n <Text color=\"gray\">$/hour</Text>\n <Text\n color={\n costPerHour > 5 ? \"red\" : costPerHour > 1 ? \"yellow\" : \"green\"\n }\n >\n ${costPerHour.toFixed(2)}\n </Text>\n </Box>\n <Box flexDirection=\"column\">\n <Text color=\"gray\">Products</Text>\n <Text\n color={gm && gm.connectedSystems.length > 0 ? \"green\" : \"gray\"}\n bold\n >\n {gm?.connectedSystems.length ?? 0}\n </Text>\n </Box>\n <Box flexDirection=\"column\">\n <Text color=\"gray\">Tools</Text>\n <Text bold>{gm?.totalTools ?? 0}</Text>\n </Box>\n <Box flexDirection=\"column\">\n <Text color=\"gray\">Models</Text>\n <Text>\n {modelCount.local}L/{modelCount.cloud}C\n </Text>\n </Box>\n </Box>\n\n {/* Row 2: Three panels */}\n <Box marginTop={1} flexDirection=\"row\" flexGrow={1}>\n {/* LEFT: Connected Systems + Routing */}\n <Box\n borderStyle=\"round\"\n borderColor=\"gray\"\n flexGrow={1}\n paddingX={1}\n flexDirection=\"column\"\n >\n <Text bold color=\"green\">\n {\" \"}\n Connected Systems\n </Text>\n {gm && gm.connectedSystems.length > 0 ? (\n gm.connectedSystems.map((sys) => (\n <Box key={sys.name}>\n <Text color=\"green\">● </Text>\n <Text bold>{sys.displayName.padEnd(18)}</Text>\n <Text color=\"gray\">{String(sys.toolCount).padStart(2)}t </Text>\n <Text color=\"gray\" dimColor>\n {sys.latencyMs}ms\n </Text>\n </Box>\n ))\n ) : (\n <Text color=\"gray\" dimColor>\n {\" \"}\n No products connected\n </Text>\n )}\n {gm &&\n gm.errors.length > 0 &&\n gm.errors.map((err) => (\n <Box key={err.name}>\n <Text color=\"red\">○ </Text>\n <Text color=\"gray\">{err.name.padEnd(18)}</Text>\n <Text color=\"red\" dimColor>\n {err.error.slice(0, 25)}\n </Text>\n </Box>\n ))}\n\n <Text> </Text>\n <Text bold color=\"blue\">\n {\" \"}\n Routing Log\n </Text>\n {routingHistory.length === 0 ? (\n <Text color=\"gray\" dimColor>\n {\" \"}\n Send a message to start.\n </Text>\n ) : (\n routingHistory.slice(0, 5).map((entry, i) => (\n <Box key={i}>\n <Text color=\"gray\" dimColor>\n {timeAgo(entry.timestamp).padEnd(8)}\n </Text>\n <Text color={getProviderColor(entry.model)} bold>\n {entry.model.padEnd(16)}\n </Text>\n <Text color=\"gray\">{entry.strategy}</Text>\n </Box>\n ))\n )}\n\n {brData && brData.leaderboard.length > 0 && (\n <>\n <Text> </Text>\n <Text bold color=\"yellow\">\n {\" \"}\n Leaderboard\n </Text>\n {brData.leaderboard\n .filter((e) => e?.model)\n .slice(0, 4)\n .map((entry, i) => (\n <Box key={i}>\n <Text color=\"gray\">{String(i + 1).padStart(2)}. </Text>\n <Text color={getProviderColor(entry.provider ?? \"\")} bold>\n {(entry.model ?? \"unknown\")\n .split(\"/\")\n .pop()\n ?.padEnd(16) ?? \"unknown\".padEnd(16)}\n </Text>\n <Text color=\"gray\">\n Q{entry.quality_rank ?? \"?\"} S{entry.speed_rank ?? \"?\"}\n </Text>\n </Box>\n ))}\n </>\n )}\n </Box>\n\n {/* CENTER: Tool Registry by Domain + Health */}\n <Box\n borderStyle=\"round\"\n borderColor=\"gray\"\n flexGrow={1}\n paddingX={1}\n marginLeft={1}\n flexDirection=\"column\"\n >\n <Text bold color=\"cyan\">\n {\" \"}\n Tool Registry ({gm?.totalTools ?? 0})\n </Text>\n {domainGroups.length > 0 ? (\n domainGroups.slice(0, 8).map((g) => (\n <Box key={`${g.product}-${g.domain}`}>\n <Text color=\"gray\">{g.product.padEnd(6)}</Text>\n <Text>{g.domain.padEnd(20)}</Text>\n <Text color=\"gray\" dimColor>\n {g.count}t\n </Text>\n </Box>\n ))\n ) : (\n <Text color=\"gray\" dimColor>\n {\" \"}\n No tools registered\n </Text>\n )}\n\n {toolStats.length > 0 && (\n <>\n <Text> </Text>\n <Text bold color=\"magenta\">\n {\" \"}\n Tool Health\n </Text>\n {toolStats\n .sort((a, b) => b.calls - a.calls)\n .slice(0, 6)\n .map((tool) => {\n const rate =\n tool.calls > 0\n ? Math.round((tool.successes / tool.calls) * 100)\n : 0;\n const color =\n rate >= 90 ? \"green\" : rate >= 70 ? \"yellow\" : \"red\";\n return (\n <Box key={tool.name}>\n <Text color={color}>\n {rate >= 90 ? \"●\" : rate >= 70 ? \"◐\" : \"○\"}{\" \"}\n </Text>\n <Text>{tool.name.padEnd(18)}</Text>\n <Text color=\"gray\">\n {String(tool.calls).padStart(3)}{\" \"}\n </Text>\n <Gauge value={rate} width={6} showPercent={false} />\n </Box>\n );\n })}\n </>\n )}\n\n {brData?.waste && brData.waste.total_waste_usd > 0 && (\n <>\n <Text> </Text>\n <Text bold color=\"red\">\n {\" \"}\n Waste: ${(brData.waste?.total_waste_usd ?? 0).toFixed(2)}\n </Text>\n </>\n )}\n </Box>\n\n {/* RIGHT: Audit + Cost Trends */}\n <Box\n borderStyle=\"round\"\n borderColor=\"gray\"\n flexGrow={1}\n paddingX={1}\n marginLeft={1}\n flexDirection=\"column\"\n >\n <Text bold color=\"magenta\">\n {\" \"}\n Audit Trail\n </Text>\n {!brData || brData.audit.length === 0 ? (\n <Text color=\"gray\" dimColor>\n {\" \"}\n No audit data. Press r to refresh.\n </Text>\n ) : (\n brData.audit\n .filter((e) => e != null)\n .slice(0, 5)\n .map((entry, i) => {\n const statusColor =\n entry.guardian_status === \"safe\"\n ? \"green\"\n : entry.guardian_status === \"flagged\"\n ? \"yellow\"\n : \"red\";\n return (\n <Box key={i}>\n <Text color={statusColor}>\n {entry.guardian_status === \"safe\" ? \"●\" : \"⚠\"}{\" \"}\n </Text>\n <Text color={getProviderColor(entry.model ?? \"\")}>\n {(entry.model ?? \"\").split(\"/\").pop()?.padEnd(12) ?? \"\"}\n </Text>\n <Text color=\"gray\">\n ${(entry.cost_usd ?? 0).toFixed(4)}\n </Text>\n </Box>\n );\n })\n )}\n\n {brData && brData.dailyTrend.length > 0 && (\n <>\n <Text> </Text>\n <Text bold color=\"blue\">\n {\" \"}\n 7-Day Cost\n </Text>\n <Box>\n <Sparkline\n data={brData.dailyTrend.map((d) => d?.cost_usd ?? 0)}\n color=\"yellow\"\n width={18}\n />\n <Text color=\"gray\">\n {\" \"}\n $\n {brData.dailyTrend\n .reduce((s, d) => s + d.cost_usd, 0)\n .toFixed(2)}\n </Text>\n </Box>\n </>\n )}\n\n {brData?.forecast && (\n <>\n <Text> </Text>\n <Text bold color={brData.forecast?.will_exceed ? \"red\" : \"green\"}>\n {\" \"}\n Forecast: ${(brData.forecast?.projected_spend ?? 0).toFixed(2)}\n </Text>\n </>\n )}\n </Box>\n </Box>\n\n {/* Bottom: Status bar */}\n <Box paddingX={1}>\n <Text color=\"gray\" dimColor>\n {brData?.loading\n ? \"Loading...\"\n : brData?.error\n ? `BR: ${brData.error}`\n : `r refresh │ Esc chat │ ${gm ? `${gm.connectedSystems.length} products │ ${gm.totalTools} tools` : \"godmode off\"} │ ${modelCount.local}L/${modelCount.cloud}C`}\n </Text>\n </Box>\n </Box>\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\n\ninterface GaugeProps {\n /** Value 0-100 */\n value: number;\n /** Width in characters */\n width?: number;\n /** Label shown before the gauge */\n label?: string;\n /** Show percentage after the gauge */\n showPercent?: boolean;\n /** Color function: returns Ink color string based on value */\n colorFn?: (value: number) => string;\n}\n\nconst DEFAULT_COLOR = (v: number): string => {\n if (v >= 85) return \"red\";\n if (v >= 60) return \"yellow\";\n return \"green\";\n};\n\nexport function Gauge({\n value,\n width = 16,\n label,\n showPercent = true,\n colorFn = DEFAULT_COLOR,\n}: GaugeProps) {\n const clamped = Math.max(0, Math.min(100, value));\n const filled = Math.round((clamped / 100) * width);\n const empty = width - filled;\n const color = colorFn(clamped);\n\n return (\n <Box>\n {label && <Text color=\"gray\">{label} </Text>}\n <Text color={color}>{\"█\".repeat(filled)}</Text>\n <Text color=\"gray\" dimColor>\n {\"░\".repeat(empty)}\n </Text>\n {showPercent && <Text color=\"gray\"> {Math.round(clamped)}%</Text>}\n </Box>\n );\n}\n","import React from \"react\";\nimport { Text } from \"ink\";\n\nconst BARS = [\"▁\", \"▂\", \"▃\", \"▄\", \"▅\", \"▆\", \"▇\", \"█\"];\n\ninterface SparklineProps {\n /** Array of numeric values to plot */\n data: number[];\n /** Color for the sparkline */\n color?: string;\n /** Width in characters (data is sampled to fit) */\n width?: number;\n}\n\nexport function Sparkline({ data, color = \"green\", width }: SparklineProps) {\n if (data.length === 0)\n return (\n <Text color=\"gray\" dimColor>\n ─\n </Text>\n );\n\n // Sample data to fit width if needed\n let values = data;\n if (width && data.length > width) {\n const step = data.length / width;\n values = Array.from(\n { length: width },\n (_, i) => data[Math.floor(i * step)],\n );\n }\n\n const min = Math.min(...values);\n const max = Math.max(...values);\n const range = max - min || 1;\n\n const bars = values.map((v) => {\n const idx = Math.round(((v - min) / range) * (BARS.length - 1));\n return BARS[idx];\n });\n\n return <Text color={color}>{bars.join(\"\")}</Text>;\n}\n","/**\n * Brainstorm TUI Theme — Catppuccin Mocha-inspired color palette.\n * All colors are semantic: used for meaning, not decoration.\n */\n\nexport const theme = {\n // Backgrounds\n base: \"#1e1e2e\",\n surface: \"#313244\",\n border: \"#45475a\",\n\n // Text\n text: \"#cdd6f4\",\n subtext: \"#a6adc8\",\n dim: \"#6c7086\",\n\n // Semantic colors\n red: \"#f38ba8\",\n green: \"#a6e3a1\",\n yellow: \"#f9e2af\",\n blue: \"#89b4fa\",\n mauve: \"#cba6f7\",\n teal: \"#94e2d5\",\n peach: \"#fab387\",\n pink: \"#f5c2e7\",\n sky: \"#89dceb\",\n lavender: \"#b4befe\",\n} as const;\n\n/** Provider → color mapping */\nexport function getProviderColor(provider: string): string {\n const p = provider.toLowerCase();\n if (p.includes(\"anthropic\") || p.includes(\"claude\")) return \"magenta\";\n if (p.includes(\"openai\") || p.includes(\"gpt\") || p.includes(\"o3\"))\n return \"yellow\";\n if (p.includes(\"google\") || p.includes(\"gemini\")) return \"blue\";\n if (p.includes(\"deepseek\")) return \"cyan\";\n if (p.includes(\"local\") || p.includes(\"ollama\") || p.includes(\"lmstudio\"))\n return \"white\";\n return \"gray\";\n}\n\n/** Role → color mapping */\nexport function getRoleColor(role: string): string {\n switch (role) {\n case \"architect\":\n return \"magenta\";\n case \"product-manager\":\n return \"blue\";\n case \"sr-developer\":\n return \"green\";\n case \"jr-developer\":\n return \"yellow\";\n case \"qa\":\n return \"red\";\n default:\n return \"gray\";\n }\n}\n\n/** Budget percentage → color */\nexport function getBudgetColor(percent: number): string {\n if (percent >= 85) return \"red\";\n if (percent >= 60) return \"yellow\";\n return \"green\";\n}\n","import React, { useState } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport { getProviderColor } from \"../../theme.js\";\nimport { Gauge } from \"../viz/Gauge.js\";\n\ninterface ModelInfo {\n id: string;\n name: string;\n provider: string;\n qualityTier: number;\n speedTier: number;\n pricing: { input: number; output: number };\n status: string;\n}\n\ninterface ModelsModeProps {\n models: ModelInfo[];\n currentModelId?: string;\n onSelectModel?: (modelId: string) => void;\n}\n\nconst QUALITY_BARS: Record<number, { label: string; value: number }> = {\n 1: { label: \"Excellent\", value: 100 },\n 2: { label: \"Good\", value: 66 },\n 3: { label: \"Basic\", value: 33 },\n};\n\nconst SPEED_BARS: Record<number, { label: string; value: number }> = {\n 1: { label: \"Fast\", value: 100 },\n 2: { label: \"Medium\", value: 66 },\n 3: { label: \"Slow\", value: 33 },\n};\n\nexport function ModelsMode({\n models,\n currentModelId,\n onSelectModel,\n}: ModelsModeProps) {\n const initialIdx = currentModelId\n ? Math.max(\n 0,\n models.findIndex(\n (m) => m.id === currentModelId || m.name === currentModelId,\n ),\n )\n : 0;\n const [selectedIdx, setSelectedIdx] = useState(initialIdx);\n\n useInput((input, key) => {\n if (key.downArrow || input === \"j\") {\n setSelectedIdx((prev) => Math.min(prev + 1, models.length - 1));\n }\n if (key.upArrow || input === \"k\") {\n setSelectedIdx((prev) => Math.max(prev - 1, 0));\n }\n if (key.return && onSelectModel && models[selectedIdx]) {\n onSelectModel(models[selectedIdx].id);\n }\n });\n\n const selected = models[selectedIdx];\n\n return (\n <Box flexDirection=\"row\" flexGrow={1} paddingX={1}>\n {/* Left: Model list */}\n <Box\n borderStyle=\"round\"\n borderColor=\"gray\"\n flexDirection=\"column\"\n paddingX={1}\n width=\"60%\"\n >\n <Text bold color=\"yellow\">\n {\" \"}\n Model Explorer\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n {models.map((m, i) => {\n const isSelected = i === selectedIdx;\n const provColor = getProviderColor(m.provider);\n return (\n <Box key={m.id}>\n <Text color={isSelected ? \"white\" : \"gray\"}>\n {isSelected ? \" ▸ \" : \" \"}\n </Text>\n <Text color={m.status === \"available\" ? \"green\" : \"red\"}>\n {m.status === \"available\" ? \"● \" : \"○ \"}\n </Text>\n <Text color={provColor} bold={isSelected}>\n {m.name.padEnd(24)}\n </Text>\n <Text color=\"gray\">\n ${m.pricing.input}/${m.pricing.output}\n </Text>\n </Box>\n );\n })}\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n {models.length} models │ j/k navigate │ Enter select\n </Text>\n </Box>\n </Box>\n\n {/* Right: Selected model detail */}\n <Box\n borderStyle=\"round\"\n borderColor=\"gray\"\n flexDirection=\"column\"\n paddingX={1}\n marginLeft={1}\n width=\"40%\"\n >\n {selected ? (\n <>\n <Text bold color={getProviderColor(selected.provider)}>\n {\" \"}\n {selected.name}\n </Text>\n <Text color=\"gray\" dimColor>\n {\" \"}\n {selected.id}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">Provider</Text>\n <Text color={getProviderColor(selected.provider)} bold>\n {\" \"}\n {selected.provider}\n </Text>\n\n <Box marginTop={1}>\n <Text color=\"gray\">Quality </Text>\n <Gauge\n value={QUALITY_BARS[selected.qualityTier]?.value ?? 50}\n width={8}\n showPercent={false}\n colorFn={() => \"yellow\"}\n />\n <Text color=\"gray\">\n {\" \"}\n {QUALITY_BARS[selected.qualityTier]?.label ?? \"?\"}\n </Text>\n </Box>\n\n <Box>\n <Text color=\"gray\">Speed </Text>\n <Gauge\n value={SPEED_BARS[selected.speedTier]?.value ?? 50}\n width={8}\n showPercent={false}\n colorFn={() => \"cyan\"}\n />\n <Text color=\"gray\">\n {\" \"}\n {SPEED_BARS[selected.speedTier]?.label ?? \"?\"}\n </Text>\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">Pricing (per 1M tokens)</Text>\n <Text>\n {\" \"}\n Input: <Text color=\"yellow\">${selected.pricing.input}</Text>\n </Text>\n <Text>\n {\" \"}\n Output: <Text color=\"yellow\">${selected.pricing.output}</Text>\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"gray\">Status: </Text>\n <Text\n color={selected.status === \"available\" ? \"green\" : \"red\"}\n bold\n >\n {selected.status}\n </Text>\n </Box>\n </Box>\n </>\n ) : (\n <Text color=\"gray\" dimColor>\n No model selected\n </Text>\n )}\n </Box>\n </Box>\n );\n}\n","import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport { getRoleColor } from \"../../theme.js\";\n\ninterface VaultInfo {\n exists: boolean;\n isOpen: boolean;\n keyCount: number;\n keys: string[];\n createdAt: string | null;\n opAvailable: boolean;\n resolvedKeys: string[];\n}\n\ninterface MemoryInfo {\n localCount: number;\n types: Record<string, number>;\n}\n\ninterface ConfigModeProps {\n strategy: string;\n permissionMode: string;\n outputStyle: string;\n sandbox: string;\n role?: string;\n modelCount?: { local: number; cloud: number };\n turnCount?: number;\n sessionCost?: number;\n vaultInfo?: VaultInfo;\n memoryInfo?: MemoryInfo;\n}\n\nfunction ConfigItem({\n label,\n value,\n color,\n}: {\n label: string;\n value: string;\n color?: string;\n}) {\n return (\n <Box>\n <Text color=\"gray\"> {label.padEnd(18)}</Text>\n <Text color={color ?? \"white\"} bold>\n {value}\n </Text>\n </Box>\n );\n}\n\nfunction formatAge(isoDate: string): string {\n const ms = Date.now() - new Date(isoDate).getTime();\n const days = Math.floor(ms / 86400000);\n if (days === 0) return \"today\";\n if (days === 1) return \"1 day ago\";\n if (days < 30) return `${days} days ago`;\n if (days < 365) return `${Math.floor(days / 30)} months ago`;\n return `${Math.floor(days / 365)} years ago`;\n}\n\n/** Known human-readable labels for provider keys */\nconst KEY_LABELS: Record<\n string,\n { label: string; provider: string; color: string }\n> = {\n BRAINSTORM_API_KEY: {\n label: \"BrainstormRouter\",\n provider: \"brainstorm\",\n color: \"green\",\n },\n ANTHROPIC_API_KEY: {\n label: \"Anthropic\",\n provider: \"anthropic\",\n color: \"magenta\",\n },\n OPENAI_API_KEY: { label: \"OpenAI\", provider: \"openai\", color: \"yellow\" },\n GOOGLE_GENERATIVE_AI_API_KEY: {\n label: \"Google AI\",\n provider: \"google\",\n color: \"blue\",\n },\n DEEPSEEK_API_KEY: { label: \"DeepSeek\", provider: \"deepseek\", color: \"cyan\" },\n MOONSHOT_API_KEY: {\n label: \"Moonshot (Kimi)\",\n provider: \"moonshot\",\n color: \"white\",\n },\n BRAINSTORM_ADMIN_KEY: {\n label: \"BR Admin\",\n provider: \"brainstorm\",\n color: \"red\",\n },\n};\n\nexport function ConfigMode({\n strategy,\n permissionMode,\n outputStyle,\n sandbox,\n role,\n modelCount,\n turnCount,\n sessionCost,\n vaultInfo,\n memoryInfo,\n}: ConfigModeProps) {\n const modeColor =\n permissionMode === \"auto\"\n ? \"green\"\n : permissionMode === \"plan\"\n ? \"cyan\"\n : \"yellow\";\n\n return (\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n <Box flexDirection=\"row\" flexGrow={1}>\n {/* Left: Active Configuration */}\n <Box\n borderStyle=\"round\"\n borderColor=\"gray\"\n flexDirection=\"column\"\n paddingX={1}\n width=\"50%\"\n >\n <Text bold color=\"magenta\">\n {\" \"}\n Active Configuration\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n {\" \"}\n <Text color=\"green\" bold>\n ●\n </Text>{\" \"}\n <Text bold>Routing</Text>\n </Text>\n <ConfigItem label=\"Strategy\" value={strategy} />\n <ConfigItem\n label=\"Permission\"\n value={permissionMode}\n color={modeColor}\n />\n <ConfigItem label=\"Output style\" value={outputStyle} />\n {role && (\n <ConfigItem\n label=\"Active role\"\n value={role}\n color={getRoleColor(role)}\n />\n )}\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n {\" \"}\n <Text color=\"yellow\" bold>\n ●\n </Text>{\" \"}\n <Text bold>Shell</Text>\n </Text>\n <ConfigItem\n label=\"Sandbox\"\n value={sandbox}\n color={\n sandbox === \"container\"\n ? \"cyan\"\n : sandbox === \"restricted\"\n ? \"yellow\"\n : \"gray\"\n }\n />\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n {\" \"}\n <Text color=\"blue\" bold>\n ●\n </Text>{\" \"}\n <Text bold>Session</Text>\n </Text>\n {turnCount !== undefined && (\n <ConfigItem label=\"Turns\" value={String(turnCount)} />\n )}\n {sessionCost !== undefined && (\n <ConfigItem\n label=\"Cost\"\n value={`$${sessionCost.toFixed(4)}`}\n color=\"yellow\"\n />\n )}\n {modelCount && (\n <ConfigItem\n label=\"Models\"\n value={`${modelCount.local} local, ${modelCount.cloud} cloud`}\n />\n )}\n </Box>\n </Box>\n\n {/* Right: Vault & Keys */}\n <Box\n borderStyle=\"round\"\n borderColor=\"gray\"\n flexDirection=\"column\"\n paddingX={1}\n marginLeft={1}\n width=\"50%\"\n >\n <Text bold color=\"cyan\">\n {\" \"}\n Vault & API Keys\n </Text>\n\n {vaultInfo ? (\n <Box marginTop={1} flexDirection=\"column\">\n {/* Vault status */}\n <Box>\n <Text color=\"gray\"> Status </Text>\n <Text\n color={\n vaultInfo.isOpen\n ? \"green\"\n : vaultInfo.exists\n ? \"yellow\"\n : \"red\"\n }\n bold\n >\n {vaultInfo.isOpen\n ? \"● unlocked\"\n : vaultInfo.exists\n ? \"● locked\"\n : \"○ not initialized\"}\n </Text>\n </Box>\n {vaultInfo.createdAt && (\n <Box>\n <Text color=\"gray\"> Created </Text>\n <Text>{formatAge(vaultInfo.createdAt)}</Text>\n </Box>\n )}\n <Box>\n <Text color=\"gray\"> 1Password </Text>\n <Text color={vaultInfo.opAvailable ? \"green\" : \"gray\"}>\n {vaultInfo.opAvailable ? \"● connected\" : \"○ not available\"}\n </Text>\n </Box>\n\n {/* Key list */}\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n {\" \"}\n <Text bold>\n Resolved Keys ({vaultInfo.resolvedKeys.length})\n </Text>\n </Text>\n {vaultInfo.resolvedKeys.length === 0 ? (\n <Text color=\"gray\" dimColor>\n {\" \"}\n No keys resolved. Use /vault add or set env vars.\n </Text>\n ) : (\n vaultInfo.resolvedKeys.map((key) => {\n const info = KEY_LABELS[key];\n return (\n <Box key={key}>\n <Text color={info?.color ?? \"gray\"}> ● </Text>\n <Text>{(info?.label ?? key).padEnd(20)}</Text>\n <Text color=\"gray\" dimColor>\n {key}\n </Text>\n </Box>\n );\n })\n )}\n </Box>\n\n {/* Vault keys (if open and different from resolved) */}\n {vaultInfo.isOpen && vaultInfo.keys.length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n {\" \"}\n <Text bold>Vault Keys ({vaultInfo.keyCount})</Text>\n </Text>\n {vaultInfo.keys.map((key) => {\n const info = KEY_LABELS[key];\n return (\n <Box key={key}>\n <Text color=\"gray\"> ◆ </Text>\n <Text>{(info?.label ?? key).padEnd(20)}</Text>\n <Text color=\"gray\" dimColor>\n {key}\n </Text>\n </Box>\n );\n })}\n </Box>\n )}\n </Box>\n ) : (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\" dimColor>\n {\" \"}\n Vault info not available.\n </Text>\n <Text color=\"gray\" dimColor>\n {\" \"}\n Run `brainstorm vault init` to create.\n </Text>\n </Box>\n )}\n\n {/* Memory */}\n {memoryInfo && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n {\" \"}\n <Text bold>Memory ({memoryInfo.localCount} entries)</Text>\n </Text>\n {Object.entries(memoryInfo.types).map(([type, count]) => (\n <Text key={type} color=\"gray\">\n {\" \"}\n {type.padEnd(12)} {count}\n </Text>\n ))}\n <Text color=\"gray\"> /dream to consolidate</Text>\n </Box>\n )}\n\n {/* Quick commands */}\n <Box marginTop={1} flexDirection=\"column\">\n <Text>\n {\" \"}\n <Text bold>Commands</Text>\n </Text>\n <Text color=\"gray\"> /vault list Show stored keys</Text>\n <Text color=\"gray\"> /role Show available roles</Text>\n <Text color=\"gray\"> /recommend Get model suggestion</Text>\n <Text color=\"gray\"> /stats Session analytics</Text>\n </Box>\n </Box>\n </Box>\n </Box>\n );\n}\n","/**\n * PlanningMode — Mode 5: Real-time plan execution visualization.\n *\n * Left panel: collapsible tree of phases/sprints/tasks\n * Right panel: detail for selected node\n * Bottom: activity bar with active task + skill usage\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport { PlanTree } from \"../planning/PlanTree.js\";\nimport type { PlanFile, PlanPhase, PlanTask } from \"@brainst0rm/core\";\nimport { parsePlanContent } from \"@brainst0rm/core\";\nimport { readdirSync, readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\ninterface PlanningModeProps {\n projectPath?: string;\n}\n\nfunction loadPlans(projectPath: string): PlanFile[] {\n const plans: PlanFile[] = [];\n const planDirs = [\n join(projectPath, \".claude\", \"plans\"),\n join(projectPath, \".brainstorm\", \"plans\"),\n ];\n\n for (const dir of planDirs) {\n if (!existsSync(dir)) continue;\n for (const file of readdirSync(dir)) {\n if (!file.endsWith(\".plan.md\")) continue;\n try {\n const filePath = join(dir, file);\n const content = readFileSync(filePath, \"utf-8\");\n plans.push(parsePlanContent(content, filePath));\n } catch {\n // Skip unparseable files\n }\n }\n }\n\n return plans;\n}\n\nexport function PlanningMode({ projectPath }: PlanningModeProps) {\n const [plans, setPlans] = useState<PlanFile[]>([]);\n const [activePlanIdx, setActivePlanIdx] = useState(0);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [selectedType, setSelectedType] = useState<\n \"phase\" | \"sprint\" | \"task\" | null\n >(null);\n\n useEffect(() => {\n const cwd = projectPath || process.cwd();\n setPlans(loadPlans(cwd));\n }, [projectPath]);\n\n useInput((input, key) => {\n // Switch between plans with [ and ]\n if (input === \"[\" && plans.length > 1) {\n setActivePlanIdx((prev) => Math.max(0, prev - 1));\n }\n if (input === \"]\" && plans.length > 1) {\n setActivePlanIdx((prev) => Math.min(plans.length - 1, prev + 1));\n }\n });\n\n if (plans.length === 0) {\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text bold color=\"cyan\">\n Planning\n </Text>\n <Box marginTop={1}>\n <Text color=\"gray\">\n No .plan.md files found. Create one at .claude/plans/my-plan.plan.md\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n Format: YAML frontmatter + ## Phases + ### Sprints + - [x] Tasks\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n Execute: storm plan execute {\"<path>\"} [--dry-run] [--auto]\n </Text>\n </Box>\n </Box>\n );\n }\n\n const activePlan = plans[activePlanIdx];\n\n // Find selected node details\n let selectedPhase: PlanPhase | null = null;\n let selectedTask: PlanTask | null = null;\n\n if (selectedId && activePlan) {\n for (const phase of activePlan.phases) {\n if (phase.id === selectedId) {\n selectedPhase = phase;\n break;\n }\n for (const sprint of phase.sprints) {\n if (sprint.id === selectedId) {\n selectedPhase = phase;\n break;\n }\n for (const task of sprint.tasks) {\n if (task.id === selectedId) {\n selectedTask = task;\n selectedPhase = phase;\n break;\n }\n }\n }\n }\n }\n\n const progress =\n activePlan.totalTasks > 0\n ? Math.round((activePlan.completedTasks / activePlan.totalTasks) * 100)\n : 0;\n\n return (\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1}>\n {/* Plan selector (if multiple) */}\n {plans.length > 1 && (\n <Box marginBottom={1}>\n <Text color=\"gray\" dimColor>\n [ ] switch plan:{\" \"}\n </Text>\n {plans.map((p, i) => (\n <Box key={p.id} marginRight={1}>\n <Text\n color={i === activePlanIdx ? \"cyan\" : \"gray\"}\n bold={i === activePlanIdx}\n >\n {p.name.slice(0, 20)}\n </Text>\n </Box>\n ))}\n </Box>\n )}\n\n {/* Progress bar */}\n <Box marginBottom={1}>\n <Text color=\"gray\">Progress: </Text>\n <Text\n color={progress >= 100 ? \"green\" : progress > 0 ? \"yellow\" : \"gray\"}\n >\n {\"█\".repeat(Math.round(progress / 5))}\n {\"░\".repeat(20 - Math.round(progress / 5))}\n </Text>\n <Text color=\"gray\"> {progress}% </Text>\n <Text color=\"gray\" dimColor>\n ({activePlan.completedTasks}/{activePlan.totalTasks})\n </Text>\n </Box>\n\n {/* Main content: tree + detail */}\n <Box flexDirection=\"row\" flexGrow={1}>\n {/* Left: Tree */}\n <Box width=\"45%\" flexDirection=\"column\">\n <PlanTree\n plan={activePlan}\n selectedId={selectedId}\n onSelect={(id, type) => {\n setSelectedId(id);\n setSelectedType(type);\n }}\n />\n </Box>\n\n {/* Separator */}\n <Box width={1} marginX={1}>\n <Text color=\"gray\" dimColor>\n │\n </Text>\n </Box>\n\n {/* Right: Detail */}\n <Box width=\"50%\" flexDirection=\"column\">\n {selectedPhase && selectedType === \"phase\" && (\n <PhaseDetail phase={selectedPhase} />\n )}\n {selectedTask && selectedType === \"task\" && (\n <TaskDetail task={selectedTask} />\n )}\n {!selectedId && (\n <Box>\n <Text color=\"gray\">Select a node to see details</Text>\n </Box>\n )}\n </Box>\n </Box>\n </Box>\n );\n}\n\nfunction PhaseDetail({ phase }: { phase: PlanPhase }) {\n return (\n <Box flexDirection=\"column\">\n <Text bold color=\"white\">\n {phase.name}\n </Text>\n <Text color=\"gray\" dimColor>\n {phase.completedCount}/{phase.taskCount} tasks\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n {phase.sprints.map((sprint) => (\n <Box key={sprint.id} flexDirection=\"column\" marginBottom={1}>\n <Text color=\"gray\">{sprint.name}</Text>\n {sprint.tasks.map((task) => {\n const icon =\n task.status === \"completed\"\n ? \"✓\"\n : task.status === \"in_progress\"\n ? \"◐\"\n : \"○\";\n const color =\n task.status === \"completed\"\n ? \"green\"\n : task.status === \"in_progress\"\n ? \"yellow\"\n : \"gray\";\n return (\n <Box key={task.id} paddingLeft={2}>\n <Text color={color}>{icon} </Text>\n <Text color=\"gray\" wrap=\"truncate\">\n {task.description.slice(0, 45)}\n </Text>\n {task.cost !== undefined && task.cost > 0 && (\n <Text color=\"gray\" dimColor>\n {\" \"}\n ${task.cost.toFixed(2)}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n ))}\n </Box>\n </Box>\n );\n}\n\nfunction TaskDetail({ task }: { task: PlanTask }) {\n return (\n <Box flexDirection=\"column\">\n <Text bold color=\"white\">\n {task.description}\n </Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"gray\">\n Status:{\" \"}\n <Text color={task.status === \"completed\" ? \"green\" : \"yellow\"}>\n {task.status}\n </Text>\n </Text>\n {task.assignedSkill && (\n <Text color=\"gray\">\n Skill: <Text color=\"cyan\">{task.assignedSkill}</Text>\n </Text>\n )}\n {task.modelUsed && (\n <Text color=\"gray\">\n Model: <Text color=\"green\">{task.modelUsed}</Text>\n </Text>\n )}\n {task.cost !== undefined && task.cost > 0 && (\n <Text color=\"gray\">\n Cost: <Text color=\"yellow\">${task.cost.toFixed(4)}</Text>\n </Text>\n )}\n </Box>\n </Box>\n );\n}\n","/**\n * PlanTree — collapsible tree view for plan hierarchy.\n *\n * Shows: Phases → Sprints → Tasks with status icons,\n * progress counts, and keyboard navigation.\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport type {\n PlanFile,\n PlanPhase,\n PlanSprint,\n PlanTask,\n PlanNodeStatus,\n} from \"@brainst0rm/core\";\n\nfunction statusIcon(status: PlanNodeStatus): string {\n switch (status) {\n case \"completed\":\n return \"✓\";\n case \"in_progress\":\n return \"◐\";\n case \"failed\":\n return \"✗\";\n case \"blocked\":\n return \"▪\";\n case \"skipped\":\n return \"○\";\n default:\n return \"○\";\n }\n}\n\nfunction statusColor(status: PlanNodeStatus): string {\n switch (status) {\n case \"completed\":\n return \"green\";\n case \"in_progress\":\n return \"yellow\";\n case \"failed\":\n return \"red\";\n case \"blocked\":\n return \"gray\";\n default:\n return \"gray\";\n }\n}\n\ninterface TreeNode {\n id: string;\n label: string;\n status: PlanNodeStatus;\n depth: number;\n type: \"phase\" | \"sprint\" | \"task\";\n progress?: string;\n cost?: number;\n skill?: string;\n expandable: boolean;\n}\n\nfunction flattenPlan(plan: PlanFile, expanded: Set<string>): TreeNode[] {\n const nodes: TreeNode[] = [];\n\n for (const phase of plan.phases) {\n nodes.push({\n id: phase.id,\n label: phase.name,\n status: phase.status,\n depth: 0,\n type: \"phase\",\n progress: `${phase.completedCount}/${phase.taskCount}`,\n expandable: true,\n });\n\n if (!expanded.has(phase.id)) continue;\n\n for (const sprint of phase.sprints) {\n nodes.push({\n id: sprint.id,\n label: sprint.name,\n status: sprint.status,\n depth: 1,\n type: \"sprint\",\n expandable: true,\n });\n\n if (!expanded.has(sprint.id)) continue;\n\n for (const task of sprint.tasks) {\n nodes.push({\n id: task.id,\n label: task.description,\n status: task.status,\n depth: 2,\n type: \"task\",\n cost: task.cost,\n skill: task.assignedSkill,\n expandable: false,\n });\n }\n }\n }\n\n return nodes;\n}\n\ninterface PlanTreeProps {\n plan: PlanFile;\n selectedId: string | null;\n onSelect: (id: string, type: \"phase\" | \"sprint\" | \"task\") => void;\n maxHeight?: number;\n isActive?: boolean;\n}\n\nexport function PlanTree({\n plan,\n selectedId,\n onSelect,\n maxHeight = 20,\n isActive = true,\n}: PlanTreeProps) {\n const [expanded, setExpanded] = useState<Set<string>>(() => {\n // Auto-expand phases that are in progress\n const initial = new Set<string>();\n for (const phase of plan.phases) {\n if (phase.status === \"in_progress\" || phase.status === \"pending\") {\n initial.add(phase.id);\n for (const sprint of phase.sprints) {\n if (sprint.status === \"in_progress\" || sprint.status === \"pending\") {\n initial.add(sprint.id);\n }\n }\n }\n }\n return initial;\n });\n const [cursor, setCursor] = useState(0);\n\n const nodes = flattenPlan(plan, expanded);\n\n useInput((input, key) => {\n if (!isActive) return;\n\n if (key.downArrow || input === \"j\") {\n setCursor((prev) => Math.min(prev + 1, nodes.length - 1));\n }\n if (key.upArrow || input === \"k\") {\n setCursor((prev) => Math.max(prev - 1, 0));\n }\n if (key.return) {\n const node = nodes[cursor];\n if (!node) return;\n\n if (node.expandable) {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(node.id)) next.delete(node.id);\n else next.add(node.id);\n return next;\n });\n }\n onSelect(node.id, node.type);\n }\n });\n\n // Keep cursor in bounds\n const safeCursor = Math.min(cursor, nodes.length - 1);\n const selectedNode = nodes[safeCursor];\n\n // Notify parent of selection change (must be in useEffect, not during render)\n useEffect(() => {\n if (selectedNode && selectedNode.id !== selectedId) {\n onSelect(selectedNode.id, selectedNode.type);\n }\n }, [selectedNode?.id]);\n\n // Scroll window\n const scrollOffset = Math.max(0, safeCursor - maxHeight + 3);\n const visibleNodes = nodes.slice(scrollOffset, scrollOffset + maxHeight);\n\n return (\n <Box flexDirection=\"column\">\n {/* Plan header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n {plan.name}\n </Text>\n </Box>\n <Box marginBottom={1}>\n <Text color=\"gray\">\n {plan.completedTasks}/{plan.totalTasks} tasks\n </Text>\n </Box>\n\n {/* Tree nodes */}\n {visibleNodes.map((node, i) => {\n const actualIdx = scrollOffset + i;\n const isCursor = actualIdx === safeCursor;\n const indent = \" \".repeat(node.depth);\n const expandIcon = node.expandable\n ? expanded.has(node.id)\n ? \"▼ \"\n : \"▶ \"\n : \" \";\n\n return (\n <Box key={node.id}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"→ \" : \" \"}\n </Text>\n <Text dimColor={!isCursor}>{indent}</Text>\n <Text color={statusColor(node.status)}>\n {statusIcon(node.status)}{\" \"}\n </Text>\n <Text dimColor={!isCursor}>{expandIcon}</Text>\n <Text\n color={isCursor ? \"white\" : \"gray\"}\n bold={isCursor}\n wrap=\"truncate\"\n >\n {node.label.slice(0, 35)}\n </Text>\n {node.progress && (\n <Text color=\"gray\" dimColor>\n {\" \"}\n {node.progress}\n </Text>\n )}\n {node.skill && (\n <Text color=\"cyan\" dimColor>\n {\" \"}\n [{node.skill}]\n </Text>\n )}\n {node.cost !== undefined && node.cost > 0 && (\n <Text color=\"gray\" dimColor>\n {\" \"}\n ${node.cost.toFixed(2)}\n </Text>\n )}\n </Box>\n );\n })}\n\n {scrollOffset > 0 && (\n <Text color=\"gray\" dimColor>\n {\" \"}\n ↑ {scrollOffset} more\n </Text>\n )}\n {scrollOffset + maxHeight < nodes.length && (\n <Text color=\"gray\" dimColor>\n {\" \"}\n ↓ {nodes.length - scrollOffset - maxHeight} more\n </Text>\n )}\n </Box>\n );\n}\n","/**\n * Shortcut overlay — full-screen keyboard reference.\n * Shown when user presses ? in non-chat modes.\n */\n\nimport React from \"react\";\nimport { Box, Text, useInput } from \"ink\";\n\ninterface ShortcutOverlayProps {\n onDismiss: () => void;\n}\n\nexport function ShortcutOverlay({ onDismiss }: ShortcutOverlayProps) {\n useInput(() => {\n onDismiss();\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text bold color=\"cyan\">\n Keyboard Shortcuts\n </Text>\n <Text> </Text>\n\n <Text bold>Navigation</Text>\n <Text color=\"gray\"> Esc Toggle between Chat and Dashboard</Text>\n <Text color=\"gray\"> 1-4 Switch modes (in non-chat modes)</Text>\n <Text color=\"gray\"> Tab Cycle modes (in non-chat modes)</Text>\n <Text color=\"gray\"> Ctrl+D×2 Exit application</Text>\n <Text> </Text>\n\n <Text bold>Chat Mode</Text>\n <Text color=\"gray\"> Enter Send message</Text>\n <Text color=\"gray\"> \\+Enter Multi-line (backslash continuation)</Text>\n <Text color=\"gray\">\n {\" \"}\n Shift+Tab Cycle permission mode (auto/confirm/plan)\n </Text>\n <Text color=\"gray\"> ↑↓ Input history</Text>\n <Text color=\"gray\"> Shift+↑↓ Scroll message history</Text>\n <Text color=\"gray\"> / Show command autocomplete</Text>\n <Text color=\"gray\"> @file Include file in context</Text>\n <Text color=\"gray\"> Esc Abort (while processing) / Dashboard (idle)</Text>\n <Text> </Text>\n\n <Text bold>Models Mode</Text>\n <Text color=\"gray\"> ↑↓ / j/k Navigate model list</Text>\n <Text color=\"gray\"> Enter Select model for session</Text>\n <Text> </Text>\n\n <Text bold>Dashboard Mode</Text>\n <Text color=\"gray\"> r Refresh BrainstormRouter data</Text>\n <Text> </Text>\n\n <Text bold>Key Commands</Text>\n <Text color=\"gray\"> /help Command reference</Text>\n <Text color=\"gray\"> /role Switch roles (architect, sr-dev, qa)</Text>\n <Text color=\"gray\"> /build Multi-model workflow wizard</Text>\n <Text color=\"gray\"> /context Token breakdown</Text>\n <Text color=\"gray\"> /insights Session intelligence</Text>\n <Text color=\"gray\"> /undo Remove last turn</Text>\n <Text> </Text>\n\n <Text color=\"gray\">Press any key to dismiss</Text>\n </Box>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAOA,SAAgB,YAAAA,WAAU,UAAAC,eAAc;AACxC,SAAS,OAAAC,OAAK,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACHtC,SAAS,UAAU,mBAAmB;AAItC,IAAM,aAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,cAGT;AAAA,EACF,MAAM,EAAE,OAAO,QAAQ,KAAK,KAAK,OAAO,QAAQ;AAAA,EAChD,WAAW,EAAE,OAAO,aAAa,KAAK,KAAK,OAAO,OAAO;AAAA,EACzD,QAAQ,EAAE,OAAO,UAAU,KAAK,KAAK,OAAO,SAAS;AAAA,EACrD,QAAQ,EAAE,OAAO,UAAU,KAAK,KAAK,OAAO,UAAU;AAAA,EACtD,UAAU,EAAE,OAAO,YAAY,KAAK,KAAK,OAAO,OAAO;AACzD;AAEO,SAAS,QAAQ,UAAmB,QAAQ;AACjD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAkB,OAAO;AAEjD,QAAM,YAAY,YAAY,MAAM;AAClC,YAAQ,CAAC,SAAS;AAChB,YAAM,MAAM,WAAW,QAAQ,IAAI;AACnC,aAAO,YAAY,MAAM,KAAK,WAAW,MAAM;AAAA,IACjD,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,YAAY,CAAC,QAAyB;AACzD,UAAM,MAAM,SAAS,KAAK,EAAE,IAAI;AAChC,QAAI,OAAO,KAAK,MAAM,WAAW,QAAQ;AACvC,cAAQ,WAAW,GAAG,CAAC;AACvB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,MAAM,SAAS,WAAW,aAAa;AAClD;;;AC3CA,SAAS,YAAAC,WAAU,eAAAC,oBAAmB;AA6CtC,IAAM,aAA8B;AAAA,EAClC,aAAa,CAAC;AAAA,EACd,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO,CAAC;AAAA,EACR,YAAY,CAAC;AAAA,EACb,aAAa;AAAA,EACb,SAAS;AAAA,EACT,OAAO;AACT;AAMO,SAAS,UAAU,SAAqB;AAC7C,QAAM,CAAC,MAAM,OAAO,IAAID,UAA0B,UAAU;AAE5D,QAAM,UAAUC,aAAY,YAAY;AACtC,QAAI,CAAC,SAAS;AACZ,cAAQ,CAAC,UAAU;AAAA,QACjB,GAAG;AAAA,QACH,OAAO;AAAA,MACT,EAAE;AACF;AAAA,IACF;AAEA,YAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,KAAK,EAAE;AAE3D,QAAI;AAEF,YAAM,CAAC,aAAa,OAAO,UAAU,OAAO,KAAK,IAC/C,MAAM,QAAQ,WAAW;AAAA,QACvB,QAAQ,eAAe;AAAA,QACvB,QAAQ,iBAAiB;AAAA,QACzB,QAAQ,YAAY;AAAA,QACpB,QAAQ,mBAAmB,KAAK;AAAA,QAChC,QAAQ,iBAAiB;AAAA,MAC3B,CAAC;AAEH,cAAQ;AAAA,QACN,aACE,YAAY,WAAW,cAAc,YAAY,QAAQ,CAAC;AAAA,QAC5D,OAAO,MAAM,WAAW,cAAc,MAAM,QAAQ;AAAA,QACpD,UAAU,SAAS,WAAW,cAAc,SAAS,QAAQ;AAAA,QAC7D,OAAO,MAAM,WAAW,cAAc,MAAM,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC;AAAA,QAClE,YAAY,MAAM,WAAW,cAAc,MAAM,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC;AAAA,QACtE,aAAa,KAAK,IAAI;AAAA,QACtB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AAAA,IACH,SAAS,KAAU;AACjB,cAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,IAAI,QAAQ,EAAE;AAAA,IACrE;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO,EAAE,MAAM,QAAQ;AACzB;;;AC1GA,SAAS,KAAK,YAAY;AA+BZ,SA2BJ,UA3BI,KAaA,YAbA;AAnBP,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiB;AACf,SACE,qBAAC,OAAI,eAAc,OAAM,gBAAe,iBAAgB,UAAU,GAChE;AAAA,wBAAC,OAEG,iBAAO,QAAQ,WAAW,EAI1B,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM;AACpB,YAAM,WAAW,OAAO;AACxB,aACE,qBAAC,OAAa,aAAa,GACzB;AAAA,4BAAC,QAAK,OAAM,QAAO,UAAU,CAAC,UAAU,eAExC;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,WAAW,KAAK,QAAQ;AAAA,YAC/B,MAAM;AAAA,YACN,UAAU,CAAC;AAAA,YAEV,eAAK;AAAA;AAAA,QACR;AAAA,QACA,oBAAC,QAAK,OAAM,QAAO,UAAU,CAAC,UAAU,eAExC;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,WAAW,KAAK,QAAQ;AAAA,YAC/B,MAAM;AAAA,YACN,UAAU,CAAC;AAAA,YAEV;AAAA;AAAA,cACA,KAAK;AAAA;AAAA;AAAA,QACR;AAAA,WArBQ,EAsBV;AAAA,IAEJ,CAAC,GACH;AAAA,IACA,qBAAC,OACE;AAAA,cACC,iCACE;AAAA,4BAAC,QAAK,OAAM,WAAU,MAAI,MACvB,gBACH;AAAA,QACA,oBAAC,QAAK,OAAM,QAAO,sBAAG;AAAA,SACxB;AAAA,MAED,SACC,iCACE;AAAA,4BAAC,QAAK,OAAM,SAAS,iBAAM;AAAA,QAC3B,oBAAC,QAAK,OAAM,QAAO,sBAAG;AAAA,SACxB;AAAA,MAEF,qBAAC,QAAK,OAAO,QAAQ,OAAO,OAAO,WAAW,SAAS;AAAA;AAAA,SAClD,QAAQ,GAAG,QAAQ,CAAC;AAAA,SACzB;AAAA,MACC,kBACC,iCACE;AAAA,4BAAC,QAAK,OAAM,QAAO,sBAAG;AAAA,QACtB;AAAA,UAAC;AAAA;AAAA,YACC,OACE,mBAAmB,SACf,UACA,mBAAmB,YACjB,WACA;AAAA,YAGP,6BAAmB,SAAS,WAAM;AAAA;AAAA,QACrC;AAAA,SACF;AAAA,OAEJ;AAAA,KACF;AAEJ;;;AC7FA,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAsBpB,gBAAAC,YAAA;AAdN,IAAM,QAAiC;AAAA,EACrC,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UACE;AACJ;AAEA,IAAM,kBAAkB;AAEjB,SAAS,QAAQ,EAAE,MAAM,aAAa,GAAiB;AAC5D,SACE,gBAAAA,KAACF,MAAA,EAAI,UAAU,GACb,0BAAAE,KAACD,OAAA,EAAK,OAAM,QAAQ,yBAAe,kBAAkB,MAAM,IAAI,GAAE,GACnE;AAEJ;;;AC1BA;AAAA,EACE,YAAAE;AAAA,EACA,eAAAC;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,OAAAC,MAAK,QAAAC,OAAM,QAAQ,YAAAC,iBAAgB;AAC5C,OAAO,eAAe;;;ACRtB,OAAO,SAAS,eAAe;AAC/B,SAAS,OAAAC,MAAK,QAAAC,aAAY;AA2ClB,SAMA,OAAAC,MANA,QAAAC,aAAA;AAzBD,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,eAAe;AACjB,GAAqB;AAEnB,QAAM,kBAAkB,QAAQ,MAAM;AACpC,QAAI,CAAC,aAAa,SAAS,UAAU,EAAG,QAAO;AAI/C,UAAM,mBAAmB,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,CAAC,CAAC;AAC9D,UAAM,WAAW,KAAK;AAAA,MACpB;AAAA,MACA,SAAS,SAAS,mBAAmB;AAAA,IACvC;AACA,UAAM,SAAS,SAAS,SAAS;AACjC,WAAO,SAAS,MAAM,UAAU,SAAS,IAAI,SAAS,MAAS;AAAA,EACjE,GAAG,CAAC,UAAU,WAAW,YAAY,CAAC;AAEtC,QAAM,cAAc,SAAS,SAAS,gBAAgB,SAAS;AAE/D,SACE,gBAAAA,MAACC,MAAA,EAAI,eAAc,UAAS,UAAU,GAAG,UAAU,GAChD;AAAA,kBAAc,KACb,gBAAAD,MAACE,OAAA,EAAK,OAAM,QACT;AAAA;AAAA,MAAK;AAAA,MAAG;AAAA,MAAY;AAAA,MAAiB,cAAc,IAAI,MAAM;AAAA,MAAI;AAAA,MAAI;AAAA,OAExE;AAAA,IAED,gBAAgB,IAAI,CAAC,KAAK,MACzB,gBAAAH,KAAC,iBAAsB,SAAS,OAAZ,CAAiB,CACtC;AAAA,KACH;AAEJ;AAEA,IAAM,gBAAgB,MAAM,KAAK,SAASI,eAAc;AAAA,EACtD;AACF,GAEG;AACD,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aACE,gBAAAH;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,cAAc;AAAA,UACd,aAAY;AAAA,UACZ,aAAY;AAAA,UACZ,YAAU;AAAA,UACV,aAAa;AAAA,UACb,WAAW;AAAA,UACX,cAAc;AAAA,UACd,aAAa;AAAA,UAEb;AAAA,4BAAAD,MAACE,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC;AAAA;AAAA,cAClB;AAAA,eACN;AAAA,YACA,gBAAAH,KAACG,OAAA,EAAM,kBAAQ,SAAQ;AAAA;AAAA;AAAA,MACzB;AAAA,IAGJ,KAAK;AACH,aACE,gBAAAF;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,eAAc;AAAA,UACd,cAAc;AAAA,UACd,aAAY;AAAA,UACZ,aAAY;AAAA,UACZ,YAAU;AAAA,UACV,aAAa;AAAA,UACb,WAAW;AAAA,UACX,cAAc;AAAA,UACd,aAAa;AAAA,UAEb;AAAA,4BAAAD,MAACC,MAAA,EACC;AAAA,8BAAAD,MAACE,OAAA,EAAK,OAAM,SAAQ,MAAI,MAAC;AAAA;AAAA,gBACZ;AAAA,iBACb;AAAA,cACC,QAAQ,SACP,gBAAAF,MAACE,OAAA,EAAK,OAAM,QAAO,UAAQ,MAAC;AAAA;AAAA,gBACxB,QAAQ;AAAA,gBAAM;AAAA,gBAAE;AAAA,iBACpB;AAAA,eAEJ;AAAA,YACA,gBAAAH,KAACE,MAAA,EAAI,aAAa,GAChB,0BAAAF,KAAC,oBAAiB,SAAS,QAAQ,SAAS,GAC9C;AAAA,YACC,QAAQ,SAAS,UAAa,QAAQ,OAAO,KAC5C,gBAAAC,MAACE,OAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,cAAI;AAAA,cACH,QAAQ,KAAK,QAAQ,CAAC;AAAA,eAC1B;AAAA;AAAA;AAAA,MAEJ;AAAA,IAGJ,KAAK;AACH,aACE,gBAAAH,KAACE,MAAA,EAAI,cAAc,GAAG,aAAa,GACjC,0BAAAD,MAACE,OAAA,EAAK,OAAM,QAAO,UAAQ,MAAC,QAAM,MAAC;AAAA;AAAA,QAC/B;AAAA,QACD,QAAQ,QAAQ,SAAS,MACtB,QAAQ,QAAQ,MAAM,GAAG,GAAG,IAAI,QAChC,QAAQ;AAAA,SACd,GACF;AAAA,IAGJ,KAAK,WAAW;AAEd,YAAM,UAAU,QAAQ;AACxB,UAAI,OAAO;AACX,UAAI,QAAgB;AACpB,UAAI,QAAQ,WAAW,QAAG,GAAG;AAC3B,eAAO;AACP,gBAAQ;AAAA,MACV,WAAW,QAAQ,WAAW,QAAG,GAAG;AAClC,eAAO;AACP,gBAAQ;AAAA,MACV,WAAW,QAAQ,SAAS,OAAO,KAAK,QAAQ,SAAS,UAAU,GAAG;AACpE,eAAO;AAAA,MACT,WAAW,QAAQ,SAAS,WAAW,GAAG;AACxC,eAAO;AAAA,MACT,WAAW,QAAQ,SAAS,MAAM,GAAG;AACnC,eAAO;AAAA,MACT;AAEA,aACE,gBAAAH,KAACE,MAAA,EAAI,cAAc,GAAG,aAAa,GACjC,0BAAAD,MAACE,OAAA,EAAK,OAAc,UAAQ,MACzB;AAAA,eAAO,GAAG,IAAI,MAAM;AAAA,QACpB;AAAA,SACH,GACF;AAAA,IAEJ;AAAA,IAEA,KAAK;AACH,aACE,gBAAAF;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,eAAc;AAAA,UACd,cAAc;AAAA,UACd,aAAY;AAAA,UACZ,aAAY;AAAA,UACZ,YAAU;AAAA,UACV,aAAa;AAAA,UACb,WAAW;AAAA,UACX,cAAc;AAAA,UACd,aAAa;AAAA,UAEb;AAAA,4BAAAD,MAACE,OAAA,EAAK,OAAM,OAAM,MAAI,MAAC;AAAA;AAAA,cACf;AAAA,eACR;AAAA,YACA,gBAAAH,KAACG,OAAA,EAAM,kBAAQ,SAAQ;AAAA;AAAA;AAAA,MACzB;AAAA,IAGJ;AACE,aAAO;AAAA,EACX;AACF,CAAC;;;ACnLD,SAAS,OAAAE,MAAK,QAAAC,aAAY;AA2BpB,SAUM,OAAAC,MAVN,QAAAC,aAAA;AAxBN,IAAM,eAAgE;AAAA,EACpE,SAAS,EAAE,MAAM,UAAK,OAAO,OAAO;AAAA,EACpC,aAAa,EAAE,MAAM,UAAK,OAAO,SAAS;AAAA,EAC1C,WAAW,EAAE,MAAM,UAAK,OAAO,QAAQ;AAAA,EACvC,QAAQ,EAAE,MAAM,UAAK,OAAO,MAAM;AACpC;AAMO,SAAS,SAAS,EAAE,MAAM,GAAkB;AACjD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE;AAChE,QAAM,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE;AAC1D,QAAM,QAAQ,MAAM;AACpB,QAAM,UAAU,YAAY,WAAW;AAGvC,MAAI,WAAW,cAAc,MAAO,QAAO;AAE3C,SACE,gBAAAA,MAACH,MAAA,EAAI,eAAc,UAAS,UAAU,GAAG,cAAc,GACrD;AAAA,oBAAAG,MAACF,OAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,MAAK;AAAA,MAAQ;AAAA,MAAU;AAAA,MAAE;AAAA,MAAM;AAAA,MAC/B,SAAS,IAAI,KAAK,MAAM,YAAY;AAAA,MAAG;AAAA,OAC1C;AAAA,IACC,MAAM,IAAI,CAAC,SAAS;AACnB,YAAM,EAAE,MAAM,MAAM,IAClB,aAAa,KAAK,MAAM,KAAK,aAAa;AAC5C,YAAM,SAAS,KAAK,WAAW;AAC/B,aACE,gBAAAE,MAACH,MAAA,EACC;AAAA,wBAAAE,KAACD,OAAA,EAAK,OAAe,eAAK,IAAI,KAAI;AAAA,QAClC,gBAAAC,KAACD,OAAA,EAAK,OAAO,SAAS,SAAS,QAAW,UAAU,QACjD,eAAK,aACR;AAAA,WAJQ,KAAK,EAKf;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;;;AC/CA,OAAOG,YAAW;AAClB,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,OAAO,aAAa;AAiCV,gBAAAC,MAEF,QAAAC,aAFE;AA9BV,IAAM,eAAuC;AAAA,EAC3C,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AACb;AAaO,IAAM,mBAAmBC,OAAM,KAAK,SAASC,kBAAiB;AAAA,EACnE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AAExB,MAAI,CAAC,WAAW,aAAa;AAC3B,UAAM,QAAQ,QAAS,aAAa,KAAK,KAAK,QAAS;AACvD,WACE,gBAAAF,MAACG,MAAA,EAAI,aAAa,GAChB;AAAA,sBAAAJ,KAACK,OAAA,EAAK,OAAM,QACV,0BAAAL,KAAC,WAAQ,MAAK,QAAO,GACvB;AAAA,MACA,gBAAAC,MAACI,OAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,QACA;AAAA,QACA,QAAQ,SAAM,KAAK,KAAK;AAAA,QACxB;AAAA,SACH;AAAA,OACF;AAAA,EAEJ;AAGA,MAAI,WAAW,aAAa;AAE1B,UAAM,oBAAoB;AAC1B,UAAM,YAAY,QAAQ,SAAS;AACnC,QAAI,iBAAiB,YACjB,QAAQ,MAAM,CAAC,iBAAiB,IAChC;AAGJ,QAAI,WAAW;AACb,YAAM,iBAAiB,eAAe,MAAM,MAAM,KAAK,CAAC,GAAG;AAC3D,UAAI,gBAAgB,MAAM,GAAG;AAC3B,cAAM,WAAW,eAAe,YAAY,KAAK;AACjD,YAAI,YAAY,GAAG;AAGjB,cAAI,WAAW,IAAI;AACjB,6BAAiB,eAAe,MAAM,GAAG,QAAQ;AAAA,UACnD,OAAO;AACL,8BAAkB;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WACE,gBAAAJ,MAACG,MAAA,EAAI,eAAc,UAAS,cAAc,GACxC;AAAA,sBAAAH,MAACG,MAAA,EACC;AAAA,wBAAAJ,KAACK,OAAA,EAAK,OAAM,SAAQ,MAAI,MACrB,yBACH;AAAA,QACC,SACC,gBAAAJ,MAACI,OAAA,EAAK,OAAM,QAAO,UAAQ,MAAC;AAAA;AAAA,UACxB;AAAA,UAAM;AAAA,UAAE;AAAA,WACZ;AAAA,QAED,aACC,gBAAAJ,MAACI,OAAA,EAAK,OAAM,QAAO,UAAQ,MAAC;AAAA;AAAA,UACxB,QAAQ;AAAA,UAAO;AAAA,WACnB;AAAA,SAEJ;AAAA,MACA,gBAAAJ,MAACG,MAAA,EAAI,aAAa,GAChB;AAAA,wBAAAJ,KAAC,oBAAiB,SAAS,gBAAgB;AAAA,QAC3C,gBAAAA,KAACK,OAAA,EAAK,OAAM,QAAO,MAAI,MACpB,oBACH;AAAA,SACF;AAAA,OACF;AAAA,EAEJ;AAEA,SAAO;AACT,CAAC;;;ACpGD,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,OAAOC,cAAa;AAiEV,gBAAAC,MAEF,QAAAC,aAFE;AAnDV,SAAS,cACP,UACA,MACQ;AACR,UAAQ,UAAU;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,KAAK,aAAa,KAAK,QAAQ,EAAE,EAC5C,MAAM,GAAG,EACT,MAAM,EAAE,EACR,KAAK,GAAG;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAG,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,MAAM,SAAS,GAAG;AAAA,IAC/D,KAAK;AACH,aAAO,OAAO,KAAK,WAAW,EAAE,EAAE,MAAM,GAAG,EAAE;AAAA,IAC/C,KAAK;AACH,aAAO,IAAI,KAAK,WAAW,EAAE,KAAK,KAAK,QAAQ,EAAE,GAAG,MAAM,GAAG,EAAE;AAAA,IACjE,KAAK;AACH,aAAO,OAAO,KAAK,WAAW,EAAE,EAAE,MAAM,GAAG,EAAE;AAAA,IAC/C,KAAK;AACH,aAAO,OAAO,KAAK,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE;AAAA,IAC7C,KAAK;AACH,aAAO,OAAO,KAAK,OAAO,EAAE,EAAE,MAAM,GAAG,EAAE;AAAA,IAC3C,KAAK;AACH,aAAO,OAAO,KAAK,WAAW,EAAE,EAAE,MAAM,GAAG,EAAE;AAAA,IAC/C,KAAK;AACH,aAAO,IAAI,KAAK,QAAQ,SAAS,KAAK,OAAO,KAAK,QAAQ,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IAC5E;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,eAAe,IAAoB;AAC1C,MAAI,KAAK,IAAM,QAAO,GAAG,EAAE;AAC3B,SAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAClC;AAMO,SAAS,gBAAgB,EAAE,KAAK,GAAyB;AAC9D,QAAM,aAAa,cAAc,KAAK,UAAU,KAAK,IAAI;AAEzD,MAAI,KAAK,WAAW,WAAW;AAC7B,UAAM,UAAU,KAAK,IAAI,IAAI,KAAK;AAClC,WACE,gBAAAA,MAACJ,MAAA,EAAI,aAAa,GAChB;AAAA,sBAAAG,KAACF,OAAA,EAAK,OAAM,UACV,0BAAAE,KAACD,UAAA,EAAQ,MAAK,QAAO,GACvB;AAAA,MACA,gBAAAE,MAACH,OAAA,EAAK,OAAM,UAAS,MAAI,MACtB;AAAA;AAAA,QACA,KAAK;AAAA,SACR;AAAA,MACC,cAAc,gBAAAG,MAACH,OAAA,EAAK,OAAM,QAAO;AAAA;AAAA,QAAE;AAAA,SAAW;AAAA,MAC/C,gBAAAG,MAACH,OAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,QAAI;AAAA,QACH,eAAe,OAAO;AAAA,QAAE;AAAA,SAC5B;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,OAAO,KAAK,OAAO,QAAQ,WAAM;AACvC,QAAM,QAAQ,KAAK,OAAO,QAAQ,UAAU;AAE5C,SACE,gBAAAG,MAACJ,MAAA,EAAI,aAAa,GAChB;AAAA,oBAAAG,KAACF,OAAA,EAAK,OAAe,gBAAK;AAAA,IAC1B,gBAAAG,MAACH,OAAA,EAAK,OAAM,QAAO;AAAA;AAAA,MAAE,KAAK;AAAA,OAAS;AAAA,IAClC,cACC,gBAAAG,MAACH,OAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,MACA;AAAA,OACH;AAAA,IAED,KAAK,aAAa,UACjB,gBAAAG,MAACH,OAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,MAAI;AAAA,MACH,eAAe,KAAK,QAAQ;AAAA,MAAE;AAAA,OAClC;AAAA,KAEJ;AAEJ;AAMO,SAAS,aAAa,EAAE,MAAM,GAAsB;AACzD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,UAAU,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS;AAC1D,QAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS;AAC5D,QAAM,cAAc,KAAK,IAAI,GAAG,UAAU,SAAS,CAAC;AACpD,QAAM,kBAAkB,UAAU,MAAM,EAAE;AAC1C,QAAM,UAAU,CAAC,GAAG,iBAAiB,GAAG,OAAO;AAE/C,SACE,gBAAAG,MAACJ,MAAA,EAAI,eAAc,UAAS,UAAU,GACnC;AAAA,kBAAc,KACb,gBAAAG,KAACH,MAAA,EAAI,aAAa,GAChB,0BAAAI,MAACH,OAAA,EAAK,OAAM,QACT;AAAA;AAAA,MAAY;AAAA,MAAmB,cAAc,IAAI,MAAM;AAAA,MAAI;AAAA,MAAI;AAAA,OAElE,GACF;AAAA,IAED,QAAQ,IAAI,CAAC,SACZ,gBAAAE,KAAC,mBAA8B,QAAT,KAAK,EAAgB,CAC5C;AAAA,KACH;AAEJ;;;AC7HA,SAAgB,YAAAE,iBAAgB;AAChC,SAAS,OAAAC,MAAK,QAAAC,OAAM,gBAAgB;AAkE5B,SAGA,OAAAC,MAHA,QAAAC,aAAA;AA1CD,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AACF,GAAsB;AACpB,QAAM,CAAC,QAAQ,SAAS,IAAIJ,UAAS,CAAC;AACtC,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAsB,oBAAI,IAAI,CAAC;AAE/D,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,aAAa,UAAU,KAAK;AAClC,gBAAU,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,QAAQ,SAAS,CAAC,CAAC;AAAA,IAC5D;AACA,QAAI,IAAI,WAAW,UAAU,KAAK;AAChC,gBAAU,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,IAC3C;AACA,QAAI,IAAI,QAAQ;AACd,iBAAW;AAAA,IACb;AACA,QAAI,IAAI,QAAQ;AACd,UAAI,eAAe,eAAe;AAChC,sBAAc,MAAM,KAAK,QAAQ,CAAC;AAAA,MACpC,OAAO;AACL,iBAAS,QAAQ,MAAM,EAAE,KAAK;AAAA,MAChC;AAAA,IACF;AACA,QAAI,UAAU,OAAO,aAAa;AAChC,YAAM,MAAM,QAAQ,MAAM,EAAE;AAC5B,kBAAY,CAAC,SAAS;AACpB,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,YAAI,KAAK,IAAI,GAAG,EAAG,MAAK,OAAO,GAAG;AAAA,YAC7B,MAAK,IAAI,GAAG;AACjB,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SACE,gBAAAI,MAACH,MAAA,EAAI,eAAc,UAAS,UAAU,GAAG,cAAc,GACrD;AAAA,oBAAAG,MAACH,MAAA,EAAI,cAAc,GACjB;AAAA,sBAAAG,MAACF,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC;AAAA;AAAA,QACpB;AAAA,SACJ;AAAA,MACA,gBAAAC,KAACD,OAAA,EAAK,MAAI,MAAE,mBAAQ;AAAA,OACtB;AAAA,IACC,QAAQ,IAAI,CAAC,KAAK,MAAM;AACvB,YAAM,WAAW,MAAM;AACvB,YAAM,aAAa,SAAS,IAAI,IAAI,KAAK;AACzC,YAAM,YAAY,cACd,aACE,WACA,WACF,WACE,WACA;AACN,YAAM,iBAAiB,cACnB,aACE,UACA,SACF,WACE,SACA;AAEN,aACE,gBAAAE,MAACH,MAAA,EAAoB,eAAc,UACjC;AAAA,wBAAAG,MAACH,MAAA,EACC;AAAA,0BAAAG,MAACF,OAAA,EAAK,OAAO,gBAAiB;AAAA;AAAA,YAAU;AAAA,aAAC;AAAA,UACzC,gBAAAC,KAACD,OAAA,EAAK,OAAO,WAAW,UAAU,QAAQ,MAAM,UAC7C,cAAI,OACP;AAAA,UACC,IAAI,eACH,gBAAAE,MAACF,OAAA,EAAK,OAAM,SAAQ,UAAQ,MACzB;AAAA;AAAA,YAAI;AAAA,aAEP;AAAA,WAEJ;AAAA,QACC,IAAI,eAAe,YAClB,gBAAAC,KAACF,MAAA,EAAI,aAAa,GAChB,0BAAAE,KAACD,OAAA,EAAK,OAAM,QAAQ,cAAI,aAAY,GACtC;AAAA,WAhBM,IAAI,KAkBd;AAAA,IAEJ,CAAC;AAAA,IACD,gBAAAC,KAACF,MAAA,EAAI,WAAW,GACd,0BAAAE,KAACD,OAAA,EAAK,OAAM,QACT,wBACG,qFACA,+DACN,GACF;AAAA,KACF;AAEJ;;;AC1HA,SAAgB,YAAAG,WAAU,WAAAC,gBAAe;AACzC,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AAkExB,gBAAAC,MAGA,QAAAC,aAHA;AA7CL,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACf,GAAsB;AACpB,QAAM,CAAC,QAAQ,SAAS,IAAIN,UAAS,CAAC;AAEtC,QAAM,WAAWC,SAAQ,MAAM;AAC7B,UAAM,IAAI,MAAM,YAAY;AAC5B,WAAO,MACJ,OAAO,CAAC,SAAS,KAAK,MAAM,YAAY,EAAE,SAAS,CAAC,CAAC,EACrD,MAAM,GAAG,UAAU;AAAA,EACxB,GAAG,CAAC,OAAO,OAAO,UAAU,CAAC;AAE7B,EAAAG,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,WAAW;AACjB,gBAAU,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,SAAS,SAAS,CAAC,CAAC;AAC3D;AAAA,IACF;AACA,QAAI,IAAI,SAAS;AACf,gBAAU,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC;AACzC;AAAA,IACF;AACA,QAAI,IAAI,OAAO,IAAI,QAAQ;AACzB,UAAI,SAAS,MAAM,GAAG;AACpB,iBAAS,SAAS,MAAM,EAAE,KAAK;AAAA,MACjC;AACA;AAAA,IACF;AACA,QAAI,IAAI,QAAQ;AACd,gBAAU;AACV;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,SACE,gBAAAC,KAACH,MAAA,EAAI,eAAc,UAAS,UAAU,GAAG,cAAc,GACpD,mBAAS,IAAI,CAAC,MAAM,MAAM;AACzB,UAAM,WAAW,MAAM;AACvB,WACE,gBAAAI,MAACJ,MAAA,EACC;AAAA,sBAAAG,KAACF,OAAA,EAAK,OAAO,WAAW,SAAS,QAC9B,qBAAW,YAAO,MACrB;AAAA,MACA,gBAAAG,MAACH,OAAA,EAAK,OAAO,WAAW,UAAU,QAAQ,MAAM,UAC7C;AAAA,aAAK,UAAU;AAAA,QACf,KAAK;AAAA,SACR;AAAA,MACC,KAAK,eACJ,gBAAAG,MAACH,OAAA,EAAK,OAAM,QAAO,UAAU,CAAC,UAC3B;AAAA;AAAA,QACA,KAAK;AAAA,SACR;AAAA,SAZM,KAAK,KAcf;AAAA,EAEJ,CAAC,GACH;AAEJ;;;ACvDO,IAAM,sBAAoC;AAAA,EAC/C;AAAA,IACE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,OAAO,CAAC,QAAQ,QAAQ,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,aAAa;AAAA;AAAA,IAEb,OAAO,CAAC,OAAO,QAAQ,IAAI,SAAS,UAAU,OAAO,UAAU;AAAA,EACjE;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,OAAO,CAAC,OAAO,QAAQ,IAAI,SAAS,UAAU,OAAO,UAAU;AAAA,EACjE;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,OAAO,CAAC,OAAO,QAAQ,IAAI,SAAS,UAAU,OAAO,UAAU;AAAA,EACjE;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,OAAO,CAAC,QAAQ,QAAQ,IAAI,SAAS,IAAI;AAAA,EAC3C;AACF;AAKO,SAAS,iBAAiB,OAAe,KAAe,WAAW,qBAAuC;AAC/G,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,MAAM,OAAO,GAAG,EAAG,QAAO,QAAQ;AAAA,EAChD;AACA,SAAO;AACT;;;ACnEA,SAAS,YAAY,cAAc,eAAe,YAAY,iBAAiB;AAC/E,SAAS,YAAY;AACrB,SAAS,eAAe;AAExB,IAAM,cAAc,KAAK,QAAQ,GAAG,aAAa;AACjD,IAAM,eAAe,KAAK,aAAa,oBAAoB;AAC3D,IAAM,aAAa;AACnB,IAAM,cAAc;AAEb,IAAM,eAAN,MAAmB;AAAA,EAChB,UAAoB,CAAC;AAAA,EACrB,SAAS;AAAA,EACT,QAAQ;AAAA,EAEhB,cAAc;AACZ,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,OAAqB;AACxB,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,CAAC,QAAS;AAGd,QAAI,KAAK,QAAQ,SAAS,KAAK,KAAK,QAAQ,KAAK,QAAQ,SAAS,CAAC,MAAM,SAAS;AAChF,WAAK,YAAY;AACjB;AAAA,IACF;AAEA,SAAK,QAAQ,KAAK,OAAO;AAGzB,QAAI,KAAK,QAAQ,SAAS,YAAY;AACpC,WAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,UAAU;AAAA,IAC/C;AAEA,SAAK,YAAY;AACjB,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,GAAG,cAAqC;AACtC,QAAI,KAAK,QAAQ,WAAW,EAAG,QAAO;AAGtC,QAAI,KAAK,WAAW,IAAI;AACtB,WAAK,QAAQ;AAAA,IACf;AAEA,UAAM,aAAa,KAAK,WAAW,KAAK,KAAK,QAAQ,SAAS,IAAI,KAAK,SAAS;AAChF,QAAI,aAAa,EAAG,QAAO;AAE3B,SAAK,SAAS;AACd,WAAO,KAAK,QAAQ,KAAK,MAAM;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAsB;AACpB,QAAI,KAAK,WAAW,GAAI,QAAO;AAE/B,SAAK,UAAU;AAEf,QAAI,KAAK,UAAU,KAAK,QAAQ,QAAQ;AACtC,WAAK,SAAS;AACd,aAAO,KAAK;AAAA,IACd;AAEA,WAAO,KAAK,QAAQ,KAAK,MAAM;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAoB;AAClB,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,SAAmB;AACjB,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB;AAAA,EAEQ,OAAa;AACnB,QAAI;AACF,UAAI,WAAW,YAAY,GAAG;AAC5B,cAAM,OAAO,KAAK,MAAM,aAAa,cAAc,OAAO,CAAC;AAC3D,YAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,eAAK,UAAU,KAAK,MAAM,CAAC,UAAU;AAAA,QACvC;AAAA,MACF;AAAA,IACF,QAAQ;AAEN,WAAK,UAAU,CAAC;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,OAAa;AACnB,QAAI;AACF,UAAI,CAAC,WAAW,WAAW,EAAG,WAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAGxE,UAAI,cAAwB,CAAC;AAC7B,UAAI;AACF,YAAI,WAAW,YAAY,GAAG;AAC5B,gBAAM,OAAO,KAAK,MAAM,aAAa,cAAc,OAAO,CAAC;AAC3D,cAAI,MAAM,QAAQ,IAAI,EAAG,eAAc;AAAA,QACzC;AAAA,MACF,QAAQ;AAAA,MAER;AAGA,YAAM,SAAS,CAAC,GAAG,WAAW;AAC9B,iBAAW,SAAS,KAAK,SAAS;AAChC,YAAI,OAAO,OAAO,SAAS,CAAC,MAAM,OAAO;AACvC,iBAAO,KAAK,KAAK;AAAA,QACnB;AAAA,MACF;AAEA,YAAM,UAAU,OAAO,MAAM,CAAC,WAAW;AAEzC,YAAM,UAAU,eAAe;AAC/B,oBAAc,SAAS,KAAK,UAAU,OAAO,GAAG,OAAO;AACvD,iBAAW,SAAS,YAAY;AAAA,IAClC,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;ARuZM,gBAAAI,MAuEE,QAAAC,aAvEF;AA7eC,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAAiB;AACf,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAwB,CAAC,CAAC;AAC1D,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,eAAe,gBAAgB,IAAIA;AAAA,IACxC;AAAA,EACF;AACA,QAAM,CAAC,cAAc,eAAe,IAAIA;AAAA,IACtC;AAAA,EACF;AACA,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,CAAC;AAChD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAsB,CAAC,CAAC;AAClD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAGjC,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;AAC1B,QAAM,CAAC,eAAe,gBAAgB,IAAIA;AAAA,IACxC;AAAA,EACF;AACA,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA0B,CAAC,CAAC;AAClE,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,CAAC;AAClD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAGhC,IAAI;AACd,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,KAAK;AAI9D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAMpC,CAAC,CAAC;AACJ,QAAM,CAAC,OAAO,IAAIA,UAAS,MAAM,IAAI,aAAa,CAAC;AACnD,QAAM,kBAAkB,OAA6C,IAAI;AACzE,QAAM,gBAAgB,OAAO,CAAC;AAM9B,QAAM,aAAaC;AAAA,IACjB,CAAC,UAAkB,YAA6C;AAC9D,aAAO,IAAI,QAAgB,CAAC,YAAY;AACtC,uBAAe,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,UAAU,SAAS,QAAQ,CAAC,CAAC;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,IACA,CAAC;AAAA,EACH;AAGA,QAAM,aAAaC,SAA4B,MAAM;AACnD,WAAO,iBAAiB,EAAE,IAAI,CAAC,SAAS;AAAA,MACtC,OAAO,IAAI;AAAA,MACX,aAAa,IAAI;AAAA,MACjB,QAAQ;AAAA,IACV,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAGL,YAAU,MAAM;AACd,UAAM,UAAU,CAAC,SAAc;AAC7B,UAAI,MAAM,YAAY,MAAM,SAAS;AACnC,yBAAiB;AAAA,UACf,UAAU,KAAK;AAAA,UACf,SAAS,KAAK,QAAQ,IAAI,CAAC,OAAY;AAAA,YACrC,OAAO,EAAE,SAAS;AAAA,YAClB,OAAO,EAAE,SAAS;AAAA,YAClB,aAAa,EAAE;AAAA,YACf,aAAa,EAAE;AAAA,UACjB,EAAE;AAAA,QACJ,CAAC;AAAA,MACH;AAAA,IACF;AACA,YAAQ,GAAG,uBAA8B,OAAO;AAChD,WAAO,MAAM;AACX,cAAQ,eAAe,uBAA8B,OAAO;AAAA,IAC9D;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,EAAAC,UAAS,CAAC,WAAW,QAAQ;AAE3B,QAAI,CAAC,SAAU;AAGf,QAAI,IAAI,WAAW,IAAI,OAAO;AAC5B;AAAA,QAAgB,CAAC,SACf,KAAK,IAAI,OAAO,GAAG,KAAK,IAAI,GAAG,SAAS,SAAS,CAAC,CAAC;AAAA,MACrD;AACA;AAAA,IACF;AACA,QAAI,IAAI,aAAa,IAAI,OAAO;AAC9B,sBAAgB,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAC/C;AAAA,IACF;AAGA,QAAI,IAAI,WAAW,CAAC,cAAc;AAChC,YAAM,OAAO,QAAQ,GAAG,KAAK;AAC7B,UAAI,SAAS,KAAM,UAAS,IAAI;AAChC;AAAA,IACF;AACA,QAAI,IAAI,aAAa,CAAC,cAAc;AAClC,YAAM,OAAO,QAAQ,KAAK;AAC1B,UAAI,SAAS,KAAM,UAAS,IAAI;AAChC;AAAA,IACF;AAEA,UAAM,SAAS,iBAAiB,WAAW,GAAU;AACrD,QAAI,CAAC,OAAQ;AAEb,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,YAAI,cAAc;AAChB,oBAAU;AAEV,cAAI,gBAAgB,QAAS,cAAa,gBAAgB,OAAO;AAEjE,0BAAgB,UAAU,WAAW,MAAM;AACzC,4BAAgB,KAAK;AACrB,6BAAiB,MAAS;AAC1B,6BAAiB,MAAS;AAC1B,4BAAgB,UAAU;AAAA,UAC5B,GAAG,GAAI;AAAA,QACT;AACA;AAAA,MACF,KAAK;AACH,aAAK;AACL;AAAA,MACF,KAAK;AACH,gBAAQ,OAAO,MAAM,gBAAgB;AACrC;AAAA,MACF,KAAK;AACH,oBAAY,CAAC,CAAC;AACd,yBAAiB,MAAS;AAC1B;AAAA,MACF,KAAK,cAAc;AACjB,cAAM,QAAQ,CAAC,QAAQ,WAAW,MAAM;AACxC,cAAM,UAAU,gBAAgB,UAAU,KAAK;AAC/C,cAAM,MAAM,MAAM,QAAQ,OAAc;AACxC,cAAM,OAAO,OAAO,MAAM,KAAK,MAAM,MAAM;AAC3C,wBAAgB,UAAU,IAAI;AAE9B,cAAM,SAAiC;AAAA,UACrC,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM;AAAA,QACR;AACA,oBAAY,CAAC,SAAS;AAAA,UACpB,GAAG;AAAA,UACH,EAAE,MAAM,WAAW,SAAS,SAAS,OAAO,IAAI,KAAK,IAAI,GAAG;AAAA,QAC9D,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,WAAyBD;AAAA,IAC7B,OAAO;AAAA,MACL,UAAU,MAAM;AAAA,MAChB,gBAAgB,MAAM;AAAA,MACtB,eAAe,MAAM;AAAA,MACrB,MAAM,MAAM,KAAK;AAAA,MACjB,cAAc,MAAM;AAClB,oBAAY,CAAC,CAAC;AACd,yBAAiB,MAAS;AAAA,MAC5B;AAAA,MACA,UAAU,CAAC,UAAkB;AAC3B,wBAAgB,WAAW,KAAK;AAEhC,cAAM,OAAO,MAAM,MAAM,GAAG,EAAE,IAAI,KAAK;AACvC,wBAAgB,IAAI;AAAA,MACtB;AAAA,MACA,aAAa,gBAAgB;AAAA,MAC7B,aAAa,gBAAgB;AAAA,MAC7B,SAAS,gBAAgB;AAAA,MACzB,SAAS,gBAAgB;AAAA,MACzB,gBAAgB,gBAAgB;AAAA,MAChC,gBAAgB,gBAAgB;AAAA,MAChC,WAAW,gBAAgB;AAAA,MAC3B,SAAS,gBAAgB;AAAA,MACzB,kBAAkB,gBAAgB;AAAA,MAClC,QAAQ;AAAA,MACR,OAAO,gBAAgB;AAAA,MACvB,OAAO,gBAAgB;AAAA,MACvB,qBAAqB,gBAAgB;AAAA,MACrC,cAAc,MAAM;AAElB,YAAI,UAAU;AACd,oBAAY,CAAC,SAAS;AACpB,gBAAM,cAAc,KAAK,cAAc,CAAC,MAAM,EAAE,SAAS,MAAM;AAC/D,cAAI,cAAc,EAAG,QAAO;AAC5B,oBAAU,KAAK,SAAS;AACxB,iBAAO,KAAK,MAAM,GAAG,WAAW;AAAA,QAClC,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MACA,eAAe,gBAAgB;AAAA,MAC/B,eAAe,gBAAgB;AAAA,MAC/B,SAAS,gBAAgB;AAAA,IAC3B;AAAA,IACA,CAAC,cAAc,aAAa,YAAY,MAAM,cAAc;AAAA,EAC9D;AAEA,QAAM,eAAeD;AAAA,IACnB,OAAO,SAAiB;AACtB,UAAI,aAAc;AAClB,UAAI,CAAC,KAAK,KAAK,GAAG;AAEhB,oBAAY,CAAC,SAAS;AAAA,UACpB,GAAG;AAAA,UACH;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF,CAAC;AACD;AAAA,MACF;AACA,cAAQ,KAAK,KAAK,KAAK,CAAC;AAGxB,UAAI,eAAe,IAAI,GAAG;AACxB,iBAAS,EAAE;AACX,cAAM,SAAS,MAAM,oBAAoB,MAAM,QAAQ;AAEvD,oBAAY,CAAC,SAAS;AAAA,UACpB,GAAG;AAAA,UACH,EAAE,MAAM,aAAa,SAAS,OAAO;AAAA,QACvC,CAAC;AACD;AAAA,MACF;AAEA,eAAS,EAAE;AACX,kBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,MAAM,QAAQ,SAAS,KAAK,KAAK,EAAE,CAAC,CAAC;AACvE,sBAAgB,IAAI;AACpB,uBAAiB,EAAE;AACnB,eAAS,CAAC,CAAC;AACX,qBAAe,CAAC,CAAC;AACjB,sBAAgB,CAAC;AAEjB,UAAI,eAAe;AACnB,UAAI;AACJ,UAAI,OAAO;AACX,YAAM,aAAa;AAEnB,UAAI;AACF,yBAAiB,SAAS,cAAc,KAAK,KAAK,CAAC,GAAG;AACpD,kBAAQ,MAAM,MAAM;AAAA,YAClB,KAAK;AACH,+BAAiB,MAAM,KAAK;AAC5B;AAAA,YACF,KAAK;AACH,sBAAQ,MAAM,SAAS,MAAM;AAC7B,8BAAgB,KAAK;AACrB,+BAAiB,MAAS;AAC1B,oBAAM,MAAM,MAAM,SAAS;AAC3B,oBAAM,SAAS,MAAM,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC,KAAK;AAClD,oBAAM,KAAK,MAAM,SAAS,WAAW,UAAU;AAC/C,oBAAM,QACJ,KAAK,IAAI,KAAK,EAAE,YAAY,KAAK,IAAI,MAAM,EAAE,MAAM;AACrD,0BAAY,CAAC,SAAS;AAAA,gBACpB,GAAG;AAAA,gBACH;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS,UAAK,KAAK,QAAQ,MAAM,SAAS,QAAQ,GAAG,MAAM,GAAG,KAAK;AAAA,gBACrE;AAAA,cACF,CAAC;AACD;AAAA,YACF,KAAK;AACH,+BAAiB,MAAS;AAC1B,8BAAgB,MAAM;AACtB,+BAAiB,YAAY;AAC7B;AAAA,YACF,KAAK;AACH,0BAAY,CAAC,SAAS;AAAA,gBACpB,GAAG;AAAA,gBACH,EAAE,MAAM,aAAa,SAAS,MAAM,QAAQ;AAAA,cAC9C,CAAC;AACD;AAAA,YACF,KAAK;AACH,6BAAe,CAAC,SAAS;AAAA,gBACvB,GAAG;AAAA,gBACH;AAAA,kBACE,IAAI,MAAM,EAAE,cAAc,OAAO,IAAI,MAAM,QAAQ;AAAA,kBACnD,UAAU,MAAM;AAAA,kBAChB,MAAO,MAAM,QAAQ,CAAC;AAAA,kBACtB,QAAQ;AAAA,kBACR,WAAW,KAAK,IAAI;AAAA,gBACtB;AAAA,cACF,CAAC;AACD;AAAA,YACF,KAAK;AACH,6BAAe,CAAC,SAAS;AAEvB,sBAAM,MAAM,KAAK;AAAA,kBACf,CAAC,MACC,EAAE,WAAW,aAAa,EAAE,aAAa,MAAM;AAAA,gBACnD;AACA,oBAAI,MAAM,EAAG,QAAO;AACpB,sBAAM,UAAU,CAAC,GAAG,IAAI;AACxB,wBAAQ,GAAG,IAAI;AAAA,kBACb,GAAG,QAAQ,GAAG;AAAA,kBACd,QAAQ;AAAA,kBACR,UAAU,KAAK,IAAI,IAAI,QAAQ,GAAG,EAAE;AAAA,kBACpC,IAAI;AAAA,gBACN;AACA,uBAAO;AAAA,cACT,CAAC;AACD;AAAA,YACF,KAAK;AACH,0BAAY,CAAC,SAAS;AAAA,gBACpB,GAAG;AAAA,gBACH;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS,4BAAuB,MAAM,OAAO,yBAAyB,MAAM,aAAa,eAAe,CAAC,WAAM,MAAM,YAAY,eAAe,CAAC;AAAA,gBACnJ;AAAA,cACF,CAAC;AACD;AAAA,YACF,KAAK;AACH,0BAAY,CAAC,SAAS;AAAA,gBACpB,GAAG;AAAA,gBACH;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS,aAAa,MAAM,YAAY,YAAO,MAAM,KAAK,MAAM,MAAM,KAAK,QAAQ,CAAC,CAAC,KAAK,MAAM,UAAU,MAAM;AAAA,gBAClH;AAAA,cACF,CAAC;AACD;AAAA,YACF,KAAK;AACH,uBAAS,CAAC,SAAS,CAAC,GAAG,MAAM,MAAM,IAAI,CAAC;AACxC;AAAA,YACF,KAAK;AACH;AAAA,gBAAS,CAAC,SACR,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAE;AAAA,cAC3D;AACA;AAAA,YACF,KAAK;AACH,0BAAY,CAAC,SAAS;AAAA,gBACpB,GAAG;AAAA,gBACH;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS,QAAQ,MAAM,MAAM,oBAAoB,MAAM,QAAQ,MAAM,MAAM,QAAQ,MAAM,GAAG,EAAE,CAAC;AAAA,gBACjG;AAAA,cACF,CAAC;AACD;AAAA,YACF,KAAK;AACH,8BAAgB,MAAM,OAAO;AAC7B,0BAAY,CAAC,SAAS;AAAA,gBACpB,GAAG;AAAA,gBACH;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS,iBAAY,MAAM,SAAS,WAAM,MAAM,OAAO,KAAK,MAAM,MAAM;AAAA,gBAC1E;AAAA,cACF,CAAC;AACD;AAAA,YACF,KAAK;AACH,0BAAY,CAAC,SAAS;AAAA,gBACpB,GAAG;AAAA,gBACH;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS,6BAAwB,MAAM,YAAY,KAAK,IAAI,CAAC;AAAA,gBAC/D;AAAA,cACF,CAAC;AACD;AAAA,YACF,KAAK;AACH,0BAAY,CAAC,SAAS;AAAA,gBACpB,GAAG;AAAA,gBACH;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS,mBAAc,MAAM,KAAK,QAAQ,CAAC,CAAC,OAAO,MAAM,MAAM,QAAQ,CAAC,CAAC,MAAM,MAAM,UAAU,QAAQ,CAAC,CAAC;AAAA,gBAC3G;AAAA,cACF,CAAC;AACD;AAAA,YACF,KAAK;AACH,0BAAY,CAAC,SAAS;AAAA,gBACpB,GAAG;AAAA,gBACH;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS,YAAY,MAAM,OAAO,MAAM,MAAM,KAAK,eAAe,CAAC,MAAM,MAAM,MAAM,eAAe,CAAC;AAAA,gBACvG;AAAA,cACF,CAAC;AACD;AAAA,YACF,KAAK;AAGH;AAAA,YACF,KAAK;AACH,0BAAY,CAAC,SAAS;AAAA,gBACpB,GAAG;AAAA,gBACH;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS,8BAAyB,MAAM,OAAO;AAAA,gBACjD;AAAA,cACF,CAAC;AACD;AAAA,YACF,KAAK;AAEH;AAAA,YACF,KAAK;AAEH;AAAA,YACF,KAAK;AACH,0BAAY,CAAC,SAAS;AAAA,gBACpB,GAAG;AAAA,gBACH,EAAE,MAAM,WAAW,SAAS,cAAc;AAAA,cAC5C,CAAC;AACD;AAAA,YACF,KAAK;AACH,qBAAO,MAAM,YAAY;AACzB,6BAAe,MAAM,SAAS;AAC9B,kBAAI,MAAM,YAAa,eAAc,MAAM,WAAW;AACtD;AAAA,YACF,KAAK,SAAS;AAEZ,oBAAM,MAAM,MAAM,MAAM,WAAW;AACnC,oBAAM,WACJ,IAAI,SAAS,OAAO,KAAK,IAAI,SAAS,cAAc,IAChD,YACA,IAAI,SAAS,QAAQ,KAAK,IAAI,SAAS,QAAQ,IAC7C,WACA,IAAI,SAAS,cAAc,KAAK,IAAI,SAAS,KAAK,IAChD,SACA,IAAI,SAAS,WAAW,IACtB,UACA;AACZ,oBAAM,OACJ,aAAa,YACT,sCACA,aAAa,WACX,mDACA,aAAa,SACX,yCACA,aAAa,UACX,sDACA;AACZ,0BAAY,CAAC,SAAS;AAAA,gBACpB,GAAG;AAAA,gBACH;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS,IAAI,QAAQ,KAAK,GAAG,GAAG,IAAI;AAAA,kBACpC;AAAA,gBACF;AAAA,cACF,CAAC;AACD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,KAAU;AACjB,uBAAe,UAAU,IAAI,OAAO;AAAA,MACtC,UAAE;AACA,yBAAiB,MAAS;AAC1B,yBAAiB,MAAS;AAC1B,wBAAgB,KAAK;AAAA,MACvB;AAGA,kBAAY,CAAC,SAAS;AAAA,QACpB,GAAG;AAAA,QACH;AAAA,UACE,MAAM;AAAA,UACN,SAAS,gBAAgB;AAAA,UACzB;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,cAAc,eAAe,MAAM,QAAQ;AAAA,EAC9C;AAGA,QAAM,aAAa,QAAQ,OAAO,QAAQ;AAC1C,QAAM,eAAe;AACrB,QAAM,cACJ,YAAY,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE,SAAS,IAAI,IAAI;AACrE,QAAM,cAAc,MAAM,SAAS,IAAI,KAAK,IAAI,MAAM,SAAS,GAAG,CAAC,IAAI;AACvE,QAAM,gBAAgB,KAAK;AAAA,IACzB;AAAA,IACA,aAAa,IAAI,eAAe,cAAc;AAAA,EAChD;AAEA,SACE,gBAAAF,MAACK,MAAA,EAAI,eAAc,UAAS,UAAU,GACpC;AAAA,oBAAAN;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,QACX;AAAA;AAAA,IACF;AAAA,KACE,kBAAkB,UAAa,kBAC/B,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,iBAAiB;AAAA,QAC1B,aAAa;AAAA,QACb,OAAO;AAAA,QACP,OAAO;AAAA;AAAA,IACT;AAAA,IAEF,gBAAAA,KAAC,gBAAa,OAAO,aAAa;AAAA,IACjC,MAAM,SAAS,KAAK,gBAAAA,KAAC,YAAS,OAAc;AAAA,IAE5C,oBAAoB,CAAC,gBAAgB,CAAC,iBACrC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,MAAM,MAAM,CAAC;AAAA,QACpB,OAAO;AAAA,QACP,UAAU,CAAC,UAAU;AACnB,mBAAS,IAAI,KAAK,GAAG;AACrB,8BAAoB,KAAK;AAAA,QAC3B;AAAA,QACA,WAAW,MAAM,oBAAoB,KAAK;AAAA;AAAA,IAC5C;AAAA,IAID,iBACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,cAAc;AAAA,QACvB,SAAS,cAAc;AAAA,QACvB,UAAU,OAAO,UAAU;AACzB,gBAAM,EAAE,eAAe,IAAI,MAAM,OAAO,mBAAmB;AAC3D,yBAAe,KAAK;AACpB,2BAAiB,IAAI;AACrB,sBAAY,CAAC,SAAS;AAAA,YACpB,GAAG;AAAA,YACH,EAAE,MAAM,WAAW,SAAS,aAAa,KAAK,GAAG;AAAA,UACnD,CAAC;AAAA,QACH;AAAA,QACA,UAAU,YAAY;AACpB,gBAAM,EAAE,eAAe,IAAI,MAAM,OAAO,mBAAmB;AAC3D,yBAAe,cAAc,QAAQ,CAAC,GAAG,SAAS,EAAE;AACpD,2BAAiB,IAAI;AAAA,QACvB;AAAA;AAAA,IACF;AAAA,IAGD,YAAY,SAAS,KAAK,CAAC,iBAC1B,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,YAAY,CAAC,EAAE;AAAA,QACxB,SAAS,YAAY,CAAC,EAAE;AAAA,QACxB,UAAU,CAAC,UAAU;AACnB,gBAAM,UAAU,YAAY,CAAC;AAC7B,yBAAe,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC;AACtC,sBAAY,CAAC,SAAS;AAAA,YACpB,GAAG;AAAA,YACH,EAAE,MAAM,WAAW,SAAS,UAAK,KAAK,GAAG;AAAA,UAC3C,CAAC;AACD,kBAAQ,QAAQ,KAAK;AAAA,QACvB;AAAA,QACA,UAAU,MAAM;AACd,gBAAM,UAAU,YAAY,CAAC;AAC7B,yBAAe,CAAC,CAAC;AACjB,kBAAQ,QAAQ,QAAQ,QAAQ,CAAC,GAAG,SAAS,EAAE;AAAA,QACjD;AAAA;AAAA,IACF;AAAA,IAEF,gBAAAC,MAACK,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAL;AAAA,QAACK;AAAA,QAAA;AAAA,UACC,aAAY;AAAA,UACZ,aAAa,eAAe,SAAS;AAAA,UACrC,UAAU;AAAA,UAEV;AAAA,4BAAAN,KAACO,OAAA,EAAK,OAAO,eAAe,SAAS,QAAQ,MAAI,MAC9C,gBACH;AAAA,YACA,gBAAAP;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,UAAU,CAAC,QAAQ;AACjB,2BAAS,GAAG;AAEZ;AAAA,oBACE,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,GAAG;AAAA,kBAC5D;AAAA,gBACF;AAAA,gBACA,UAAU,CAAC,QAAQ;AACjB,sCAAoB,KAAK;AAEzB,sBAAI,IAAI,SAAS,IAAI,GAAG;AACtB,6BAAS,IAAI,MAAM,GAAG,EAAE,IAAI,IAAI;AAChC;AAAA,kBACF;AACA,+BAAa,GAAG;AAAA,gBAClB;AAAA,gBACA,aACE,eACI,gBACA;AAAA;AAAA,YAER;AAAA;AAAA;AAAA,MACF;AAAA,MACA,gBAAAA,KAACM,MAAA,EAAI,UAAU,GACb,0BAAAN,KAACO,OAAA,EAAK,OAAM,QAAO,UAAQ,MACxB,yBACG,+CACA,8EACN,GACF;AAAA,OACF;AAAA,KACF;AAEJ;;;AS1oBA,SAAgB,aAAAC,kBAAiB;AACjC,SAAS,OAAAC,OAAK,QAAAC,cAAY;;;ACf1B,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAmCV,SACV,OAAAC,OADU,QAAAC,aAAA;AApBhB,IAAM,gBAAgB,CAAC,MAAsB;AAC3C,MAAI,KAAK,GAAI,QAAO;AACpB,MAAI,KAAK,GAAI,QAAO;AACpB,SAAO;AACT;AAEO,SAAS,MAAM;AAAA,EACpB;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,cAAc;AAAA,EACd,UAAU;AACZ,GAAe;AACb,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC;AAChD,QAAM,SAAS,KAAK,MAAO,UAAU,MAAO,KAAK;AACjD,QAAM,QAAQ,QAAQ;AACtB,QAAM,QAAQ,QAAQ,OAAO;AAE7B,SACE,gBAAAA,MAACH,OAAA,EACE;AAAA,aAAS,gBAAAG,MAACF,QAAA,EAAK,OAAM,QAAQ;AAAA;AAAA,MAAM;AAAA,OAAC;AAAA,IACrC,gBAAAC,MAACD,QAAA,EAAK,OAAe,mBAAI,OAAO,MAAM,GAAE;AAAA,IACxC,gBAAAC,MAACD,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB,mBAAI,OAAO,KAAK,GACnB;AAAA,IACC,eAAe,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO;AAAA;AAAA,MAAE,KAAK,MAAM,OAAO;AAAA,MAAE;AAAA,OAAC;AAAA,KAC5D;AAEJ;;;AC3CA,SAAS,QAAAG,cAAY;AAgBf,gBAAAC,aAAA;AAdN,IAAM,OAAO,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAW7C,SAAS,UAAU,EAAE,MAAM,QAAQ,SAAS,MAAM,GAAmB;AAC1E,MAAI,KAAK,WAAW;AAClB,WACE,gBAAAA,MAACD,QAAA,EAAK,OAAM,QAAO,UAAQ,MAAC,oBAE5B;AAIJ,MAAI,SAAS;AACb,MAAI,SAAS,KAAK,SAAS,OAAO;AAChC,UAAM,OAAO,KAAK,SAAS;AAC3B,aAAS,MAAM;AAAA,MACb,EAAE,QAAQ,MAAM;AAAA,MAChB,CAAC,GAAG,MAAM,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,QAAQ,MAAM,OAAO;AAE3B,QAAM,OAAO,OAAO,IAAI,CAAC,MAAM;AAC7B,UAAM,MAAM,KAAK,OAAQ,IAAI,OAAO,SAAU,KAAK,SAAS,EAAE;AAC9D,WAAO,KAAK,GAAG;AAAA,EACjB,CAAC;AAED,SAAO,gBAAAC,MAACD,QAAA,EAAK,OAAe,eAAK,KAAK,EAAE,GAAE;AAC5C;;;ACZO,SAAS,iBAAiB,UAA0B;AACzD,QAAM,IAAI,SAAS,YAAY;AAC/B,MAAI,EAAE,SAAS,WAAW,KAAK,EAAE,SAAS,QAAQ,EAAG,QAAO;AAC5D,MAAI,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,IAAI;AAC9D,WAAO;AACT,MAAI,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,QAAQ,EAAG,QAAO;AACzD,MAAI,EAAE,SAAS,UAAU,EAAG,QAAO;AACnC,MAAI,EAAE,SAAS,OAAO,KAAK,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,UAAU;AACtE,WAAO;AACT,SAAO;AACT;AAGO,SAAS,aAAa,MAAsB;AACjD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;AHwEU,SAwHE,YAAAE,WAxHF,OAAAC,OACA,QAAAC,cADA;AAtEV,SAAS,cAAc,IAAoB;AACzC,QAAM,OAAO,KAAK,MAAM,KAAK,GAAK;AAClC,MAAI,OAAO,EAAG,QAAO;AACrB,MAAI,OAAO,GAAI,QAAO,GAAG,IAAI;AAC7B,SAAO,GAAG,KAAK,MAAM,OAAO,EAAE,CAAC,KAAK,OAAO,EAAE;AAC/C;AAEA,SAAS,aAAa,GAAmB;AACvC,MAAI,KAAK,IAAW,QAAO,IAAI,IAAI,KAAW,QAAQ,CAAC,CAAC;AACxD,MAAI,KAAK,IAAO,QAAO,IAAI,IAAI,KAAO,QAAQ,CAAC,CAAC;AAChD,SAAO,OAAO,CAAC;AACjB;AAEA,SAAS,QAAQ,IAAoB;AACnC,QAAM,OAAO,KAAK,OAAO,KAAK,IAAI,IAAI,MAAM,GAAI;AAChD,MAAI,OAAO,GAAI,QAAO,GAAG,IAAI;AAC7B,SAAO,GAAG,KAAK,MAAM,OAAO,EAAE,CAAC;AACjC;AAGA,SAAS,mBACP,SAC2D;AAC3D,QAAM,SAAoE,CAAC;AAC3E,aAAW,OAAO,SAAS;AACzB,eAAW,OAAO,IAAI,cAAc;AAClC,aAAO,KAAK;AAAA,QACV,QAAQ;AAAA,QACR,SAAS,IAAI;AAAA,QACb,OAAO,KAAK,KAAK,IAAI,YAAY,KAAK,IAAI,IAAI,aAAa,QAAQ,CAAC,CAAC;AAAA,MACvE,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,QAAM,cAAc,UAAU,MAAS,cAAc,UAAW,OAAU;AAC1E,QAAM,KAAK;AACX,QAAM,eAAe,KAAK,mBAAmB,GAAG,gBAAgB,IAAI,CAAC;AAErE,EAAAC,WAAU,MAAM;AACd,QAAI,gBAAgB,CAAC,UAAU,OAAO,gBAAgB,IAAI;AACxD,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACE,gBAAAD,OAACE,OAAA,EAAI,eAAc,UAAS,UAAU,GAAG,UAAU,GAEjD;AAAA,oBAAAF;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,aAAY;AAAA,QACZ,aAAY;AAAA,QACZ,UAAU;AAAA,QACV,eAAc;AAAA,QACd,gBAAe;AAAA,QAEf;AAAA,0BAAAF,OAACE,OAAA,EAAI,eAAc,UACjB;AAAA,4BAAAH,MAACI,QAAA,EAAK,OAAM,QAAO,qBAAO;AAAA,YAC1B,gBAAAH,OAACG,QAAA,EAAK,OAAM,UAAS,MAAI,MAAC;AAAA;AAAA,cACtB,YAAY,QAAQ,CAAC;AAAA,eACzB;AAAA,aACF;AAAA,UACA,gBAAAH,OAACE,OAAA,EAAI,eAAc,UACjB;AAAA,4BAAAH,MAACI,QAAA,EAAK,OAAM,QAAO,oBAAM;AAAA,YACzB,gBAAAH,OAACG,QAAA,EACE;AAAA,2BAAa,WAAW,KAAK;AAAA,cAC9B,gBAAAJ,MAACI,QAAA,EAAK,OAAM,QAAO,oBAAC;AAAA,cAAO;AAAA,cAAE,aAAa,WAAW,MAAM;AAAA,cAC3D,gBAAAJ,MAACI,QAAA,EAAK,OAAM,QAAO,oBAAC;AAAA,eACtB;AAAA,aACF;AAAA,UACA,gBAAAH,OAACE,OAAA,EAAI,eAAc,UACjB;AAAA,4BAAAH,MAACI,QAAA,EAAK,OAAM,QAAO,mBAAK;AAAA,YACxB,gBAAAJ,MAACI,QAAA,EAAK,MAAI,MAAE,qBAAU;AAAA,aACxB;AAAA,UACA,gBAAAH,OAACE,OAAA,EAAI,eAAc,UACjB;AAAA,4BAAAH,MAACI,QAAA,EAAK,OAAM,QAAO,qBAAO;AAAA,YAC1B,gBAAAJ,MAACI,QAAA,EAAM,wBAAc,OAAO,GAAE;AAAA,aAChC;AAAA,UACA,gBAAAH,OAACE,OAAA,EAAI,eAAc,UACjB;AAAA,4BAAAH,MAACI,QAAA,EAAK,OAAM,QAAO,oBAAM;AAAA,YACzB,gBAAAH;AAAA,cAACG;AAAA,cAAA;AAAA,gBACC,OACE,cAAc,IAAI,QAAQ,cAAc,IAAI,WAAW;AAAA,gBAE1D;AAAA;AAAA,kBACG,YAAY,QAAQ,CAAC;AAAA;AAAA;AAAA,YACzB;AAAA,aACF;AAAA,UACA,gBAAAH,OAACE,OAAA,EAAI,eAAc,UACjB;AAAA,4BAAAH,MAACI,QAAA,EAAK,OAAM,QAAO,sBAAQ;AAAA,YAC3B,gBAAAJ;AAAA,cAACI;AAAA,cAAA;AAAA,gBACC,OAAO,MAAM,GAAG,iBAAiB,SAAS,IAAI,UAAU;AAAA,gBACxD,MAAI;AAAA,gBAEH,cAAI,iBAAiB,UAAU;AAAA;AAAA,YAClC;AAAA,aACF;AAAA,UACA,gBAAAH,OAACE,OAAA,EAAI,eAAc,UACjB;AAAA,4BAAAH,MAACI,QAAA,EAAK,OAAM,QAAO,mBAAK;AAAA,YACxB,gBAAAJ,MAACI,QAAA,EAAK,MAAI,MAAE,cAAI,cAAc,GAAE;AAAA,aAClC;AAAA,UACA,gBAAAH,OAACE,OAAA,EAAI,eAAc,UACjB;AAAA,4BAAAH,MAACI,QAAA,EAAK,OAAM,QAAO,oBAAM;AAAA,YACzB,gBAAAH,OAACG,QAAA,EACE;AAAA,yBAAW;AAAA,cAAM;AAAA,cAAG,WAAW;AAAA,cAAM;AAAA,eACxC;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,IAGA,gBAAAH,OAACE,OAAA,EAAI,WAAW,GAAG,eAAc,OAAM,UAAU,GAE/C;AAAA,sBAAAF;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,aAAY;AAAA,UACZ,aAAY;AAAA,UACZ,UAAU;AAAA,UACV,UAAU;AAAA,UACV,eAAc;AAAA,UAEd;AAAA,4BAAAF,OAACG,QAAA,EAAK,MAAI,MAAC,OAAM,SACd;AAAA;AAAA,cAAI;AAAA,eAEP;AAAA,YACC,MAAM,GAAG,iBAAiB,SAAS,IAClC,GAAG,iBAAiB,IAAI,CAAC,QACvB,gBAAAH,OAACE,OAAA,EACC;AAAA,8BAAAH,MAACI,QAAA,EAAK,OAAM,SAAQ,qBAAE;AAAA,cACtB,gBAAAJ,MAACI,QAAA,EAAK,MAAI,MAAE,cAAI,YAAY,OAAO,EAAE,GAAE;AAAA,cACvC,gBAAAH,OAACG,QAAA,EAAK,OAAM,QAAQ;AAAA,uBAAO,IAAI,SAAS,EAAE,SAAS,CAAC;AAAA,gBAAE;AAAA,iBAAE;AAAA,cACxD,gBAAAH,OAACG,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA,oBAAI;AAAA,gBAAU;AAAA,iBACjB;AAAA,iBANQ,IAAI,IAOd,CACD,IAED,gBAAAH,OAACG,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,cAAI;AAAA,eAEP;AAAA,YAED,MACC,GAAG,OAAO,SAAS,KACnB,GAAG,OAAO,IAAI,CAAC,QACb,gBAAAH,OAACE,OAAA,EACC;AAAA,8BAAAH,MAACI,QAAA,EAAK,OAAM,OAAM,qBAAE;AAAA,cACpB,gBAAAJ,MAACI,QAAA,EAAK,OAAM,QAAQ,cAAI,KAAK,OAAO,EAAE,GAAE;AAAA,cACxC,gBAAAJ,MAACI,QAAA,EAAK,OAAM,OAAM,UAAQ,MACvB,cAAI,MAAM,MAAM,GAAG,EAAE,GACxB;AAAA,iBALQ,IAAI,IAMd,CACD;AAAA,YAEH,gBAAAJ,MAACI,QAAA,EAAK,eAAC;AAAA,YACP,gBAAAH,OAACG,QAAA,EAAK,MAAI,MAAC,OAAM,QACd;AAAA;AAAA,cAAI;AAAA,eAEP;AAAA,YACC,eAAe,WAAW,IACzB,gBAAAH,OAACG,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,cAAI;AAAA,eAEP,IAEA,eAAe,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,MACrC,gBAAAH,OAACE,OAAA,EACC;AAAA,8BAAAH,MAACI,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB,kBAAQ,MAAM,SAAS,EAAE,OAAO,CAAC,GACpC;AAAA,cACA,gBAAAJ,MAACI,QAAA,EAAK,OAAO,iBAAiB,MAAM,KAAK,GAAG,MAAI,MAC7C,gBAAM,MAAM,OAAO,EAAE,GACxB;AAAA,cACA,gBAAAJ,MAACI,QAAA,EAAK,OAAM,QAAQ,gBAAM,UAAS;AAAA,iBAP3B,CAQV,CACD;AAAA,YAGF,UAAU,OAAO,YAAY,SAAS,KACrC,gBAAAH,OAAAF,WAAA,EACE;AAAA,8BAAAC,MAACI,QAAA,EAAK,eAAC;AAAA,cACP,gBAAAH,OAACG,QAAA,EAAK,MAAI,MAAC,OAAM,UACd;AAAA;AAAA,gBAAI;AAAA,iBAEP;AAAA,cACC,OAAO,YACL,OAAO,CAAC,MAAM,GAAG,KAAK,EACtB,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,OAAO,MACX,gBAAAH,OAACE,OAAA,EACC;AAAA,gCAAAF,OAACG,QAAA,EAAK,OAAM,QAAQ;AAAA,yBAAO,IAAI,CAAC,EAAE,SAAS,CAAC;AAAA,kBAAE;AAAA,mBAAE;AAAA,gBAChD,gBAAAJ,MAACI,QAAA,EAAK,OAAO,iBAAiB,MAAM,YAAY,EAAE,GAAG,MAAI,MACrD,iBAAM,SAAS,WACd,MAAM,GAAG,EACT,IAAI,GACH,OAAO,EAAE,KAAK,UAAU,OAAO,EAAE,GACvC;AAAA,gBACA,gBAAAH,OAACG,QAAA,EAAK,OAAM,QAAO;AAAA;AAAA,kBACf,MAAM,gBAAgB;AAAA,kBAAI;AAAA,kBAAG,MAAM,cAAc;AAAA,mBACrD;AAAA,mBAVQ,CAWV,CACD;AAAA,eACL;AAAA;AAAA;AAAA,MAEJ;AAAA,MAGA,gBAAAH;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,aAAY;AAAA,UACZ,aAAY;AAAA,UACZ,UAAU;AAAA,UACV,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,eAAc;AAAA,UAEd;AAAA,4BAAAF,OAACG,QAAA,EAAK,MAAI,MAAC,OAAM,QACd;AAAA;AAAA,cAAI;AAAA,cACW,IAAI,cAAc;AAAA,cAAE;AAAA,eACtC;AAAA,YACC,aAAa,SAAS,IACrB,aAAa,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAC5B,gBAAAH,OAACE,OAAA,EACC;AAAA,8BAAAH,MAACI,QAAA,EAAK,OAAM,QAAQ,YAAE,QAAQ,OAAO,CAAC,GAAE;AAAA,cACxC,gBAAAJ,MAACI,QAAA,EAAM,YAAE,OAAO,OAAO,EAAE,GAAE;AAAA,cAC3B,gBAAAH,OAACG,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA,kBAAE;AAAA,gBAAM;AAAA,iBACX;AAAA,iBALQ,GAAG,EAAE,OAAO,IAAI,EAAE,MAAM,EAMlC,CACD,IAED,gBAAAH,OAACG,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,cAAI;AAAA,eAEP;AAAA,YAGD,UAAU,SAAS,KAClB,gBAAAH,OAAAF,WAAA,EACE;AAAA,8BAAAC,MAACI,QAAA,EAAK,eAAC;AAAA,cACP,gBAAAH,OAACG,QAAA,EAAK,MAAI,MAAC,OAAM,WACd;AAAA;AAAA,gBAAI;AAAA,iBAEP;AAAA,cACC,UACE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,SAAS;AACb,sBAAM,OACJ,KAAK,QAAQ,IACT,KAAK,MAAO,KAAK,YAAY,KAAK,QAAS,GAAG,IAC9C;AACN,sBAAM,QACJ,QAAQ,KAAK,UAAU,QAAQ,KAAK,WAAW;AACjD,uBACE,gBAAAH,OAACE,OAAA,EACC;AAAA,kCAAAF,OAACG,QAAA,EAAK,OACH;AAAA,4BAAQ,KAAK,WAAM,QAAQ,KAAK,WAAM;AAAA,oBAAK;AAAA,qBAC9C;AAAA,kBACA,gBAAAJ,MAACI,QAAA,EAAM,eAAK,KAAK,OAAO,EAAE,GAAE;AAAA,kBAC5B,gBAAAH,OAACG,QAAA,EAAK,OAAM,QACT;AAAA,2BAAO,KAAK,KAAK,EAAE,SAAS,CAAC;AAAA,oBAAG;AAAA,qBACnC;AAAA,kBACA,gBAAAJ,MAAC,SAAM,OAAO,MAAM,OAAO,GAAG,aAAa,OAAO;AAAA,qBAR1C,KAAK,IASf;AAAA,cAEJ,CAAC;AAAA,eACL;AAAA,YAGD,QAAQ,SAAS,OAAO,MAAM,kBAAkB,KAC/C,gBAAAC,OAAAF,WAAA,EACE;AAAA,8BAAAC,MAACI,QAAA,EAAK,eAAC;AAAA,cACP,gBAAAH,OAACG,QAAA,EAAK,MAAI,MAAC,OAAM,OACd;AAAA;AAAA,gBAAI;AAAA,iBACK,OAAO,OAAO,mBAAmB,GAAG,QAAQ,CAAC;AAAA,iBACzD;AAAA,eACF;AAAA;AAAA;AAAA,MAEJ;AAAA,MAGA,gBAAAH;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,aAAY;AAAA,UACZ,aAAY;AAAA,UACZ,UAAU;AAAA,UACV,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,eAAc;AAAA,UAEd;AAAA,4BAAAF,OAACG,QAAA,EAAK,MAAI,MAAC,OAAM,WACd;AAAA;AAAA,cAAI;AAAA,eAEP;AAAA,YACC,CAAC,UAAU,OAAO,MAAM,WAAW,IAClC,gBAAAH,OAACG,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,cAAI;AAAA,eAEP,IAEA,OAAO,MACJ,OAAO,CAAC,MAAM,KAAK,IAAI,EACvB,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,OAAO,MAAM;AACjB,oBAAMC,eACJ,MAAM,oBAAoB,SACtB,UACA,MAAM,oBAAoB,YACxB,WACA;AACR,qBACE,gBAAAJ,OAACE,OAAA,EACC;AAAA,gCAAAF,OAACG,QAAA,EAAK,OAAOC,cACV;AAAA,wBAAM,oBAAoB,SAAS,WAAM;AAAA,kBAAK;AAAA,mBACjD;AAAA,gBACA,gBAAAL,MAACI,QAAA,EAAK,OAAO,iBAAiB,MAAM,SAAS,EAAE,GAC3C,iBAAM,SAAS,IAAI,MAAM,GAAG,EAAE,IAAI,GAAG,OAAO,EAAE,KAAK,IACvD;AAAA,gBACA,gBAAAH,OAACG,QAAA,EAAK,OAAM,QAAO;AAAA;AAAA,mBACd,MAAM,YAAY,GAAG,QAAQ,CAAC;AAAA,mBACnC;AAAA,mBATQ,CAUV;AAAA,YAEJ,CAAC;AAAA,YAGJ,UAAU,OAAO,WAAW,SAAS,KACpC,gBAAAH,OAAAF,WAAA,EACE;AAAA,8BAAAC,MAACI,QAAA,EAAK,eAAC;AAAA,cACP,gBAAAH,OAACG,QAAA,EAAK,MAAI,MAAC,OAAM,QACd;AAAA;AAAA,gBAAI;AAAA,iBAEP;AAAA,cACA,gBAAAH,OAACE,OAAA,EACC;AAAA,gCAAAH;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,OAAO,WAAW,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;AAAA,oBACnD,OAAM;AAAA,oBACN,OAAO;AAAA;AAAA,gBACT;AAAA,gBACA,gBAAAC,OAACG,QAAA,EAAK,OAAM,QACT;AAAA;AAAA,kBAAI;AAAA,kBAEJ,OAAO,WACL,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,UAAU,CAAC,EAClC,QAAQ,CAAC;AAAA,mBACd;AAAA,iBACF;AAAA,eACF;AAAA,YAGD,QAAQ,YACP,gBAAAH,OAAAF,WAAA,EACE;AAAA,8BAAAC,MAACI,QAAA,EAAK,eAAC;AAAA,cACP,gBAAAH,OAACG,QAAA,EAAK,MAAI,MAAC,OAAO,OAAO,UAAU,cAAc,QAAQ,SACtD;AAAA;AAAA,gBAAI;AAAA,iBACQ,OAAO,UAAU,mBAAmB,GAAG,QAAQ,CAAC;AAAA,iBAC/D;AAAA,eACF;AAAA;AAAA;AAAA,MAEJ;AAAA,OACF;AAAA,IAGA,gBAAAJ,MAACG,OAAA,EAAI,UAAU,GACb,0BAAAH,MAACI,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB,kBAAQ,UACL,eACA,QAAQ,QACN,OAAO,OAAO,KAAK,KACnB,oCAA0B,KAAK,GAAG,GAAG,iBAAiB,MAAM,oBAAe,GAAG,UAAU,WAAW,aAAa,WAAM,WAAW,KAAK,KAAK,WAAW,KAAK,KACnK,GACF;AAAA,KACF;AAEJ;;;AI5bA,SAAgB,YAAAE,iBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,iBAAgB;AAuE5B,SA2CE,YAAAC,WAjCM,OAAAC,OAVR,QAAAC,cAAA;AAnDR,IAAM,eAAiE;AAAA,EACrE,GAAG,EAAE,OAAO,aAAa,OAAO,IAAI;AAAA,EACpC,GAAG,EAAE,OAAO,QAAQ,OAAO,GAAG;AAAA,EAC9B,GAAG,EAAE,OAAO,SAAS,OAAO,GAAG;AACjC;AAEA,IAAM,aAA+D;AAAA,EACnE,GAAG,EAAE,OAAO,QAAQ,OAAO,IAAI;AAAA,EAC/B,GAAG,EAAE,OAAO,UAAU,OAAO,GAAG;AAAA,EAChC,GAAG,EAAE,OAAO,QAAQ,OAAO,GAAG;AAChC;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,aAAa,iBACf,KAAK;AAAA,IACH;AAAA,IACA,OAAO;AAAA,MACL,CAAC,MAAM,EAAE,OAAO,kBAAkB,EAAE,SAAS;AAAA,IAC/C;AAAA,EACF,IACA;AACJ,QAAM,CAAC,aAAa,cAAc,IAAIC,UAAS,UAAU;AAEzD,EAAAC,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,aAAa,UAAU,KAAK;AAClC,qBAAe,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,OAAO,SAAS,CAAC,CAAC;AAAA,IAChE;AACA,QAAI,IAAI,WAAW,UAAU,KAAK;AAChC,qBAAe,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,IAChD;AACA,QAAI,IAAI,UAAU,iBAAiB,OAAO,WAAW,GAAG;AACtD,oBAAc,OAAO,WAAW,EAAE,EAAE;AAAA,IACtC;AAAA,EACF,CAAC;AAED,QAAM,WAAW,OAAO,WAAW;AAEnC,SACE,gBAAAF,OAACG,OAAA,EAAI,eAAc,OAAM,UAAU,GAAG,UAAU,GAE9C;AAAA,oBAAAH;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,aAAY;AAAA,QACZ,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,UAAU;AAAA,QACV,OAAM;AAAA,QAEN;AAAA,0BAAAH,OAACI,QAAA,EAAK,MAAI,MAAC,OAAM,UACd;AAAA;AAAA,YAAI;AAAA,aAEP;AAAA,UACA,gBAAAL,MAACI,OAAA,EAAI,WAAW,GAAG,eAAc,UAC9B,iBAAO,IAAI,CAAC,GAAG,MAAM;AACpB,kBAAM,aAAa,MAAM;AACzB,kBAAM,YAAY,iBAAiB,EAAE,QAAQ;AAC7C,mBACE,gBAAAH,OAACG,OAAA,EACC;AAAA,8BAAAJ,MAACK,QAAA,EAAK,OAAO,aAAa,UAAU,QACjC,uBAAa,aAAQ,OACxB;AAAA,cACA,gBAAAL,MAACK,QAAA,EAAK,OAAO,EAAE,WAAW,cAAc,UAAU,OAC/C,YAAE,WAAW,cAAc,YAAO,WACrC;AAAA,cACA,gBAAAL,MAACK,QAAA,EAAK,OAAO,WAAW,MAAM,YAC3B,YAAE,KAAK,OAAO,EAAE,GACnB;AAAA,cACA,gBAAAJ,OAACI,QAAA,EAAK,OAAM,QAAO;AAAA;AAAA,gBACf,EAAE,QAAQ;AAAA,gBAAM;AAAA,gBAAG,EAAE,QAAQ;AAAA,iBACjC;AAAA,iBAZQ,EAAE,EAaZ;AAAA,UAEJ,CAAC,GACH;AAAA,UACA,gBAAAL,MAACI,OAAA,EAAI,WAAW,GACd,0BAAAH,OAACI,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA,mBAAO;AAAA,YAAO;AAAA,aACjB,GACF;AAAA;AAAA;AAAA,IACF;AAAA,IAGA,gBAAAL;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,aAAY;AAAA,QACZ,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAM;AAAA,QAEL,qBACC,gBAAAH,OAAAF,WAAA,EACE;AAAA,0BAAAE,OAACI,QAAA,EAAK,MAAI,MAAC,OAAO,iBAAiB,SAAS,QAAQ,GACjD;AAAA;AAAA,YACA,SAAS;AAAA,aACZ;AAAA,UACA,gBAAAJ,OAACI,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,YACA,SAAS;AAAA,aACZ;AAAA,UAEA,gBAAAJ,OAACG,OAAA,EAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,4BAAAJ,MAACK,QAAA,EAAK,OAAM,QAAO,sBAAQ;AAAA,YAC3B,gBAAAJ,OAACI,QAAA,EAAK,OAAO,iBAAiB,SAAS,QAAQ,GAAG,MAAI,MACnD;AAAA;AAAA,cACA,SAAS;AAAA,eACZ;AAAA,YAEA,gBAAAJ,OAACG,OAAA,EAAI,WAAW,GACd;AAAA,8BAAAJ,MAACK,QAAA,EAAK,OAAM,QAAO,sBAAQ;AAAA,cAC3B,gBAAAL;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,aAAa,SAAS,WAAW,GAAG,SAAS;AAAA,kBACpD,OAAO;AAAA,kBACP,aAAa;AAAA,kBACb,SAAS,MAAM;AAAA;AAAA,cACjB;AAAA,cACA,gBAAAC,OAACI,QAAA,EAAK,OAAM,QACT;AAAA;AAAA,gBACA,aAAa,SAAS,WAAW,GAAG,SAAS;AAAA,iBAChD;AAAA,eACF;AAAA,YAEA,gBAAAJ,OAACG,OAAA,EACC;AAAA,8BAAAJ,MAACK,QAAA,EAAK,OAAM,QAAO,oBAAM;AAAA,cACzB,gBAAAL;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,WAAW,SAAS,SAAS,GAAG,SAAS;AAAA,kBAChD,OAAO;AAAA,kBACP,aAAa;AAAA,kBACb,SAAS,MAAM;AAAA;AAAA,cACjB;AAAA,cACA,gBAAAC,OAACI,QAAA,EAAK,OAAM,QACT;AAAA;AAAA,gBACA,WAAW,SAAS,SAAS,GAAG,SAAS;AAAA,iBAC5C;AAAA,eACF;AAAA,YAEA,gBAAAJ,OAACG,OAAA,EAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,8BAAAJ,MAACK,QAAA,EAAK,OAAM,QAAO,qCAAuB;AAAA,cAC1C,gBAAAJ,OAACI,QAAA,EACE;AAAA;AAAA,gBAAI;AAAA,gBACE,gBAAAJ,OAACI,QAAA,EAAK,OAAM,UAAS;AAAA;AAAA,kBAAE,SAAS,QAAQ;AAAA,mBAAM;AAAA,iBACvD;AAAA,cACA,gBAAAJ,OAACI,QAAA,EACE;AAAA;AAAA,gBAAI;AAAA,gBACG,gBAAAJ,OAACI,QAAA,EAAK,OAAM,UAAS;AAAA;AAAA,kBAAE,SAAS,QAAQ;AAAA,mBAAO;AAAA,iBACzD;AAAA,eACF;AAAA,YAEA,gBAAAJ,OAACG,OAAA,EAAI,WAAW,GACd;AAAA,8BAAAJ,MAACK,QAAA,EAAK,OAAM,QAAO,sBAAQ;AAAA,cAC3B,gBAAAL;AAAA,gBAACK;AAAA,gBAAA;AAAA,kBACC,OAAO,SAAS,WAAW,cAAc,UAAU;AAAA,kBACnD,MAAI;AAAA,kBAEH,mBAAS;AAAA;AAAA,cACZ;AAAA,eACF;AAAA,aACF;AAAA,WACF,IAEA,gBAAAL,MAACK,QAAA,EAAK,OAAM,QAAO,UAAQ,MAAC,+BAE5B;AAAA;AAAA,IAEJ;AAAA,KACF;AAEJ;;;AC9LA,SAAS,OAAAC,OAAK,QAAAC,cAAY;AA0CpB,SACA,OAAAC,OADA,QAAAC,cAAA;AAXN,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,gBAAAA,OAACC,OAAA,EACC;AAAA,oBAAAD,OAACE,QAAA,EAAK,OAAM,QAAO;AAAA;AAAA,MAAE,MAAM,OAAO,EAAE;AAAA,OAAE;AAAA,IACtC,gBAAAH,MAACG,QAAA,EAAK,OAAO,SAAS,SAAS,MAAI,MAChC,iBACH;AAAA,KACF;AAEJ;AAEA,SAAS,UAAU,SAAyB;AAC1C,QAAM,KAAK,KAAK,IAAI,IAAI,IAAI,KAAK,OAAO,EAAE,QAAQ;AAClD,QAAM,OAAO,KAAK,MAAM,KAAK,KAAQ;AACrC,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,OAAO,GAAI,QAAO,GAAG,IAAI;AAC7B,MAAI,OAAO,IAAK,QAAO,GAAG,KAAK,MAAM,OAAO,EAAE,CAAC;AAC/C,SAAO,GAAG,KAAK,MAAM,OAAO,GAAG,CAAC;AAClC;AAGA,IAAM,aAGF;AAAA,EACF,oBAAoB;AAAA,IAClB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AAAA,IACjB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,gBAAgB,EAAE,OAAO,UAAU,UAAU,UAAU,OAAO,SAAS;AAAA,EACvE,8BAA8B;AAAA,IAC5B,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,kBAAkB,EAAE,OAAO,YAAY,UAAU,YAAY,OAAO,OAAO;AAAA,EAC3E,kBAAkB;AAAA,IAChB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,sBAAsB;AAAA,IACpB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AACF;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,YACJ,mBAAmB,SACf,UACA,mBAAmB,SACjB,SACA;AAER,SACE,gBAAAH,MAACE,OAAA,EAAI,eAAc,UAAS,UAAU,GAAG,UAAU,GACjD,0BAAAD,OAACC,OAAA,EAAI,eAAc,OAAM,UAAU,GAEjC;AAAA,oBAAAD;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,aAAY;AAAA,QACZ,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,UAAU;AAAA,QACV,OAAM;AAAA,QAEN;AAAA,0BAAAD,OAACE,QAAA,EAAK,MAAI,MAAC,OAAM,WACd;AAAA;AAAA,YAAI;AAAA,aAEP;AAAA,UAEA,gBAAAF,OAACC,OAAA,EAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,4BAAAD,OAACE,QAAA,EACE;AAAA;AAAA,cACD,gBAAAH,MAACG,QAAA,EAAK,OAAM,SAAQ,MAAI,MAAC,oBAEzB;AAAA,cAAQ;AAAA,cACR,gBAAAH,MAACG,QAAA,EAAK,MAAI,MAAC,qBAAO;AAAA,eACpB;AAAA,YACA,gBAAAH,MAAC,cAAW,OAAM,YAAW,OAAO,UAAU;AAAA,YAC9C,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO;AAAA,gBACP,OAAO;AAAA;AAAA,YACT;AAAA,YACA,gBAAAA,MAAC,cAAW,OAAM,gBAAe,OAAO,aAAa;AAAA,YACpD,QACC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO;AAAA,gBACP,OAAO,aAAa,IAAI;AAAA;AAAA,YAC1B;AAAA,aAEJ;AAAA,UAEA,gBAAAC,OAACC,OAAA,EAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,4BAAAD,OAACE,QAAA,EACE;AAAA;AAAA,cACD,gBAAAH,MAACG,QAAA,EAAK,OAAM,UAAS,MAAI,MAAC,oBAE1B;AAAA,cAAQ;AAAA,cACR,gBAAAH,MAACG,QAAA,EAAK,MAAI,MAAC,mBAAK;AAAA,eAClB;AAAA,YACA,gBAAAH;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO;AAAA,gBACP,OACE,YAAY,cACR,SACA,YAAY,eACV,WACA;AAAA;AAAA,YAEV;AAAA,aACF;AAAA,UAEA,gBAAAC,OAACC,OAAA,EAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,4BAAAD,OAACE,QAAA,EACE;AAAA;AAAA,cACD,gBAAAH,MAACG,QAAA,EAAK,OAAM,QAAO,MAAI,MAAC,oBAExB;AAAA,cAAQ;AAAA,cACR,gBAAAH,MAACG,QAAA,EAAK,MAAI,MAAC,qBAAO;AAAA,eACpB;AAAA,YACC,cAAc,UACb,gBAAAH,MAAC,cAAW,OAAM,SAAQ,OAAO,OAAO,SAAS,GAAG;AAAA,YAErD,gBAAgB,UACf,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,IAAI,YAAY,QAAQ,CAAC,CAAC;AAAA,gBACjC,OAAM;AAAA;AAAA,YACR;AAAA,YAED,cACC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,GAAG,WAAW,KAAK,WAAW,WAAW,KAAK;AAAA;AAAA,YACvD;AAAA,aAEJ;AAAA;AAAA;AAAA,IACF;AAAA,IAGA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,aAAY;AAAA,QACZ,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAM;AAAA,QAEN;AAAA,0BAAAD,OAACE,QAAA,EAAK,MAAI,MAAC,OAAM,QACd;AAAA;AAAA,YAAI;AAAA,aAEP;AAAA,UAEC,YACC,gBAAAF,OAACC,OAAA,EAAI,WAAW,GAAG,eAAc,UAE/B;AAAA,4BAAAD,OAACC,OAAA,EACC;AAAA,8BAAAF,MAACG,QAAA,EAAK,OAAM,QAAO,sBAAQ;AAAA,cAC3B,gBAAAH;AAAA,gBAACG;AAAA,gBAAA;AAAA,kBACC,OACE,UAAU,SACN,UACA,UAAU,SACR,WACA;AAAA,kBAER,MAAI;AAAA,kBAEH,oBAAU,SACP,oBACA,UAAU,SACR,kBACA;AAAA;AAAA,cACR;AAAA,eACF;AAAA,YACC,UAAU,aACT,gBAAAF,OAACC,OAAA,EACC;AAAA,8BAAAF,MAACG,QAAA,EAAK,OAAM,QAAO,uBAAS;AAAA,cAC5B,gBAAAH,MAACG,QAAA,EAAM,oBAAU,UAAU,SAAS,GAAE;AAAA,eACxC;AAAA,YAEF,gBAAAF,OAACC,OAAA,EACC;AAAA,8BAAAF,MAACG,QAAA,EAAK,OAAM,QAAO,yBAAW;AAAA,cAC9B,gBAAAH,MAACG,QAAA,EAAK,OAAO,UAAU,cAAc,UAAU,QAC5C,oBAAU,cAAc,qBAAgB,wBAC3C;AAAA,eACF;AAAA,YAGA,gBAAAF,OAACC,OAAA,EAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,8BAAAD,OAACE,QAAA,EACE;AAAA;AAAA,gBACD,gBAAAF,OAACE,QAAA,EAAK,MAAI,MAAC;AAAA;AAAA,kBACO,UAAU,aAAa;AAAA,kBAAO;AAAA,mBAChD;AAAA,iBACF;AAAA,cACC,UAAU,aAAa,WAAW,IACjC,gBAAAF,OAACE,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,gBAAI;AAAA,iBAEP,IAEA,UAAU,aAAa,IAAI,CAAC,QAAQ;AAClC,sBAAM,OAAO,WAAW,GAAG;AAC3B,uBACE,gBAAAF,OAACC,OAAA,EACC;AAAA,kCAAAF,MAACG,QAAA,EAAK,OAAO,MAAM,SAAS,QAAQ,sBAAG;AAAA,kBACvC,gBAAAH,MAACG,QAAA,EAAO,iBAAM,SAAS,KAAK,OAAO,EAAE,GAAE;AAAA,kBACvC,gBAAAH,MAACG,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB,eACH;AAAA,qBALQ,GAMV;AAAA,cAEJ,CAAC;AAAA,eAEL;AAAA,YAGC,UAAU,UAAU,UAAU,KAAK,SAAS,KAC3C,gBAAAF,OAACC,OAAA,EAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,8BAAAD,OAACE,QAAA,EACE;AAAA;AAAA,gBACD,gBAAAF,OAACE,QAAA,EAAK,MAAI,MAAC;AAAA;AAAA,kBAAa,UAAU;AAAA,kBAAS;AAAA,mBAAC;AAAA,iBAC9C;AAAA,cACC,UAAU,KAAK,IAAI,CAAC,QAAQ;AAC3B,sBAAM,OAAO,WAAW,GAAG;AAC3B,uBACE,gBAAAF,OAACC,OAAA,EACC;AAAA,kCAAAF,MAACG,QAAA,EAAK,OAAM,QAAO,sBAAG;AAAA,kBACtB,gBAAAH,MAACG,QAAA,EAAO,iBAAM,SAAS,KAAK,OAAO,EAAE,GAAE;AAAA,kBACvC,gBAAAH,MAACG,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB,eACH;AAAA,qBALQ,GAMV;AAAA,cAEJ,CAAC;AAAA,eACH;AAAA,aAEJ,IAEA,gBAAAF,OAACC,OAAA,EAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,4BAAAD,OAACE,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,cAAI;AAAA,eAEP;AAAA,YACA,gBAAAF,OAACE,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,cAAI;AAAA,eAEP;AAAA,aACF;AAAA,UAID,cACC,gBAAAF,OAACC,OAAA,EAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,4BAAAD,OAACE,QAAA,EACE;AAAA;AAAA,cACD,gBAAAF,OAACE,QAAA,EAAK,MAAI,MAAC;AAAA;AAAA,gBAAS,WAAW;AAAA,gBAAW;AAAA,iBAAS;AAAA,eACrD;AAAA,YACC,OAAO,QAAQ,WAAW,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MACjD,gBAAAF,OAACE,QAAA,EAAgB,OAAM,QACpB;AAAA;AAAA,cACA,KAAK,OAAO,EAAE;AAAA,cAAE;AAAA,cAAE;AAAA,iBAFV,IAGX,CACD;AAAA,YACD,gBAAAH,MAACG,QAAA,EAAK,OAAM,QAAO,oCAAsB;AAAA,aAC3C;AAAA,UAIF,gBAAAF,OAACC,OAAA,EAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,4BAAAD,OAACE,QAAA,EACE;AAAA;AAAA,cACD,gBAAAH,MAACG,QAAA,EAAK,MAAI,MAAC,sBAAQ;AAAA,eACrB;AAAA,YACA,gBAAAH,MAACG,QAAA,EAAK,OAAM,QAAO,2CAA6B;AAAA,YAChD,gBAAAH,MAACG,QAAA,EAAK,OAAM,QAAO,yCAA2B;AAAA,YAC9C,gBAAAH,MAACG,QAAA,EAAK,OAAM,QAAO,8CAAgC;AAAA,YACnD,gBAAAH,MAACG,QAAA,EAAK,OAAM,QAAO,uCAAyB;AAAA,aAC9C;AAAA;AAAA;AAAA,IACF;AAAA,KACF,GACF;AAEJ;;;ACnVA,SAAgB,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,iBAAgB;;;ACFpC,SAAgB,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,iBAAgB;AAiL5B,gBAAAC,OAKA,QAAAC,cALA;AAxKR,SAAS,WAAW,QAAgC;AAClD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,YAAY,QAAgC;AACnD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAcA,SAAS,YAAY,MAAgB,UAAmC;AACtE,QAAM,QAAoB,CAAC;AAE3B,aAAW,SAAS,KAAK,QAAQ;AAC/B,UAAM,KAAK;AAAA,MACT,IAAI,MAAM;AAAA,MACV,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,OAAO;AAAA,MACP,MAAM;AAAA,MACN,UAAU,GAAG,MAAM,cAAc,IAAI,MAAM,SAAS;AAAA,MACpD,YAAY;AAAA,IACd,CAAC;AAED,QAAI,CAAC,SAAS,IAAI,MAAM,EAAE,EAAG;AAE7B,eAAW,UAAU,MAAM,SAAS;AAClC,YAAM,KAAK;AAAA,QACT,IAAI,OAAO;AAAA,QACX,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,OAAO;AAAA,QACP,MAAM;AAAA,QACN,YAAY;AAAA,MACd,CAAC;AAED,UAAI,CAAC,SAAS,IAAI,OAAO,EAAE,EAAG;AAE9B,iBAAW,QAAQ,OAAO,OAAO;AAC/B,cAAM,KAAK;AAAA,UACT,IAAI,KAAK;AAAA,UACT,OAAO,KAAK;AAAA,UACZ,QAAQ,KAAK;AAAA,UACb,OAAO;AAAA,UACP,MAAM;AAAA,UACN,MAAM,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAUO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AACb,GAAkB;AAChB,QAAM,CAAC,UAAU,WAAW,IAAIN,UAAsB,MAAM;AAE1D,UAAM,UAAU,oBAAI,IAAY;AAChC,eAAW,SAAS,KAAK,QAAQ;AAC/B,UAAI,MAAM,WAAW,iBAAiB,MAAM,WAAW,WAAW;AAChE,gBAAQ,IAAI,MAAM,EAAE;AACpB,mBAAW,UAAU,MAAM,SAAS;AAClC,cAAI,OAAO,WAAW,iBAAiB,OAAO,WAAW,WAAW;AAClE,oBAAQ,IAAI,OAAO,EAAE;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,CAAC;AAEtC,QAAM,QAAQ,YAAY,MAAM,QAAQ;AAExC,EAAAI,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,CAAC,SAAU;AAEf,QAAI,IAAI,aAAa,UAAU,KAAK;AAClC,gBAAU,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,MAAM,SAAS,CAAC,CAAC;AAAA,IAC1D;AACA,QAAI,IAAI,WAAW,UAAU,KAAK;AAChC,gBAAU,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,IAC3C;AACA,QAAI,IAAI,QAAQ;AACd,YAAM,OAAO,MAAM,MAAM;AACzB,UAAI,CAAC,KAAM;AAEX,UAAI,KAAK,YAAY;AACnB,oBAAY,CAAC,SAAS;AACpB,gBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,cAAI,KAAK,IAAI,KAAK,EAAE,EAAG,MAAK,OAAO,KAAK,EAAE;AAAA,cACrC,MAAK,IAAI,KAAK,EAAE;AACrB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AACA,eAAS,KAAK,IAAI,KAAK,IAAI;AAAA,IAC7B;AAAA,EACF,CAAC;AAGD,QAAM,aAAa,KAAK,IAAI,QAAQ,MAAM,SAAS,CAAC;AACpD,QAAM,eAAe,MAAM,UAAU;AAGrC,EAAAH,WAAU,MAAM;AACd,QAAI,gBAAgB,aAAa,OAAO,YAAY;AAClD,eAAS,aAAa,IAAI,aAAa,IAAI;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,cAAc,EAAE,CAAC;AAGrB,QAAM,eAAe,KAAK,IAAI,GAAG,aAAa,YAAY,CAAC;AAC3D,QAAM,eAAe,MAAM,MAAM,cAAc,eAAe,SAAS;AAEvE,SACE,gBAAAK,OAACJ,OAAA,EAAI,eAAc,UAEjB;AAAA,oBAAAG,MAACH,OAAA,EAAI,cAAc,GACjB,0BAAAG,MAACF,QAAA,EAAK,MAAI,MAAC,OAAM,QACd,eAAK,MACR,GACF;AAAA,IACA,gBAAAE,MAACH,OAAA,EAAI,cAAc,GACjB,0BAAAI,OAACH,QAAA,EAAK,OAAM,QACT;AAAA,WAAK;AAAA,MAAe;AAAA,MAAE,KAAK;AAAA,MAAW;AAAA,OACzC,GACF;AAAA,IAGC,aAAa,IAAI,CAAC,MAAM,MAAM;AAC7B,YAAM,YAAY,eAAe;AACjC,YAAM,WAAW,cAAc;AAC/B,YAAM,SAAS,KAAK,OAAO,KAAK,KAAK;AACrC,YAAM,aAAa,KAAK,aACpB,SAAS,IAAI,KAAK,EAAE,IAClB,YACA,YACF;AAEJ,aACE,gBAAAG,OAACJ,OAAA,EACC;AAAA,wBAAAG,MAACF,QAAA,EAAK,OAAO,WAAW,SAAS,QAC9B,qBAAW,YAAO,MACrB;AAAA,QACA,gBAAAE,MAACF,QAAA,EAAK,UAAU,CAAC,UAAW,kBAAO;AAAA,QACnC,gBAAAG,OAACH,QAAA,EAAK,OAAO,YAAY,KAAK,MAAM,GACjC;AAAA,qBAAW,KAAK,MAAM;AAAA,UAAG;AAAA,WAC5B;AAAA,QACA,gBAAAE,MAACF,QAAA,EAAK,UAAU,CAAC,UAAW,sBAAW;AAAA,QACvC,gBAAAE;AAAA,UAACF;AAAA,UAAA;AAAA,YACC,OAAO,WAAW,UAAU;AAAA,YAC5B,MAAM;AAAA,YACN,MAAK;AAAA,YAEJ,eAAK,MAAM,MAAM,GAAG,EAAE;AAAA;AAAA,QACzB;AAAA,QACC,KAAK,YACJ,gBAAAG,OAACH,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,UACA,KAAK;AAAA,WACR;AAAA,QAED,KAAK,SACJ,gBAAAG,OAACH,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,UAAI;AAAA,UACH,KAAK;AAAA,UAAM;AAAA,WACf;AAAA,QAED,KAAK,SAAS,UAAa,KAAK,OAAO,KACtC,gBAAAG,OAACH,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,UAAI;AAAA,UACH,KAAK,KAAK,QAAQ,CAAC;AAAA,WACvB;AAAA,WAhCM,KAAK,EAkCf;AAAA,IAEJ,CAAC;AAAA,IAEA,eAAe,KACd,gBAAAG,OAACH,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,MAAI;AAAA,MACF;AAAA,MAAa;AAAA,OAClB;AAAA,IAED,eAAe,YAAY,MAAM,UAChC,gBAAAG,OAACH,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,MAAI;AAAA,MACF,MAAM,SAAS,eAAe;AAAA,MAAU;AAAA,OAC7C;AAAA,KAEJ;AAEJ;;;ADvPA,SAAS,wBAAwB;AACjC,SAAS,aAAa,gBAAAI,eAAc,cAAAC,mBAAkB;AACtD,SAAS,QAAAC,aAAY;AAwDb,gBAAAC,OAcE,QAAAC,cAdF;AAlDR,SAAS,UAAU,aAAiC;AAClD,QAAM,QAAoB,CAAC;AAC3B,QAAM,WAAW;AAAA,IACfF,MAAK,aAAa,WAAW,OAAO;AAAA,IACpCA,MAAK,aAAa,eAAe,OAAO;AAAA,EAC1C;AAEA,aAAW,OAAO,UAAU;AAC1B,QAAI,CAACD,YAAW,GAAG,EAAG;AACtB,eAAW,QAAQ,YAAY,GAAG,GAAG;AACnC,UAAI,CAAC,KAAK,SAAS,UAAU,EAAG;AAChC,UAAI;AACF,cAAM,WAAWC,MAAK,KAAK,IAAI;AAC/B,cAAM,UAAUF,cAAa,UAAU,OAAO;AAC9C,cAAM,KAAK,iBAAiB,SAAS,QAAQ,CAAC;AAAA,MAChD,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,EAAE,YAAY,GAAsB;AAC/D,QAAM,CAAC,OAAO,QAAQ,IAAIK,UAAqB,CAAC,CAAC;AACjD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,CAAC;AACpD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAwB,IAAI;AAChE,QAAM,CAAC,cAAc,eAAe,IAAIA,UAEtC,IAAI;AAEN,EAAAC,WAAU,MAAM;AACd,UAAM,MAAM,eAAe,QAAQ,IAAI;AACvC,aAAS,UAAU,GAAG,CAAC;AAAA,EACzB,GAAG,CAAC,WAAW,CAAC;AAEhB,EAAAC,UAAS,CAAC,OAAO,QAAQ;AAEvB,QAAI,UAAU,OAAO,MAAM,SAAS,GAAG;AACrC,uBAAiB,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IAClD;AACA,QAAI,UAAU,OAAO,MAAM,SAAS,GAAG;AACrC,uBAAiB,CAAC,SAAS,KAAK,IAAI,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IACjE;AAAA,EACF,CAAC;AAED,MAAI,MAAM,WAAW,GAAG;AACtB,WACE,gBAAAH,OAACI,OAAA,EAAI,eAAc,UAAS,UAAU,GAAG,UAAU,GACjD;AAAA,sBAAAL,MAACM,QAAA,EAAK,MAAI,MAAC,OAAM,QAAO,sBAExB;AAAA,MACA,gBAAAN,MAACK,OAAA,EAAI,WAAW,GACd,0BAAAL,MAACM,QAAA,EAAK,OAAM,QAAO,kFAEnB,GACF;AAAA,MACA,gBAAAN,MAACK,OAAA,EAAI,WAAW,GACd,0BAAAL,MAACM,QAAA,EAAK,OAAM,QAAO,UAAQ,MAAC,8EAE5B,GACF;AAAA,MACA,gBAAAN,MAACK,OAAA,EAAI,WAAW,GACd,0BAAAJ,OAACK,QAAA,EAAK,OAAM,QAAO,UAAQ,MAAC;AAAA;AAAA,QACG;AAAA,QAAS;AAAA,SACxC,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,aAAa,MAAM,aAAa;AAGtC,MAAI,gBAAkC;AACtC,MAAI,eAAgC;AAEpC,MAAI,cAAc,YAAY;AAC5B,eAAW,SAAS,WAAW,QAAQ;AACrC,UAAI,MAAM,OAAO,YAAY;AAC3B,wBAAgB;AAChB;AAAA,MACF;AACA,iBAAW,UAAU,MAAM,SAAS;AAClC,YAAI,OAAO,OAAO,YAAY;AAC5B,0BAAgB;AAChB;AAAA,QACF;AACA,mBAAW,QAAQ,OAAO,OAAO;AAC/B,cAAI,KAAK,OAAO,YAAY;AAC1B,2BAAe;AACf,4BAAgB;AAChB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WACJ,WAAW,aAAa,IACpB,KAAK,MAAO,WAAW,iBAAiB,WAAW,aAAc,GAAG,IACpE;AAEN,SACE,gBAAAL,OAACI,OAAA,EAAI,eAAc,UAAS,UAAU,GAAG,UAAU,GAEhD;AAAA,UAAM,SAAS,KACd,gBAAAJ,OAACI,OAAA,EAAI,cAAc,GACjB;AAAA,sBAAAJ,OAACK,QAAA,EAAK,OAAM,QAAO,UAAQ,MAAC;AAAA;AAAA,QACT;AAAA,SACnB;AAAA,MACC,MAAM,IAAI,CAAC,GAAG,MACb,gBAAAN,MAACK,OAAA,EAAe,aAAa,GAC3B,0BAAAL;AAAA,QAACM;AAAA,QAAA;AAAA,UACC,OAAO,MAAM,gBAAgB,SAAS;AAAA,UACtC,MAAM,MAAM;AAAA,UAEX,YAAE,KAAK,MAAM,GAAG,EAAE;AAAA;AAAA,MACrB,KANQ,EAAE,EAOZ,CACD;AAAA,OACH;AAAA,IAIF,gBAAAL,OAACI,OAAA,EAAI,cAAc,GACjB;AAAA,sBAAAL,MAACM,QAAA,EAAK,OAAM,QAAO,wBAAU;AAAA,MAC7B,gBAAAL;AAAA,QAACK;AAAA,QAAA;AAAA,UACC,OAAO,YAAY,MAAM,UAAU,WAAW,IAAI,WAAW;AAAA,UAE5D;AAAA,qBAAI,OAAO,KAAK,MAAM,WAAW,CAAC,CAAC;AAAA,YACnC,SAAI,OAAO,KAAK,KAAK,MAAM,WAAW,CAAC,CAAC;AAAA;AAAA;AAAA,MAC3C;AAAA,MACA,gBAAAL,OAACK,QAAA,EAAK,OAAM,QAAO;AAAA;AAAA,QAAE;AAAA,QAAS;AAAA,SAAE;AAAA,MAChC,gBAAAL,OAACK,QAAA,EAAK,OAAM,QAAO,UAAQ,MAAC;AAAA;AAAA,QACxB,WAAW;AAAA,QAAe;AAAA,QAAE,WAAW;AAAA,QAAW;AAAA,SACtD;AAAA,OACF;AAAA,IAGA,gBAAAL,OAACI,OAAA,EAAI,eAAc,OAAM,UAAU,GAEjC;AAAA,sBAAAL,MAACK,OAAA,EAAI,OAAM,OAAM,eAAc,UAC7B,0BAAAL;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN;AAAA,UACA,UAAU,CAAC,IAAI,SAAS;AACtB,0BAAc,EAAE;AAChB,4BAAgB,IAAI;AAAA,UACtB;AAAA;AAAA,MACF,GACF;AAAA,MAGA,gBAAAA,MAACK,OAAA,EAAI,OAAO,GAAG,SAAS,GACtB,0BAAAL,MAACM,QAAA,EAAK,OAAM,QAAO,UAAQ,MAAC,oBAE5B,GACF;AAAA,MAGA,gBAAAL,OAACI,OAAA,EAAI,OAAM,OAAM,eAAc,UAC5B;AAAA,yBAAiB,iBAAiB,WACjC,gBAAAL,MAAC,eAAY,OAAO,eAAe;AAAA,QAEpC,gBAAgB,iBAAiB,UAChC,gBAAAA,MAAC,cAAW,MAAM,cAAc;AAAA,QAEjC,CAAC,cACA,gBAAAA,MAACK,OAAA,EACC,0BAAAL,MAACM,QAAA,EAAK,OAAM,QAAO,0CAA4B,GACjD;AAAA,SAEJ;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,YAAY,EAAE,MAAM,GAAyB;AACpD,SACE,gBAAAL,OAACI,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAL,MAACM,QAAA,EAAK,MAAI,MAAC,OAAM,SACd,gBAAM,MACT;AAAA,IACA,gBAAAL,OAACK,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA,YAAM;AAAA,MAAe;AAAA,MAAE,MAAM;AAAA,MAAU;AAAA,OAC1C;AAAA,IACA,gBAAAN,MAACK,OAAA,EAAI,WAAW,GAAG,eAAc,UAC9B,gBAAM,QAAQ,IAAI,CAAC,WAClB,gBAAAJ,OAACI,OAAA,EAAoB,eAAc,UAAS,cAAc,GACxD;AAAA,sBAAAL,MAACM,QAAA,EAAK,OAAM,QAAQ,iBAAO,MAAK;AAAA,MAC/B,OAAO,MAAM,IAAI,CAAC,SAAS;AAC1B,cAAM,OACJ,KAAK,WAAW,cACZ,WACA,KAAK,WAAW,gBACd,WACA;AACR,cAAM,QACJ,KAAK,WAAW,cACZ,UACA,KAAK,WAAW,gBACd,WACA;AACR,eACE,gBAAAL,OAACI,OAAA,EAAkB,aAAa,GAC9B;AAAA,0BAAAJ,OAACK,QAAA,EAAK,OAAe;AAAA;AAAA,YAAK;AAAA,aAAC;AAAA,UAC3B,gBAAAN,MAACM,QAAA,EAAK,OAAM,QAAO,MAAK,YACrB,eAAK,YAAY,MAAM,GAAG,EAAE,GAC/B;AAAA,UACC,KAAK,SAAS,UAAa,KAAK,OAAO,KACtC,gBAAAL,OAACK,QAAA,EAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,YAAI;AAAA,YACH,KAAK,KAAK,QAAQ,CAAC;AAAA,aACvB;AAAA,aATM,KAAK,EAWf;AAAA,MAEJ,CAAC;AAAA,SA7BO,OAAO,EA8BjB,CACD,GACH;AAAA,KACF;AAEJ;AAEA,SAAS,WAAW,EAAE,KAAK,GAAuB;AAChD,SACE,gBAAAL,OAACI,OAAA,EAAI,eAAc,UACjB;AAAA,oBAAAL,MAACM,QAAA,EAAK,MAAI,MAAC,OAAM,SACd,eAAK,aACR;AAAA,IACA,gBAAAL,OAACI,OAAA,EAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,sBAAAJ,OAACK,QAAA,EAAK,OAAM,QAAO;AAAA;AAAA,QACT;AAAA,QACR,gBAAAN,MAACM,QAAA,EAAK,OAAO,KAAK,WAAW,cAAc,UAAU,UAClD,eAAK,QACR;AAAA,SACF;AAAA,MACC,KAAK,iBACJ,gBAAAL,OAACK,QAAA,EAAK,OAAM,QAAO;AAAA;AAAA,QACV,gBAAAN,MAACM,QAAA,EAAK,OAAM,QAAQ,eAAK,eAAc;AAAA,SAChD;AAAA,MAED,KAAK,aACJ,gBAAAL,OAACK,QAAA,EAAK,OAAM,QAAO;AAAA;AAAA,QACV,gBAAAN,MAACM,QAAA,EAAK,OAAM,SAAS,eAAK,WAAU;AAAA,SAC7C;AAAA,MAED,KAAK,SAAS,UAAa,KAAK,OAAO,KACtC,gBAAAL,OAACK,QAAA,EAAK,OAAM,QAAO;AAAA;AAAA,QACX,gBAAAL,OAACK,QAAA,EAAK,OAAM,UAAS;AAAA;AAAA,UAAE,KAAK,KAAK,QAAQ,CAAC;AAAA,WAAE;AAAA,SACpD;AAAA,OAEJ;AAAA,KACF;AAEJ;;;AElRA,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,iBAAgB;AAa9B,gBAAAC,OAeA,QAAAC,cAfA;AAPC,SAAS,gBAAgB,EAAE,UAAU,GAAyB;AACnE,EAAAF,UAAS,MAAM;AACb,cAAU;AAAA,EACZ,CAAC;AAED,SACE,gBAAAE,OAACJ,OAAA,EAAI,eAAc,UAAS,UAAU,GAAG,UAAU,GACjD;AAAA,oBAAAG,MAACF,QAAA,EAAK,MAAI,MAAC,OAAM,QAAO,gCAExB;AAAA,IACA,gBAAAE,MAACF,QAAA,EAAK,eAAC;AAAA,IAEP,gBAAAE,MAACF,QAAA,EAAK,MAAI,MAAC,wBAAU;AAAA,IACrB,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,oDAAsC;AAAA,IACzD,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,mDAAqC;AAAA,IACxD,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,kDAAoC;AAAA,IACvD,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,2CAA0B;AAAA,IAC7C,gBAAAE,MAACF,QAAA,EAAK,eAAC;AAAA,IAEP,gBAAAE,MAACF,QAAA,EAAK,MAAI,MAAC,uBAAS;AAAA,IACpB,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,iCAAmB;AAAA,IACtC,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,2DAA4C;AAAA,IAC/D,gBAAAG,OAACH,QAAA,EAAK,OAAM,QACT;AAAA;AAAA,MAAI;AAAA,OAEP;AAAA,IACA,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,yCAAiB;AAAA,IACpC,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,wDAAgC;AAAA,IACnD,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,0CAA4B;AAAA,IAC/C,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,4CAA8B;AAAA,IACjD,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,8DAAgD;AAAA,IACnE,gBAAAE,MAACF,QAAA,EAAK,eAAC;AAAA,IAEP,gBAAAE,MAACF,QAAA,EAAK,MAAI,MAAC,yBAAW;AAAA,IACtB,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,qDAA6B;AAAA,IAChD,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,6CAA+B;AAAA,IAClD,gBAAAE,MAACF,QAAA,EAAK,eAAC;AAAA,IAEP,gBAAAE,MAACF,QAAA,EAAK,MAAI,MAAC,4BAAc;AAAA,IACzB,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,8CAAgC;AAAA,IACnD,gBAAAE,MAACF,QAAA,EAAK,eAAC;AAAA,IAEP,gBAAAE,MAACF,QAAA,EAAK,MAAI,MAAC,0BAAY;AAAA,IACvB,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,sCAAwB;AAAA,IAC3C,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,yDAA2C;AAAA,IAC9D,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,iDAAmC;AAAA,IACtD,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,uCAAyB;AAAA,IAC5C,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,6CAA+B;AAAA,IAClD,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,qCAAuB;AAAA,IAC1C,gBAAAE,MAACF,QAAA,EAAK,eAAC;AAAA,IAEP,gBAAAE,MAACF,QAAA,EAAK,OAAM,QAAO,sCAAwB;AAAA,KAC7C;AAEJ;;;AtBsMI,SACE,OAAAI,OADF,QAAAC,cAAA;AAnLG,SAAS,IAAI,OAAiB;AACnC,QAAM,EAAE,KAAK,IAAIC,QAAO;AACxB,QAAM,EAAE,MAAM,SAAS,WAAW,aAAa,IAAI,QAAQ,MAAM;AACjE,QAAM,CAAC,aAAa,cAAc,IAAIC,UAAS,CAAC;AAChD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;AACpE,QAAM,CAAC,cAAc,eAAe,IAAIA,UAA6B;AACrE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA6B;AACnE,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAyB,CAAC,CAAC;AACvE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAgC,oBAAI,IAAI,CAAC;AAC3E,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,CAAC;AAC5C,QAAM,CAAC,YAAY,IAAIA,UAAS,KAAK,IAAI,CAAC;AAC1C,QAAM,EAAE,MAAM,QAAQ,SAAS,UAAU,IAAI,UAAU,MAAM,WAAW,IAAI;AAC5E,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,CAAC;AAC5C,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAA6B;AACzE,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,KAAK;AACxD,QAAM,kBAAkBC,QAA6C,IAAI;AAOzE,EAAAC,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,UAAI,SAAS,QAAQ;AAEnB,YAAI,cAAc;AAChB,gBAAM,UAAU;AAChB,cAAI,gBAAgB,QAAS,cAAa,gBAAgB,OAAO;AACjE,0BAAgB,UAAU,WAAW,MAAM;AACzC,4BAAgB,KAAK;AACrB,4BAAgB,UAAU;AAAA,UAC5B,GAAG,GAAI;AAAA,QACT,OAAO;AACL,kBAAQ,WAAW;AAAA,QACrB;AAAA,MACF,OAAO;AAEL,gBAAQ,MAAM;AAAA,MAChB;AACA;AAAA,IACF;AAGA,QAAI,UAAU,OAAO,SAAS,QAAQ;AACpC,uBAAiB,IAAI;AACrB;AAAA,IACF;AAGA,QAAI,SAAS,QAAQ;AACnB,UAAI,aAAa,KAAK,EAAG;AACzB,UAAI,IAAI,KAAK;AACX,kBAAU;AACV;AAAA,MACF;AACA,UAAI,UAAU,OAAO,SAAS,aAAa;AACzC,kBAAU;AACV;AAAA,MACF;AAAA,IACF;AAGA,QAAI,UAAU,OAAO,IAAI,MAAM;AAC7B,YAAM,MAAM,KAAK,IAAI;AACrB,UAAI,YAAY,KAAK,MAAM,YAAY,KAAM;AAC3C,aAAK;AAAA,MACP,OAAO;AACL,qBAAa,GAAG;AAAA,MAClB;AACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,aAAa,QAAQ,OAAO,QAAQ;AAG1C,QAAM,wBAAwB;AAAA,IAC5B,GAAG,MAAM;AAAA,IACT,SAAS,MAAM;AAAA,IACf,UAAU,CAAC,UAAkB;AAC3B,YAAM,gBAAgB,WAAW,KAAK;AACtC,YAAM,OAAO,MAAM,MAAM,GAAG,EAAE,IAAI,KAAK;AACvC,sBAAgB,IAAI;AAAA,IACtB;AAAA,IACA,eAAe,CAAC,SAA6B;AAC3C,YAAM,gBAAgB,gBAAgB,IAAI;AAC1C,qBAAe,IAAI;AAAA,IACrB;AAAA,EACF;AAGA,WAAS,mBAAmB,MAA0C;AACpE,UAAM,MAAM,MAAM,cAAc,IAAI;AACpC,QAAI;AACJ,QAAI;AAEJ,YAAQ,mBAAmB;AACzB,sBAAgB,IAAI;AACpB,UAAI;AACF,yBAAiB,SAAS,KAAK;AAE7B,cAAI,MAAM,SAAS,WAAW;AAC5B,4BACE,MAAM,SAAS,MAAM,MAAM,MAAM,SAAS,MAAM;AAClD,4BAAgB,MAAM,SAAS,MAAM,IAAI;AACzC,8BAAkB,CAAC,SAAS;AAAA,cAC1B;AAAA,gBACE,OAAO,MAAM,SAAS,MAAM;AAAA,gBAC5B,UAAU,MAAM,SAAS;AAAA,gBACzB,QAAQ,MAAM,SAAS;AAAA,gBACvB,WAAW,KAAK,IAAI;AAAA,cACtB;AAAA,cACA,GAAG,KAAK,MAAM,GAAG,CAAC;AAAA,YACpB,CAAC;AAAA,UACH;AACA,cAAI,MAAM,SAAS,mBAAmB;AACpC,yBAAa,CAAC,SAAS;AACrB,oBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,oBAAM,WAAW,KAAK,IAAI,MAAM,QAAQ,KAAK;AAAA,gBAC3C,MAAM,MAAM;AAAA,gBACZ,OAAO;AAAA,gBACP,WAAW;AAAA,cACb;AACA,mBAAK,IAAI,MAAM,UAAU;AAAA,gBACvB,GAAG;AAAA,gBACH,OAAO,SAAS,QAAQ;AAAA,cAC1B,CAAC;AACD,qBAAO;AAAA,YACT,CAAC;AAAA,UACH;AACA,cAAI,MAAM,SAAS,oBAAoB;AACrC,yBAAa,CAAC,SAAS;AACrB,oBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,oBAAM,WAAW,KAAK,IAAI,MAAM,QAAQ;AACxC,kBAAI,UAAU;AACZ,qBAAK,IAAI,MAAM,UAAU;AAAA,kBACvB,GAAG;AAAA,kBACH,WAAW,SAAS,YAAY;AAAA,gBAClC,CAAC;AAAA,cACH;AACA,qBAAO;AAAA,YACT,CAAC;AAAA,UACH;AAEA,cAAI,MAAM,SAAS,oBAAoB;AACrC,4BAAiB,MAAc,UAAU;AACzC,kBAAM,aAAc,MAAc,UAAU;AAC5C,gBAAI,OAAO,eAAe,YAAY,aAAa,GAAG;AACpD,6BAAe,CAAC,SAAS,KAAK,IAAI,MAAM,UAAU,CAAC;AAAA,YACrD;AACA,kBAAM,WAAY,MAAc,UAAU;AAC1C,gBAAI,SAAU,mBAAkB,QAAQ;AAAA,UAC1C;AACA,cAAI,MAAM,SAAS,QAAQ;AACzB,2BAAe,MAAM,SAAS;AAC9B,gBAAI,MAAM,YAAa,eAAc,MAAM,WAAW;AACtD,yBAAa,CAAC,SAAS,OAAO,CAAC;AAE/B,gBAAI,MAAM,WAAW,eAAe;AAClC,oBAAM,QACH,cAAc,eAAe;AAAA,gBAC5B,SAAS;AAAA,gBACT,SAAS,CAAC;AAAA,gBACV,YAAY;AAAA,cACd,CAAC,EACA,MAAM,MAAM;AAAA,cAAC,CAAC;AAAA,YACnB;AAAA,UACF;AACA,gBAAM;AAAA,QACR;AAAA,MACF,UAAE;AACA,wBAAgB,KAAK;AAAA,MACvB;AAAA,IACF,GAAG;AAAA,EACL;AAEA,SACE,gBAAAJ,OAACK,OAAA,EAAI,eAAc,UAAS,QAAQ,YAClC;AAAA,oBAAAN;AAAA,MAAC;AAAA;AAAA,QACC,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA;AAAA,IACF;AAAA,IAIA,gBAAAA;AAAA,MAACM;AAAA,MAAA;AAAA,QACC,eAAc;AAAA,QACd,UAAU,SAAS,SAAS,IAAI;AAAA,QAChC,SAAS,SAAS,SAAS,SAAS;AAAA,QAEpC,0BAAAN;AAAA,UAAC;AAAA;AAAA,YACC,UAAU,MAAM;AAAA,YAChB,YAAY,MAAM;AAAA,YAClB,eAAe;AAAA,YACf,SAAS,MAAM;AAAA,YACf,UAAU,SAAS;AAAA,YACnB,gBAAgB;AAAA;AAAA,QAClB;AAAA;AAAA,IACF;AAAA,IAEC,SAAS,eACR,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,YAAY,MAAM;AAAA,QAClB;AAAA,QACA,WAAW,MAAM,KAAK,UAAU,OAAO,CAAC;AAAA,QACxC;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,aAAa,MAAM;AAAA;AAAA,IACrB;AAAA,IAGD,SAAS,YACR,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,MAAM,UAAU,CAAC;AAAA,QACzB,gBAAgB;AAAA,QAChB,eAAe,CAAC,OAAO;AACrB,gBAAM,gBAAgB,WAAW,EAAE;AACnC,gBAAM,OAAO,GAAG,MAAM,GAAG,EAAE,IAAI,KAAK;AACpC,0BAAgB,IAAI;AACpB,kBAAQ,MAAM;AAAA,QAChB;AAAA;AAAA,IACF;AAAA,IAGD,SAAS,YACR,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,MAAM,YAAY,YAAY,MAAM;AAAA,QAC9C,gBAAgB,MAAM,YAAY,kBAAkB;AAAA,QACpD,aAAa,MAAM,YAAY,eAAe;AAAA,QAC9C,SAAS,MAAM,YAAY,WAAW;AAAA,QACtC,MAAM;AAAA,QACN,YAAY,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,YAAY,MAAM;AAAA;AAAA,IACpB;AAAA,IAGD,SAAS,cAAc,gBAAAA,MAAC,gBAAa;AAAA,IAEtC,gBAAAA,MAAC,WAAQ,MAAY,cAA4B;AAAA,IAGhD,iBACC,gBAAAA,MAAC,mBAAgB,WAAW,MAAM,iBAAiB,KAAK,GAAG;AAAA,KAE/D;AAEJ;","names":["useState","useRef","Box","useApp","useInput","useState","useCallback","Box","Text","jsx","useState","useCallback","useMemo","Box","Text","useInput","Box","Text","jsx","jsxs","Box","Text","MessageBubble","Box","Text","jsx","jsxs","React","Box","Text","jsx","jsxs","React","StreamingMessage","Box","Text","Box","Text","Spinner","jsx","jsxs","useState","Box","Text","jsx","jsxs","useState","useMemo","Box","Text","useInput","jsx","jsxs","jsx","jsxs","useState","useCallback","useMemo","useInput","Box","Text","useEffect","Box","Text","Box","Text","jsx","jsxs","Text","jsx","Fragment","jsx","jsxs","useEffect","Box","Text","statusColor","useState","Box","Text","useInput","Fragment","jsx","jsxs","useState","useInput","Box","Text","Box","Text","jsx","jsxs","Box","Text","useState","useEffect","Box","Text","useInput","useState","useEffect","Box","Text","useInput","jsx","jsxs","readFileSync","existsSync","join","jsx","jsxs","useState","useEffect","useInput","Box","Text","Box","Text","useInput","jsx","jsxs","jsx","jsxs","useApp","useState","useRef","useInput","Box"]}
|