dominus-cli 0.5.8 → 0.6.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/index.js +244 -62
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +214 -54
- package/dist/mcp.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/config.ts","../src/transport/protocol.ts","../src/transport/ws-server.ts","../src/transport/ws-client.ts","../src/agent/internal-memory.ts","../src/memory/store.ts","../src/tools/studio/read-script.ts","../src/tools/studio/edit-script.ts","../src/tools/studio/run-code.ts","../src/tools/studio/get-explorer.ts","../src/tools/studio/get-properties.ts","../src/tools/studio/get-descendants-properties.ts","../src/tools/studio/set-properties.ts","../src/tools/studio/insert-instance.ts","../src/tools/studio/delete-instance.ts","../src/tools/studio/get-output.ts","../src/tools/studio/get-selection.ts","../src/tools/studio/search-scripts.ts","../src/tools/studio/run-tests.ts","../src/tools/studio/get-class-info.ts","../src/tools/studio/create-ui.ts","../src/tools/studio/execute-run-test.ts","../src/tools/studio/execute-play-test.ts","../src/tools/studio/create-part.ts","../src/tools/studio/clone-instance.ts","../src/tools/studio/group-instances.ts","../src/tools/studio/build-multiple.ts","../src/tools/studio/serialize-ui.ts","../src/tools/studio/move-instance.ts","../src/tools/studio/bulk-set-properties.ts","../src/tools/studio/find-replace-scripts.ts","../src/tools/memory/recall.ts","../src/tools/memory/remember.ts","../src/tools/cloud/upload-asset.ts","../src/tools/studio/undo-redo.ts","../src/mcp/server.ts","../src/ui/components/Welcome.tsx","../src/ui/components/Setup.tsx","../src/ui/components/StatusBar.tsx","../src/ui/components/OutputPane.tsx","../src/ui/components/ChatPane.tsx","../src/utils/clipboard.ts","../src/ui/components/InputBar.tsx","../src/ui/components/Explorer.tsx","../src/ui/components/ToolCallView.tsx","../src/ui/components/Layout.tsx","../src/ui/hooks/useStudio.ts","../src/app.tsx","../src/index.tsx","../src/ai/provider.ts","../src/agent/system-prompt.ts","../src/agent/context-builder.ts","../src/ai/models.ts","../src/agent/loop.ts","../src/tools/registry.ts","../src/utils/update-checker.ts"],"names":["fs","path","os","WebSocket","EventEmitter","result","tool","React","jsxs","Box","jsx","Text","Fragment","formatTime","useState","useInput","TextInput","useRef","useEffect","useCallback","nanoid","recallFacts","storeFact","getScriptIndex","execSync","__dirname","startMcpServer"],"mappings":"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","file":"index.js","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport type { ConfigAccess } from '../tools/types.js';\n\nconst DOMINUS_DIR = path.join(os.homedir(), '.dominus');\nconst CONFIG_PATH = path.join(DOMINUS_DIR, 'config.json');\nconst DB_PATH = path.join(DOMINUS_DIR, 'dominus.db');\nconst RULES_PATH = path.join(DOMINUS_DIR, 'rules.json');\n\nexport type AIProviderType =\n | 'openai'\n | 'anthropic'\n | 'gemini'\n | 'xai'\n | 'openrouter'\n | 'custom';\n\nexport interface ProviderConfig {\n name: string;\n baseUrl: string;\n envVar: string;\n defaultModel: string;\n}\n\nexport const PROVIDERS: Record<AIProviderType, ProviderConfig> = {\n openai: {\n name: 'OpenAI',\n baseUrl: 'https://api.openai.com/v1',\n envVar: 'OPENAI_API_KEY',\n defaultModel: 'gpt-5.3-codex',\n },\n anthropic: {\n name: 'Anthropic',\n baseUrl: 'https://api.anthropic.com/v1/',\n envVar: 'ANTHROPIC_API_KEY',\n defaultModel: 'claude-sonnet-4-6',\n },\n gemini: {\n name: 'Google Gemini',\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai',\n envVar: 'GEMINI_API_KEY',\n defaultModel: 'gemini-3.1-pro',\n },\n xai: {\n name: 'xAI (Grok)',\n baseUrl: 'https://api.x.ai/v1',\n envVar: 'XAI_API_KEY',\n defaultModel: 'grok-4.2',\n },\n openrouter: {\n name: 'OpenRouter',\n baseUrl: 'https://openrouter.ai/api/v1',\n envVar: 'OPENROUTER_API_KEY',\n defaultModel: 'anthropic/claude-sonnet-4-6',\n },\n custom: {\n name: 'Custom',\n baseUrl: '',\n envVar: '',\n defaultModel: '',\n },\n};\n\nexport interface DominusConfig {\n provider: AIProviderType;\n apiKey?: string;\n apiBaseUrl: string;\n model: string;\n port: number;\n maxToolIterations: number;\n maxVerifyRetries: number;\n tokenBudget: number;\n autoIndex: boolean;\n autoLearn: boolean;\n userName: string;\n openCloudApiKey?: string;\n}\n\nconst DEFAULTS: DominusConfig = {\n provider: 'openai',\n apiBaseUrl: '',\n model: '',\n port: 18088,\n maxToolIterations: 25,\n maxVerifyRetries: 3,\n tokenBudget: 128000,\n autoIndex: true,\n autoLearn: true,\n userName: 'Developer',\n};\n\n/**\n * Auto-detect provider from environment variables.\n * Returns the first provider whose env var is set, or null.\n */\nexport function detectProviderFromEnv(): { provider: AIProviderType; apiKey: string } | null {\n const priority: AIProviderType[] = ['openai', 'anthropic', 'gemini', 'xai', 'openrouter'];\n for (const p of priority) {\n const key = process.env[PROVIDERS[p].envVar];\n if (key) return { provider: p, apiKey: key };\n }\n return null;\n}\n\n/**\n * Resolve the effective base URL and model for a provider config.\n */\nexport function resolveProviderSettings(config: DominusConfig): {\n baseUrl: string;\n model: string;\n} {\n const providerInfo = PROVIDERS[config.provider];\n return {\n baseUrl: config.apiBaseUrl || providerInfo?.baseUrl || PROVIDERS.openrouter.baseUrl,\n model: config.model || providerInfo?.defaultModel || 'gpt-4o',\n };\n}\n\nexport interface DominusRules {\n do: string[];\n dont: string[];\n conventions: string[];\n context: string;\n}\n\nconst DEFAULT_RULES: DominusRules = {\n do: [],\n dont: [],\n conventions: [],\n context: '',\n};\n\nfunction ensureDir(): void {\n if (!fs.existsSync(DOMINUS_DIR)) {\n fs.mkdirSync(DOMINUS_DIR, { recursive: true });\n }\n}\n\nfunction readJson<T>(filePath: string, defaults: T): T {\n try {\n if (fs.existsSync(filePath)) {\n const raw = fs.readFileSync(filePath, 'utf-8');\n return { ...defaults, ...JSON.parse(raw) };\n }\n } catch {\n // Corrupted file; reset to defaults\n }\n return { ...defaults };\n}\n\nfunction writeJson(filePath: string, data: unknown): void {\n ensureDir();\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\n}\n\nexport function loadConfig(): DominusConfig {\n ensureDir();\n return readJson(CONFIG_PATH, DEFAULTS);\n}\n\nexport function saveConfig(config: DominusConfig): void {\n writeJson(CONFIG_PATH, config);\n}\n\nexport function getConfigValue<K extends keyof DominusConfig>(key: K): DominusConfig[K] {\n const config = loadConfig();\n return config[key];\n}\n\nexport function setConfigValue<K extends keyof DominusConfig>(\n key: K,\n value: DominusConfig[K],\n): void {\n const config = loadConfig();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (config as any)[key] = value;\n saveConfig(config);\n}\n\nexport function loadRules(): DominusRules {\n ensureDir();\n return readJson(RULES_PATH, DEFAULT_RULES);\n}\n\nexport function saveRules(rules: DominusRules): void {\n writeJson(RULES_PATH, rules);\n}\n\nexport function getDominusDir(): string {\n ensureDir();\n return DOMINUS_DIR;\n}\n\nexport function getDbPath(): string {\n ensureDir();\n return DB_PATH;\n}\n\nexport function createConfigAccess(): ConfigAccess {\n return {\n get<T>(key: string): T | undefined {\n const config = loadConfig() as unknown as Record<string, unknown>;\n return config[key] as T | undefined;\n },\n set(key: string, value: unknown): void {\n const config = loadConfig() as unknown as Record<string, unknown>;\n config[key] = value;\n saveConfig(config as unknown as DominusConfig);\n },\n getAll(): Record<string, unknown> {\n return loadConfig() as unknown as Record<string, unknown>;\n },\n };\n}\n","import { nanoid } from 'nanoid';\r\n\r\nexport interface WsMessage<T = unknown> {\r\n id: string;\r\n type: string;\r\n payload: T;\r\n ts: number;\r\n}\r\n\r\nexport const StudioMsg = {\r\n CONNECTED: 'studio:connected',\r\n DISCONNECTED: 'studio:disconnected',\r\n EXPLORER: 'studio:explorer',\r\n OUTPUT: 'studio:output',\r\n ERROR: 'studio:error',\r\n SELECTION: 'studio:selection',\r\n SCRIPT_CONTENT: 'studio:script:content',\r\n SCRIPT_CHANGED: 'studio:script:changed',\r\n RESPONSE: 'studio:response',\r\n REFLECTION: 'studio:reflection',\r\n TEST_RESULTS: 'studio:test:results',\r\n} as const;\r\n\r\nexport const CliMsg = {\r\n GET_EXPLORER: 'cli:get:explorer',\r\n GET_SCRIPT: 'cli:get:script',\r\n SET_SCRIPT: 'cli:set:script',\r\n RUN_CODE: 'cli:run',\r\n GET_PROPERTIES: 'cli:get:properties',\r\n GET_DESCENDANTS_PROPERTIES: 'cli:get:descendants:properties',\r\n SET_PROPERTIES: 'cli:set:properties',\r\n INSERT_INSTANCE: 'cli:insert',\r\n DELETE_INSTANCE: 'cli:delete',\r\n GET_SELECTION: 'cli:get:selection',\r\n SELECT: 'cli:select',\r\n SEARCH_SCRIPTS: 'cli:search:scripts',\r\n GET_OUTPUT: 'cli:get:output',\r\n RUN_TESTS: 'cli:run:tests',\r\n EXECUTE_RUN_TEST: 'cli:test:run',\r\n EXECUTE_PLAY_TEST: 'cli:test:play',\r\n END_TEST: 'cli:test:end',\r\n BUILD_UI: 'cli:build:ui',\r\n GET_REFLECTION: 'cli:get:reflection',\r\n UPLOAD_ASSET: 'cli:upload:asset',\r\n SERIALIZE_UI: 'cli:serialize:ui',\r\n MOVE_INSTANCE: 'cli:move:instance',\r\n UNDO: 'cli:undo',\r\n REDO: 'cli:redo',\r\n BULK_SET_PROPERTIES: 'cli:bulk:set:properties',\r\n FIND_REPLACE_SCRIPTS: 'cli:find:replace:scripts',\r\n} as const;\r\n\r\nexport type StudioMsgType = (typeof StudioMsg)[keyof typeof StudioMsg];\r\nexport type CliMsgType = (typeof CliMsg)[keyof typeof CliMsg];\r\n\r\nexport interface ExplorerNode {\r\n name: string;\r\n className: string;\r\n path: string;\r\n children?: ExplorerNode[];\r\n}\r\n\r\nexport interface StudioConnectedPayload {\r\n studioVersion: string;\r\n placeId?: number;\r\n placeName?: string;\r\n engineVersion?: string;\r\n}\r\n\r\nexport interface ScriptContentPayload {\r\n path: string;\r\n className: 'Script' | 'LocalScript' | 'ModuleScript';\r\n source: string;\r\n lineCount: number;\r\n}\r\n\r\nexport interface ScriptChangedPayload {\r\n path: string;\r\n source: string;\r\n}\r\n\r\nexport interface OutputPayload {\r\n message: string;\r\n level: 'info' | 'warn' | 'error';\r\n timestamp: number;\r\n source?: string;\r\n}\r\n\r\nexport interface SelectionPayload {\r\n paths: string[];\r\n classNames: string[];\r\n}\r\n\r\nexport interface PropertyEntry {\r\n name: string;\r\n value: string;\r\n type: string;\r\n category?: string;\r\n}\r\n\r\nexport interface TestResultPayload {\r\n name: string;\r\n passed: boolean;\r\n duration: number;\r\n error?: string;\r\n}\r\n\r\nexport interface StudioTestPayload {\r\n args?: unknown;\r\n}\r\n\r\nexport interface StudioTestResultPayload {\r\n success: boolean;\r\n result?: unknown;\r\n error?: string;\r\n duration?: number;\r\n}\r\n\r\nexport interface ReflectionPayload {\r\n className: string;\r\n properties: { name: string; type: string; category: string }[];\r\n methods: { name: string; parameters: string[] }[];\r\n events: { name: string; parameters: string[] }[];\r\n}\r\n\r\nexport interface RunCodePayload {\r\n code: string;\r\n}\r\n\r\nexport interface RunCodeResponsePayload {\r\n output: string;\r\n error?: string;\r\n duration: number;\r\n}\r\n\r\nexport interface SearchScriptsPayload {\r\n query: string;\r\n maxResults?: number;\r\n}\r\n\r\nexport interface SearchResultPayload {\r\n results: {\r\n path: string;\r\n className: string;\r\n matches: { line: number; text: string }[];\r\n }[];\r\n}\r\n\r\nexport interface InsertInstancePayload {\r\n className: string;\r\n parentPath: string;\r\n name: string;\r\n properties?: Record<string, unknown>;\r\n}\r\n\r\nexport interface SetPropertiesPayload {\r\n path: string;\r\n properties: Record<string, unknown>;\r\n}\r\n\r\nexport function createMessage<T>(type: string, payload: T): WsMessage<T> {\r\n return { id: nanoid(), type, payload, ts: Date.now() };\r\n}\r\n\r\nexport function createRequest<T>(type: string, payload: T): WsMessage<T> {\r\n return createMessage(type, payload);\r\n}\r\n\r\nexport function parseMessage(raw: string): WsMessage {\r\n try {\r\n return JSON.parse(raw) as WsMessage;\r\n } catch {\r\n throw new Error(`Failed to parse WebSocket message: ${raw.slice(0, 100)}`);\r\n }\r\n}\r\n\r\nexport function serializeMessage(msg: WsMessage): string {\r\n return JSON.stringify(msg);\r\n}\r\n","import { WebSocketServer, WebSocket } from 'ws';\nimport { EventEmitter } from 'node:events';\nimport {\n parseMessage,\n serializeMessage,\n createMessage,\n StudioMsg,\n type WsMessage,\n type StudioConnectedPayload,\n} from './protocol.js';\n\nexport interface StudioConnection {\n ws: WebSocket;\n studioVersion?: string;\n placeId?: number;\n placeName?: string;\n connectedAt: number;\n}\n\nexport interface StudioBridge extends EventEmitter {\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs?: number): Promise<WsMessage<T>>;\n sendNotification(type: string, payload: unknown): void;\n isConnected(): boolean;\n getConnectionInfo(): StudioConnection | null;\n getPort(): number;\n stop(): Promise<void>;\n}\n\nexport class DominusServer extends EventEmitter implements StudioBridge {\n private wss: WebSocketServer | null = null;\n private studioClient: StudioConnection | null = null;\n private controllers = new Set<WebSocket>();\n private pendingRequests = new Map<\n string,\n { resolve: (msg: WsMessage) => void; reject: (err: Error) => void; timer: ReturnType<typeof setTimeout> }\n >();\n private relayRequests = new Map<string, WebSocket>();\n private port: number;\n\n constructor(port = 18088) {\n super();\n this.port = port;\n }\n\n start(maxRetries = 0): Promise<void> {\n return new Promise((resolve, reject) => {\n const tryPort = (port: number, attempt: number) => {\n const wss = new WebSocketServer({ port });\n\n wss.on('listening', () => {\n this.wss = wss;\n this.port = port;\n this.wss.on('connection', (ws) => this.handleConnection(ws));\n this.emit('server:started', { port });\n resolve();\n });\n\n wss.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE' && attempt < maxRetries) {\n wss.close();\n tryPort(port + 1, attempt + 1);\n } else {\n this.emit('server:error', err);\n reject(err);\n }\n });\n };\n\n tryPort(this.port, 0);\n });\n }\n\n private handleConnection(ws: WebSocket): void {\n let identified = false;\n\n ws.on('message', (raw) => {\n try {\n const msg = parseMessage(raw.toString());\n\n if (!identified) {\n if (msg.type === StudioMsg.CONNECTED) {\n identified = true;\n this.setStudioClient(ws, msg);\n return;\n }\n if (msg.type === 'controller:connect') {\n identified = true;\n this.addController(ws);\n ws.send(serializeMessage(createMessage('controller:welcome', {\n studioConnected: this.isConnected(),\n port: this.port,\n })));\n return;\n }\n }\n\n if (this.controllers.has(ws)) {\n this.handleControllerMessage(ws, msg);\n } else {\n this.handleStudioMessage(msg);\n }\n } catch (err) {\n this.emit('server:error', err);\n }\n });\n\n ws.on('close', () => {\n if (this.controllers.has(ws)) {\n this.controllers.delete(ws);\n for (const [id, controllerWs] of this.relayRequests) {\n if (controllerWs === ws) this.relayRequests.delete(id);\n }\n } else if (this.studioClient?.ws === ws) {\n this.studioClient = null;\n this.emit('studio:disconnected');\n this.broadcastToControllers('studio:disconnected', {});\n for (const [id, pending] of this.pendingRequests) {\n clearTimeout(pending.timer);\n pending.reject(new Error('Studio disconnected'));\n this.pendingRequests.delete(id);\n }\n }\n });\n\n ws.on('error', (err) => {\n this.emit('server:error', err);\n });\n }\n\n private setStudioClient(ws: WebSocket, msg: WsMessage): void {\n if (this.studioClient) {\n this.studioClient.ws.close();\n }\n\n const payload = msg.payload as StudioConnectedPayload;\n this.studioClient = {\n ws,\n connectedAt: Date.now(),\n studioVersion: payload.studioVersion,\n placeId: payload.placeId,\n placeName: payload.placeName,\n };\n\n this.emit('studio:connected', payload);\n this.broadcastToControllers('studio:connected', payload);\n }\n\n private addController(ws: WebSocket): void {\n this.controllers.add(ws);\n this.emit('controller:connected');\n }\n\n private broadcastToControllers(type: string, payload: unknown): void {\n const msg = serializeMessage(createMessage(type, payload));\n for (const ws of this.controllers) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(msg);\n }\n }\n }\n\n private handleControllerMessage(controllerWs: WebSocket, msg: WsMessage): void {\n if (!this.studioClient || this.studioClient.ws.readyState !== WebSocket.OPEN) {\n controllerWs.send(serializeMessage({\n id: msg.id,\n type: StudioMsg.RESPONSE,\n payload: { error: 'Studio not connected' },\n ts: Date.now(),\n }));\n return;\n }\n\n this.relayRequests.set(msg.id, controllerWs);\n this.studioClient.ws.send(serializeMessage(msg));\n }\n\n private handleStudioMessage(msg: WsMessage): void {\n if (msg.type === StudioMsg.CONNECTED) {\n const payload = msg.payload as StudioConnectedPayload;\n if (this.studioClient) {\n this.studioClient.studioVersion = payload.studioVersion;\n this.studioClient.placeId = payload.placeId;\n this.studioClient.placeName = payload.placeName;\n }\n this.emit('studio:connected', payload);\n this.broadcastToControllers('studio:connected', payload);\n return;\n }\n\n if (msg.type === StudioMsg.RESPONSE) {\n // Check if this is a relayed request from a controller\n const controllerWs = this.relayRequests.get(msg.id);\n if (controllerWs && controllerWs.readyState === WebSocket.OPEN) {\n controllerWs.send(serializeMessage(msg));\n this.relayRequests.delete(msg.id);\n return;\n }\n\n // Otherwise handle locally (MCP or direct)\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n clearTimeout(pending.timer);\n pending.resolve(msg);\n this.pendingRequests.delete(msg.id);\n }\n return;\n }\n\n // Forward events to controllers and local listeners\n this.emit(msg.type, msg.payload);\n this.emit('message', msg);\n this.broadcastToControllers(msg.type, msg.payload);\n }\n\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs = 10000): Promise<WsMessage<T>> {\n return new Promise((resolve, reject) => {\n if (!this.studioClient || this.studioClient.ws.readyState !== WebSocket.OPEN) {\n reject(new Error('No Studio connection'));\n return;\n }\n\n const msg = createMessage(type, payload);\n\n const timer = setTimeout(() => {\n this.pendingRequests.delete(msg.id);\n reject(new Error(`Request timed out: ${type}`));\n }, timeoutMs);\n\n this.pendingRequests.set(msg.id, {\n resolve: resolve as (msg: WsMessage) => void,\n reject,\n timer,\n });\n\n this.studioClient.ws.send(serializeMessage(msg));\n });\n }\n\n sendNotification(type: string, payload: unknown): void {\n if (!this.studioClient || this.studioClient.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n const msg = createMessage(type, payload);\n this.studioClient.ws.send(serializeMessage(msg));\n }\n\n isConnected(): boolean {\n return this.studioClient !== null && this.studioClient.ws.readyState === WebSocket.OPEN;\n }\n\n getConnectionInfo(): StudioConnection | null {\n return this.studioClient;\n }\n\n getPort(): number {\n return this.port;\n }\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n if (this.studioClient) {\n this.studioClient.ws.close();\n this.studioClient = null;\n }\n for (const ws of this.controllers) {\n ws.close();\n }\n this.controllers.clear();\n for (const [, pending] of this.pendingRequests) {\n clearTimeout(pending.timer);\n pending.reject(new Error('Server shutting down'));\n }\n this.pendingRequests.clear();\n this.relayRequests.clear();\n\n if (this.wss) {\n this.wss.close(() => resolve());\n } else {\n resolve();\n }\n });\n }\n}\n","import { WebSocket } from 'ws';\r\nimport { EventEmitter } from 'node:events';\r\nimport {\r\n parseMessage,\r\n serializeMessage,\r\n createMessage,\r\n StudioMsg,\r\n type WsMessage,\r\n type StudioConnectedPayload,\r\n} from './protocol.js';\r\nimport type { StudioBridge, StudioConnection } from './ws-server.js';\r\n\r\n/**\r\n * Connects as a relay client to an existing DominusServer.\r\n * Has the same interface as DominusServer so the TUI/Agent\r\n * can use either transparently.\r\n */\r\nexport class DominusClient extends EventEmitter implements StudioBridge {\r\n private ws: WebSocket | null = null;\r\n private port: number;\r\n private studioConnected = false;\r\n private connectionInfo: Omit<StudioConnection, 'ws'> | null = null;\r\n private pendingRequests = new Map<\r\n string,\r\n { resolve: (msg: WsMessage) => void; reject: (err: Error) => void; timer: ReturnType<typeof setTimeout> }\r\n >();\r\n\r\n constructor(port = 18088) {\r\n super();\r\n this.port = port;\r\n }\r\n\r\n connect(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const url = `ws://localhost:${this.port}`;\r\n const ws = new WebSocket(url);\r\n\r\n ws.on('open', () => {\r\n this.ws = ws;\r\n ws.send(serializeMessage(createMessage('controller:connect', {})));\r\n this.emit('server:started', { port: this.port, relay: true });\r\n resolve();\r\n });\r\n\r\n ws.on('message', (raw) => {\r\n try {\r\n const msg = parseMessage(raw.toString());\r\n this.handleMessage(msg);\r\n } catch (err) {\r\n this.emit('server:error', err);\r\n }\r\n });\r\n\r\n ws.on('close', () => {\r\n this.ws = null;\r\n this.studioConnected = false;\r\n this.emit('studio:disconnected');\r\n for (const [id, pending] of this.pendingRequests) {\r\n clearTimeout(pending.timer);\r\n pending.reject(new Error('Relay connection lost'));\r\n this.pendingRequests.delete(id);\r\n }\r\n });\r\n\r\n ws.on('error', (err) => {\r\n if (!this.ws) reject(err);\r\n this.emit('server:error', err);\r\n });\r\n });\r\n }\r\n\r\n private handleMessage(msg: WsMessage): void {\r\n if (msg.type === 'controller:welcome') {\r\n const p = msg.payload as { studioConnected: boolean };\r\n this.studioConnected = p.studioConnected;\r\n if (this.studioConnected) {\r\n this.emit('studio:connected', {});\r\n }\r\n return;\r\n }\r\n\r\n if (msg.type === 'studio:connected') {\r\n this.studioConnected = true;\r\n const payload = msg.payload as StudioConnectedPayload;\r\n this.connectionInfo = {\r\n connectedAt: Date.now(),\r\n studioVersion: payload.studioVersion,\r\n placeId: payload.placeId,\r\n placeName: payload.placeName,\r\n };\r\n this.emit('studio:connected', payload);\r\n return;\r\n }\r\n\r\n if (msg.type === 'studio:disconnected') {\r\n this.studioConnected = false;\r\n this.connectionInfo = null;\r\n this.emit('studio:disconnected');\r\n return;\r\n }\r\n\r\n if (msg.type === StudioMsg.RESPONSE) {\r\n const pending = this.pendingRequests.get(msg.id);\r\n if (pending) {\r\n clearTimeout(pending.timer);\r\n pending.resolve(msg);\r\n this.pendingRequests.delete(msg.id);\r\n }\r\n return;\r\n }\r\n\r\n this.emit(msg.type, msg.payload);\r\n this.emit('message', msg);\r\n }\r\n\r\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs = 10000): Promise<WsMessage<T>> {\r\n return new Promise((resolve, reject) => {\r\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\r\n reject(new Error('Not connected to Dominus server'));\r\n return;\r\n }\r\n if (!this.studioConnected) {\r\n reject(new Error('Studio not connected'));\r\n return;\r\n }\r\n\r\n const msg = createMessage(type, payload);\r\n\r\n const timer = setTimeout(() => {\r\n this.pendingRequests.delete(msg.id);\r\n reject(new Error(`Request timed out: ${type}`));\r\n }, timeoutMs);\r\n\r\n this.pendingRequests.set(msg.id, {\r\n resolve: resolve as (msg: WsMessage) => void,\r\n reject,\r\n timer,\r\n });\r\n\r\n this.ws.send(serializeMessage(msg));\r\n });\r\n }\r\n\r\n sendNotification(type: string, payload: unknown): void {\r\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\r\n const msg = createMessage(type, payload);\r\n this.ws.send(serializeMessage(msg));\r\n }\r\n\r\n isConnected(): boolean {\r\n return this.studioConnected;\r\n }\r\n\r\n getConnectionInfo(): StudioConnection | null {\r\n if (!this.connectionInfo) return null;\r\n return { ...this.connectionInfo, ws: this.ws! } as StudioConnection;\r\n }\r\n\r\n getPort(): number {\r\n return this.port;\r\n }\r\n\r\n stop(): Promise<void> {\r\n return new Promise((resolve) => {\r\n for (const [, pending] of this.pendingRequests) {\r\n clearTimeout(pending.timer);\r\n pending.reject(new Error('Client shutting down'));\r\n }\r\n this.pendingRequests.clear();\r\n if (this.ws) {\r\n this.ws.close();\r\n this.ws = null;\r\n }\r\n resolve();\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Check if a Dominus server is already running on the given port.\r\n */\r\nexport async function isPortInUse(port: number): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const ws = new WebSocket(`ws://localhost:${port}`);\r\n const timer = setTimeout(() => {\r\n ws.close();\r\n resolve(false);\r\n }, 1000);\r\n\r\n ws.on('open', () => {\r\n clearTimeout(timer);\r\n ws.close();\r\n resolve(true);\r\n });\r\n\r\n ws.on('error', () => {\r\n clearTimeout(timer);\r\n resolve(false);\r\n });\r\n });\r\n}\r\n","/**\r\n * INTERNAL_MEMORY — lessons learned and quirks that ship with Dominus.\r\n *\r\n * These are baked into every system prompt so the agent doesn't repeat\r\n * known mistakes. Add entries here when you discover a pattern that caused\r\n * a failure, an unintuitive API, or a workaround that should be remembered.\r\n *\r\n * Keep entries short, specific, and actionable. Prefer bullet points over prose.\r\n */\r\n\r\nexport const INTERNAL_MEMORY = `## Internal Memory — Known Quirks & Lessons\r\n\r\nThese are built-in lessons that ship with Dominus. Follow them exactly.\r\n\r\n### create_ui — property format\r\n- Each node accepts properties in **either** of two shapes:\r\n - **Flattened (preferred)**: props as top-level keys next to \\`ClassName\\`, \\`Name\\`, \\`Children\\`.\r\n \\`\\`\\`json\r\n { \"ClassName\": \"TextButton\", \"Name\": \"Btn\", \"Text\": \"OK\", \"Size\": [0, 100, 0, 40] }\r\n \\`\\`\\`\r\n - **Nested bag**: props grouped under \\`properties\\` / \\`Properties\\` / \\`props\\` / \\`Props\\`.\r\n \\`\\`\\`json\r\n { \"ClassName\": \"TextButton\", \"Name\": \"Btn\",\r\n \"properties\": { \"Text\": \"OK\", \"Size\": [0, 100, 0, 40] } }\r\n \\`\\`\\`\r\n- Do NOT mix a nested \\`properties\\` bag with flattened props of the same name — the bag wins.\r\n- Reserved keys (never treated as instance properties): \\`ClassName\\`, \\`className\\`, \\`Name\\`, \\`name\\`, \\`Children\\`, \\`children\\`, \\`properties\\`, \\`Properties\\`, \\`props\\`, \\`Props\\`.\r\n\r\n### build_multiple — schema is strict\r\n- Top-level keys only: \\`name\\`, \\`className\\`, \\`position\\`, \\`size\\`, \\`color\\`, \\`material\\`, \\`anchored\\`, \\`shape\\`, \\`transparency\\`, \\`parent\\`, \\`canCollide\\`.\r\n- Does NOT accept a nested \\`properties\\` bag. For anything outside those fields use \\`insert_instance\\` + \\`set_properties\\`.\r\n- \\`shape\\` values: \\`Block\\`, \\`Ball\\`, \\`Cylinder\\`, \\`Wedge\\`.\r\n\r\n### Color formats (accepted everywhere)\r\n- Hex: \\`\"#RRGGBB\"\\`\r\n- RGB string: \\`\"rgb(255, 128, 0)\"\\`\r\n- BrickColor name: \\`\"Bright red\"\\`, \\`\"Institutional white\"\\`, \\`\"Really black\"\\`, etc.\r\n- Array: \\`[r, g, b]\\` (0–1 floats) or \\`[255, 128, 0]\\` (auto-detected if any value > 1)\r\n\r\n### UDim2 / UDim / Vector2 / Color3 coercion (create_ui)\r\n- UDim2: \\`[xScale, xOffset, yScale, yOffset]\\` or \\`{XScale, XOffset, YScale, YOffset}\\`.\r\n- UDim: \\`[scale, offset]\\` or a plain number (treated as pixels).\r\n- Vector2 (e.g. \\`AnchorPoint\\`): \\`[x, y]\\` or \\`{x, y}\\`.\r\n- 2-element arrays are auto-disambiguated by property name (\\`AnchorPoint\\` → Vector2, \\`CornerRadius\\` → UDim).\r\n\r\n### Common GUI property names\r\n- GUI uses \\`Size\\`/\\`Position\\` as **UDim2** — never Vector3.\r\n- \\`BackgroundColor3\\`, \\`TextColor3\\`, \\`BorderColor3\\`, \\`ImageColor3\\` → Color3.\r\n- \\`Font\\` accepts a string enum name like \\`\"GothamBold\"\\`, \\`\"SourceSans\"\\`.\r\n- Enum properties take the string name: \\`\"Center\"\\`, \\`\"Left\"\\`, \\`\"Fit\"\\`.\r\n\r\n### Tool selection cheat-sheet\r\n- Single 3D part → \\`create_part\\`\r\n- Many 3D parts (tree, building, vehicle) → \\`build_multiple\\` with \\`groupName\\`\r\n- Full UI tree → \\`create_ui\\` (one call, never loop \\`insert_instance\\` for UI)\r\n- **Convert/export existing UI → \\`serialize_ui\\`** (NOT get_descendants_properties)\r\n- Adjusting an existing instance → \\`set_properties\\` (not \\`run_code\\`)\r\n- **Inspecting user's selection → \\`get_selection\\`, then \\`get_properties\\` or \\`serialize_ui\\`**\r\n- **Reading properties → \\`get_properties\\` (NEVER \\`run_code\\` with dump scripts)**\r\n- **Browsing the tree → \\`get_explorer\\`**\r\n- Anything exotic or procedural → \\`run_code\\` as last resort\r\n\r\n### NEVER use run_code for:\r\n- Getting properties of an instance → use \\`get_properties\\` or \\`serialize_ui\\`\r\n- Dumping selection info → use \\`inspect_selection\\` (ONE call does it all)\r\n- Inspecting an instance + its children → use \\`inspect_instance\\`\r\n- Converting UI to Roact/React → use \\`convert_ui_to_code\\`\r\n- Creating instances → use \\`create_part\\`, \\`create_ui\\`, \\`insert_instance\\`, \\`build_multiple\\`\r\n- Modifying properties → use \\`set_properties\\` or \\`bulk_set_properties\\`\r\n- Reading scripts → use \\`read_script\\`\r\n- Browsing the explorer → use \\`get_explorer\\`\r\n\\`run_code\\` is ONLY for procedural logic, terrain generation, raycasts, physics queries, or custom algorithms with no tool equivalent.\r\n\r\n### Composite skill tools (prefer these over chaining)\r\n- \\`inspect_selection\\` — Returns paths + compact properties for all selected instances in ONE call. Use when user says \"my selection\" or \"what I selected\".\r\n- \\`inspect_instance\\` — Returns compact properties + children tree for a single instance in ONE call. Combines get_properties + get_explorer.\r\n- \\`convert_ui_to_code\\` — Serializes a UI tree and generates a Roact/React component. Use when user says \"turn this into a component\" or \"convert to React\".\r\n\r\n### Verification habits\r\n- After a build, call \\`get_explorer\\` or \\`get_selection\\` to confirm the tree looks right.\r\n- After editing a script, read it back.\r\n- After \\`run_code\\`, check \\`get_output\\` for errors.\r\n\r\n### serialize_ui — the RIGHT tool for UI conversion\r\n- **Use \\`serialize_ui\\` when converting existing UI to Roact/React/Fusion components.** It returns a minimal JSON tree with only non-default properties, already in JSON-friendly formats.\r\n- **Do NOT use \\`get_descendants_properties\\` for UI conversion** — it returns a flat list with ~50+ properties per instance (including read-only, deprecated, nil, and default values), which bloats context and confuses conversion.\r\n- \\`serialize_ui\\` output maps 1:1 to \\`create_ui\\` input — you can round-trip UI through it.\r\n- The tree structure preserves parent-child hierarchy, so Roact/React children mapping is direct.\r\n\r\n### UI → Roact/React conversion cheat-sheet\r\n- \\`serialize_ui\\` path → JSON tree → map each node to \\`Roact.createElement(ClassName, props, childrenDict)\\`\r\n- UDim2 arrays \\`[xS, xO, yS, yO]\\` → \\`UDim2.new(xS, xO, yS, yO)\\`\r\n- Color3 hex strings → \\`Color3.fromHex(\"#RRGGBB\")\\`\r\n- Vector2 arrays → \\`Vector2.new(x, y)\\`\r\n- UDim arrays → \\`UDim.new(s, o)\\`\r\n- Enum strings like \\`\"Center\"\\` → \\`Enum.TextXAlignment.Center\\`\r\n- FontFace → \\`Font.new(family, weight, style)\\`\r\n- UI modifiers (UICorner, UIStroke, UIGradient, UIListLayout, UIPadding) are CHILDREN not props\r\n- Use instance Name as dictionary key in children table\r\n`;\r\n","import fs from 'node:fs';\r\nimport initSqlJs from 'sql.js';\r\nimport type { Database, QueryExecResult } from 'sql.js';\r\nimport { getDbPath } from '../config/config.js';\r\nimport type { Fact, FactCategory, SessionSummary, ChatMessage, ScriptEntry } from './types.js';\r\n\r\nlet db: Database | null = null;\r\nlet dbPath: string;\r\n\r\nconst SCHEMA = `\r\nCREATE TABLE IF NOT EXISTS facts (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n content TEXT NOT NULL,\r\n category TEXT NOT NULL,\r\n source TEXT,\r\n relevance REAL DEFAULT 1.0,\r\n created_at INTEGER NOT NULL,\r\n accessed_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS summaries (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n session_id TEXT NOT NULL,\r\n summary TEXT NOT NULL,\r\n created_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS messages (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n session_id TEXT NOT NULL,\r\n role TEXT NOT NULL,\r\n content TEXT NOT NULL,\r\n tool_name TEXT,\r\n created_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS script_index (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n path TEXT NOT NULL,\r\n class_name TEXT NOT NULL,\r\n summary TEXT,\r\n line_count INTEGER,\r\n last_hash TEXT,\r\n updated_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE INDEX IF NOT EXISTS idx_facts_project ON facts(project_id);\r\nCREATE INDEX IF NOT EXISTS idx_facts_category ON facts(project_id, category);\r\nCREATE INDEX IF NOT EXISTS idx_scripts_project ON script_index(project_id);\r\nCREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id);\r\nCREATE INDEX IF NOT EXISTS idx_summaries_project ON summaries(project_id);\r\n`;\r\n\r\nfunction persist(): void {\r\n if (!db) return;\r\n const data = db.export();\r\n fs.writeFileSync(dbPath, Buffer.from(data));\r\n}\r\n\r\nexport async function initMemoryStore(): Promise<void> {\r\n if (db) return;\r\n dbPath = getDbPath();\r\n const SQL = await initSqlJs();\r\n\r\n if (fs.existsSync(dbPath)) {\r\n const buffer = fs.readFileSync(dbPath);\r\n db = new SQL.Database(buffer);\r\n } else {\r\n db = new SQL.Database();\r\n }\r\n\r\n db.run(SCHEMA);\r\n persist();\r\n}\r\n\r\nexport function getDb(): Database {\r\n if (!db) throw new Error('Memory store not initialized. Call initMemoryStore() first.');\r\n return db;\r\n}\r\n\r\nexport function closeMemoryStore(): void {\r\n if (db) {\r\n persist();\r\n db.close();\r\n db = null;\r\n }\r\n}\r\n\r\n// --- Facts ---\r\n\r\nexport function storeFact(fact: Omit<Fact, 'id'>): number {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO facts (project_id, content, category, source, relevance, created_at, accessed_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n fact.projectId,\r\n fact.content,\r\n fact.category,\r\n fact.source ?? null,\r\n fact.relevance,\r\n fact.createdAt,\r\n fact.accessedAt,\r\n ],\r\n );\r\n persist();\r\n const stmt = d.prepare('SELECT last_insert_rowid()');\r\n stmt.step();\r\n const row = stmt.get();\r\n stmt.free();\r\n return (row?.[0] as number) ?? 0;\r\n}\r\n\r\nexport function recallFacts(projectId: string, query: string, limit = 10): Fact[] {\r\n const d = getDb();\r\n const keywords = query\r\n .toLowerCase()\r\n .split(/\\s+/)\r\n .filter((w) => w.length > 2);\r\n\r\n if (keywords.length === 0) {\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? ORDER BY relevance DESC, accessed_at DESC LIMIT ?`,\r\n [projectId, limit],\r\n );\r\n return rowsToFacts(result);\r\n }\r\n\r\n const likeClauses = keywords.map(() => `LOWER(content) LIKE ?`).join(' OR ');\r\n const likeParams = keywords.map((k) => `%${k}%`);\r\n\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? AND (${likeClauses})\r\n ORDER BY relevance DESC, accessed_at DESC LIMIT ?`,\r\n [projectId, ...likeParams, limit],\r\n );\r\n\r\n const facts = rowsToFacts(result);\r\n\r\n // Update accessed_at for recalled facts\r\n for (const fact of facts) {\r\n if (fact.id) {\r\n d.run(`UPDATE facts SET accessed_at = ? WHERE id = ?`, [Date.now(), fact.id]);\r\n }\r\n }\r\n if (facts.length > 0) persist();\r\n\r\n return facts;\r\n}\r\n\r\nexport function getAllFacts(projectId: string): Fact[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? ORDER BY relevance DESC`,\r\n [projectId],\r\n );\r\n return rowsToFacts(result);\r\n}\r\n\r\nfunction rowsToFacts(result: QueryExecResult[]): Fact[] {\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n content: row[2] as string,\r\n category: row[3] as FactCategory,\r\n source: row[4] as string | undefined,\r\n relevance: row[5] as number,\r\n createdAt: row[6] as number,\r\n accessedAt: row[7] as number,\r\n }));\r\n}\r\n\r\n// --- Messages ---\r\n\r\nexport function storeMessage(msg: Omit<ChatMessage, 'id'>): void {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO messages (session_id, role, content, tool_name, created_at)\r\n VALUES (?, ?, ?, ?, ?)`,\r\n [msg.sessionId, msg.role, msg.content, msg.toolName ?? null, msg.createdAt],\r\n );\r\n persist();\r\n}\r\n\r\nexport function getSessionMessages(sessionId: string, limit = 100): ChatMessage[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM messages WHERE session_id = ? ORDER BY created_at ASC LIMIT ?`,\r\n [sessionId, limit],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n sessionId: row[1] as string,\r\n role: row[2] as ChatMessage['role'],\r\n content: row[3] as string,\r\n toolName: (row[4] as string) || undefined,\r\n createdAt: row[5] as number,\r\n }));\r\n}\r\n\r\n// --- Summaries ---\r\n\r\nexport function storeSummary(summary: Omit<SessionSummary, 'id'>): void {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO summaries (project_id, session_id, summary, created_at)\r\n VALUES (?, ?, ?, ?)`,\r\n [summary.projectId, summary.sessionId, summary.summary, summary.createdAt],\r\n );\r\n persist();\r\n}\r\n\r\nexport function getProjectSummaries(projectId: string, limit = 20): SessionSummary[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM summaries WHERE project_id = ? ORDER BY created_at DESC LIMIT ?`,\r\n [projectId, limit],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n sessionId: row[2] as string,\r\n summary: row[3] as string,\r\n createdAt: row[4] as number,\r\n }));\r\n}\r\n\r\n// --- Script Index ---\r\n\r\nexport function upsertScript(entry: Omit<ScriptEntry, 'id'>): void {\r\n const d = getDb();\r\n const existing = d.exec(\r\n `SELECT id FROM script_index WHERE project_id = ? AND path = ?`,\r\n [entry.projectId, entry.path],\r\n );\r\n\r\n if (existing[0]?.values.length) {\r\n d.run(\r\n `UPDATE script_index SET class_name = ?, summary = ?, line_count = ?, last_hash = ?, updated_at = ?\r\n WHERE project_id = ? AND path = ?`,\r\n [\r\n entry.className,\r\n entry.summary ?? null,\r\n entry.lineCount ?? null,\r\n entry.lastHash ?? null,\r\n entry.updatedAt,\r\n entry.projectId,\r\n entry.path,\r\n ],\r\n );\r\n } else {\r\n d.run(\r\n `INSERT INTO script_index (project_id, path, class_name, summary, line_count, last_hash, updated_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n entry.projectId,\r\n entry.path,\r\n entry.className,\r\n entry.summary ?? null,\r\n entry.lineCount ?? null,\r\n entry.lastHash ?? null,\r\n entry.updatedAt,\r\n ],\r\n );\r\n }\r\n persist();\r\n}\r\n\r\nexport function getScriptIndex(\r\n projectId: string,\r\n): { path: string; summary?: string; className: string }[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT path, summary, class_name FROM script_index WHERE project_id = ? ORDER BY path`,\r\n [projectId],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n path: row[0] as string,\r\n summary: (row[1] as string) || undefined,\r\n className: row[2] as string,\r\n }));\r\n}\r\n\r\nexport function getScriptEntry(projectId: string, scriptPath: string): ScriptEntry | null {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM script_index WHERE project_id = ? AND path = ?`,\r\n [projectId, scriptPath],\r\n );\r\n if (!result[0]?.values.length) return null;\r\n const row = result[0].values[0];\r\n return {\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n path: row[2] as string,\r\n className: row[3] as string,\r\n summary: (row[4] as string) || undefined,\r\n lineCount: (row[5] as number) || undefined,\r\n lastHash: (row[6] as string) || undefined,\r\n updatedAt: row[7] as number,\r\n };\r\n}\r\n\r\n// --- Decay ---\r\n\r\nexport function decayRelevance(projectId: string, factor = 0.95): void {\r\n const d = getDb();\r\n d.run(`UPDATE facts SET relevance = relevance * ? WHERE project_id = ?`, [factor, projectId]);\r\n persist();\r\n}\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { ScriptContentPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'read_script',\r\n description:\r\n 'Read the source code of a script in Roblox Studio. Provide the full instance path (e.g., \"ServerScriptService.GameManager\").',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path of the script (e.g., \"ServerScriptService.GameManager\")',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const path = params.path as string;\r\n const response = await ctx.sendToStudio<ScriptContentPayload>(CliMsg.GET_SCRIPT, { path });\r\n\r\n if (!response.payload) {\r\n return { success: false, error: `Script not found: ${path}` };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n path: response.payload.path,\r\n className: response.payload.className,\r\n source: response.payload.source,\r\n lineCount: response.payload.lineCount,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'edit_script',\r\n description:\r\n 'Replace the entire source code of a script in Roblox Studio. Provide the full path and the new source code.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path of the script',\r\n },\r\n source: {\r\n type: 'string',\r\n description: 'The new complete source code for the script',\r\n },\r\n },\r\n required: ['path', 'source'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const path = params.path as string;\r\n const source = params.source as string;\r\n\r\n const response = await ctx.sendToStudio(CliMsg.SET_SCRIPT, { path, source });\r\n const payload = response.payload as { success: boolean; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to edit script' };\r\n }\r\n\r\n return { success: true, data: { path, linesWritten: source.split('\\n').length } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { RunCodeResponsePayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'run_code',\r\n description:\r\n 'Execute arbitrary Luau code in Roblox Studio and return the output. The code runs in the Studio plugin context with full API access.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n code: {\r\n type: 'string',\r\n description: 'Luau code to execute in Studio',\r\n },\r\n },\r\n required: ['code'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const code = params.code as string;\r\n const response = await ctx.sendToStudio<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n const payload = response.payload;\r\n\r\n if (payload.error) {\r\n return { success: false, error: payload.error, data: { output: payload.output } };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { output: payload.output, duration: payload.duration },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_explorer',\r\n description:\r\n 'Get the DataModel explorer tree from Roblox Studio. Optionally filter by a root path and max depth.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n rootPath: {\r\n type: 'string',\r\n description: 'Root path to start from (e.g., \"ServerScriptService\"). Omit for entire tree.',\r\n },\r\n maxDepth: {\r\n type: 'number',\r\n description: 'Maximum depth of the tree (default: 3)',\r\n default: 3,\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ tree: ExplorerNode[] }>(CliMsg.GET_EXPLORER, {\r\n rootPath: params.rootPath ?? null,\r\n maxDepth: params.maxDepth ?? 3,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { PropertyEntry } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_properties',\r\n description: 'Get all properties of a single instance in Roblox Studio. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties. For inspecting UI trees, prefer serialize_ui or get_descendants_properties.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path (e.g., \"Workspace.Part\")',\r\n },\r\n compact: {\r\n type: 'boolean',\r\n description: 'Strip read-only, nil, deprecated, and default-valued properties (default true). Set false for full dump.',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const compact = params.compact !== false;\r\n\r\n const response = await ctx.sendToStudio<{ properties: PropertyEntry[] }>(\r\n CliMsg.GET_PROPERTIES,\r\n { path: params.path, compact },\r\n );\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_descendants_properties',\r\n description: 'Easily get all descendants of a UI instance (or any instance) and all of their properties. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties to keep responses small.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path (e.g., \"Workspace.Part\", \"StarterGui.ScreenGui\")',\r\n },\r\n compact: {\r\n type: 'boolean',\r\n description: 'When true (default), strips read-only, nil, deprecated, and default-valued properties to massively reduce response size. Set to false for full property dump.',\r\n },\r\n outputFile: {\r\n type: 'string',\r\n description: 'Optional file path to write the JSON result to, useful for very large trees where context limits apply.',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const compact = params.compact !== false; // default true\r\n\r\n const response = await ctx.sendToStudio<{ success: boolean; descendants?: unknown }>(\r\n CliMsg.GET_DESCENDANTS_PROPERTIES,\r\n { path: params.path, compact },\r\n 1000 * 60 * 5, // 5 minute timeout since getting ALL descendants can take a very long time\r\n );\r\n\r\n if (params.outputFile && typeof params.outputFile === 'string') {\r\n const fs = await import('fs/promises');\r\n const path = await import('path');\r\n const outputPath = path.resolve(process.cwd(), params.outputFile);\r\n await fs.writeFile(outputPath, JSON.stringify(response.payload, null, 2), 'utf-8');\r\n return { success: true, data: `Successfully saved descendants to ${outputPath}` };\r\n }\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'set_properties',\r\n description: 'Set properties on an instance in Roblox Studio.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path (e.g., \"Workspace.Part\")',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Key-value pairs of properties to set (e.g., {\"Name\": \"MyPart\", \"BrickColor\": \"Bright red\"})',\r\n },\r\n },\r\n required: ['path', 'properties'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.SET_PROPERTIES, {\r\n path: params.path,\r\n properties: params.properties,\r\n });\r\n\r\n const payload = response.payload as { success: boolean; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to set properties' };\r\n }\r\n\r\n return { success: true, data: { path: params.path, updated: Object.keys(params.properties as object) } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'insert_instance',\r\n description: 'Insert a new instance into the Roblox Studio DataModel.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n className: {\r\n type: 'string',\r\n description: 'Class name of the instance to create (e.g., \"Part\", \"Script\", \"ModuleScript\")',\r\n },\r\n parentPath: {\r\n type: 'string',\r\n description: 'Full path of the parent instance (e.g., \"Workspace\", \"ServerScriptService\")',\r\n },\r\n name: {\r\n type: 'string',\r\n description: 'Name for the new instance',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Optional properties to set on the new instance',\r\n },\r\n },\r\n required: ['className', 'parentPath', 'name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.INSERT_INSTANCE, {\r\n className: params.className,\r\n parentPath: params.parentPath,\r\n name: params.name,\r\n properties: params.properties ?? {},\r\n });\r\n\r\n const payload = response.payload as { success: boolean; path?: string; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to insert instance' };\r\n }\r\n\r\n return { success: true, data: { path: payload.path } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'delete_instance',\r\n description: 'Delete an instance from the Roblox Studio DataModel by path.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path to delete (e.g., \"Workspace.OldPart\")',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.DELETE_INSTANCE, { path: params.path });\r\n const payload = response.payload as { success: boolean; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to delete instance' };\r\n }\r\n\r\n return { success: true, data: { deleted: params.path } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { OutputPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_output',\r\n description: 'Get recent output log entries from Roblox Studio (prints, warnings, errors).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n limit: {\r\n type: 'number',\r\n description: 'Maximum number of log entries to return (default: 50)',\r\n default: 50,\r\n },\r\n level: {\r\n type: 'string',\r\n description: 'Filter by log level',\r\n enum: ['info', 'warn', 'error'],\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ entries: OutputPayload[] }>(CliMsg.GET_OUTPUT, {\r\n limit: params.limit ?? 50,\r\n level: params.level ?? null,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { SelectionPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_selection',\r\n description: 'Get the currently selected instances in Roblox Studio.',\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n\r\n async execute(_params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { SearchResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'search_scripts',\r\n description:\r\n 'Search across all scripts in Roblox Studio for a text pattern. Returns matching lines with context.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n query: {\r\n type: 'string',\r\n description: 'Text or pattern to search for in script sources',\r\n },\r\n maxResults: {\r\n type: 'number',\r\n description: 'Maximum number of script results (default: 20)',\r\n default: 20,\r\n },\r\n },\r\n required: ['query'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<SearchResultPayload>(CliMsg.SEARCH_SCRIPTS, {\r\n query: params.query,\r\n maxResults: params.maxResults ?? 20,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { TestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'run_tests',\r\n description:\r\n 'Run tests in Roblox Studio using StudioTestService. Can run all tests or a specific test by name.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n testName: {\r\n type: 'string',\r\n description: 'Specific test name to run. Omit to run all tests.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ results: TestResultPayload[] }>(CliMsg.RUN_TESTS, {\r\n testName: params.testName ?? null,\r\n });\r\n\r\n const results = response.payload.results ?? [];\r\n const passed = results.filter((r) => r.passed).length;\r\n const failed = results.filter((r) => !r.passed).length;\r\n\r\n return {\r\n success: failed === 0,\r\n data: { total: results.length, passed, failed, results },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_class_info',\r\n description:\r\n 'Look up the full schema of a Roblox class using ReflectionService. ' +\r\n 'Returns all properties (with their types), methods (with parameters), and events. ' +\r\n 'ALWAYS call this before creating or modifying GUI/UI elements (Frame, TextLabel, ImageLabel, etc.) ' +\r\n 'to know the correct property names and expected types (e.g., Size is UDim2 for GUI, Vector3 for Parts).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n className: {\r\n type: 'string',\r\n description: 'Roblox class name, e.g. \"Frame\", \"TextLabel\", \"Part\", \"MeshPart\", \"Camera\"',\r\n },\r\n },\r\n required: ['className'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n className: string;\r\n properties: { name: string; type: string; category?: string; owner?: string }[];\r\n methods: { name: string; parameters: { name: string; type: string }[]; owner?: string }[];\r\n events: { name: string; parameters: { name: string; type: string }[]; owner?: string }[];\r\n superclass?: string;\r\n creatable?: boolean;\r\n error?: string;\r\n }>(CliMsg.GET_REFLECTION, { className: params.className });\r\n\r\n const payload = response.payload;\r\n if (payload.error) {\r\n return { success: false, error: payload.error };\r\n }\r\n\r\n return { success: true, data: payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'create_ui',\r\n description:\r\n 'Create an entire UI tree in Roblox Studio in a SINGLE call. ' +\r\n 'Pass a declarative JSON tree with ClassName, Name, properties, and Children. ' +\r\n 'All types are auto-coerced natively in Luau — UDim2, Color3, Font, enums all work. ' +\r\n 'This is 10x faster than run_code for UI because it handles everything in one round-trip ' +\r\n 'with no Luau syntax issues. Replaces any existing instance with the same name.\\n\\n' +\r\n 'Example: create a pastel hello world screen:\\n' +\r\n '{\\n' +\r\n ' \"parent\": \"StarterGui\",\\n' +\r\n ' \"tree\": {\\n' +\r\n ' \"ClassName\": \"ScreenGui\",\\n' +\r\n ' \"Name\": \"HelloWorld\",\\n' +\r\n ' \"ResetOnSpawn\": false,\\n' +\r\n ' \"Children\": [{\\n' +\r\n ' \"ClassName\": \"Frame\",\\n' +\r\n ' \"Name\": \"Background\",\\n' +\r\n ' \"Size\": [1, 0, 1, 0],\\n' +\r\n ' \"BackgroundColor3\": \"#F0E6FF\",\\n' +\r\n ' \"Children\": [\\n' +\r\n ' { \"ClassName\": \"UICorner\", \"CornerRadius\": [0, 12] },\\n' +\r\n ' { \"ClassName\": \"TextLabel\", \"Name\": \"Title\", \"Text\": \"Hello World!\",\\n' +\r\n ' \"Size\": [0.5, 0, 0.1, 0], \"Position\": [0.25, 0, 0.45, 0],\\n' +\r\n ' \"BackgroundTransparency\": 1, \"TextColor3\": \"#6C5CE7\",\\n' +\r\n ' \"TextScaled\": true, \"Font\": \"GothamBold\" }\\n' +\r\n ' ]\\n' +\r\n ' }]\\n' +\r\n ' }\\n' +\r\n '}',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n parent: {\r\n type: 'string',\r\n description: 'Parent path: \"StarterGui\", \"PlayerGui\", or any instance path. Default: StarterGui',\r\n },\r\n tree: {\r\n type: 'object',\r\n description:\r\n 'The root UI node. Each node has: ClassName (string), Name (string), ' +\r\n 'Children (array of child nodes), and properties. Properties may be ' +\r\n 'specified either flattened at the top level of the node, OR nested ' +\r\n 'under a \"properties\" / \"Properties\" / \"props\" key — both work. ' +\r\n 'Property values are auto-coerced:\\n' +\r\n ' UDim2: [xScale, xOffset, yScale, yOffset] or {XScale, XOffset, YScale, YOffset}\\n' +\r\n ' Color3: \"#hex\", \"rgb(r,g,b)\", [r,g,b], or BrickColor name\\n' +\r\n ' UDim: [scale, offset] or number\\n' +\r\n ' Vector2: [x, y] or {x, y} (auto-disambiguated from UDim by property name)\\n' +\r\n ' NumberRange: [min, max] or number\\n' +\r\n ' Rect: [minX, minY, maxX, maxY] or {MinX, MinY, MaxX, MaxY}\\n' +\r\n ' Font: \"GothamBold\", \"SourceSans\", etc. (Enum.Font names)\\n' +\r\n ' Enums: string name like \"Center\", \"Left\", \"Fit\"\\n' +\r\n ' FontFace: {Family, Weight, Style}\\n' +\r\n ' 2-element arrays are auto-disambiguated: AnchorPoint→Vector2, CornerRadius/Padding→UDim, etc.',\r\n },\r\n animate: {\r\n type: 'boolean',\r\n description: 'If true, task.wait() will be injected between creation of nodes so that the UI writes out dynamically.',\r\n },\r\n },\r\n required: ['tree'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n path?: string;\r\n instanceCount?: number;\r\n error?: string;\r\n }>(CliMsg.BUILD_UI, {\r\n parent: params.parent ?? 'StarterGui',\r\n animate: params.animate,\r\n tree: params.tree,\r\n });\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'UI build failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { path: payload.path, instanceCount: payload.instanceCount },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { StudioTestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'execute_run_test',\r\n description:\r\n 'Start a Run mode test session in Roblox Studio using StudioTestService:ExecuteRunModeAsync(). ' +\r\n 'Passes args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until the session ends (via EndTest or manual stop). ' +\r\n 'Returns the value passed to EndTest(). ' +\r\n 'Use this for headless automated tests — no player character, just server scripts running.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n args: {\r\n description:\r\n 'Arguments to pass to the test session. Server scripts retrieve this with StudioTestService:GetTestArgs(). ' +\r\n 'Can be a string (e.g. test suite name), table, or any serializable value.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<StudioTestResultPayload>(\r\n CliMsg.EXECUTE_RUN_TEST,\r\n { args: params.args ?? null },\r\n 120_000,\r\n );\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Run mode test failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n result: payload.result,\r\n duration: payload.duration,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { StudioTestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'execute_play_test',\r\n description:\r\n 'Start a solo Play mode test session in Roblox Studio using StudioTestService:ExecutePlayModeAsync(). ' +\r\n 'Passes args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until the session ends (via EndTest or manual stop). ' +\r\n 'Returns the value passed to EndTest(). ' +\r\n 'Use this for tests that need a player character and full client-server simulation.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n args: {\r\n description:\r\n 'Arguments to pass to the test session. Server scripts retrieve this with StudioTestService:GetTestArgs(). ' +\r\n 'Can be a string (e.g. test suite name), table, or any serializable value.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<StudioTestResultPayload>(\r\n CliMsg.EXECUTE_PLAY_TEST,\r\n { args: params.args ?? null },\r\n 120_000,\r\n );\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Play mode test failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n result: payload.result,\r\n duration: payload.duration,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'create_part',\r\n description:\r\n 'Create a Part in Roblox Studio with position, size, color, material and more — all in one call. Much faster than insert_instance + set_properties separately.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n name: { type: 'string', description: 'Name for the part' },\r\n parent: {\r\n type: 'string',\r\n description: 'Parent path (default: \"Workspace\")',\r\n },\r\n shape: {\r\n type: 'string',\r\n enum: ['Block', 'Ball', 'Cylinder', 'Wedge', 'CornerWedge'],\r\n description: 'Part shape (default: Block)',\r\n },\r\n position: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'World position {x, y, z}',\r\n },\r\n size: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'Size in studs {x, y, z} (default: {4, 1, 2})',\r\n },\r\n color: {\r\n type: 'string',\r\n description: 'Color as hex \"#FF0000\", BrickColor name \"Bright red\", or RGB \"rgb(255,0,0)\"',\r\n },\r\n material: {\r\n type: 'string',\r\n description: 'Material name: Plastic, Wood, Grass, Ice, Metal, Concrete, Sand, Neon, Glass, etc.',\r\n },\r\n transparency: { type: 'number', description: '0 (opaque) to 1 (invisible)' },\r\n anchored: { type: 'boolean', description: 'Whether the part is anchored (default: true)' },\r\n canCollide: { type: 'boolean', description: 'Whether the part has collision' },\r\n },\r\n required: ['name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const parent = (params.parent as string) || 'Workspace';\r\n const name = params.name as string;\r\n const pos = params.position as { x?: number; y?: number; z?: number } | undefined;\r\n const size = params.size as { x?: number; y?: number; z?: number } | undefined;\r\n\r\n const properties: Record<string, unknown> = {};\r\n\r\n if (pos) properties.Position = { X: pos.x ?? 0, Y: pos.y ?? 0, Z: pos.z ?? 0 };\r\n if (size) properties.Size = { X: size.x ?? 4, Y: size.y ?? 1, Z: size.z ?? 2 };\r\n if (params.color) {\r\n const c = params.color as string;\r\n if (c.startsWith('#')) {\r\n properties.Color = c;\r\n } else if (c.startsWith('rgb')) {\r\n const m = c.match(/(\\d+)/g);\r\n if (m && m.length >= 3) {\r\n properties.Color = { red: parseInt(m[0]), green: parseInt(m[1]), blue: parseInt(m[2]) };\r\n }\r\n } else {\r\n properties.BrickColor = c;\r\n }\r\n }\r\n if (params.material) properties.Material = params.material;\r\n if (params.transparency !== undefined) properties.Transparency = params.transparency;\r\n if (params.anchored !== undefined) properties.Anchored = params.anchored;\r\n else properties.Anchored = true;\r\n if (params.canCollide !== undefined) properties.CanCollide = params.canCollide;\r\n if (params.shape && params.shape !== 'Block') properties.Shape = params.shape;\r\n\r\n const className = (params.shape === 'Wedge') ? 'WedgePart'\r\n : (params.shape === 'CornerWedge') ? 'CornerWedgePart'\r\n : 'Part';\r\n\r\n const res = await ctx.sendToStudio(CliMsg.INSERT_INSTANCE, {\r\n className,\r\n parentPath: parent,\r\n name,\r\n properties,\r\n });\r\n\r\n const payload = res.payload as { success: boolean; path?: string; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to create part' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { path: payload.path, properties: Object.keys(properties) },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'clone_instance',\r\n description:\r\n 'Clone an existing instance in Roblox Studio and optionally reposition/rename it. Great for duplicating parts, models, or entire trees.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: { type: 'string', description: 'Path of instance to clone' },\r\n newName: { type: 'string', description: 'Name for the clone (optional)' },\r\n newParent: { type: 'string', description: 'Parent path for the clone (optional, defaults to same parent)' },\r\n offset: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'Position offset from original {x, y, z}',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const code = buildCloneCode(params);\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to clone' };\r\n }\r\n\r\n return { success: true, data: { output: payload.output } };\r\n },\r\n};\r\n\r\nfunction buildCloneCode(params: Record<string, unknown>): string {\r\n const path = params.path as string;\r\n const parts = path.split('.');\r\n let resolve = 'game';\r\n for (const p of parts) {\r\n resolve += `[\"${p}\"]`;\r\n }\r\n\r\n const lines = [\r\n `local orig = ${resolve}`,\r\n `local clone = orig:Clone()`,\r\n ];\r\n\r\n if (params.newName) {\r\n lines.push(`clone.Name = \"${params.newName}\"`);\r\n }\r\n\r\n if (params.newParent) {\r\n const parentParts = (params.newParent as string).split('.');\r\n let parentResolve = 'game';\r\n for (const p of parentParts) {\r\n parentResolve += `[\"${p}\"]`;\r\n }\r\n lines.push(`clone.Parent = ${parentResolve}`);\r\n } else {\r\n lines.push(`clone.Parent = orig.Parent`);\r\n }\r\n\r\n const offset = params.offset as { x?: number; y?: number; z?: number } | undefined;\r\n if (offset) {\r\n lines.push(`if clone:IsA(\"BasePart\") then`);\r\n lines.push(` clone.Position = clone.Position + Vector3.new(${offset.x ?? 0}, ${offset.y ?? 0}, ${offset.z ?? 0})`);\r\n lines.push(`end`);\r\n }\r\n\r\n lines.push(`print(\"Cloned: \" .. clone:GetFullName())`);\r\n return lines.join('\\n');\r\n}\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'group_instances',\r\n description:\r\n 'Group multiple instances under a new Model or Folder. Useful for organizing parts into objects (e.g., grouping trunk + leaves into a \"Tree\" model).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n paths: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of instance paths to group together',\r\n },\r\n groupName: { type: 'string', description: 'Name for the new group' },\r\n groupClass: {\r\n type: 'string',\r\n enum: ['Model', 'Folder'],\r\n description: 'Class for the group container (default: Model)',\r\n },\r\n parent: { type: 'string', description: 'Parent path (default: Workspace)' },\r\n },\r\n required: ['paths', 'groupName'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const paths = params.paths as string[];\r\n const groupName = params.groupName as string;\r\n const groupClass = (params.groupClass as string) || 'Model';\r\n const parent = (params.parent as string) || 'Workspace';\r\n\r\n const resolves = paths.map((p) => {\r\n const parts = p.split('.');\r\n let r = 'game';\r\n for (const part of parts) r += `[\"${part}\"]`;\r\n return r;\r\n });\r\n\r\n const parentParts = parent.split('.');\r\n let parentResolve = 'game';\r\n for (const p of parentParts) parentResolve += `[\"${p}\"]`;\r\n\r\n const code = [\r\n `local group = Instance.new(\"${groupClass}\")`,\r\n `group.Name = \"${groupName}\"`,\r\n `group.Parent = ${parentResolve}`,\r\n ...resolves.map((r) => `${r}.Parent = group`),\r\n groupClass === 'Model' ? `if group:IsA(\"Model\") then group:MoveTo(group:GetBoundingBox().Position) end` : '',\r\n `print(\"Grouped ${paths.length} instances into: \" .. group:GetFullName())`,\r\n ].filter(Boolean).join('\\n');\r\n\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to group' };\r\n }\r\n\r\n return { success: true, data: { groupPath: `${parent}.${groupName}`, count: paths.length } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\ninterface PartSpec {\r\n name: string;\r\n className?: string;\r\n parent?: string;\r\n position?: { x: number; y: number; z: number };\r\n size?: { x: number; y: number; z: number };\r\n color?: string;\r\n material?: string;\r\n transparency?: number;\r\n anchored?: boolean;\r\n shape?: string;\r\n}\r\n\r\nexport const tool: Tool = {\r\n name: 'build_multiple',\r\n description:\r\n 'Create multiple parts/instances in one batch call. Send an array of specs and they all get created in a single Studio round-trip. Ideal for building trees, houses, vehicles, terrain — anything composed of multiple parts.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n parts: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n properties: {\r\n name: { type: 'string', description: 'Part name' },\r\n className: { type: 'string', description: 'ClassName (default: Part)' },\r\n parent: { type: 'string', description: 'Parent path (default: Workspace)' },\r\n position: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n },\r\n size: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n },\r\n color: { type: 'string', description: 'Hex \"#RRGGBB\" or BrickColor name' },\r\n material: { type: 'string' },\r\n transparency: { type: 'number' },\r\n anchored: { type: 'boolean' },\r\n shape: { type: 'string', enum: ['Block', 'Ball', 'Cylinder', 'Wedge'] },\r\n },\r\n required: ['name'],\r\n },\r\n description: 'Array of part specifications',\r\n },\r\n groupName: {\r\n type: 'string',\r\n description: 'Optional: group all parts under a Model with this name',\r\n },\r\n groupParent: {\r\n type: 'string',\r\n description: 'Parent for the group Model (default: Workspace)',\r\n },\r\n },\r\n required: ['parts'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const parts = params.parts as PartSpec[];\r\n const groupName = params.groupName as string | undefined;\r\n const groupParent = (params.groupParent as string) || 'Workspace';\r\n\r\n const code = generateBatchCode(parts, groupName, groupParent);\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Batch build failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n count: parts.length,\r\n group: groupName ?? null,\r\n output: payload.output,\r\n },\r\n };\r\n },\r\n};\r\n\r\nfunction generateBatchCode(parts: PartSpec[], groupName?: string, groupParent?: string): string {\r\n const lines: string[] = [];\r\n\r\n function resolveParent(path: string): string {\r\n const segs = path.split('.');\r\n let r = 'game';\r\n for (const s of segs) r += `[\"${s}\"]`;\r\n return r;\r\n }\r\n\r\n if (groupName) {\r\n const gp = resolveParent(groupParent || 'Workspace');\r\n lines.push(`local _group = Instance.new(\"Model\")`);\r\n lines.push(`_group.Name = \"${groupName}\"`);\r\n lines.push(`_group.Parent = ${gp}`);\r\n }\r\n\r\n for (let i = 0; i < parts.length; i++) {\r\n const p = parts[i];\r\n const varName = `_p${i}`;\r\n const cn = p.className || (p.shape === 'Wedge' ? 'WedgePart' : 'Part');\r\n\r\n lines.push(`local ${varName} = Instance.new(\"${cn}\")`);\r\n lines.push(`${varName}.Name = \"${p.name}\"`);\r\n\r\n if (p.position) {\r\n lines.push(`${varName}.Position = Vector3.new(${p.position.x ?? 0}, ${p.position.y ?? 0}, ${p.position.z ?? 0})`);\r\n }\r\n if (p.size) {\r\n lines.push(`${varName}.Size = Vector3.new(${p.size.x ?? 4}, ${p.size.y ?? 1}, ${p.size.z ?? 2})`);\r\n }\r\n if (p.color) {\r\n if (p.color.startsWith('#')) {\r\n lines.push(`${varName}.Color = Color3.fromHex(\"${p.color}\")`);\r\n } else {\r\n lines.push(`${varName}.BrickColor = BrickColor.new(\"${p.color}\")`);\r\n }\r\n }\r\n if (p.material) {\r\n lines.push(`${varName}.Material = Enum.Material.${p.material}`);\r\n }\r\n if (p.transparency !== undefined) {\r\n lines.push(`${varName}.Transparency = ${p.transparency}`);\r\n }\r\n if (p.anchored !== undefined) {\r\n lines.push(`${varName}.Anchored = ${p.anchored}`);\r\n } else {\r\n lines.push(`${varName}.Anchored = true`);\r\n }\r\n if (p.shape && p.shape !== 'Block' && cn === 'Part') {\r\n lines.push(`${varName}.Shape = Enum.PartType.${p.shape}`);\r\n }\r\n\r\n if (groupName) {\r\n lines.push(`${varName}.Parent = _group`);\r\n } else {\r\n const parent = p.parent || 'Workspace';\r\n lines.push(`${varName}.Parent = ${resolveParent(parent)}`);\r\n }\r\n }\r\n\r\n lines.push(`print(\"Built ${parts.length} parts${groupName ? ` in ${groupName}` : ''}\")`);\r\n return lines.join('\\n');\r\n}\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'serialize_ui',\r\n description:\r\n 'Serialize an existing UI tree from Roblox Studio into create_ui-compatible JSON. ' +\r\n 'This is the reverse of create_ui — read any instance and get back a declarative JSON tree ' +\r\n 'you can modify and pass back to create_ui. Perfect for cloning, templating, or refactoring UIs.\\n\\n' +\r\n 'The output includes ClassName, Name, all non-default properties (with values converted to ' +\r\n 'JSON-friendly formats like [r,g,b] for Color3, [xS,xO,yS,yO] for UDim2, etc.), and Children.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Instance path to serialize (e.g. \"StarterGui.MyScreenGui\")',\r\n },\r\n maxDepth: {\r\n type: 'number',\r\n description: 'Maximum depth to serialize (default: 50)',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n tree?: unknown;\r\n error?: string;\r\n }>(CliMsg.SERIALIZE_UI, {\r\n path: params.path,\r\n maxDepth: params.maxDepth ?? 50,\r\n }, 1000 * 60 * 2);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Serialization failed' };\r\n }\r\n\r\n return { success: true, data: payload.tree };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'move_instance',\r\n description:\r\n 'Move (reparent) an instance to a new parent in Roblox Studio. ' +\r\n 'This preserves the instance and all its descendants — much better than delete + recreate. ' +\r\n 'Sets a ChangeHistoryService waypoint so the move can be undone.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full path of the instance to move (e.g. \"Workspace.OldFolder.MyPart\")',\r\n },\r\n newParent: {\r\n type: 'string',\r\n description: 'Full path of the new parent (e.g. \"Workspace.NewFolder\")',\r\n },\r\n },\r\n required: ['path', 'newParent'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n newPath?: string;\r\n error?: string;\r\n }>(CliMsg.MOVE_INSTANCE, {\r\n path: params.path,\r\n newParent: params.newParent,\r\n });\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Move failed' };\r\n }\r\n\r\n return { success: true, data: { newPath: payload.newPath } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'bulk_set_properties',\r\n description:\r\n 'Set properties on multiple instances at once in a single call. ' +\r\n 'Much faster than calling set_properties repeatedly. Supports two modes:\\n' +\r\n '1. Explicit paths: provide an array of {path, properties} objects\\n' +\r\n '2. By class filter: provide a root path, className filter, and properties to apply to all matches\\n\\n' +\r\n 'Example (explicit): [{\"path\": \"StarterGui.HUD.Title\", \"properties\": {\"TextColor3\": \"#fff\"}}, ...]\\n' +\r\n 'Example (filter): root=\"StarterGui.HUD\", className=\"TextLabel\", properties={\"Font\": \"GothamBold\"}',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n targets: {\r\n type: 'array',\r\n description: 'Array of {path, properties} objects for explicit mode.',\r\n items: {\r\n type: 'object',\r\n description: 'A target with path and properties to set.',\r\n },\r\n },\r\n root: {\r\n type: 'string',\r\n description: 'Root instance path to search under (filter mode)',\r\n },\r\n className: {\r\n type: 'string',\r\n description: 'Only apply to instances of this ClassName (filter mode)',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Properties to set on all matched instances (filter mode)',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n modified?: number;\r\n errors?: string[];\r\n error?: string;\r\n }>(CliMsg.BULK_SET_PROPERTIES, {\r\n targets: params.targets,\r\n root: params.root,\r\n className: params.className,\r\n properties: params.properties,\r\n }, 1000 * 60);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Bulk set failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n modified: payload.modified,\r\n errors: payload.errors?.length ? payload.errors : undefined,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'find_replace_scripts',\r\n description:\r\n 'Find and replace text across all scripts in the game (or under a root path). ' +\r\n 'Supports plain text and Lua pattern matching. Returns a list of modified scripts with match counts.\\n\\n' +\r\n 'Use dryRun=true to preview changes without applying them.\\n' +\r\n 'Example: find=\"workspace\" replace=\"Workspace\" root=\"ServerScriptService\"',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n find: {\r\n type: 'string',\r\n description: 'Text or Lua pattern to search for',\r\n },\r\n replace: {\r\n type: 'string',\r\n description: 'Replacement text (supports Lua pattern captures like %1, %2)',\r\n },\r\n root: {\r\n type: 'string',\r\n description: 'Root path to limit search scope (optional, searches entire game if omitted)',\r\n },\r\n usePattern: {\r\n type: 'boolean',\r\n description: 'If true, treat find/replace as Lua patterns. Default: false (plain text)',\r\n },\r\n dryRun: {\r\n type: 'boolean',\r\n description: 'If true, report matches but do not modify scripts. Default: false',\r\n },\r\n },\r\n required: ['find', 'replace'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n modified?: { path: string; matches: number }[];\r\n totalMatches?: number;\r\n totalFiles?: number;\r\n error?: string;\r\n }>(CliMsg.FIND_REPLACE_SCRIPTS, {\r\n find: params.find,\r\n replace: params.replace,\r\n root: params.root,\r\n usePattern: params.usePattern ?? false,\r\n dryRun: params.dryRun ?? false,\r\n }, 1000 * 60 * 5);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Find/replace failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n totalFiles: payload.totalFiles,\r\n totalMatches: payload.totalMatches,\r\n modified: payload.modified,\r\n dryRun: params.dryRun ?? false,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolResult } from '../types.js';\r\nimport { recallFacts, getProjectSummaries } from '../../memory/store.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'recall_memory',\r\n description:\r\n 'Search your memory for previously learned facts about the current project. Use this to recall architecture decisions, patterns, known bugs, or user preferences.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n query: {\r\n type: 'string',\r\n description: 'What to search for in memory (e.g., \"player data storage\", \"combat system architecture\")',\r\n },\r\n limit: {\r\n type: 'number',\r\n description: 'Max number of facts to return (default: 10)',\r\n default: 10,\r\n },\r\n },\r\n required: ['query'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\r\n const query = params.query as string;\r\n const limit = (params.limit as number) ?? 10;\r\n const projectId = 'current';\r\n\r\n const facts = recallFacts(projectId, query, limit);\r\n const summaries = getProjectSummaries(projectId, 5);\r\n\r\n return {\r\n success: true,\r\n data: {\r\n facts: facts.map((f) => ({ content: f.content, category: f.category })),\r\n recentSessions: summaries.map((s) => s.summary),\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolResult } from '../types.js';\r\nimport { storeFact } from '../../memory/store.js';\r\nimport type { FactCategory } from '../../memory/types.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'remember',\r\n description:\r\n 'Store a fact about the current project in persistent memory. Use this to remember architecture decisions, patterns, bugs found, or user preferences so you can recall them in future sessions.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n fact: {\r\n type: 'string',\r\n description: 'The fact to remember (e.g., \"PlayerData DataStore uses key format Player_{UserId}\")',\r\n },\r\n category: {\r\n type: 'string',\r\n description: 'Category of the fact',\r\n enum: ['architecture', 'pattern', 'preference', 'bug', 'api', 'general'],\r\n },\r\n },\r\n required: ['fact', 'category'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\r\n const fact = params.fact as string;\r\n const category = (params.category as FactCategory) ?? 'general';\r\n const now = Date.now();\r\n\r\n storeFact({\r\n projectId: 'current',\r\n content: fact,\r\n category,\r\n source: 'agent',\r\n relevance: 1.0,\r\n createdAt: now,\r\n accessedAt: now,\r\n });\r\n\r\n return { success: true, data: { stored: fact, category } };\r\n },\r\n};\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport type { Tool, ToolContext, ToolResult } from '../types.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'upload_asset',\r\n description:\r\n 'Upload a local file (image, model, audio) to Roblox via the Open Cloud API. Requires an Open Cloud API key configured in dominus.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n filePath: {\r\n type: 'string',\r\n description: 'Local file path of the asset to upload',\r\n },\r\n assetType: {\r\n type: 'string',\r\n description: 'Type of asset',\r\n enum: ['Image', 'Audio', 'Model'],\r\n },\r\n name: {\r\n type: 'string',\r\n description: 'Display name for the asset on Roblox',\r\n },\r\n description: {\r\n type: 'string',\r\n description: 'Description of the asset',\r\n },\r\n },\r\n required: ['filePath', 'assetType', 'name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n const apiKey = ctx.config.get<string>('openCloudApiKey');\r\n if (!apiKey) {\r\n return {\r\n success: false,\r\n error: 'Open Cloud API key not configured. Run: dominus config set openCloudApiKey <key>',\r\n };\r\n }\r\n\r\n const filePath = params.filePath as string;\r\n const assetType = params.assetType as string;\r\n const name = params.name as string;\r\n const description = (params.description as string) ?? '';\r\n\r\n if (!fs.existsSync(filePath)) {\r\n return { success: false, error: `File not found: ${filePath}` };\r\n }\r\n\r\n const fileBuffer = fs.readFileSync(filePath);\r\n const fileName = path.basename(filePath);\r\n\r\n const typeMapping: Record<string, string> = {\r\n Image: 'Decal',\r\n Audio: 'Audio',\r\n Model: 'Model',\r\n };\r\n\r\n try {\r\n const formData = new FormData();\r\n const blob = new Blob([fileBuffer]);\r\n formData.append('fileContent', blob, fileName);\r\n formData.append(\r\n 'request',\r\n JSON.stringify({\r\n assetType: typeMapping[assetType] ?? assetType,\r\n displayName: name,\r\n description,\r\n creationContext: { creator: { userId: 'me' } },\r\n }),\r\n );\r\n\r\n const response = await fetch(\r\n 'https://apis.roblox.com/assets/v1/assets',\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'x-api-key': apiKey,\r\n },\r\n body: formData,\r\n },\r\n );\r\n\r\n if (!response.ok) {\r\n const text = await response.text();\r\n return { success: false, error: `Upload failed (${response.status}): ${text}` };\r\n }\r\n\r\n const data = await response.json();\r\n return {\r\n success: true,\r\n data: {\r\n assetId: data.assetId ?? data.id,\r\n operationId: data.operationId ?? data.path,\r\n name,\r\n type: assetType,\r\n },\r\n };\r\n } catch (err) {\r\n return {\r\n success: false,\r\n error: `Upload error: ${err instanceof Error ? err.message : String(err)}`,\r\n };\r\n }\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const undoTool: Tool = {\r\n name: 'undo',\r\n description:\r\n 'Undo the last action in Roblox Studio using ChangeHistoryService. ' +\r\n 'Works just like Ctrl+Z. Use this to roll back mistakes.',\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n\r\n async execute(_params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n error?: string;\r\n }>(CliMsg.UNDO, {});\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Undo failed' };\r\n }\r\n\r\n return { success: true, data: 'Undo performed' };\r\n },\r\n};\r\n\r\nexport const redoTool: Tool = {\r\n name: 'redo',\r\n description:\r\n 'Redo the last undone action in Roblox Studio using ChangeHistoryService. ' +\r\n 'Works just like Ctrl+Y.',\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n\r\n async execute(_params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n error?: string;\r\n }>(CliMsg.REDO, {});\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Redo failed' };\r\n }\r\n\r\n return { success: true, data: 'Redo performed' };\r\n },\r\n};\r\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport { z } from 'zod';\r\nimport { DominusServer, type StudioBridge } from '../transport/ws-server.js';\r\nimport { DominusClient, isPortInUse } from '../transport/ws-client.js';\r\nimport { CliMsg, type ExplorerNode, type ScriptContentPayload, type RunCodeResponsePayload, type SearchResultPayload, type OutputPayload, type SelectionPayload, type PropertyEntry, type TestResultPayload, type StudioTestResultPayload } from '../transport/protocol.js';\r\nimport { initMemoryStore, recallFacts, storeFact, getScriptIndex } from '../memory/store.js';\r\nimport { loadConfig } from '../config/config.js';\r\nimport { INTERNAL_MEMORY } from '../agent/internal-memory.js';\r\n\r\nlet bridge: StudioBridge;\r\n\r\nexport async function startMcpServer(): Promise<void> {\r\n const config = loadConfig();\r\n await initMemoryStore();\r\n\r\n const portTaken = await isPortInUse(config.port);\r\n if (portTaken) {\r\n const client = new DominusClient(config.port);\r\n await client.connect();\r\n bridge = client;\r\n } else {\r\n const server = new DominusServer(config.port);\r\n await server.start();\r\n bridge = server;\r\n }\r\n\r\n const mcp = new McpServer({\r\n name: 'dominus',\r\n version: '0.5.8',\r\n }, {\r\n instructions: INTERNAL_MEMORY,\r\n });\r\n\r\n // --- Helpers: safe Lua string generation ---\r\n /** Escape a string for safe embedding in Lua code */\r\n function luaStr(s: string): string {\r\n return `\"${s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r')}\"`;\r\n }\r\n /** Convert a dot-path like \"Workspace.Folder.Part\" to game[\"Workspace\"][\"Folder\"][\"Part\"] */\r\n function resolvePath(dotPath: string): string {\r\n const parts = dotPath.split('.');\r\n let r = 'game';\r\n for (const p of parts) r += `[${luaStr(p)}]`;\r\n return r;\r\n }\r\n\r\n // --- Code Generation Helpers ---\r\n\r\n /** Convert a serialized UI tree node into a Roact/React createElement call */\r\n function generateComponentCode(\r\n tree: Record<string, unknown>,\r\n componentName: string,\r\n framework: string,\r\n ): string {\r\n const isReact = framework === 'react';\r\n const lib = isReact ? 'React' : 'Roact';\r\n\r\n const lines: string[] = [];\r\n lines.push(`local ${lib} = require(game.ReplicatedStorage.Packages.${isReact ? 'React' : 'Roact'})`);\r\n if (isReact) {\r\n lines.push(`local e = React.createElement`);\r\n } else {\r\n lines.push(`local e = Roact.createElement`);\r\n }\r\n lines.push('');\r\n\r\n // Collect all ClassName types used so we can note them\r\n lines.push(`local function ${componentName}()`);\r\n lines.push(`\\treturn ${renderNode(tree, 1)}`);\r\n lines.push('end');\r\n lines.push('');\r\n lines.push(`return ${componentName}`);\r\n\r\n return lines.join('\\n');\r\n }\r\n\r\n function renderNode(node: Record<string, unknown>, depth: number): string {\r\n const indent = '\\t'.repeat(depth);\r\n const indent2 = '\\t'.repeat(depth + 1);\r\n const className = (node.ClassName as string) || 'Frame';\r\n const children = (node.Children as Record<string, unknown>[]) || [];\r\n const name = node.Name as string | undefined;\r\n\r\n // Build props table\r\n const props: string[] = [];\r\n const skipKeys = new Set(['ClassName', 'Name', 'Children', 'className', 'name', 'children']);\r\n for (const [key, val] of Object.entries(node)) {\r\n if (skipKeys.has(key)) continue;\r\n props.push(`${indent2}${key} = ${luaValue(val, depth + 1)},`);\r\n }\r\n\r\n // Build children table\r\n const childEntries: string[] = [];\r\n for (const child of children) {\r\n const childName = (child.Name as string) || (child.ClassName as string) || 'Child';\r\n childEntries.push(`${indent2}${childName} = ${renderNode(child, depth + 1)},`);\r\n }\r\n\r\n // Combine\r\n const hasProps = props.length > 0;\r\n const hasChildren = childEntries.length > 0;\r\n\r\n if (!hasProps && !hasChildren) {\r\n return `e(\"${className}\", {})`;\r\n }\r\n\r\n const parts: string[] = [];\r\n parts.push(`e(\"${className}\", {`);\r\n if (hasProps) {\r\n parts.push(...props);\r\n }\r\n if (hasChildren) {\r\n parts.push(`${indent2}}, {`);\r\n parts.push(...childEntries);\r\n parts.push(`${indent}})`);\r\n } else {\r\n parts.push(`${indent}})`);\r\n }\r\n\r\n return parts.join('\\n');\r\n }\r\n\r\n function luaValue(val: unknown, _depth: number): string {\r\n if (val === null || val === undefined) return 'nil';\r\n if (typeof val === 'boolean') return String(val);\r\n if (typeof val === 'number') return String(val);\r\n if (typeof val === 'string') {\r\n // Detect special Roblox types from serialize_ui output\r\n if (val.startsWith('#') && val.length === 7) {\r\n return `Color3.fromHex(\"${val}\")`;\r\n }\r\n // Enum-like strings (single word, PascalCase)\r\n if (/^[A-Z][a-zA-Z]+$/.test(val)) {\r\n return `\"${val}\"`; // keep as string, Roact handles enum coercion\r\n }\r\n return `\"${val.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n')}\"`;\r\n }\r\n if (Array.isArray(val)) {\r\n // UDim2: [xS, xO, yS, yO]\r\n if (val.length === 4 && val.every(v => typeof v === 'number')) {\r\n return `UDim2.new(${val.join(', ')})`;\r\n }\r\n // Vector2 / UDim: [x, y]\r\n if (val.length === 2 && val.every(v => typeof v === 'number')) {\r\n return `Vector2.new(${val.join(', ')})`;\r\n }\r\n // Color3: [r, g, b]\r\n if (val.length === 3 && val.every(v => typeof v === 'number')) {\r\n const allSmall = val.every(v => (v as number) <= 1);\r\n if (allSmall) return `Color3.new(${val.join(', ')})`;\r\n return `Color3.fromRGB(${val.join(', ')})`;\r\n }\r\n return `{${val.map(v => luaValue(v, _depth)).join(', ')}}`;\r\n }\r\n if (typeof val === 'object') {\r\n const entries = Object.entries(val as Record<string, unknown>);\r\n if (entries.length === 0) return '{}';\r\n return `{\\n${entries.map(([k, v]) => `${'\\t'.repeat(_depth + 1)}${k} = ${luaValue(v, _depth + 1)}`).join(',\\n')}\\n${'\\t'.repeat(_depth)}}`;\r\n }\r\n return String(val);\r\n }\r\n\r\n // --- Studio Tools ---\r\n\r\n mcp.tool(\r\n 'read_script',\r\n 'Read the source code of a script in Roblox Studio',\r\n { path: z.string().describe('Full instance path, e.g. \"ServerScriptService.GameManager\"') },\r\n async ({ path }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<ScriptContentPayload>(CliMsg.GET_SCRIPT, { path });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'edit_script',\r\n 'Replace the entire source code of a script in Roblox Studio',\r\n {\r\n path: z.string().describe('Full instance path'),\r\n source: z.string().describe('New complete source code'),\r\n },\r\n async ({ path, source }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.SET_SCRIPT, { path, source });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'run_code',\r\n 'Execute arbitrary Luau code in Roblox Studio. LAST RESORT — only use when no dedicated tool exists. ' +\r\n 'Do NOT use for: reading properties (use get_properties/inspect_selection/serialize_ui), creating instances (use create_part/create_ui/insert_instance/build_multiple), ' +\r\n 'modifying properties (use set_properties/bulk_set_properties), or inspecting the tree (use get_explorer). ' +\r\n 'Valid uses: complex procedural generation, terrain algorithms, raycasting, physics queries, custom logic with no tool equivalent.',\r\n { code: z.string().describe('Luau code to execute') },\r\n async ({ code }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_explorer',\r\n 'Get the DataModel explorer tree from Roblox Studio',\r\n {\r\n rootPath: z.string().optional().describe('Root path to start from. Omit for entire tree.'),\r\n maxDepth: z.number().optional().default(3).describe('Maximum tree depth'),\r\n },\r\n async ({ rootPath, maxDepth }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ tree: ExplorerNode[] }>(CliMsg.GET_EXPLORER, {\r\n rootPath: rootPath ?? null,\r\n maxDepth,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_properties',\r\n 'Get all properties of a single instance in Roblox Studio. Returns property name, value, type, and category. For inspecting UI trees, prefer serialize_ui (structured tree) or get_descendants_properties (flat list with compact filtering).',\r\n {\r\n path: z.string().describe('Full instance path (e.g. \"Workspace.Part\", \"StarterGui.MyUI.Frame\")'),\r\n compact: z.boolean().optional().default(true).describe('Strip read-only, nil, deprecated, and default-valued properties (default true). Set false for full dump.'),\r\n },\r\n async ({ path, compact }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ properties: PropertyEntry[] }>(CliMsg.GET_PROPERTIES, { path, compact });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_descendants_properties',\r\n 'Easily get all descendants of a UI instance (or any instance) and all of their properties. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties to keep responses small.',\r\n { \r\n path: z.string().describe('Full instance path (e.g., \"Workspace.Part\", \"StarterGui.ScreenGui\")'),\r\n compact: z.boolean().optional().default(true).describe('Strip noisy/default properties (default true). Set false for full dump.'),\r\n outputFile: z.string().optional().describe('Optional file path to write to prevent limit errors/timeouts'),\r\n },\r\n async ({ path, compact, outputFile }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<unknown>(CliMsg.GET_DESCENDANTS_PROPERTIES, { path, compact, outputFile }, 1000 * 60 * 5);\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'set_properties',\r\n 'Set properties on an instance in Roblox Studio',\r\n {\r\n path: z.string().describe('Full instance path'),\r\n properties: z.record(z.unknown()).describe('Key-value pairs of properties to set'),\r\n },\r\n async ({ path, properties }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.SET_PROPERTIES, { path, properties });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'insert_instance',\r\n 'Create a new instance in the Roblox Studio DataModel',\r\n {\r\n className: z.string().describe('Class name (e.g. \"Part\", \"Script\")'),\r\n parentPath: z.string().describe('Parent instance path'),\r\n name: z.string().describe('Name for the new instance'),\r\n properties: z.record(z.unknown()).optional().describe('Optional properties to set'),\r\n },\r\n async ({ className, parentPath, name, properties }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.INSERT_INSTANCE, {\r\n className, parentPath, name, properties: properties ?? {},\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'delete_instance',\r\n 'Delete an instance from the Roblox Studio DataModel',\r\n { path: z.string().describe('Full instance path to delete') },\r\n async ({ path }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.DELETE_INSTANCE, { path });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_selection',\r\n 'Get the currently selected instances in Roblox Studio. Returns paths and class names of all selected objects. ' +\r\n 'Use this FIRST when the user says \"my selection\" or \"what I have selected\". ' +\r\n 'Then use get_properties or serialize_ui on the returned paths to inspect details.',\r\n {},\r\n async () => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'search_scripts',\r\n 'Search all scripts in Roblox Studio for a text pattern',\r\n {\r\n query: z.string().describe('Text to search for'),\r\n maxResults: z.number().optional().default(20).describe('Max results'),\r\n },\r\n async ({ query, maxResults }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<SearchResultPayload>(CliMsg.SEARCH_SCRIPTS, { query, maxResults });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_output',\r\n 'Get recent output log from Roblox Studio',\r\n {\r\n limit: z.number().optional().default(50).describe('Max entries'),\r\n level: z.enum(['info', 'warn', 'error']).optional().describe('Filter by level'),\r\n },\r\n async ({ limit, level }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ entries: OutputPayload[] }>(CliMsg.GET_OUTPUT, {\r\n limit, level: level ?? null,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_class_info',\r\n 'Look up the schema of any Roblox class using ReflectionService. Returns all properties (with types), methods (with parameters), and events. ' +\r\n 'ALWAYS use this before creating or modifying GUI elements to know correct property names and types.',\r\n { className: z.string().describe('Roblox class name, e.g. \"Frame\", \"TextLabel\", \"Part\", \"MeshPart\"') },\r\n async ({ className }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<unknown>(CliMsg.GET_REFLECTION, { className });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'create_ui',\r\n 'Create an entire UI tree in one call. Pass a declarative JSON tree — ClassName, Name, properties, Children. ' +\r\n 'All types auto-coerced in Luau (UDim2, Color3, Font, enums). 10x faster than run_code. ' +\r\n 'UDim2: [xScale, xOffset, yScale, yOffset]. Color3: \"#hex\" or \"rgb(r,g,b)\". Font: \"GothamBold\". Enums: string names.',\r\n {\r\n parent: z.string().optional().describe('Parent: \"StarterGui\", \"PlayerGui\", or path. Default: StarterGui'),\r\n tree: z.record(z.unknown()).describe(\r\n 'Root UI node: {ClassName, Name, properties..., Children: [{...}, ...]}. ' +\r\n 'UDim2 as [xScale, xOffset, yScale, yOffset], Color3 as \"#hex\", Font as \"GothamBold\"',\r\n ),\r\n animate: z.boolean().optional().describe('If true, task.wait() will be injected between creation of nodes so that the UI writes out dynamically.'),\r\n },\r\n async ({ parent, tree, animate }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ success: boolean; path?: string; instanceCount?: number; error?: string }>(\r\n CliMsg.BUILD_UI, { parent: parent ?? 'StarterGui', tree, animate },\r\n );\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'run_tests',\r\n 'Run tests by requiring ModuleScripts matching test naming conventions (*.test, *.spec, *Test, *Spec). Lightweight — does not enter Run/Play mode.',\r\n { testName: z.string().optional().describe('Specific test name, or omit to run all') },\r\n async ({ testName }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ results: TestResultPayload[] }>(CliMsg.RUN_TESTS, {\r\n testName: testName ?? null,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'execute_run_test',\r\n 'Start a Run mode test session using StudioTestService:ExecuteRunModeAsync(). ' +\r\n 'This actually enters Run mode in Studio. Pass args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until EndTest() is called or the session stops. Returns the value from EndTest(). ' +\r\n 'Use for headless automated tests — no player, just server scripts.',\r\n { args: z.unknown().optional().describe('Arguments passed to the test session. Server scripts get this via StudioTestService:GetTestArgs()') },\r\n async ({ args }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<StudioTestResultPayload>(CliMsg.EXECUTE_RUN_TEST, { args: args ?? null }, 120_000);\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'execute_play_test',\r\n 'Start a solo Play mode test session using StudioTestService:ExecutePlayModeAsync(). ' +\r\n 'This enters Play mode with a player character. Pass args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until EndTest() is called or the session stops. Returns the value from EndTest(). ' +\r\n 'Use for tests needing a player character and full client-server simulation.',\r\n { args: z.unknown().optional().describe('Arguments passed to the test session. Server scripts get this via StudioTestService:GetTestArgs()') },\r\n async ({ args }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<StudioTestResultPayload>(CliMsg.EXECUTE_PLAY_TEST, { args: args ?? null }, 120_000);\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- Builder Tools ---\r\n\r\n mcp.tool(\r\n 'create_part',\r\n 'Create a Part with position, size, color, material — all in one call. Faster than insert_instance + set_properties.',\r\n {\r\n name: z.string().describe('Name for the part'),\r\n parent: z.string().optional().describe('Parent path (default: Workspace)'),\r\n shape: z.enum(['Block', 'Ball', 'Cylinder', 'Wedge', 'CornerWedge']).optional().describe('Part shape'),\r\n position: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('World position'),\r\n size: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('Size in studs'),\r\n color: z.string().optional().describe('Hex \"#00FF00\", BrickColor name, or \"rgb(0,255,0)\"'),\r\n material: z.string().optional().describe('Plastic, Wood, Grass, Neon, Metal, etc.'),\r\n transparency: z.number().optional().describe('0=opaque, 1=invisible'),\r\n anchored: z.boolean().optional().describe('Anchored (default: true)'),\r\n canCollide: z.boolean().optional().describe('Has collision'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const properties: Record<string, unknown> = {};\r\n if (params.position) properties.Position = { X: params.position.x, Y: params.position.y, Z: params.position.z };\r\n if (params.size) properties.Size = { X: params.size.x, Y: params.size.y, Z: params.size.z };\r\n if (params.color) {\r\n const c = params.color;\r\n if (c.startsWith('#')) properties.Color = c;\r\n else if (c.startsWith('rgb')) {\r\n const m = c.match(/(\\d+)/g);\r\n if (m && m.length >= 3) properties.Color = { red: parseInt(m[0]), green: parseInt(m[1]), blue: parseInt(m[2]) };\r\n } else properties.BrickColor = c;\r\n }\r\n if (params.material) properties.Material = params.material;\r\n if (params.transparency !== undefined) properties.Transparency = params.transparency;\r\n if (params.anchored !== undefined) properties.Anchored = params.anchored;\r\n else properties.Anchored = true;\r\n if (params.canCollide !== undefined) properties.CanCollide = params.canCollide;\r\n if (params.shape && params.shape !== 'Block') properties.Shape = params.shape;\r\n\r\n const className = params.shape === 'Wedge' ? 'WedgePart' : params.shape === 'CornerWedge' ? 'CornerWedgePart' : 'Part';\r\n\r\n const res = await bridge.sendRequest<{ success: boolean; path?: string; error?: string }>(CliMsg.INSERT_INSTANCE, {\r\n className,\r\n parentPath: params.parent ?? 'Workspace',\r\n name: params.name,\r\n properties,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'clone_instance',\r\n 'Clone an existing instance, optionally rename it, move it, or offset its position',\r\n {\r\n path: z.string().describe('Path of instance to clone'),\r\n newName: z.string().optional().describe('Name for the clone'),\r\n newParent: z.string().optional().describe('Parent path for the clone'),\r\n offset: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('Position offset from original'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const lines = [`local orig = ${resolvePath(params.path)}`, `local clone = orig:Clone()`];\r\n if (params.newName) lines.push(`clone.Name = ${luaStr(params.newName)}`);\r\n if (params.newParent) {\r\n lines.push(`clone.Parent = ${resolvePath(params.newParent)}`);\r\n } else {\r\n lines.push(`clone.Parent = orig.Parent`);\r\n }\r\n if (params.offset) {\r\n lines.push(`if clone:IsA(\"BasePart\") then`);\r\n lines.push(` clone.Position = clone.Position + Vector3.new(${params.offset.x}, ${params.offset.y}, ${params.offset.z})`);\r\n lines.push(`end`);\r\n }\r\n lines.push(`print(\"Cloned: \" .. clone:GetFullName())`);\r\n\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code: lines.join('\\n') });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'group_instances',\r\n 'Group multiple instances into a Model or Folder. All listed instances become children of the new group.',\r\n {\r\n paths: z.array(z.string()).describe('Array of instance paths to group'),\r\n groupName: z.string().describe('Name for the group'),\r\n groupClass: z.enum(['Model', 'Folder']).optional().describe('Container class (default: Model)'),\r\n parent: z.string().optional().describe('Parent path (default: Workspace)'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const gc = params.groupClass ?? 'Model';\r\n const parent = params.parent ?? 'Workspace';\r\n\r\n const code = [\r\n `local group = Instance.new(${luaStr(gc)})`,\r\n `group.Name = ${luaStr(params.groupName)}`,\r\n `group.Parent = ${resolvePath(parent)}`,\r\n ...params.paths.map((p) => `${resolvePath(p)}.Parent = group`),\r\n `print(\"Grouped ${params.paths.length} instances into: \" .. group:GetFullName())`,\r\n ].join('\\n');\r\n\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'build_multiple',\r\n 'Create many parts/instances in one batch. Send an array of specs — all created in a single round-trip. Ideal for building trees, houses, vehicles. Supports hex colors, rgb() colors, and BrickColor names.',\r\n {\r\n parts: z.array(z.object({\r\n name: z.string(),\r\n className: z.string().optional(),\r\n parent: z.string().optional(),\r\n position: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional(),\r\n size: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional(),\r\n color: z.string().optional().describe('Hex \"#RRGGBB\", \"rgb(r,g,b)\", or BrickColor name'),\r\n material: z.string().optional().describe('Enum.Material name: Plastic, Wood, Neon, Glass, etc.'),\r\n transparency: z.number().optional(),\r\n anchored: z.boolean().optional(),\r\n canCollide: z.boolean().optional(),\r\n shape: z.enum(['Block', 'Ball', 'Cylinder', 'Wedge']).optional(),\r\n })).describe('Array of part specifications'),\r\n groupName: z.string().optional().describe('Group all parts into a Model with this name'),\r\n groupParent: z.string().optional().describe('Parent for the group (default: Workspace)'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const parts = params.parts;\r\n const groupName = params.groupName;\r\n const groupParent = params.groupParent ?? 'Workspace';\r\n\r\n const lines: string[] = [];\r\n if (groupName) {\r\n lines.push(`local _group = Instance.new(\"Model\")`);\r\n lines.push(`_group.Name = ${luaStr(groupName)}`);\r\n lines.push(`_group.Parent = ${resolvePath(groupParent)}`);\r\n }\r\n for (let i = 0; i < parts.length; i++) {\r\n const p = parts[i];\r\n const v = `_p${i}`;\r\n const cn = p.className ?? (p.shape === 'Wedge' ? 'WedgePart' : 'Part');\r\n lines.push(`local ${v} = Instance.new(${luaStr(cn)})`);\r\n lines.push(`${v}.Name = ${luaStr(p.name)}`);\r\n if (p.position) lines.push(`${v}.Position = Vector3.new(${p.position.x}, ${p.position.y}, ${p.position.z})`);\r\n if (p.size) lines.push(`${v}.Size = Vector3.new(${p.size.x}, ${p.size.y}, ${p.size.z})`);\r\n if (p.color) {\r\n if (p.color.startsWith('#')) {\r\n lines.push(`${v}.Color = Color3.fromHex(${luaStr(p.color)})`);\r\n } else if (p.color.startsWith('rgb(')) {\r\n const m = p.color.match(/rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/);\r\n if (m) lines.push(`${v}.Color = Color3.fromRGB(${m[1]}, ${m[2]}, ${m[3]})`);\r\n } else {\r\n lines.push(`${v}.BrickColor = BrickColor.new(${luaStr(p.color)})`);\r\n }\r\n }\r\n if (p.material) lines.push(`${v}.Material = Enum.Material.${p.material}`);\r\n if (p.transparency !== undefined) lines.push(`${v}.Transparency = ${p.transparency}`);\r\n lines.push(`${v}.Anchored = ${p.anchored ?? true}`);\r\n if (p.canCollide !== undefined) lines.push(`${v}.CanCollide = ${p.canCollide}`);\r\n if (p.shape && p.shape !== 'Block' && cn === 'Part') lines.push(`${v}.Shape = Enum.PartType.${p.shape}`);\r\n lines.push(`${v}.Parent = ${groupName ? '_group' : resolvePath(p.parent ?? 'Workspace')}`);\r\n }\r\n lines.push(`print(\"Built ${parts.length} parts${groupName ? ` in ${groupName}` : ''}\")`);\r\n\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code: lines.join('\\n') });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- UI Serialization ---\r\n\r\n mcp.tool(\r\n 'serialize_ui',\r\n 'Serialize an existing Roblox UI tree into a compact, create_ui-compatible JSON tree. ' +\r\n 'This is the reverse of create_ui — reads any GUI instance and returns a declarative JSON tree ' +\r\n 'with ClassName, Name, non-default properties (Color3 as hex, UDim2 as arrays, etc.), and Children. ' +\r\n 'Perfect for: converting existing UI to Roact/React components, cloning/templating, understanding UI structure, ' +\r\n 'or refactoring. Use this INSTEAD of get_descendants_properties when you need to recreate or convert UI.',\r\n {\r\n path: z.string().describe('Instance path to serialize (e.g. \"StarterGui.MyScreenGui\")'),\r\n maxDepth: z.number().optional().default(50).describe('Maximum tree depth (default 50)'),\r\n },\r\n async ({ path, maxDepth }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ success: boolean; tree?: unknown; error?: string }>(\r\n CliMsg.SERIALIZE_UI, { path, maxDepth }, 1000 * 60 * 2,\r\n );\r\n if (!res.payload.success) {\r\n return { content: [{ type: 'text' as const, text: `Error: ${res.payload.error ?? 'Serialization failed'}` }] };\r\n }\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload.tree, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- Composite Skill Tools ---\r\n // Higher-level tools that combine multiple operations into a single call.\r\n // These prevent LLMs from falling back to run_code for common workflows.\r\n\r\n mcp.tool(\r\n 'inspect_selection',\r\n 'Inspect the user\\'s current selection in Roblox Studio. Returns the selected instance paths AND their properties (compact) in a single call. ' +\r\n 'Use this FIRST when the user says \"my selection\", \"what I selected\", or \"the selected thing\". ' +\r\n 'Much better than calling get_selection + get_properties separately.',\r\n {},\r\n async () => {\r\n assertConnected();\r\n // Step 1: get selection\r\n const selRes = await bridge.sendRequest<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n const paths: string[] = selRes.payload?.paths ?? [];\r\n if (paths.length === 0) {\r\n return { content: [{ type: 'text' as const, text: 'No instances selected in Studio.' }] };\r\n }\r\n\r\n // Step 2: get compact properties for each selected instance\r\n const results: Record<string, unknown> = {};\r\n for (const p of paths.slice(0, 10)) { // cap at 10 to avoid huge payloads\r\n try {\r\n const propRes = await bridge.sendRequest<{ properties?: PropertyEntry[]; error?: string }>(\r\n CliMsg.GET_PROPERTIES, { path: p, compact: true },\r\n );\r\n results[p] = propRes.payload.properties ?? propRes.payload;\r\n } catch {\r\n results[p] = { error: 'Failed to read properties' };\r\n }\r\n }\r\n if (paths.length > 10) {\r\n results['_truncated'] = `${paths.length - 10} more instances not shown`;\r\n }\r\n\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(results, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'inspect_instance',\r\n 'Inspect a single instance: returns its compact properties AND its children tree in one call. ' +\r\n 'Combines get_properties + get_explorer into a single round-trip. ' +\r\n 'Use when you need to understand an instance and its subtree.',\r\n {\r\n path: z.string().describe('Full instance path (e.g. \"Workspace.MyModel\")'),\r\n childDepth: z.number().optional().default(2).describe('How deep to show the children tree (default 2)'),\r\n },\r\n async ({ path, childDepth }) => {\r\n assertConnected();\r\n // Parallel: get properties + get children tree\r\n const [propRes, treeRes] = await Promise.all([\r\n bridge.sendRequest<{ properties?: PropertyEntry[]; error?: string }>(\r\n CliMsg.GET_PROPERTIES, { path, compact: true },\r\n ),\r\n bridge.sendRequest<{ tree?: ExplorerNode; error?: string }>(\r\n CliMsg.GET_EXPLORER, { rootPath: path, maxDepth: childDepth ?? 2 },\r\n ),\r\n ]);\r\n\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({\r\n properties: propRes.payload.properties ?? propRes.payload,\r\n children: treeRes.payload.tree ?? treeRes.payload,\r\n }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'convert_ui_to_code',\r\n 'Convert an existing Roblox UI tree into Roact/React-lua component code. ' +\r\n 'Serializes the UI at the given path, then generates a ready-to-use Luau component. ' +\r\n 'Use when the user asks to \"turn this into a component\", \"convert to React\", or \"make a Roact version\".',\r\n {\r\n path: z.string().describe('Path to the UI instance to convert (e.g. \"StarterGui.MyScreenGui.MainFrame\")'),\r\n framework: z.enum(['roact', 'react']).optional().default('react').describe('Target framework: \"roact\" (legacy) or \"react\" (react-lua, default)'),\r\n componentName: z.string().optional().describe('Name for the generated component (defaults to instance Name)'),\r\n },\r\n async ({ path, framework, componentName }) => {\r\n assertConnected();\r\n // Step 1: serialize the UI tree\r\n const res = await bridge.sendRequest<{ success: boolean; tree?: Record<string, unknown>; error?: string }>(\r\n CliMsg.SERIALIZE_UI, { path, maxDepth: 50 }, 1000 * 60 * 2,\r\n );\r\n if (!res.payload.success || !res.payload.tree) {\r\n return { content: [{ type: 'text' as const, text: `Error serializing UI: ${res.payload.error ?? 'Unknown error'}` }] };\r\n }\r\n\r\n const tree = res.payload.tree;\r\n const name = componentName || (tree.Name as string) || 'GeneratedComponent';\r\n const fw = framework || 'react';\r\n\r\n // Step 2: generate code from the serialized tree\r\n const code = generateComponentCode(tree, name, fw);\r\n return { content: [{ type: 'text' as const, text: code }] };\r\n },\r\n );\r\n\r\n // --- Memory Tools ---\r\n\r\n mcp.tool(\r\n 'recall_memory',\r\n 'Search persistent memory for facts about the current Roblox project',\r\n { query: z.string().describe('What to search for') },\r\n async ({ query }) => {\r\n const facts = recallFacts('current', query, 15);\r\n const scripts = getScriptIndex('current');\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({ facts: facts.map(f => f.content), scriptIndex: scripts }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'remember',\r\n 'Store a fact about the project in persistent memory for future sessions',\r\n {\r\n fact: z.string().describe('The fact to remember'),\r\n category: z.enum(['architecture', 'pattern', 'preference', 'bug', 'api', 'general']).describe('Category'),\r\n },\r\n async ({ fact, category }) => {\r\n const now = Date.now();\r\n storeFact({ projectId: 'current', content: fact, category, source: 'mcp', relevance: 1.0, createdAt: now, accessedAt: now });\r\n return { content: [{ type: 'text' as const, text: `Remembered: ${fact}` }] };\r\n },\r\n );\r\n\r\n // --- Resources ---\r\n\r\n mcp.resource(\r\n 'studio://status',\r\n 'studio://status',\r\n async () => {\r\n const info = bridge.getConnectionInfo();\r\n return {\r\n contents: [{\r\n uri: 'studio://status',\r\n text: JSON.stringify({\r\n connected: bridge.isConnected(),\r\n placeName: info?.placeName,\r\n placeId: info?.placeId,\r\n studioVersion: info?.studioVersion,\r\n port: bridge.getPort(),\r\n }, null, 2),\r\n mimeType: 'application/json',\r\n }],\r\n };\r\n },\r\n );\r\n\r\n // Start the MCP server on stdio\r\n const transport = new StdioServerTransport();\r\n await mcp.connect(transport);\r\n}\r\n\r\nfunction assertConnected(): void {\r\n if (!bridge.isConnected()) {\r\n throw new Error(\r\n 'Roblox Studio is not connected. Open Studio and click the Dominus plugin Connect button.',\r\n );\r\n }\r\n}\r\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nconst CROWN_ART = ` ◆ ◆ ◆\n ╔█╗ ╔█╗ ╔█╗\n ║█║ ║█║ ║█║\n ╚█╚═════╝█╚═════╝█╝\n ╚═══════════════╝`;\n\nfunction getGreeting(name: string): string {\n const hour = new Date().getHours();\n if (hour >= 5 && hour < 12) return `Good morning ${name}!`;\n if (hour >= 12 && hour < 17) return `Good afternoon ${name}!`;\n if (hour >= 17 && hour < 21) return `Good evening ${name}!`;\n return `Burning the midnight oil, ${name}!`;\n}\n\ninterface WelcomeProps {\n userName: string;\n version: string;\n model: string;\n provider: string;\n port: number;\n hasApiKey: boolean;\n connected: boolean;\n cwd: string;\n}\n\nexport const Welcome: React.FC<WelcomeProps> = React.memo(({\n userName,\n version,\n model,\n provider,\n port,\n hasApiKey,\n connected,\n cwd,\n}) => {\n const greeting = getGreeting(userName);\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {/* Header */}\n <Box\n borderStyle=\"round\"\n borderColor=\"magenta\"\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text bold color=\"magenta\">\n Dominus v{version}\n </Text>\n <Text dimColor>AI-Powered Roblox Studio Agent</Text>\n </Box>\n\n {/* Main content: two columns */}\n <Box>\n {/* Left column: greeting + mascot */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n width=\"50%\"\n >\n <Text bold color=\"cyan\">\n {greeting}\n </Text>\n <Text> </Text>\n\n {CROWN_ART.split('\\n').map((line, i) => (\n <Text key={i} color=\"yellow\">\n {line}\n </Text>\n ))}\n\n <Text> </Text>\n <Text dimColor>\n {provider} · {model || 'no model set'}\n </Text>\n <Text dimColor>{cwd}</Text>\n </Box>\n\n {/* Right column: tips or setup */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n width=\"50%\"\n >\n {hasApiKey ? (\n <>\n <Text bold color=\"yellow\">\n Tips for getting started\n </Text>\n <Text>\n Just type a message to chat with the AI agent\n </Text>\n <Text>\n Use <Text color=\"cyan\">/help</Text> to see all commands\n </Text>\n <Text>\n Use <Text color=\"cyan\">/run {'<code>'}</Text> to execute Luau in Studio\n </Text>\n <Text> </Text>\n <Text bold color=\"yellow\">\n Studio connection\n </Text>\n {connected ? (\n <Text color=\"green\">● Connected to Roblox Studio</Text>\n ) : (\n <>\n <Text color=\"red\">○ Waiting for Studio plugin...</Text>\n <Text dimColor>WebSocket server on port {port}</Text>\n <Text dimColor>\n Run <Text color=\"cyan\">dominus install-plugin</Text> if needed\n </Text>\n </>\n )}\n </>\n ) : (\n <>\n <Text bold color=\"yellow\">\n Setup — pick any provider\n </Text>\n <Text> </Text>\n <Text>\n <Text color=\"green\" bold>OpenAI </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">OPENAI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Anthropic </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">ANTHROPIC_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Gemini </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">GEMINI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Grok (xAI) </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">XAI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>OpenRouter </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">OPENROUTER_API_KEY</Text>\n </Text>\n <Text> </Text>\n <Text dimColor>Or configure manually:</Text>\n <Text>\n <Text color=\"cyan\">dominus config set provider openai</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">dominus config set apiKey sk-...</Text>\n </Text>\n </>\n )}\n </Box>\n </Box>\n </Box>\n );\n});\n","import React, { useState } from 'react';\r\nimport { Box, Text, useInput } from 'ink';\r\nimport TextInput from 'ink-text-input';\r\nimport { PROVIDERS, type AIProviderType } from '../../config/config.js';\r\n\r\ninterface SetupProps {\r\n onComplete: (provider: AIProviderType, apiKey: string) => void;\r\n}\r\n\r\nconst PROVIDER_OPTIONS: { key: AIProviderType; label: string; hint: string }[] = [\r\n { key: 'openai', label: 'OpenAI', hint: 'GPT-5.3, GPT-5.2, o3-mini' },\r\n { key: 'anthropic', label: 'Anthropic', hint: 'Claude Opus 4-6, Sonnet 4-6' },\r\n { key: 'gemini', label: 'Google Gemini', hint: 'Gemini 3.1 Pro, 2.0 Flash' },\r\n { key: 'xai', label: 'xAI (Grok)', hint: 'Grok 4.2, Grok 3' },\r\n { key: 'openrouter', label: 'OpenRouter', hint: '300+ models, one key' },\r\n];\r\n\r\nexport const Setup: React.FC<SetupProps> = ({ onComplete }) => {\r\n const [step, setStep] = useState<'provider' | 'key'>('provider');\r\n const [selectedIdx, setSelectedIdx] = useState(0);\r\n const [selectedProvider, setSelectedProvider] = useState<AIProviderType>('openai');\r\n const [apiKey, setApiKey] = useState('');\r\n\r\n useInput((input, key) => {\r\n if (step !== 'provider') return;\r\n\r\n if (key.upArrow) {\r\n setSelectedIdx((prev) => Math.max(0, prev - 1));\r\n } else if (key.downArrow) {\r\n setSelectedIdx((prev) => Math.min(PROVIDER_OPTIONS.length - 1, prev + 1));\r\n } else if (key.return) {\r\n setSelectedProvider(PROVIDER_OPTIONS[selectedIdx].key);\r\n setStep('key');\r\n }\r\n });\r\n\r\n const handleKeySubmit = (value: string) => {\r\n const trimmed = value.trim();\r\n if (trimmed) {\r\n onComplete(selectedProvider, trimmed);\r\n }\r\n };\r\n\r\n const providerInfo = PROVIDERS[selectedProvider];\r\n\r\n return (\r\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\r\n <Text bold color=\"magenta\">\r\n ◆ Dominus — First Time Setup\r\n </Text>\r\n <Text> </Text>\r\n\r\n {step === 'provider' && (\r\n <>\r\n <Text bold>Select your AI provider:</Text>\r\n <Text> </Text>\r\n {PROVIDER_OPTIONS.map((opt, i) => (\r\n <Box key={opt.key}>\r\n <Text color={i === selectedIdx ? 'cyan' : undefined} bold={i === selectedIdx}>\r\n {i === selectedIdx ? ' ❯ ' : ' '}\r\n {opt.label}\r\n </Text>\r\n <Text dimColor> {opt.hint}</Text>\r\n </Box>\r\n ))}\r\n <Text> </Text>\r\n <Text dimColor>↑/↓ to select, Enter to confirm</Text>\r\n </>\r\n )}\r\n\r\n {step === 'key' && (\r\n <>\r\n <Text>\r\n Provider: <Text color=\"cyan\" bold>{PROVIDERS[selectedProvider].name}</Text>\r\n </Text>\r\n <Text>\r\n Default model: <Text color=\"green\">{providerInfo.defaultModel}</Text>\r\n </Text>\r\n <Text> </Text>\r\n <Text bold>Enter your API key:</Text>\r\n <Text dimColor>\r\n Get one from your provider's dashboard\r\n </Text>\r\n <Text> </Text>\r\n <Box>\r\n <Text color=\"cyan\">❯ </Text>\r\n <TextInput\r\n value={apiKey}\r\n onChange={setApiKey}\r\n onSubmit={handleKeySubmit}\r\n mask=\"*\"\r\n placeholder=\"sk-...\"\r\n />\r\n </Box>\r\n </>\r\n )}\r\n </Box>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\ninterface StatusBarProps {\r\n connected: boolean;\r\n placeName?: string;\r\n model: string;\r\n sessionTokens?: number;\r\n}\r\n\r\nexport const StatusBar: React.FC<StatusBarProps> = React.memo(({\r\n connected,\r\n placeName,\r\n model,\r\n sessionTokens,\r\n}) => {\r\n const statusColor = connected ? 'green' : 'red';\r\n const statusText = connected ? `● Connected${placeName ? ` — ${placeName}` : ''}` : '○ Disconnected';\r\n const shortModel = model.split('/').pop() ?? model;\r\n\r\n return (\r\n <Box\r\n borderStyle=\"single\"\r\n borderColor=\"gray\"\r\n paddingX={1}\r\n justifyContent=\"space-between\"\r\n width=\"100%\"\r\n >\r\n <Box gap={2}>\r\n <Text bold color=\"magenta\">\r\n DOMINUS\r\n </Text>\r\n <Text color={statusColor}>{statusText}</Text>\r\n </Box>\r\n <Box gap={2}>\r\n {sessionTokens !== undefined && (\r\n <Text dimColor>~{Math.round(sessionTokens / 1000)}k tokens</Text>\r\n )}\r\n <Text color=\"cyan\">{shortModel}</Text>\r\n <Text dimColor>Ctrl+C to quit</Text>\r\n </Box>\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\nexport interface OutputEntry {\r\n message: string;\r\n level: 'info' | 'warn' | 'error';\r\n timestamp: number;\r\n source?: string;\r\n}\r\n\r\ninterface OutputPaneProps {\r\n entries: OutputEntry[];\r\n maxLines?: number;\r\n}\r\n\r\nfunction formatTime(ts: number): string {\r\n const d = new Date(ts);\r\n return d.toLocaleTimeString('en-US', { hour12: false });\r\n}\r\n\r\nconst LEVEL_COLORS: Record<string, string> = {\r\n info: 'white',\r\n warn: 'yellow',\r\n error: 'red',\r\n};\r\n\r\nconst LEVEL_ICONS: Record<string, string> = {\r\n info: '│',\r\n warn: '⚠',\r\n error: '✖',\r\n};\r\n\r\nexport const OutputPane: React.FC<OutputPaneProps> = React.memo(({ entries, maxLines = 10 }) => {\r\n const visible = entries.slice(-maxLines);\r\n\r\n return (\r\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\r\n <Text bold dimColor>\r\n Output\r\n </Text>\r\n {visible.length === 0 ? (\r\n <Text dimColor italic>\r\n Waiting for Studio output...\r\n </Text>\r\n ) : (\r\n visible.map((entry, i) => (\r\n <Text key={i} color={LEVEL_COLORS[entry.level] ?? 'white'}>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>{' '}\r\n <Text>{LEVEL_ICONS[entry.level] ?? '│'}</Text> {entry.message}\r\n </Text>\r\n ))\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\nexport interface ChatEntry {\r\n role: 'user' | 'assistant' | 'tool' | 'error' | 'system';\r\n content: string;\r\n toolName?: string;\r\n timestamp: number;\r\n}\r\n\r\ninterface ChatPaneProps {\r\n entries: ChatEntry[];\r\n streaming?: string;\r\n maxLines?: number;\r\n}\r\n\r\nfunction formatTime(ts: number): string {\r\n const d = new Date(ts);\r\n return d.toLocaleTimeString('en-US', { hour12: false });\r\n}\r\n\r\nexport const ChatPane: React.FC<ChatPaneProps> = React.memo(({ entries, streaming, maxLines = 20 }) => {\r\n const visible = entries.slice(-maxLines);\r\n\r\n return (\r\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\r\n {visible.map((entry, i) => (\r\n <Box key={i} flexDirection=\"column\" marginBottom={entry.role === 'user' ? 1 : 0}>\r\n {entry.role === 'user' && (\r\n <Box>\r\n <Text color=\"cyan\" bold>\r\n You{' '}\r\n </Text>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>\r\n </Box>\r\n )}\r\n {entry.role === 'assistant' && (\r\n <Box>\r\n <Text color=\"magenta\" bold>\r\n Dominus{' '}\r\n </Text>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>\r\n </Box>\r\n )}\r\n {entry.role === 'tool' && (\r\n <Text color=\"yellow\">\r\n ⚡ {entry.toolName ?? 'tool'}: {entry.content}\r\n </Text>\r\n )}\r\n {entry.role === 'system' && (\r\n <Text color=\"yellow\" bold>Dominus </Text>\r\n )}\r\n {entry.role === 'error' && (\r\n <Text color=\"red\">✖ Error: {entry.content}</Text>\r\n )}\r\n {(entry.role === 'user' || entry.role === 'assistant' || entry.role === 'system') && (\r\n <Text wrap=\"wrap\">{entry.content}</Text>\r\n )}\r\n </Box>\r\n ))}\r\n\r\n {streaming && (\r\n <Box flexDirection=\"column\">\r\n <Box>\r\n <Text color=\"magenta\" bold>\r\n Dominus{' '}\r\n </Text>\r\n <Text dimColor>(typing...)</Text>\r\n </Box>\r\n <Text wrap=\"wrap\">{streaming}</Text>\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import { execSync } from 'node:child_process';\r\nimport { tmpdir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { readFileSync, unlinkSync, existsSync } from 'node:fs';\r\nimport { randomBytes } from 'node:crypto';\r\n\r\nexport interface ClipboardImage {\r\n base64: string;\r\n mimeType: 'image/png';\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nconst PS_SCRIPT = `\r\nAdd-Type -AssemblyName System.Windows.Forms\r\n$img = [System.Windows.Forms.Clipboard]::GetImage()\r\nif ($img -eq $null) { exit 1 }\r\n$path = $args[0]\r\n$img.Save($path, [System.Drawing.Imaging.ImageFormat]::Png)\r\n$img.Dispose()\r\nWrite-Host \"$($img.Width)x$($img.Height)\"\r\n`;\r\n\r\nexport function getClipboardImage(): ClipboardImage | null {\r\n if (process.platform !== 'win32') {\r\n return getClipboardImageUnix();\r\n }\r\n\r\n const tmpPath = join(tmpdir(), `dominus-clip-${randomBytes(4).toString('hex')}.png`);\r\n\r\n try {\r\n execSync(\r\n `powershell -NoProfile -Command \"Add-Type -AssemblyName System.Windows.Forms; $img = [System.Windows.Forms.Clipboard]::GetImage(); if ($img -eq $null) { exit 1 }; $img.Save('${tmpPath.replace(/'/g, \"''\")}', [System.Drawing.Imaging.ImageFormat]::Png); $img.Dispose()\"`,\r\n { stdio: 'pipe', timeout: 5000 },\r\n );\r\n\r\n if (!existsSync(tmpPath)) return null;\r\n\r\n const buffer = readFileSync(tmpPath);\r\n unlinkSync(tmpPath);\r\n\r\n if (buffer.length < 100) return null;\r\n\r\n return {\r\n base64: buffer.toString('base64'),\r\n mimeType: 'image/png',\r\n };\r\n } catch {\r\n try { if (existsSync(tmpPath)) unlinkSync(tmpPath); } catch { /* ignore */ }\r\n return null;\r\n }\r\n}\r\n\r\nfunction getClipboardImageUnix(): ClipboardImage | null {\r\n const tmpPath = join(tmpdir(), `dominus-clip-${randomBytes(4).toString('hex')}.png`);\r\n\r\n try {\r\n if (process.platform === 'darwin') {\r\n execSync(`osascript -e 'set png to (the clipboard as «class PNGf»)' -e 'set f to open for access POSIX file \"${tmpPath}\" with write permission' -e 'write png to f' -e 'close access f'`, { stdio: 'pipe', timeout: 5000 });\r\n } else {\r\n execSync(`xclip -selection clipboard -t image/png -o > \"${tmpPath}\"`, { stdio: 'pipe', timeout: 5000 });\r\n }\r\n\r\n if (!existsSync(tmpPath)) return null;\r\n\r\n const buffer = readFileSync(tmpPath);\r\n unlinkSync(tmpPath);\r\n\r\n if (buffer.length < 100) return null;\r\n\r\n return {\r\n base64: buffer.toString('base64'),\r\n mimeType: 'image/png',\r\n };\r\n } catch {\r\n try { if (existsSync(tmpPath)) unlinkSync(tmpPath); } catch { /* ignore */ }\r\n return null;\r\n }\r\n}\r\n","import React, { useState, useMemo, useRef, useCallback, useEffect } from 'react';\r\nimport { Box, Text, useInput } from 'ink';\r\nimport TextInput from 'ink-text-input';\r\nimport { getClipboardImage } from '../../utils/clipboard.js';\r\n\r\ninterface CommandSuggestion {\r\n command: string;\r\n description: string;\r\n}\r\n\r\nconst COMMANDS: CommandSuggestion[] = [\r\n { command: '/help', description: 'Show help and available commands' },\r\n { command: '/model', description: 'Switch the AI model' },\r\n { command: '/models', description: 'List all available models from your provider' },\r\n { command: '/status', description: 'Show connection and config status' },\r\n { command: '/clear', description: 'Clear chat history' },\r\n { command: '/paste', description: 'Paste image from clipboard (or Alt+V)' },\r\n];\r\n\r\nexport interface ImageAttachment {\r\n base64: string;\r\n mimeType: 'image/png';\r\n}\r\n\r\ninterface InputBarProps {\r\n onSubmit: (text: string, image?: ImageAttachment) => void;\r\n onImagePaste?: (image: ImageAttachment) => void;\r\n isProcessing: boolean;\r\n placeholder?: string;\r\n imageAttached?: boolean;\r\n onClearImage?: () => void;\r\n}\r\n\r\nconst SuggestionBox: React.FC<{ suggestions: CommandSuggestion[]; selectedIdx: number }> = React.memo(\r\n ({ suggestions, selectedIdx }) => (\r\n <Box flexDirection=\"column\" paddingX={1} borderStyle=\"single\" borderColor=\"gray\">\r\n {suggestions.map((s, i) => (\r\n <Box key={s.command}>\r\n <Text color={i === selectedIdx ? 'cyan' : undefined} bold={i === selectedIdx}>\r\n {i === selectedIdx ? '❯ ' : ' '}\r\n </Text>\r\n <Text color={i === selectedIdx ? 'cyan' : 'white'} bold={i === selectedIdx}>\r\n {s.command.padEnd(16)}\r\n </Text>\r\n <Text dimColor>{s.description}</Text>\r\n </Box>\r\n ))}\r\n <Text dimColor> ↑↓ navigate · Tab complete · Enter select</Text>\r\n </Box>\r\n ),\r\n);\r\n\r\nexport const InputBar: React.FC<InputBarProps> = React.memo(({\r\n onSubmit,\r\n onImagePaste,\r\n isProcessing,\r\n placeholder = 'Ask Dominus anything, or /help for commands...',\r\n imageAttached,\r\n onClearImage,\r\n}) => {\r\n const [value, setValue] = useState('');\r\n const [selectedIdx, setSelectedIdx] = useState(0);\r\n const [pasteStatus, setPasteStatus] = useState<'none' | 'checking' | 'no_image'>('none');\r\n const valueRef = useRef(value);\r\n valueRef.current = value;\r\n\r\n const suggestions = useMemo(() => {\r\n if (!value.startsWith('/') || value.includes(' ')) return [];\r\n const query = value.toLowerCase();\r\n return COMMANDS.filter((c) => c.command.startsWith(query));\r\n }, [value]);\r\n\r\n const showSuggestions = suggestions.length > 0 && value.length > 0;\r\n\r\n const tryPasteImage = useCallback(() => {\r\n if (!onImagePaste) return false;\r\n setPasteStatus('checking');\r\n try {\r\n const img = getClipboardImage();\r\n if (img) {\r\n onImagePaste(img);\r\n setPasteStatus('none');\r\n return true;\r\n }\r\n } catch { /* ignore */ }\r\n setPasteStatus('no_image');\r\n setTimeout(() => setPasteStatus('none'), 2000);\r\n return false;\r\n }, [onImagePaste]);\r\n\r\n // Listen for raw stdin to catch Alt+V and Ctrl+V\r\n useEffect(() => {\r\n const handler = (data: Buffer) => {\r\n if (isProcessing) return;\r\n const str = data.toString();\r\n // Alt+V: ESC + v (0x1B 0x76)\r\n if (str === '\\x1bv' || str === '\\x1bV') {\r\n tryPasteImage();\r\n return;\r\n }\r\n // Ctrl+V: 0x16 (works if terminal doesn't intercept it)\r\n if (str === '\\x16') {\r\n tryPasteImage();\r\n return;\r\n }\r\n };\r\n process.stdin.on('data', handler);\r\n return () => { process.stdin.off('data', handler); };\r\n }, [isProcessing, tryPasteImage]);\r\n\r\n useInput((_input, key) => {\r\n if (isProcessing) return;\r\n\r\n if (!showSuggestions) return;\r\n\r\n if (key.upArrow) {\r\n setSelectedIdx((prev) => Math.max(0, prev - 1));\r\n } else if (key.downArrow) {\r\n setSelectedIdx((prev) => Math.min(suggestions.length - 1, prev + 1));\r\n } else if (key.tab) {\r\n const selected = suggestions[selectedIdx];\r\n if (selected) {\r\n setValue(selected.command + ' ');\r\n setSelectedIdx(0);\r\n }\r\n }\r\n });\r\n\r\n const handleChange = useCallback((v: string) => {\r\n setValue(v);\r\n setSelectedIdx(0);\r\n }, []);\r\n\r\n const handleSubmit = useCallback((text: string) => {\r\n if (isProcessing) return;\r\n\r\n // /paste command\r\n if (text.trim().toLowerCase() === '/paste') {\r\n tryPasteImage();\r\n setValue('');\r\n return;\r\n }\r\n\r\n const currentValue = valueRef.current;\r\n const currentSuggestions = COMMANDS.filter(\r\n (c) => currentValue.startsWith('/') && !currentValue.includes(' ') && c.command.startsWith(currentValue.toLowerCase()),\r\n );\r\n const hasSuggestions = currentSuggestions.length > 0 && currentValue.length > 0;\r\n\r\n if (hasSuggestions) {\r\n const cmd = currentSuggestions[0]?.command;\r\n if (cmd && currentValue !== cmd && !currentValue.includes(' ')) {\r\n const noArgCmds = ['/clear', '/help', '/status', '/models', '/paste'];\r\n setValue(cmd + (noArgCmds.includes(cmd) ? '' : ' '));\r\n setSelectedIdx(0);\r\n return;\r\n }\r\n }\r\n\r\n if (text.trim()) {\r\n onSubmit(text.trim());\r\n setValue('');\r\n setSelectedIdx(0);\r\n }\r\n }, [isProcessing, onSubmit, tryPasteImage]);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n {showSuggestions && (\r\n <SuggestionBox suggestions={suggestions} selectedIdx={selectedIdx} />\r\n )}\r\n\r\n {imageAttached && (\r\n <Box paddingX={1} gap={1}>\r\n <Text color=\"green\" bold>[image 1]</Text>\r\n <Text dimColor>pasted — send a message to use it</Text>\r\n </Box>\r\n )}\r\n\r\n {pasteStatus === 'checking' && (\r\n <Box paddingX={1}>\r\n <Text color=\"yellow\">Checking clipboard...</Text>\r\n </Box>\r\n )}\r\n\r\n {pasteStatus === 'no_image' && (\r\n <Box paddingX={1}>\r\n <Text color=\"red\">No image found in clipboard. Copy an image first (screenshot, snipping tool, etc.)</Text>\r\n </Box>\r\n )}\r\n\r\n <Box borderStyle=\"single\" borderColor={isProcessing ? 'yellow' : imageAttached ? 'green' : 'cyan'} paddingX={1}>\r\n <Text color={isProcessing ? 'yellow' : 'cyan'} bold>\r\n {isProcessing ? '⟳ ' : imageAttached ? '📎 ' : '❯ '}\r\n </Text>\r\n {isProcessing ? (\r\n <Text dimColor>Processing...</Text>\r\n ) : (\r\n <TextInput\r\n value={value}\r\n onChange={handleChange}\r\n onSubmit={handleSubmit}\r\n placeholder={imageAttached ? 'Describe what you want (image attached)...' : placeholder}\r\n />\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\nconst CLASS_ICONS: Record<string, string> = {\r\n Workspace: '🌍',\r\n ServerScriptService: '⚙️',\r\n ReplicatedStorage: '📦',\r\n ReplicatedFirst: '🚀',\r\n StarterGui: '🖥️',\r\n StarterPack: '🎒',\r\n StarterPlayer: '🧑',\r\n Players: '👥',\r\n Lighting: '💡',\r\n SoundService: '🔊',\r\n Script: '📜',\r\n LocalScript: '📱',\r\n ModuleScript: '📘',\r\n Part: '🧱',\r\n Model: '📐',\r\n Folder: '📁',\r\n RemoteEvent: '📡',\r\n RemoteFunction: '📡',\r\n BindableEvent: '🔗',\r\n};\r\n\r\nfunction getIcon(className: string): string {\r\n return CLASS_ICONS[className] ?? '◇';\r\n}\r\n\r\ninterface ExplorerPaneProps {\r\n tree: ExplorerNode[];\r\n selectedPath?: string;\r\n maxDepth?: number;\r\n}\r\n\r\nconst TreeNode: React.FC<{\r\n node: ExplorerNode;\r\n depth: number;\r\n maxDepth: number;\r\n selectedPath?: string;\r\n}> = ({ node, depth, maxDepth, selectedPath }) => {\r\n const indent = ' '.repeat(depth);\r\n const isSelected = node.path === selectedPath;\r\n const hasChildren = node.children && node.children.length > 0;\r\n const icon = getIcon(node.className);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text>\r\n <Text dimColor>{indent}</Text>\r\n <Text>{hasChildren ? '▾ ' : ' '}</Text>\r\n <Text>{icon} </Text>\r\n <Text bold={isSelected} color={isSelected ? 'cyan' : undefined}>\r\n {node.name}\r\n </Text>\r\n <Text dimColor> ({node.className})</Text>\r\n </Text>\r\n {hasChildren &&\r\n depth < maxDepth &&\r\n node.children!.map((child, i) => (\r\n <TreeNode\r\n key={`${child.path}-${i}`}\r\n node={child}\r\n depth={depth + 1}\r\n maxDepth={maxDepth}\r\n selectedPath={selectedPath}\r\n />\r\n ))}\r\n </Box>\r\n );\r\n};\r\n\r\nexport const ExplorerPane: React.FC<ExplorerPaneProps> = React.memo(({\r\n tree,\r\n selectedPath,\r\n maxDepth = 4,\r\n}) => {\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n borderStyle=\"single\"\r\n borderColor=\"gray\"\r\n paddingX={1}\r\n width={36}\r\n minWidth={30}\r\n >\r\n <Text bold dimColor>\r\n Explorer\r\n </Text>\r\n {tree.length === 0 ? (\r\n <Text dimColor italic>\r\n Connect Studio plugin...\r\n </Text>\r\n ) : (\r\n tree.map((node, i) => (\r\n <TreeNode\r\n key={`${node.path}-${i}`}\r\n node={node}\r\n depth={0}\r\n maxDepth={maxDepth}\r\n selectedPath={selectedPath}\r\n />\r\n ))\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport Spinner from 'ink-spinner';\r\nimport type { ToolResult } from '../../tools/types.js';\r\n\r\nexport interface ToolCallEntry {\r\n name: string;\r\n args: Record<string, unknown>;\r\n result?: ToolResult;\r\n status: 'running' | 'done' | 'error';\r\n}\r\n\r\ninterface ToolCallViewProps {\r\n calls: ToolCallEntry[];\r\n}\r\n\r\nfunction summarizeArgs(args: Record<string, unknown>): string {\r\n const parts: string[] = [];\r\n for (const [key, value] of Object.entries(args)) {\r\n const str = typeof value === 'string' ? value : JSON.stringify(value);\r\n parts.push(`${key}=${str.length > 40 ? str.slice(0, 40) + '...' : str}`);\r\n }\r\n return parts.join(', ');\r\n}\r\n\r\nexport const ToolCallView: React.FC<ToolCallViewProps> = React.memo(({ calls }) => {\r\n if (calls.length === 0) return null;\r\n\r\n return (\r\n <Box flexDirection=\"column\" paddingX={1}>\r\n {calls.map((call, i) => (\r\n <Box key={i} gap={1}>\r\n {call.status === 'running' && (\r\n <Text color=\"yellow\">\r\n <Spinner type=\"dots\" />\r\n </Text>\r\n )}\r\n {call.status === 'done' && <Text color=\"green\">✔</Text>}\r\n {call.status === 'error' && <Text color=\"red\">✖</Text>}\r\n <Text color=\"yellow\" bold>\r\n {call.name}\r\n </Text>\r\n <Text dimColor>({summarizeArgs(call.args)})</Text>\r\n {call.result && !call.result.success && (\r\n <Text color=\"red\"> — {call.result.error}</Text>\r\n )}\r\n </Box>\r\n ))}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box } from 'ink';\r\nimport { StatusBar } from './StatusBar.js';\r\nimport { OutputPane, type OutputEntry } from './OutputPane.js';\r\nimport { ChatPane, type ChatEntry } from './ChatPane.js';\r\nimport { InputBar, type ImageAttachment } from './InputBar.js';\r\nimport { ExplorerPane } from './Explorer.js';\r\nimport { ToolCallView, type ToolCallEntry } from './ToolCallView.js';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\ninterface LayoutProps {\r\n connected: boolean;\r\n placeName?: string;\r\n model: string;\r\n chatEntries: ChatEntry[];\r\n outputEntries: OutputEntry[];\r\n explorerTree: ExplorerNode[];\r\n toolCalls: ToolCallEntry[];\r\n streaming?: string;\r\n isProcessing: boolean;\r\n onSubmit: (text: string, image?: ImageAttachment) => void;\r\n onImagePaste?: (image: ImageAttachment) => void;\r\n imageAttached?: boolean;\r\n onClearImage?: () => void;\r\n}\r\n\r\nexport const Layout: React.FC<LayoutProps> = React.memo(({\r\n connected,\r\n placeName,\r\n model,\r\n chatEntries,\r\n outputEntries,\r\n explorerTree,\r\n toolCalls,\r\n streaming,\r\n isProcessing,\r\n onSubmit,\r\n onImagePaste,\r\n imageAttached,\r\n onClearImage,\r\n}) => {\r\n return (\r\n <Box flexDirection=\"column\" width=\"100%\">\r\n <StatusBar connected={connected} placeName={placeName} model={model} />\r\n\r\n <Box flexGrow={1}>\r\n <ExplorerPane tree={explorerTree} />\r\n\r\n <Box flexDirection=\"column\" flexGrow={1}>\r\n <ChatPane entries={chatEntries} streaming={streaming} />\r\n {toolCalls.length > 0 && <ToolCallView calls={toolCalls} />}\r\n </Box>\r\n </Box>\r\n\r\n <OutputPane entries={outputEntries} maxLines={6} />\r\n <InputBar\r\n onSubmit={onSubmit}\r\n onImagePaste={onImagePaste}\r\n isProcessing={isProcessing}\r\n imageAttached={imageAttached}\r\n onClearImage={onClearImage}\r\n />\r\n </Box>\r\n );\r\n});\r\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { StudioBridge } from '../../transport/ws-server.js';\nimport type { ExplorerNode, OutputPayload, StudioConnectedPayload } from '../../transport/protocol.js';\nimport { StudioMsg } from '../../transport/protocol.js';\nimport type { OutputEntry } from '../components/OutputPane.js';\n\ninterface StudioState {\n connected: boolean;\n placeName?: string;\n placeId?: number;\n explorerTree: ExplorerNode[];\n outputLog: OutputEntry[];\n}\n\nexport function useStudio(server: StudioBridge) {\n const connInfo = server.getConnectionInfo();\n const [state, setState] = useState<StudioState>({\n connected: server.isConnected(),\n placeName: connInfo?.placeName,\n placeId: connInfo?.placeId,\n explorerTree: [],\n outputLog: [],\n });\n\n const stateRef = useRef(state);\n stateRef.current = state;\n\n useEffect(() => {\n // Sync initial state in case connection happened before mount\n if (server.isConnected() && !stateRef.current.connected) {\n const info = server.getConnectionInfo();\n setState((prev) => ({\n ...prev,\n connected: true,\n placeName: info?.placeName,\n placeId: info?.placeId,\n }));\n }\n\n const onConnected = (payload: StudioConnectedPayload) => {\n setState((prev) => ({\n ...prev,\n connected: true,\n placeName: payload.placeName ?? prev.placeName,\n placeId: payload.placeId ?? prev.placeId,\n }));\n };\n\n const onDisconnected = () => {\n setState((prev) => ({\n ...prev,\n connected: false,\n placeName: undefined,\n placeId: undefined,\n }));\n };\n\n const onExplorer = (payload: { tree: ExplorerNode[] }) => {\n setState((prev) => ({ ...prev, explorerTree: payload.tree ?? [] }));\n };\n\n const onOutput = (payload: OutputPayload) => {\n setState((prev) => ({\n ...prev,\n outputLog: [\n ...prev.outputLog.slice(-200),\n {\n message: payload.message,\n level: payload.level,\n timestamp: payload.timestamp ?? Date.now(),\n source: payload.source,\n },\n ],\n }));\n };\n\n const onError = (payload: OutputPayload) => {\n setState((prev) => ({\n ...prev,\n outputLog: [\n ...prev.outputLog.slice(-200),\n {\n message: payload.message,\n level: 'error',\n timestamp: payload.timestamp ?? Date.now(),\n source: payload.source,\n },\n ],\n }));\n };\n\n server.on('studio:connected', onConnected);\n server.on('studio:disconnected', onDisconnected);\n server.on(StudioMsg.EXPLORER, onExplorer);\n server.on(StudioMsg.OUTPUT, onOutput);\n server.on(StudioMsg.ERROR, onError);\n\n return () => {\n server.off('studio:connected', onConnected);\n server.off('studio:disconnected', onDisconnected);\n server.off(StudioMsg.EXPLORER, onExplorer);\n server.off(StudioMsg.OUTPUT, onOutput);\n server.off(StudioMsg.ERROR, onError);\n };\n }, [server]);\n\n const clearOutput = useCallback(() => {\n setState((prev) => ({ ...prev, outputLog: [] }));\n }, []);\n\n return { ...state, clearOutput };\n}\n","import React, { useState, useCallback, useRef } from 'react';\nimport { Box } from 'ink';\nimport { Welcome } from './ui/components/Welcome.js';\nimport { Setup } from './ui/components/Setup.js';\nimport { Layout } from './ui/components/Layout.js';\nimport { InputBar, type ImageAttachment } from './ui/components/InputBar.js';\nimport { useStudio } from './ui/hooks/useStudio.js';\nimport type { StudioBridge } from './transport/ws-server.js';\nimport type { AgentLoop } from './agent/loop.js';\nimport type { ChatEntry } from './ui/components/ChatPane.js';\nimport type { ToolCallEntry } from './ui/components/ToolCallView.js';\nimport { loadConfig, setConfigValue, PROVIDERS, resolveProviderSettings, type AIProviderType } from './config/config.js';\n\ninterface AppProps {\n server: StudioBridge;\n agent: AgentLoop | null;\n version: string;\n}\n\nexport const App: React.FC<AppProps> = ({ server, agent: initialAgent, version }) => {\n const [showWelcome, setShowWelcome] = useState(true);\n const [chatEntries, setChatEntries] = useState<ChatEntry[]>([]);\n const [toolCalls, setToolCalls] = useState<ToolCallEntry[]>([]);\n const [streaming, setStreaming] = useState('');\n const [isProcessing, setIsProcessing] = useState(false);\n const [agent, setAgent] = useState(initialAgent);\n\n const studio = useStudio(server);\n const config = loadConfig();\n const hasApiKey = !!config.apiKey;\n const [needsSetup, setNeedsSetup] = useState(!hasApiKey);\n const [pendingImage, setPendingImage] = useState<ImageAttachment | null>(null);\n const pendingImageRef = useRef<ImageAttachment | null>(null);\n\n const handleImagePaste = useCallback((image: ImageAttachment) => {\n setPendingImage(image);\n pendingImageRef.current = image;\n }, []);\n\n const handleClearImage = useCallback(() => {\n setPendingImage(null);\n pendingImageRef.current = null;\n }, []);\n\n const handleSetupComplete = useCallback((provider: AIProviderType, apiKey: string) => {\n setConfigValue('provider', provider);\n setConfigValue('apiKey', apiKey);\n const providerInfo = PROVIDERS[provider];\n setConfigValue('apiBaseUrl', providerInfo.baseUrl);\n setConfigValue('model', providerInfo.defaultModel);\n setNeedsSetup(false);\n }, []);\n\n const addSystemMessage = useCallback((content: string) => {\n setChatEntries((prev) => [\n ...prev,\n { role: 'system' as const, content, timestamp: Date.now() },\n ]);\n }, []);\n\n const handleCommand = useCallback(\n (text: string): boolean => {\n const input = text.startsWith('/') ? text.slice(1) : text;\n const [cmd, ...args] = input.split(' ');\n const arg = args.join(' ');\n const lowerCmd = cmd.toLowerCase();\n\n const currentModel = agent?.getModel() ?? resolveProviderSettings(config).model;\n const providerName = PROVIDERS[config.provider]?.name ?? config.provider;\n const keyStatus = config.apiKey\n ? `${config.apiKey.slice(0, 6)}...${config.apiKey.slice(-4)}`\n : 'NOT SET';\n\n switch (lowerCmd) {\n case 'help':\n case 'h':\n case '?':\n addSystemMessage([\n '── Your Config ─────────────────────────────',\n ` Provider: ${providerName}`,\n ` Model: ${currentModel}`,\n ` API Key: ${keyStatus}`,\n ` Studio: ${studio.connected ? '● Connected' + (studio.placeName ? ` (${studio.placeName})` : '') : '○ Disconnected'}`,\n '',\n '── Commands ────────────────────────────────',\n ' /help Show this help',\n ' /model <name> Switch AI model',\n ' /models List available models',\n ' /status Connection status',\n ' /clear Clear chat history',\n '',\n '── Setup (run in your terminal) ────────────',\n ' dominus config set provider <name>',\n ' Providers: openai, anthropic, gemini, xai, openrouter',\n ' dominus config set apiKey <key>',\n ' dominus config list',\n ' dominus install-plugin',\n ' dominus mcp-install',\n '',\n 'Or just type a message to chat with Dominus!',\n ].join('\\n'));\n return true;\n\n case 'clear':\n agent?.clearHistory();\n setChatEntries([]);\n setToolCalls([]);\n return true;\n\n case 'model':\n if (arg && agent) {\n agent.setModel(arg);\n addSystemMessage(`Model switched to: ${arg}`);\n } else {\n addSystemMessage('Usage: /model <model-name>');\n }\n return true;\n\n case 'models': {\n if (!agent) {\n addSystemMessage('No API key configured — cannot fetch models.');\n return true;\n }\n addSystemMessage(`Fetching models from ${providerName}...`);\n agent.listModels().then((models) => {\n if (models.length === 0) {\n addSystemMessage('Could not fetch models. Check your API key.');\n return;\n }\n const lines = models.slice(0, 40).map((m) => ` ${m.id}`);\n addSystemMessage([\n `── ${providerName} Models (${models.length} total) ──`,\n ...lines,\n models.length > 40 ? ` ... and ${models.length - 40} more` : '',\n '',\n ` Current: ${currentModel}`,\n ' Switch with: /model <name>',\n ].join('\\n'));\n });\n return true;\n }\n\n case 'status':\n addSystemMessage([\n '── Status ──────────────────────────────────',\n ` Provider: ${providerName}`,\n ` Model: ${currentModel}`,\n ` API Key: ${keyStatus}`,\n ` Port: ${server.getPort()}`,\n ` Studio: ${studio.connected ? '● Connected' + (studio.placeName ? ` (${studio.placeName})` : '') : '○ Disconnected'}`,\n ].join('\\n'));\n return true;\n\n default:\n return false;\n }\n },\n [agent, studio, server, config, addSystemMessage],\n );\n\n const handleSubmit = useCallback(\n async (text: string) => {\n if (isProcessing) return;\n\n // Check for commands first (with or without /)\n // /paste is handled directly by InputBar, skip it here\n if (text.trim().toLowerCase() === '/paste' || text.trim().toLowerCase() === 'paste') return;\n\n const isCommand = text.startsWith('/') || ['help', 'h', '?', 'clear', 'model', 'models', 'status'].includes(text.split(' ')[0].toLowerCase());\n if (isCommand) {\n setShowWelcome(false);\n handleCommand(text);\n return;\n }\n\n // Dismiss welcome for regular messages\n setShowWelcome(false);\n\n if (!agent) {\n setChatEntries((prev) => [\n ...prev,\n { role: 'user', content: text, timestamp: Date.now() },\n {\n role: 'error',\n content: 'No API key configured. Set OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, or XAI_API_KEY — or run: dominus config set apiKey <key>',\n timestamp: Date.now(),\n },\n ]);\n return;\n }\n\n // Grab and clear any pending image\n const image = pendingImageRef.current;\n setPendingImage(null);\n pendingImageRef.current = null;\n\n setIsProcessing(true);\n setToolCalls([]);\n\n const displayText = image ? `${text}\\n[image 1]` : text;\n setChatEntries((prev) => [\n ...prev,\n { role: 'user', content: displayText, timestamp: Date.now() },\n ]);\n\n let fullText = '';\n\n try {\n for await (const event of agent.run(text, image ? { base64: image.base64, mimeType: image.mimeType } : undefined)) {\n switch (event.type) {\n case 'text':\n fullText += event.content;\n setStreaming(fullText);\n break;\n\n case 'tool_call':\n setToolCalls((prev) => [\n ...prev,\n { name: event.tool, args: event.args, status: 'running' },\n ]);\n break;\n\n case 'tool_result':\n setToolCalls((prev) =>\n prev.map((tc) =>\n tc.name === event.tool && tc.status === 'running'\n ? { ...tc, status: event.result.success ? 'done' : 'error', result: event.result }\n : tc,\n ),\n );\n break;\n\n case 'error':\n setChatEntries((prev) => [\n ...prev,\n { role: 'error', content: event.message, timestamp: Date.now() },\n ]);\n break;\n }\n }\n\n if (fullText) {\n setChatEntries((prev) => [\n ...prev,\n { role: 'assistant', content: fullText, timestamp: Date.now() },\n ]);\n }\n } catch (err) {\n setChatEntries((prev) => [\n ...prev,\n {\n role: 'error',\n content: err instanceof Error ? err.message : String(err),\n timestamp: Date.now(),\n },\n ]);\n } finally {\n setIsProcessing(false);\n setStreaming('');\n setToolCalls([]);\n }\n },\n [agent, isProcessing, handleCommand],\n );\n\n if (needsSetup) {\n return <Setup onComplete={handleSetupComplete} />;\n }\n\n if (showWelcome) {\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n <Welcome\n userName={config.userName}\n version={version}\n model={resolveProviderSettings(config).model}\n provider={PROVIDERS[config.provider]?.name ?? config.provider}\n port={server.getPort()}\n hasApiKey={hasApiKey}\n connected={studio.connected}\n cwd={process.cwd()}\n />\n <InputBar\n onSubmit={handleSubmit}\n onImagePaste={handleImagePaste}\n isProcessing={false}\n imageAttached={!!pendingImage}\n onClearImage={handleClearImage}\n placeholder={\n hasApiKey\n ? 'Type a message to begin, or Ctrl+V to paste an image...'\n : 'Set up your API key to get started, or type /help...'\n }\n />\n </Box>\n );\n }\n\n return (\n <Layout\n connected={studio.connected}\n placeName={studio.placeName}\n model={agent?.getModel() ?? resolveProviderSettings(config).model}\n chatEntries={chatEntries}\n outputEntries={studio.outputLog}\n explorerTree={studio.explorerTree}\n toolCalls={toolCalls}\n streaming={streaming || undefined}\n isProcessing={isProcessing}\n onSubmit={handleSubmit}\n onImagePaste={handleImagePaste}\n imageAttached={!!pendingImage}\n onClearImage={handleClearImage}\n />\n );\n};\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { App } from './app.js';\nimport { DominusServer, type StudioBridge } from './transport/ws-server.js';\nimport { DominusClient, isPortInUse } from './transport/ws-client.js';\nimport { AgentLoop } from './agent/loop.js';\nimport { ToolRegistry, createDefaultRegistry } from './tools/registry.js';\nimport { initMemoryStore, closeMemoryStore } from './memory/store.js';\nimport {\n loadConfig,\n setConfigValue,\n getConfigValue,\n loadRules,\n saveRules,\n getDominusDir,\n detectProviderFromEnv,\n PROVIDERS,\n type DominusConfig,\n type AIProviderType,\n} from './config/config.js';\nimport { checkForUpdate, formatUpdateMessage, autoUpdate } from './utils/update-checker.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst VERSION = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf-8')).version;\n\nconst program = new Command();\n\nprogram\n .name('dominus')\n .description('AI-powered autonomous agent for Roblox Studio development')\n .version(VERSION);\n\n// Main start command (default)\nprogram\n .command('start', { isDefault: true })\n .description('Launch the Dominus TUI agent')\n .option('-p, --port <port>', 'WebSocket server port', '18088')\n .action(async (opts) => {\n const config = loadConfig();\n const port = parseInt(opts.port) || config.port;\n\n // Auto-detect API key from environment variables\n if (!config.apiKey) {\n const detected = detectProviderFromEnv();\n if (detected) {\n setConfigValue('provider', detected.provider);\n setConfigValue('apiKey', detected.apiKey);\n }\n }\n\n // Auto-detect user name\n if (config.userName === 'Developer') {\n const envUser = process.env.USER || process.env.USERNAME || 'Developer';\n const firstName = envUser.split(' ')[0];\n if (firstName && firstName !== 'Developer') {\n setConfigValue('userName', firstName);\n }\n }\n\n checkForUpdate(VERSION).then((info) => {\n if (info) process.stderr.write(formatUpdateMessage(info));\n }).catch(() => {});\n\n await launchApp(port);\n });\n\n// Config commands\nconst configCmd = program.command('config').description('Manage Dominus configuration');\n\nconfigCmd\n .command('set <key> <value>')\n .description('Set a config value')\n .action((key: string, value: string) => {\n const numericKeys = ['port', 'maxToolIterations', 'maxVerifyRetries', 'tokenBudget'];\n const booleanKeys = ['autoIndex', 'autoLearn'];\n const validProviders = ['openai', 'anthropic', 'gemini', 'xai', 'openrouter', 'custom'];\n\n let parsed: unknown = value;\n if (numericKeys.includes(key)) {\n parsed = parseInt(value);\n } else if (booleanKeys.includes(key)) {\n parsed = value === 'true';\n } else if (key === 'provider') {\n if (!validProviders.includes(value)) {\n console.log(` ✖ Invalid provider: ${value}`);\n console.log(` Valid providers: ${validProviders.join(', ')}`);\n return;\n }\n // When changing provider, also update model and base URL defaults\n const providerInfo = PROVIDERS[value as AIProviderType];\n setConfigValue('apiBaseUrl', providerInfo.baseUrl);\n setConfigValue('model', providerInfo.defaultModel);\n }\n\n setConfigValue(key as keyof DominusConfig, parsed as DominusConfig[keyof DominusConfig]);\n console.log(` ✔ Set ${key} = ${value}`);\n if (key === 'provider') {\n const p = PROVIDERS[value as AIProviderType];\n console.log(` → Base URL: ${p.baseUrl}`);\n console.log(` → Default model: ${p.defaultModel}`);\n }\n console.log(` Config stored at: ${getDominusDir()}/config.json`);\n });\n\nconfigCmd\n .command('get <key>')\n .description('Get a config value')\n .action((key: string) => {\n const value = getConfigValue(key as keyof DominusConfig);\n if (key.toLowerCase().includes('key') && typeof value === 'string') {\n console.log(` ${key} = ${value.slice(0, 8)}...${value.slice(-4)}`);\n } else {\n console.log(` ${key} = ${JSON.stringify(value)}`);\n }\n });\n\nconfigCmd\n .command('list')\n .description('List all config values')\n .action(() => {\n const config = loadConfig();\n console.log('');\n console.log(' Dominus Configuration:');\n console.log(' ─────────────────────');\n for (const [key, value] of Object.entries(config)) {\n const display =\n key.toLowerCase().includes('key') && typeof value === 'string' && value.length > 12\n ? `${value.slice(0, 8)}...${value.slice(-4)}`\n : JSON.stringify(value);\n console.log(` ${key}: ${display}`);\n }\n console.log('');\n console.log(` Config file: ${getDominusDir()}/config.json`);\n console.log('');\n });\n\n// Rules commands\nconst rulesCmd = program.command('rules').description('Manage agent rules (do/don\\'t)');\n\nrulesCmd\n .command('add-do <rule>')\n .description('Add a rule for things Dominus should do')\n .action((rule: string) => {\n const rules = loadRules();\n rules.do.push(rule);\n saveRules(rules);\n console.log(` ✔ Added DO rule: ${rule}`);\n });\n\nrulesCmd\n .command('add-dont <rule>')\n .description('Add a rule for things Dominus should NOT do')\n .action((rule: string) => {\n const rules = loadRules();\n rules.dont.push(rule);\n saveRules(rules);\n console.log(` ✔ Added DON'T rule: ${rule}`);\n });\n\nrulesCmd\n .command('list')\n .description('List all rules')\n .action(() => {\n const rules = loadRules();\n console.log('');\n console.log(' Dominus Rules:');\n if (rules.do.length) {\n console.log(' DO:');\n rules.do.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (rules.dont.length) {\n console.log(\" DON'T:\");\n rules.dont.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (rules.conventions.length) {\n console.log(' CONVENTIONS:');\n rules.conventions.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (!rules.do.length && !rules.dont.length && !rules.conventions.length) {\n console.log(' No rules configured yet.');\n console.log(' Use: dominus rules add-do \"Always use strict typing\"');\n console.log(' Use: dominus rules add-dont \"Never use deprecated APIs\"');\n }\n console.log('');\n });\n\n// Plugin install command\nprogram\n .command('update')\n .description('Auto-update Dominus to the latest version')\n .action(async () => {\n console.log(` Current version: ${VERSION}`);\n console.log(' Checking for updates...');\n\n const result = await autoUpdate(VERSION);\n if (result.from === result.to && result.success) {\n console.log(' Already on the latest version.');\n return;\n }\n if (result.success) {\n console.log(` ✔ Updated: ${result.from} → ${result.to}`);\n console.log(' Restart dominus to use the new version.');\n } else {\n console.error(` ✘ Update failed: ${result.error}`);\n }\n });\n\nprogram\n .command('install-plugin')\n .description('Build & install the Dominus plugin into Roblox Studio')\n .action(async () => {\n const { execSync } = await import('node:child_process');\n\n const packageRoot = path.resolve(import.meta.dirname ?? __dirname, '..');\n const pluginDir = path.join(packageRoot, 'plugin');\n const pluginProject = path.join(pluginDir, 'default.project.json');\n const studioPlugins = path.join(\n os.homedir(),\n 'AppData',\n 'Local',\n 'Roblox',\n 'Plugins',\n );\n const destFile = path.join(studioPlugins, 'Dominus.rbxm');\n\n if (!fs.existsSync(pluginProject)) {\n console.log(' ✖ Plugin source not found.');\n console.log(` Expected at: ${pluginDir}`);\n return;\n }\n\n if (!fs.existsSync(studioPlugins)) {\n fs.mkdirSync(studioPlugins, { recursive: true });\n }\n\n // Try building with Rojo\n let rojoAvailable = false;\n try {\n execSync('rojo --version', { stdio: 'pipe' });\n rojoAvailable = true;\n } catch {\n // Rojo not installed\n }\n\n if (rojoAvailable) {\n try {\n console.log(' Building plugin with Rojo...');\n execSync(`rojo build \"${pluginDir}\" -o \"${destFile}\"`, { stdio: 'pipe' });\n console.log(` ✔ Plugin built and installed to: ${destFile}`);\n console.log(' Restart Roblox Studio to load the plugin.');\n } catch (err) {\n console.log(` ✖ Rojo build failed: ${err instanceof Error ? err.message : err}`);\n }\n } else {\n // Fallback: build a simple .rbxmx (XML model) that Studio can load\n console.log(' Rojo not found — building plugin manually...');\n buildPluginXml(pluginDir, destFile.replace('.rbxm', '.rbxmx'));\n }\n });\n\n// MCP server command\nprogram\n .command('mcp')\n .description('Start the Dominus MCP server (for Cursor, Claude Desktop, etc.)')\n .option('-p, --port <port>', 'WebSocket server port for Studio connection', '18088')\n .action(async () => {\n const { startMcpServer } = await import('./mcp/server.js');\n await startMcpServer();\n });\n\n// MCP install — auto-write config into supported editors\ninterface McpTarget {\n name: string;\n configPath: string;\n keyPath: string[];\n}\n\nfunction getMcpTargets(): McpTarget[] {\n const home = os.homedir();\n const appData = process.env.APPDATA || path.join(home, 'AppData', 'Roaming');\n const localAppData = process.env.LOCALAPPDATA || path.join(home, 'AppData', 'Local');\n const cwd = process.cwd();\n\n return [\n {\n name: 'Cursor (project)',\n configPath: path.join(cwd, '.cursor', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Cursor (global)',\n configPath: path.join(home, '.cursor', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Claude Desktop',\n configPath: path.join(appData, 'Claude', 'claude_desktop_config.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Claude Code',\n configPath: path.join(home, '.claude.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Windsurf (project)',\n configPath: path.join(cwd, '.windsurf', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Windsurf (global)',\n configPath: path.join(home, '.codeium', 'windsurf', 'mcp_config.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'VS Code (project)',\n configPath: path.join(cwd, '.vscode', 'mcp.json'),\n keyPath: ['servers'],\n },\n {\n name: 'VS Code (global)',\n configPath: path.join(localAppData, 'Code', 'User', 'settings.json'),\n keyPath: ['mcp', 'servers'],\n },\n ];\n}\n\nconst dominusEntry = {\n command: 'dominus',\n args: ['mcp'],\n type: 'stdio',\n};\n\nfunction injectMcpConfig(target: McpTarget): { status: 'installed' | 'already' | 'created' } {\n let config: Record<string, unknown> = {};\n if (fs.existsSync(target.configPath)) {\n try {\n config = JSON.parse(fs.readFileSync(target.configPath, 'utf-8'));\n } catch {\n config = {};\n }\n }\n\n // Navigate to the nested key, creating objects along the way\n let obj = config as Record<string, unknown>;\n for (const key of target.keyPath) {\n if (!obj[key] || typeof obj[key] !== 'object') {\n obj[key] = {};\n }\n obj = obj[key] as Record<string, unknown>;\n }\n\n if (obj['dominus']) {\n return { status: 'already' };\n }\n\n obj['dominus'] = { ...dominusEntry };\n\n const dir = path.dirname(target.configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(target.configPath, JSON.stringify(config, null, 2), 'utf-8');\n\n return { status: fs.existsSync(target.configPath) ? 'installed' : 'created' };\n}\n\nprogram\n .command('mcp-install')\n .description('Auto-install Dominus MCP into Cursor, VS Code, Claude Desktop, Windsurf, etc.')\n .option('-a, --all', 'Install to all detected editors')\n .action(async (opts) => {\n const targets = getMcpTargets();\n\n console.log('');\n console.log(' Dominus MCP Auto-Installer');\n console.log(' ═════════════════════════');\n console.log('');\n\n if (opts.all) {\n for (const target of targets) {\n const result = injectMcpConfig(target);\n const icon = result.status === 'already' ? '●' : '✔';\n const msg = result.status === 'already' ? 'already configured' : 'installed';\n console.log(` ${icon} ${target.name}: ${msg}`);\n }\n console.log('');\n console.log(' Restart your editors to load the Dominus MCP server.');\n console.log('');\n return;\n }\n\n // Interactive: show which editors are detected\n const detected: { target: McpTarget; exists: boolean }[] = targets.map((t) => ({\n target: t,\n exists: fs.existsSync(path.dirname(t.configPath)),\n }));\n\n const toInstall = detected.filter((d) => d.exists);\n\n if (toInstall.length === 0) {\n console.log(' No supported editors detected.');\n console.log(' Run with --all to install configs anyway,');\n console.log(' or manually add to your editor\\'s MCP config:');\n console.log('');\n console.log(' {');\n console.log(' \"dominus\": {');\n console.log(' \"command\": \"dominus\",');\n console.log(' \"args\": [\"mcp\"]');\n console.log(' }');\n console.log(' }');\n console.log('');\n return;\n }\n\n console.log(' Detected editors:');\n console.log('');\n\n for (const { target } of toInstall) {\n const result = injectMcpConfig(target);\n const icon = result.status === 'already' ? '●' : '✔';\n const msg = result.status === 'already' ? 'already configured' : 'installed';\n console.log(` ${icon} ${target.name}: ${msg}`);\n console.log(` ${target.configPath}`);\n }\n\n const skipped = detected.filter((d) => !d.exists);\n if (skipped.length > 0) {\n console.log('');\n console.log(' Skipped (not detected):');\n for (const { target } of skipped) {\n console.log(` ○ ${target.name}`);\n }\n }\n\n console.log('');\n console.log(' Provides 14 Roblox Studio tools to your AI editor.');\n console.log(' Restart your editors to load the Dominus MCP server.');\n console.log('');\n });\n\n// MCP setup helper (print-only)\nprogram\n .command('mcp-setup')\n .description('Print MCP configuration for manual setup')\n .action(() => {\n console.log('');\n console.log(' Dominus MCP — Manual Setup');\n console.log(' ═════════════════════════');\n console.log('');\n console.log(' Tip: Run `dominus mcp-install` to auto-install instead!');\n console.log('');\n console.log(' Add this to your editor\\'s MCP config:');\n console.log('');\n console.log(' {');\n console.log(' \"dominus\": {');\n console.log(' \"command\": \"dominus\",');\n console.log(' \"args\": [\"mcp\"]');\n console.log(' }');\n console.log(' }');\n console.log('');\n console.log(' Config file locations:');\n console.log('');\n console.log(' Cursor (project) .cursor/mcp.json');\n console.log(' Cursor (global) ~/.cursor/mcp.json');\n console.log(' Claude Desktop %APPDATA%/Claude/claude_desktop_config.json');\n console.log(' Claude Code ~/.claude.json');\n console.log(' Windsurf (project) .windsurf/mcp.json');\n console.log(' Windsurf (global) ~/.codeium/windsurf/mcp_config.json');\n console.log(' VS Code (project) .vscode/mcp.json');\n console.log(' VS Code (global) %LOCALAPPDATA%/Code/User/settings.json');\n console.log('');\n console.log(' 14 tools: read_script, edit_script, run_code, get_explorer,');\n console.log(' get_properties, set_properties, insert_instance, delete_instance,');\n console.log(' get_selection, search_scripts, get_output, run_tests,');\n console.log(' recall_memory, remember');\n console.log('');\n });\n\nfunction buildPluginXml(pluginDir: string, destFile: string): void {\n const srcDir = path.join(pluginDir, 'src');\n if (!fs.existsSync(srcDir)) {\n console.log(` ✖ Plugin source directory not found: ${srcDir}`);\n return;\n }\n\n const files = fs.readdirSync(srcDir).filter((f) => f.endsWith('.lua'));\n const mainFile = files.find((f) => f === 'init.server.lua');\n const moduleFiles = files.filter((f) => f !== 'init.server.lua');\n\n if (!mainFile) {\n console.log(' ✖ init.server.lua not found in plugin source');\n return;\n }\n\n const escapeXml = (s: string) =>\n s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n\n const mainSource = fs.readFileSync(path.join(srcDir, mainFile), 'utf-8');\n\n let moduleItems = '';\n for (const mf of moduleFiles) {\n const modName = mf.replace('.lua', '');\n const modSource = fs.readFileSync(path.join(srcDir, mf), 'utf-8');\n moduleItems += `\n <Item class=\"ModuleScript\" referent=\"${modName}\">\n <Properties>\n <string name=\"Name\">${modName}</string>\n <ProtectedString name=\"Source\"><![CDATA[${modSource}]]></ProtectedString>\n </Properties>\n </Item>`;\n }\n\n const rbxmx = `<roblox version=\"4\">\n <Item class=\"Script\" referent=\"Dominus\">\n <Properties>\n <string name=\"Name\">Dominus</string>\n <ProtectedString name=\"Source\"><![CDATA[${mainSource}]]></ProtectedString>\n <token name=\"RunContext\">1</token>\n </Properties>${moduleItems}\n </Item>\n</roblox>`;\n\n fs.writeFileSync(destFile, rbxmx, 'utf-8');\n console.log(` ✔ Plugin installed to: ${destFile}`);\n console.log(' Restart Roblox Studio to load the plugin.');\n}\n\nasync function launchApp(port: number): Promise<void> {\n await initMemoryStore();\n\n let server: StudioBridge;\n\n const portTaken = await isPortInUse(port);\n if (portTaken) {\n // Another Dominus instance (MCP) already owns the port — connect as relay\n const client = new DominusClient(port);\n await client.connect();\n server = client;\n } else {\n const srv = new DominusServer(port);\n await srv.start();\n server = srv;\n }\n\n const config = loadConfig();\n let agent: AgentLoop | null = null;\n\n if (config.apiKey) {\n const tools = createDefaultRegistry();\n await new Promise((r) => setTimeout(r, 100));\n agent = new AgentLoop(server, tools);\n }\n\n const { waitUntilExit } = render(\n <App server={server} agent={agent} version={VERSION} />,\n );\n\n const cleanup = async () => {\n closeMemoryStore();\n await server.stop();\n };\n\n process.on('SIGINT', async () => {\n await cleanup();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n await cleanup();\n process.exit(0);\n });\n\n await waitUntilExit();\n await cleanup();\n}\n\nprogram.parse();\n","import OpenAI from 'openai';\nimport { type DominusConfig, resolveProviderSettings, PROVIDERS } from '../config/config.js';\nimport type { Tool, ToolCall } from '../tools/types.js';\n\nexport interface AIResponse {\n content: string | null;\n toolCalls: ToolCall[];\n finishReason: string;\n usage?: { promptTokens: number; completionTokens: number; totalTokens: number };\n}\n\nexport interface StreamChunk {\n type: 'text' | 'tool_call_start' | 'tool_call_delta' | 'tool_call_end' | 'done';\n content?: string;\n toolCall?: Partial<ToolCall>;\n}\n\nexport class AIProvider {\n private client: OpenAI;\n private model: string;\n private providerName: string;\n\n constructor(config: DominusConfig) {\n if (!config.apiKey) {\n throw new Error('API key not configured. Run: dominus config set apiKey <your-key>');\n }\n\n const { baseUrl, model } = resolveProviderSettings(config);\n this.providerName = PROVIDERS[config.provider]?.name ?? config.provider;\n\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: baseUrl,\n });\n this.model = model;\n }\n\n setModel(model: string): void {\n this.model = model;\n }\n\n getModel(): string {\n return this.model;\n }\n\n getProviderName(): string {\n return this.providerName;\n }\n\n async listModels(): Promise<{ id: string; owned_by?: string }[]> {\n try {\n const list = await this.client.models.list();\n const models: { id: string; owned_by?: string }[] = [];\n for await (const m of list) {\n models.push({ id: m.id, owned_by: m.owned_by });\n }\n models.sort((a, b) => a.id.localeCompare(b.id));\n return models;\n } catch {\n return [];\n }\n }\n\n async chat(\n messages: OpenAI.ChatCompletionMessageParam[],\n tools?: Tool[],\n ): Promise<AIResponse> {\n const openAITools = tools?.map(toolToOpenAI);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n tools: openAITools?.length ? openAITools : undefined,\n temperature: 0.3,\n });\n\n const choice = response.choices[0];\n if (!choice) throw new Error('No response from AI');\n\n const toolCalls: ToolCall[] = (choice.message.tool_calls ?? []).map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n }));\n\n return {\n content: choice.message.content,\n toolCalls,\n finishReason: choice.finish_reason ?? 'stop',\n usage: response.usage\n ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n };\n }\n\n async *streamChat(\n messages: OpenAI.ChatCompletionMessageParam[],\n tools?: Tool[],\n ): AsyncGenerator<StreamChunk> {\n const openAITools = tools?.map(toolToOpenAI);\n\n const stream = await this.client.chat.completions.create({\n model: this.model,\n messages,\n tools: openAITools?.length ? openAITools : undefined,\n temperature: 0.3,\n stream: true,\n });\n\n const toolCallBuffers = new Map<number, { id: string; name: string; args: string }>();\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n if (delta.content) {\n yield { type: 'text', content: delta.content };\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (!toolCallBuffers.has(tc.index)) {\n toolCallBuffers.set(tc.index, {\n id: tc.id ?? '',\n name: tc.function?.name ?? '',\n args: '',\n });\n if (tc.function?.name) {\n yield {\n type: 'tool_call_start',\n toolCall: { id: tc.id, name: tc.function.name },\n };\n }\n }\n\n const buffer = toolCallBuffers.get(tc.index)!;\n if (tc.id) buffer.id = tc.id;\n if (tc.function?.name) buffer.name = tc.function.name;\n if (tc.function?.arguments) {\n buffer.args += tc.function.arguments;\n yield {\n type: 'tool_call_delta',\n content: tc.function.arguments,\n toolCall: { id: buffer.id, name: buffer.name },\n };\n }\n }\n }\n\n if (chunk.choices[0]?.finish_reason === 'tool_calls') {\n for (const [, buffer] of toolCallBuffers) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(buffer.args);\n } catch {\n /* empty args */\n }\n yield {\n type: 'tool_call_end',\n toolCall: { id: buffer.id, name: buffer.name, arguments: args },\n };\n }\n toolCallBuffers.clear();\n }\n }\n\n yield { type: 'done' };\n }\n}\n\nfunction toolToOpenAI(tool: Tool): OpenAI.ChatCompletionTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters as unknown as Record<string, unknown>,\n },\n };\n}\n","import type { DominusRules } from '../config/config.js';\r\nimport type { Fact } from '../memory/types.js';\r\nimport { INTERNAL_MEMORY } from './internal-memory.js';\r\n\r\nexport function buildSystemPrompt(opts: {\r\n userName: string;\r\n connected: boolean;\r\n placeName?: string;\r\n placeId?: number;\r\n scriptIndex?: { path: string; summary?: string; className: string }[];\r\n facts?: Fact[];\r\n rules?: DominusRules;\r\n}): string {\r\n const parts: string[] = [];\r\n\r\n parts.push(`You are Dominus, an expert AI agent for Roblox Studio development.\r\nYou assist ${opts.userName} with building, debugging, and refactoring Roblox experiences.\r\n\r\nYou are deeply knowledgeable about:\r\n- Luau (Roblox's programming language): syntax, idioms, metatables, type annotations, coroutines\r\n- Roblox Engine API: all services (Players, Workspace, DataStoreService, ReplicatedStorage, etc.)\r\n- Roblox architecture patterns: client-server model, remotes, replication, DataStores\r\n- Common frameworks: Knit, ProfileService, Rodux, Roact, Fusion\r\n- Studio workflows: plugins, packages, team collaboration, testing\r\n- Performance: memory management, heartbeat optimization, streaming, LOD\r\n\r\nYou have direct access to Roblox Studio through tools. You can read/edit scripts, run code, browse the explorer tree, manage instances, and run tests -- all in real-time via WebSocket.\r\n\r\n## CRITICAL: NEVER use run_code for tasks that have a dedicated tool\r\nrun_code is a LAST RESORT. You have 30+ specialized tools — use them.\r\n- Reading properties → get_properties, get_descendants_properties\r\n- Inspecting selection → inspect_selection (ONE call returns paths + properties)\r\n- Inspecting an instance → inspect_instance (ONE call returns properties + children)\r\n- Converting UI to code → convert_ui_to_code (ONE call serializes + generates component)\r\n- Creating parts → create_part, build_multiple\r\n- Creating UI → create_ui\r\n- Modifying properties → set_properties, bulk_set_properties\r\n- Browsing the tree → get_explorer\r\n- Reading/editing scripts → read_script, edit_script\r\n- Serializing UI → serialize_ui\r\nOnly use run_code for: procedural generation, terrain algorithms, raycasting, physics queries, or other logic that no tool covers.\r\n\r\nWhen the user asks you to do something, you should:\r\n1. Use your tools to gather context (read scripts, check explorer, recall memory)\r\n2. Plan your approach for complex tasks\r\n3. Execute changes using the appropriate dedicated tools (NOT run_code unless truly necessary)\r\n4. Verify your changes worked (read back, check output for errors)\r\n5. Remember important facts for future sessions`);\r\n\r\n // Connection status\r\n if (opts.connected) {\r\n parts.push(`\\n## Current Session\r\n- Studio: CONNECTED${opts.placeName ? ` (${opts.placeName})` : ''}${opts.placeId ? ` [PlaceID: ${opts.placeId}]` : ''}\r\n- You can use all Studio tools.`);\r\n } else {\r\n parts.push(`\\n## Current Session\r\n- Studio: NOT CONNECTED\r\n- You cannot use Studio tools until the plugin connects.\r\n- You can still use memory tools and answer Roblox questions.`);\r\n }\r\n\r\n // Project index\r\n if (opts.scriptIndex?.length) {\r\n parts.push('\\n## Project Scripts');\r\n const lines = opts.scriptIndex.map(\r\n (s) => `- ${s.path} (${s.className})${s.summary ? `: ${s.summary}` : ''}`,\r\n );\r\n if (lines.length > 40) {\r\n parts.push(lines.slice(0, 40).join('\\n'));\r\n parts.push(`... and ${lines.length - 40} more scripts`);\r\n } else {\r\n parts.push(lines.join('\\n'));\r\n }\r\n }\r\n\r\n // Recalled facts\r\n if (opts.facts?.length) {\r\n parts.push('\\n## Remembered Context');\r\n for (const fact of opts.facts.slice(0, 20)) {\r\n parts.push(`- [${fact.category}] ${fact.content}`);\r\n }\r\n }\r\n\r\n // User rules\r\n if (opts.rules) {\r\n if (opts.rules.do.length > 0) {\r\n parts.push('\\n## Rules: DO');\r\n for (const rule of opts.rules.do) {\r\n parts.push(`- ${rule}`);\r\n }\r\n }\r\n if (opts.rules.dont.length > 0) {\r\n parts.push('\\n## Rules: DO NOT');\r\n for (const rule of opts.rules.dont) {\r\n parts.push(`- ${rule}`);\r\n }\r\n }\r\n if (opts.rules.conventions.length > 0) {\r\n parts.push('\\n## Coding Conventions');\r\n for (const conv of opts.rules.conventions) {\r\n parts.push(`- ${conv}`);\r\n }\r\n }\r\n if (opts.rules.context) {\r\n parts.push(`\\n## Project Context\\n${opts.rules.context}`);\r\n }\r\n }\r\n\r\n parts.push(`\\n## Tool Usage Guidelines\r\n- Always verify your work: after editing a script, read it back to confirm.\r\n- After running code, check the output for errors.\r\n- Use remember to store important facts you discover about the project.\r\n- Use recall_memory before complex tasks to check if you already know relevant context.\r\n- When searching scripts, be specific with your query terms.\r\n- For multi-step changes, explain your plan before executing.\r\n\r\n## Building & Construction\r\nWhen the user asks you to build or create objects (parts, trees, houses, terrain, etc.):\r\n\r\n**PREFER these builder tools over raw run_code:**\r\n- \\`create_part\\` — create a single part with position, size, color, material, shape in one call\r\n- \\`build_multiple\\` — create many parts in a single batch round-trip (FASTEST for complex builds)\r\n- \\`clone_instance\\` — duplicate an existing object, optionally offset/rename it\r\n- \\`group_instances\\` — organize parts into a Model or Folder\r\n- \\`set_properties\\` — adjust properties on existing instances (supports Vector3, Color3, enums, hex colors)\r\n\r\n**Why use builder tools instead of run_code?**\r\n- Tool calls are structured — the AI sends typed parameters, no string interpolation bugs\r\n- Properties are auto-coerced (hex → Color3, tables → Vector3, strings → Enum values)\r\n- \\`build_multiple\\` sends one batch of Luau to Studio, creating many parts in a single round-trip\r\n- Easier for the agent to plan, verify, and iterate\r\n\r\n**Building strategy:**\r\n1. For a single part: use \\`create_part\\`\r\n2. For multi-part objects (trees, buildings, vehicles): use \\`build_multiple\\` with \\`groupName\\`\r\n3. For repeating/duplicating: use \\`clone_instance\\` with offset\r\n4. For organizing: use \\`group_instances\\`\r\n5. Only fall back to \\`run_code\\` for complex logic (loops, raycasts, terrain generation algorithms)\r\n\r\n## GUI / UI Elements — CRITICAL\r\n**ALWAYS use \\`create_ui\\` for building UI.** It creates the entire UI tree in ONE call — no run_code, no get_class_info needed.\r\nDo NOT use run_code for UI creation. Do NOT call get_class_info before create_ui — it already handles all types natively.\r\n\r\n\\`create_ui\\` takes a declarative JSON tree and builds everything in a single Studio round-trip:\r\n\\`\\`\\`json\r\n{\r\n \"parent\": \"StarterGui\",\r\n \"tree\": {\r\n \"ClassName\": \"ScreenGui\", \"Name\": \"MyUI\", \"ResetOnSpawn\": false,\r\n \"Children\": [\r\n { \"ClassName\": \"Frame\", \"Size\": [1, 0, 1, 0], \"BackgroundColor3\": \"#F0E6FF\",\r\n \"Children\": [\r\n { \"ClassName\": \"UICorner\", \"CornerRadius\": [0, 12] },\r\n { \"ClassName\": \"TextLabel\", \"Text\": \"Hello!\", \"Size\": [0.5, 0, 0.1, 0],\r\n \"Position\": [0.25, 0, 0.45, 0], \"BackgroundTransparency\": 1,\r\n \"TextColor3\": \"#6C5CE7\", \"TextScaled\": true, \"Font\": \"GothamBold\" }\r\n ]\r\n }\r\n ]\r\n }\r\n}\r\n\\`\\`\\`\r\n\r\nGUI classes use DIFFERENT property types than 3D parts:\r\n\r\n**Key type differences:**\r\n- GUI Size/Position = \\`UDim2\\` (NOT Vector3). Format: \\`{XScale: 0.5, XOffset: 0, YScale: 0.5, YOffset: 0}\\` or \\`[xScale, xOffset, yScale, yOffset]\\`\r\n- GUI AnchorPoint = \\`Vector2\\` = \\`{x: 0.5, y: 0.5}\\`\r\n- BackgroundColor3 = \\`Color3\\` = \\`\"#FF0000\"\\` or \\`{R: 1, G: 0, B: 0}\\` or \\`\"rgb(255,0,0)\"\\`\r\n- Font = \\`Font\\` = \\`{Family: \"rbxasset://fonts/families/SourceSansPro.json\", Weight: \"Bold\"}\\`\r\n- BorderSizePixel = \\`number\\`\r\n- TextSize = \\`number\\`\r\n- Enum properties (e.g., TextXAlignment) = string name like \\`\"Center\"\\`, \\`\"Left\"\\`\r\n\r\n**Property coercion handles automatically:**\r\n- UDim2: tables, arrays, \"0.5, 0, 0.3, 0\" strings\r\n- UDim: {Scale, Offset} or number\r\n- Vector3, Vector2, Color3, BrickColor, CFrame, Rect, NumberRange\r\n- NumberSequence, ColorSequence (for gradients)\r\n- All enum properties from string names\r\n- Color3 from hex \"#RRGGBB\", \"rgb(r,g,b)\", or BrickColor name strings\r\n\r\n## Serializing & Converting Existing UI\r\nWhen the user asks to convert, export, recreate, or turn an existing UI into a React/Roact component:\r\n\r\n**Use \\`serialize_ui\\` — NOT \\`get_descendants_properties\\`.**\r\n\\`serialize_ui\\` returns a clean, minimal JSON tree with only non-default properties, values already in JSON-friendly formats (hex colors, UDim2 arrays, enum names), and a proper parent-child hierarchy. It's purpose-built for this exact workflow.\r\n\r\n\\`get_descendants_properties\\` returns a flat list with ALL properties (including read-only, defaults, deprecated) — it's much larger and harder to convert.\r\n\r\n### Roblox UI → Roact/React Conversion Workflow\r\n1. Call \\`serialize_ui\\` with the path (e.g. \\`StarterGui.MyScreenGui.MyFrame\\`)\r\n2. The result is a tree like:\r\n\\`\\`\\`json\r\n{\r\n \"ClassName\": \"Frame\", \"Name\": \"MyFrame\",\r\n \"Size\": [0.5, 0, 0.3, 0], \"BackgroundColor3\": \"#1a1a2e\",\r\n \"Children\": [\r\n { \"ClassName\": \"UICorner\", \"CornerRadius\": [0, 8] },\r\n { \"ClassName\": \"TextLabel\", \"Name\": \"Title\", \"Text\": \"Hello\",\r\n \"Size\": [1, 0, 0.2, 0], \"TextColor3\": \"#ffffff\", \"BackgroundTransparency\": 1 }\r\n ]\r\n}\r\n\\`\\`\\`\r\n3. Convert to Roact/React-lua using these mappings:\r\n - Each JSON node → \\`Roact.createElement(ClassName, props, children)\\` or \\`React.createElement\\`\r\n - \\`UDim2\\` arrays \\`[xS, xO, yS, yO]\\` → \\`UDim2.new(xS, xO, yS, yO)\\`\r\n - \\`Color3\\` hex \\`\"#RRGGBB\"\\` → \\`Color3.fromHex(\"#RRGGBB\")\\`\r\n - \\`Vector2\\` arrays \\`[x, y]\\` → \\`Vector2.new(x, y)\\`\r\n - \\`UDim\\` arrays \\`[s, o]\\` → \\`UDim.new(s, o)\\`\r\n - Enum strings \\`\"Center\"\\` → \\`Enum.TextXAlignment.Center\\` (resolve the full enum path)\r\n - \\`Children\\` array → child elements table\r\n - UI modifiers (UICorner, UIStroke, UIGradient, UIListLayout, UIPadding, UIScale) → children of the parent element\r\n\r\n### Example Roact output:\r\n\\`\\`\\`lua\r\nlocal function MyFrame()\r\n return Roact.createElement(\"Frame\", {\r\n Size = UDim2.new(0.5, 0, 0.3, 0),\r\n BackgroundColor3 = Color3.fromHex(\"#1a1a2e\"),\r\n }, {\r\n Corner = Roact.createElement(\"UICorner\", {\r\n CornerRadius = UDim.new(0, 8),\r\n }),\r\n Title = Roact.createElement(\"TextLabel\", {\r\n Size = UDim2.new(1, 0, 0.2, 0),\r\n Text = \"Hello\",\r\n TextColor3 = Color3.fromHex(\"#ffffff\"),\r\n BackgroundTransparency = 1,\r\n }),\r\n })\r\nend\r\n\\`\\`\\`\r\n\r\n### Key rules for conversion:\r\n- Use the instance \\`Name\\` as the dictionary key in the children table\r\n- UI modifiers (UICorner, UIStroke, etc.) are CHILDREN, not props\r\n- Keep the exact property values from serialize_ui — don't guess or approximate\r\n- For Fusion: \\`New \"Frame\" { Size = UDim2.new(...), [Children] = { ... } }\\`\r\n- Preserve ZIndex ordering when relevant\r\n- FontFace objects → \\`Font.new(\"rbxasset://fonts/families/...\", Enum.FontWeight.Bold)\\`\r\n\r\n## ReflectionService\r\nThe \\`get_class_info\\` tool queries Roblox's ReflectionService to return the complete API surface for any class:\r\n- All properties with their exact ValueType\r\n- All methods with parameter names and types\r\n- All events with parameter types\r\n- Superclass, creatability, serialization info\r\n\r\nUse it whenever you're unsure about property names or types. It's fast and cached.\r\n\r\n${INTERNAL_MEMORY}`);\r\n\r\n return parts.join('\\n');\r\n}\r\n","import type OpenAI from 'openai';\nimport { buildSystemPrompt } from './system-prompt.js';\nimport { recallFacts, getScriptIndex, getProjectSummaries } from '../memory/store.js';\nimport { loadConfig, loadRules } from '../config/config.js';\nimport { getContextWindow } from '../ai/models.js';\nimport type { StudioBridge } from '../transport/ws-server.js';\nimport type { ChatMessage } from '../memory/types.js';\n\nconst CHARS_PER_TOKEN = 4; // rough estimate\n\ninterface ContextBuildResult {\n messages: OpenAI.ChatCompletionMessageParam[];\n tokenEstimate: number;\n}\n\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\nexport function buildContext(opts: {\n userMessage: string;\n conversationHistory: OpenAI.ChatCompletionMessageParam[];\n server: StudioBridge;\n projectId: string;\n sessionId: string;\n}): ContextBuildResult {\n const config = loadConfig();\n const rules = loadRules();\n const contextWindow = getContextWindow(config.model);\n\n // Token budget allocation\n const systemBudget = Math.floor(contextWindow * 0.15);\n const memoryBudget = Math.floor(contextWindow * 0.15);\n const conversationBudget = Math.floor(contextWindow * 0.45);\n // 25% reserved for response + tool calls\n\n // Build system prompt\n const connInfo = opts.server.getConnectionInfo();\n const facts = recallFacts(opts.projectId, opts.userMessage, 15);\n const scriptIndex = getScriptIndex(opts.projectId);\n const summaries = getProjectSummaries(opts.projectId, 5);\n\n let systemPrompt = buildSystemPrompt({\n userName: config.userName,\n connected: opts.server.isConnected(),\n placeName: connInfo?.placeName,\n placeId: connInfo?.placeId,\n scriptIndex,\n facts,\n rules,\n });\n\n // Trim system prompt if over budget\n if (estimateTokens(systemPrompt) > systemBudget) {\n systemPrompt = systemPrompt.slice(0, systemBudget * CHARS_PER_TOKEN);\n }\n\n // Build conversation messages, trimming old ones if over budget\n const messages: OpenAI.ChatCompletionMessageParam[] = [\n { role: 'system', content: systemPrompt },\n ];\n\n // Add session summaries as context\n if (summaries.length > 0) {\n const summaryText = summaries\n .map((s) => s.summary)\n .join('\\n');\n if (estimateTokens(summaryText) <= memoryBudget) {\n messages.push({\n role: 'system',\n content: `Previous session summaries:\\n${summaryText}`,\n });\n }\n }\n\n // Add conversation history, newest first, respecting budget\n let historyTokens = 0;\n const historyMessages: OpenAI.ChatCompletionMessageParam[] = [];\n\n // Always include the current user message\n const currentMsg: OpenAI.ChatCompletionMessageParam = {\n role: 'user',\n content: opts.userMessage,\n };\n\n // Add historical messages from newest to oldest\n for (let i = opts.conversationHistory.length - 1; i >= 0; i--) {\n const msg = opts.conversationHistory[i];\n const content =\n typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);\n const tokens = estimateTokens(content);\n\n if (historyTokens + tokens > conversationBudget) break;\n historyTokens += tokens;\n historyMessages.unshift(msg);\n }\n\n messages.push(...historyMessages, currentMsg);\n\n const totalTokens = estimateTokens(\n messages.map((m) => (typeof m.content === 'string' ? m.content : '')).join(''),\n );\n\n return { messages, tokenEstimate: totalTokens };\n}\n\nexport function chatMessageToOpenAI(\n msg: ChatMessage,\n): OpenAI.ChatCompletionMessageParam | null {\n switch (msg.role) {\n case 'user':\n return { role: 'user', content: msg.content };\n case 'assistant':\n return { role: 'assistant', content: msg.content };\n case 'system':\n return { role: 'system', content: msg.content };\n case 'tool_result':\n return {\n role: 'tool' as const,\n content: msg.content,\n tool_call_id: msg.toolName ?? 'unknown',\n };\n default:\n return null;\n }\n}\n","import type { AIProviderType } from '../config/config.js';\n\nexport interface ModelInfo {\n id: string;\n name: string;\n contextWindow: number;\n supportsTools: boolean;\n provider: AIProviderType;\n}\n\nexport const POPULAR_MODELS: ModelInfo[] = [\n // --- OpenAI ---\n { id: 'gpt-5.3-codex', name: 'GPT-5.3 Codex', contextWindow: 256000, supportsTools: true, provider: 'openai' },\n { id: 'gpt-5.2', name: 'GPT-5.2', contextWindow: 256000, supportsTools: true, provider: 'openai' },\n { id: 'gpt-4o', name: 'GPT-4o', contextWindow: 128000, supportsTools: true, provider: 'openai' },\n { id: 'o3-mini', name: 'o3-mini', contextWindow: 200000, supportsTools: true, provider: 'openai' },\n\n // --- Anthropic ---\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6', contextWindow: 200000, supportsTools: true, provider: 'anthropic' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6', contextWindow: 200000, supportsTools: true, provider: 'anthropic' },\n\n // --- Google Gemini ---\n { id: 'gemini-3.1-pro', name: 'Gemini 3.1 Pro', contextWindow: 2097152, supportsTools: true, provider: 'gemini' },\n { id: 'gemini-2.0-flash', name: 'Gemini 2.0 Flash', contextWindow: 1048576, supportsTools: true, provider: 'gemini' },\n\n // --- xAI / Grok ---\n { id: 'grok-4.2', name: 'Grok 4.2', contextWindow: 256000, supportsTools: true, provider: 'xai' },\n { id: 'grok-3', name: 'Grok 3', contextWindow: 131072, supportsTools: true, provider: 'xai' },\n\n // --- OpenRouter (routes to any model) ---\n { id: 'anthropic/claude-opus-4-6', name: 'Claude Opus 4.6', contextWindow: 200000, supportsTools: true, provider: 'openrouter' },\n { id: 'anthropic/claude-sonnet-4-6', name: 'Claude Sonnet 4.6', contextWindow: 200000, supportsTools: true, provider: 'openrouter' },\n { id: 'openai/gpt-5.3-codex', name: 'GPT-5.3 Codex', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'openai/gpt-5.2', name: 'GPT-5.2', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'google/gemini-3.1-pro', name: 'Gemini 3.1 Pro', contextWindow: 2097152, supportsTools: true, provider: 'openrouter' },\n { id: 'x-ai/grok-4.2', name: 'Grok 4.2', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'deepseek/deepseek-v3.2', name: 'DeepSeek V3.2', contextWindow: 1000000, supportsTools: true, provider: 'openrouter' },\n];\n\nexport function getModelInfo(modelId: string): ModelInfo | undefined {\n return POPULAR_MODELS.find((m) => m.id === modelId);\n}\n\nexport function getModelsForProvider(provider: AIProviderType): ModelInfo[] {\n return POPULAR_MODELS.filter((m) => m.provider === provider);\n}\n\nexport function getContextWindow(modelId: string): number {\n return getModelInfo(modelId)?.contextWindow ?? 128000;\n}\n","import type OpenAI from 'openai';\nimport { nanoid } from 'nanoid';\nimport { AIProvider } from '../ai/provider.js';\nimport { buildContext } from './context-builder.js';\nimport { loadConfig } from '../config/config.js';\nimport { createConfigAccess } from '../config/config.js';\nimport { storeMessage } from '../memory/store.js';\nimport type { StudioBridge } from '../transport/ws-server.js';\nimport { ToolRegistry } from '../tools/registry.js';\nimport type { AgentEvent, ToolContext, ToolCall, ToolResult } from '../tools/types.js';\nimport type { WsMessage } from '../transport/protocol.js';\n\nexport class AgentLoop {\n private ai: AIProvider;\n private server: StudioBridge;\n private tools: ToolRegistry;\n private conversationHistory: OpenAI.ChatCompletionMessageParam[] = [];\n private projectId = 'current';\n private sessionId: string;\n private maxIterations: number;\n private maxRetries: number;\n\n constructor(server: StudioBridge, tools: ToolRegistry) {\n const config = loadConfig();\n this.ai = new AIProvider(config);\n this.server = server;\n this.tools = tools;\n this.sessionId = nanoid();\n this.maxIterations = config.maxToolIterations;\n this.maxRetries = config.maxVerifyRetries;\n }\n\n getSessionId(): string {\n return this.sessionId;\n }\n\n setModel(model: string): void {\n this.ai.setModel(model);\n }\n\n getModel(): string {\n return this.ai.getModel();\n }\n\n async listModels(): Promise<{ id: string; owned_by?: string }[]> {\n return this.ai.listModels();\n }\n\n setProjectId(projectId: string): void {\n this.projectId = projectId;\n }\n\n async *run(\n userMessage: string,\n imageAttachment?: { base64: string; mimeType: string },\n ): AsyncGenerator<AgentEvent> {\n storeMessage({\n sessionId: this.sessionId,\n role: 'user',\n content: userMessage + (imageAttachment ? ' [image attached]' : ''),\n createdAt: Date.now(),\n });\n\n const { messages } = buildContext({\n userMessage,\n conversationHistory: this.conversationHistory,\n server: this.server,\n projectId: this.projectId,\n sessionId: this.sessionId,\n });\n\n // If image attached, convert the last user message to multipart content\n if (imageAttachment) {\n const lastMsg = messages[messages.length - 1];\n if (lastMsg && lastMsg.role === 'user') {\n (lastMsg as any).content = [\n { type: 'text', text: typeof lastMsg.content === 'string' ? lastMsg.content : userMessage },\n {\n type: 'image_url',\n image_url: {\n url: `data:${imageAttachment.mimeType};base64,${imageAttachment.base64}`,\n detail: 'high',\n },\n },\n ];\n }\n }\n\n const toolCtx = this.createToolContext();\n const allTools = this.tools.getAll();\n let currentMessages = [...messages];\n let iteration = 0;\n\n while (iteration < this.maxIterations) {\n iteration++;\n\n try {\n const response = await this.ai.chat(currentMessages, allTools);\n\n // Handle text response\n if (response.content) {\n yield { type: 'text', content: response.content };\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'assistant',\n content: response.content,\n createdAt: Date.now(),\n });\n\n this.conversationHistory.push({ role: 'assistant', content: response.content });\n }\n\n // No tool calls -- we're done\n if (response.toolCalls.length === 0) {\n break;\n }\n\n // Execute tool calls\n const toolResults: { call: ToolCall; result: ToolResult }[] = [];\n\n for (const call of response.toolCalls) {\n yield { type: 'tool_call', tool: call.name, args: call.arguments };\n\n const result = await this.tools.execute(call, toolCtx);\n toolResults.push({ call, result });\n\n yield { type: 'tool_result', tool: call.name, result };\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'tool_call',\n content: JSON.stringify({ name: call.name, args: call.arguments }),\n toolName: call.name,\n createdAt: Date.now(),\n });\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'tool_result',\n content: JSON.stringify(result),\n toolName: call.name,\n createdAt: Date.now(),\n });\n }\n\n // Add assistant message with tool calls to conversation\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: 'assistant',\n content: response.content ?? null,\n tool_calls: response.toolCalls.map((tc) => ({\n id: tc.id,\n type: 'function' as const,\n function: { name: tc.name, arguments: JSON.stringify(tc.arguments) },\n })),\n };\n currentMessages.push(assistantMsg);\n\n // Add tool results to messages\n for (const { call, result } of toolResults) {\n currentMessages.push({\n role: 'tool',\n content: JSON.stringify(result),\n tool_call_id: call.id,\n });\n }\n\n this.conversationHistory.push(assistantMsg);\n for (const { call, result } of toolResults) {\n this.conversationHistory.push({\n role: 'tool' as const,\n content: JSON.stringify(result),\n tool_call_id: call.id,\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n yield { type: 'error', message };\n break;\n }\n }\n\n yield { type: 'done' };\n }\n\n async *streamRun(\n userMessage: string,\n imageAttachment?: { base64: string; mimeType: string },\n ): AsyncGenerator<AgentEvent> {\n for await (const event of this.run(userMessage, imageAttachment)) {\n yield event;\n }\n }\n\n private createToolContext(): ToolContext {\n return {\n sendToStudio: <T = unknown>(type: string, payload: unknown, timeoutMs?: number): Promise<WsMessage<T>> => {\n return this.server.sendRequest<T>(type, payload, timeoutMs);\n },\n isStudioConnected: () => this.server.isConnected(),\n memory: {\n recall: (query: string, projectId: string, limit?: number) => {\n const { recallFacts } = require('../memory/store.js');\n const facts = recallFacts(projectId || this.projectId, query, limit);\n return facts.map((f: { content: string }) => f.content);\n },\n learn: (projectId: string, facts: { content: string; category: string }[]) => {\n const { storeFact } = require('../memory/store.js');\n const now = Date.now();\n for (const f of facts) {\n storeFact({\n projectId: projectId || this.projectId,\n content: f.content,\n category: f.category as any,\n source: 'agent',\n relevance: 1.0,\n createdAt: now,\n accessedAt: now,\n });\n }\n },\n getScriptIndex: (projectId: string) => {\n const { getScriptIndex } = require('../memory/store.js');\n return getScriptIndex(projectId || this.projectId);\n },\n },\n config: createConfigAccess(),\n };\n }\n\n clearHistory(): void {\n this.conversationHistory = [];\n this.sessionId = nanoid();\n }\n}\n","import type { Tool, ToolCall, ToolResult, ToolContext } from './types.js';\r\n\r\nexport class ToolRegistry {\r\n private tools = new Map<string, Tool>();\r\n\r\n register(tool: Tool): void {\r\n if (this.tools.has(tool.name)) {\r\n throw new Error(`Tool already registered: ${tool.name}`);\r\n }\r\n this.tools.set(tool.name, tool);\r\n }\r\n\r\n get(name: string): Tool | undefined {\r\n return this.tools.get(name);\r\n }\r\n\r\n getAll(): Tool[] {\r\n return Array.from(this.tools.values());\r\n }\r\n\r\n getSchemas(): Tool[] {\r\n return this.getAll();\r\n }\r\n\r\n async execute(call: ToolCall, ctx: ToolContext): Promise<ToolResult> {\r\n const tool = this.tools.get(call.name);\r\n if (!tool) {\r\n return { success: false, error: `Unknown tool: ${call.name}` };\r\n }\r\n\r\n try {\r\n return await tool.execute(call.arguments, ctx);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n return { success: false, error: message };\r\n }\r\n }\r\n\r\n listNames(): string[] {\r\n return Array.from(this.tools.keys());\r\n }\r\n}\r\n\r\nexport function createDefaultRegistry(): ToolRegistry {\r\n const registry = new ToolRegistry();\r\n\r\n // Dynamic imports to avoid circular deps\r\n const toolModules = [\r\n import('./studio/read-script.js'),\r\n import('./studio/edit-script.js'),\r\n import('./studio/run-code.js'),\r\n import('./studio/get-explorer.js'),\r\n import('./studio/get-properties.js'),\r\n import('./studio/get-descendants-properties.js'),\r\n import('./studio/set-properties.js'),\r\n import('./studio/insert-instance.js'),\r\n import('./studio/delete-instance.js'),\r\n import('./studio/get-output.js'),\r\n import('./studio/get-selection.js'),\r\n import('./studio/search-scripts.js'),\r\n import('./studio/run-tests.js'),\r\n import('./studio/get-class-info.js'),\r\n import('./studio/create-ui.js'),\r\n import('./studio/execute-run-test.js'),\r\n import('./studio/execute-play-test.js'),\r\n import('./studio/create-part.js'),\r\n import('./studio/clone-instance.js'),\r\n import('./studio/group-instances.js'),\r\n import('./studio/build-multiple.js'),\r\n import('./studio/serialize-ui.js'),\r\n import('./studio/move-instance.js'),\r\n import('./studio/bulk-set-properties.js'),\r\n import('./studio/find-replace-scripts.js'),\r\n import('./memory/recall.js'),\r\n import('./memory/remember.js'),\r\n import('./cloud/upload-asset.js'),\r\n ];\r\n\r\n // Register all tools asynchronously, return immediately\r\n // Tools will be available by the time the agent loop starts\r\n void Promise.all(\r\n toolModules.map(async (mod) => {\r\n const m = await mod;\r\n if (m.tool) registry.register(m.tool);\r\n }),\r\n );\r\n\r\n // Register undo/redo (dual-export module)\r\n void import('./studio/undo-redo.js').then((m) => {\r\n registry.register(m.undoTool);\r\n registry.register(m.redoTool);\r\n });\r\n\r\n return registry;\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\nimport https from 'node:https';\r\nimport { execSync } from 'node:child_process';\r\n\r\nconst CACHE_DIR = path.join(os.homedir(), '.dominus');\r\nconst CACHE_FILE = path.join(CACHE_DIR, 'update-check.json');\r\nconst CHECK_INTERVAL_MS = 4 * 60 * 60 * 1000; // 4 hours\r\nconst NPM_PACKAGE = 'dominus-cli';\r\n\r\ninterface UpdateCache {\r\n lastCheck: number;\r\n latestVersion: string | null;\r\n}\r\n\r\nfunction readCache(): UpdateCache {\r\n try {\r\n if (fs.existsSync(CACHE_FILE)) {\r\n return JSON.parse(fs.readFileSync(CACHE_FILE, 'utf-8'));\r\n }\r\n } catch {}\r\n return { lastCheck: 0, latestVersion: null };\r\n}\r\n\r\nfunction writeCache(cache: UpdateCache): void {\r\n try {\r\n if (!fs.existsSync(CACHE_DIR)) fs.mkdirSync(CACHE_DIR, { recursive: true });\r\n fs.writeFileSync(CACHE_FILE, JSON.stringify(cache), 'utf-8');\r\n } catch {}\r\n}\r\n\r\nfunction fetchLatestVersion(): Promise<string | null> {\r\n return new Promise((resolve) => {\r\n const req = https.get(\r\n `https://registry.npmjs.org/${NPM_PACKAGE}/latest`,\r\n { headers: { Accept: 'application/json' }, timeout: 5000 },\r\n (res) => {\r\n if (res.statusCode !== 200) { resolve(null); res.resume(); return; }\r\n let body = '';\r\n res.on('data', (c) => (body += c));\r\n res.on('end', () => {\r\n try { resolve(JSON.parse(body).version ?? null); }\r\n catch { resolve(null); }\r\n });\r\n },\r\n );\r\n req.on('error', () => resolve(null));\r\n req.on('timeout', () => { req.destroy(); resolve(null); });\r\n });\r\n}\r\n\r\nfunction compareVersions(current: string, latest: string): number {\r\n const a = current.split('.').map(Number);\r\n const b = latest.split('.').map(Number);\r\n for (let i = 0; i < 3; i++) {\r\n if ((b[i] ?? 0) > (a[i] ?? 0)) return 1;\r\n if ((b[i] ?? 0) < (a[i] ?? 0)) return -1;\r\n }\r\n return 0;\r\n}\r\n\r\nexport interface UpdateInfo {\r\n updateAvailable: boolean;\r\n currentVersion: string;\r\n latestVersion: string;\r\n}\r\n\r\n/**\r\n * Non-blocking update check. Fires off a network request in the background\r\n * and returns immediately if the cache is fresh. Never throws.\r\n */\r\nexport async function checkForUpdate(currentVersion: string): Promise<UpdateInfo | null> {\r\n try {\r\n const cache = readCache();\r\n const now = Date.now();\r\n\r\n if (now - cache.lastCheck < CHECK_INTERVAL_MS && cache.latestVersion) {\r\n if (compareVersions(currentVersion, cache.latestVersion) > 0) {\r\n return { updateAvailable: true, currentVersion, latestVersion: cache.latestVersion };\r\n }\r\n return null;\r\n }\r\n\r\n const latest = await fetchLatestVersion();\r\n writeCache({ lastCheck: now, latestVersion: latest });\r\n\r\n if (latest && compareVersions(currentVersion, latest) > 0) {\r\n return { updateAvailable: true, currentVersion, latestVersion: latest };\r\n }\r\n } catch {}\r\n return null;\r\n}\r\n\r\nexport function formatUpdateMessage(info: UpdateInfo): string {\r\n const line1 = `Update available: ${info.currentVersion} → ${info.latestVersion}`;\r\n const line2 = `Run: npm i -g ${NPM_PACKAGE}`;\r\n const width = Math.max(line1.length, line2.length) + 4;\r\n const pad = (s: string) => ` │ ${s}${' '.repeat(width - s.length - 4)} │`;\r\n return [\r\n '',\r\n ` ╭${'─'.repeat(width)}╮`,\r\n pad(line1),\r\n pad(line2),\r\n ` ╰${'─'.repeat(width)}╯`,\r\n '',\r\n ].join('\\n');\r\n}\r\n\r\n/**\r\n * Auto-update: detects the package manager used to install dominus-cli\r\n * and runs the appropriate update command. Returns true if the update succeeded.\r\n */\r\nexport async function autoUpdate(currentVersion: string): Promise<{ success: boolean; from: string; to: string; error?: string }> {\r\n const info = await checkForUpdate(currentVersion);\r\n if (!info?.updateAvailable) {\r\n return { success: true, from: currentVersion, to: currentVersion };\r\n }\r\n\r\n // Detect which package manager installed us\r\n const managers = [\r\n { name: 'pnpm', check: 'pnpm list -g dominus-cli', cmd: 'pnpm add -g dominus-cli@latest' },\r\n { name: 'npm', check: 'npm list -g dominus-cli', cmd: 'npm install -g dominus-cli@latest' },\r\n { name: 'yarn', check: 'yarn global list --pattern dominus-cli', cmd: 'yarn global add dominus-cli@latest' },\r\n ];\r\n\r\n let installCmd: string | null = null;\r\n for (const mgr of managers) {\r\n try {\r\n const out = execSync(mgr.check, { stdio: 'pipe', timeout: 10000 }).toString();\r\n if (out.includes('dominus-cli')) {\r\n installCmd = mgr.cmd;\r\n break;\r\n }\r\n } catch {}\r\n }\r\n\r\n // Check if we're a linked install (dev workflow)\r\n if (!installCmd) {\r\n try {\r\n const out = execSync('pnpm list -g dominus-cli', { stdio: 'pipe', timeout: 10000 }).toString();\r\n if (out.includes('link:')) {\r\n // Linked install — pull + rebuild\r\n const pkgPath = path.resolve(__dirname, '..');\r\n if (fs.existsSync(path.join(pkgPath, '.git'))) {\r\n try {\r\n execSync('git pull', { cwd: pkgPath, stdio: 'pipe', timeout: 30000 });\r\n execSync('pnpm install', { cwd: pkgPath, stdio: 'pipe', timeout: 60000 });\r\n execSync('pnpm build', { cwd: pkgPath, stdio: 'pipe', timeout: 60000 });\r\n execSync('pnpm build:plugin', { cwd: pkgPath, stdio: 'pipe', timeout: 30000 });\r\n return { success: true, from: currentVersion, to: info.latestVersion };\r\n } catch (err) {\r\n return { success: false, from: currentVersion, to: info.latestVersion, error: `Git pull/rebuild failed: ${err}` };\r\n }\r\n }\r\n return { success: false, from: currentVersion, to: info.latestVersion, error: 'Linked install without git — run \"pnpm build\" manually in the repo' };\r\n }\r\n } catch {}\r\n }\r\n\r\n if (!installCmd) {\r\n installCmd = `npm install -g ${NPM_PACKAGE}@latest`;\r\n }\r\n\r\n try {\r\n execSync(installCmd, { stdio: 'pipe', timeout: 120000 });\r\n // Clear the update cache so next run shows the new version\r\n writeCache({ lastCheck: 0, latestVersion: null });\r\n return { success: true, from: currentVersion, to: info.latestVersion };\r\n } catch (err) {\r\n return { success: false, from: currentVersion, to: info.latestVersion, error: `Update command failed: ${err}` };\r\n }\r\n}\r\n\r\n// Needed for linked install detection\r\nconst __dirname = path.dirname(new URL(import.meta.url).pathname.replace(/^\\/([A-Z]:)/, '$1'));\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/config.ts","../src/transport/protocol.ts","../src/transport/ws-server.ts","../src/transport/ws-client.ts","../src/agent/internal-memory.ts","../src/memory/store.ts","../src/tools/studio/read-script.ts","../src/tools/studio/edit-script.ts","../src/tools/studio/run-code.ts","../src/tools/studio/get-explorer.ts","../src/tools/studio/get-properties.ts","../src/tools/studio/get-descendants-properties.ts","../src/tools/studio/set-properties.ts","../src/tools/studio/insert-instance.ts","../src/tools/studio/delete-instance.ts","../src/tools/studio/get-output.ts","../src/tools/studio/get-selection.ts","../src/tools/studio/search-scripts.ts","../src/tools/studio/run-tests.ts","../src/tools/studio/get-class-info.ts","../src/tools/studio/create-ui.ts","../src/tools/studio/execute-run-test.ts","../src/tools/studio/execute-play-test.ts","../src/tools/studio/create-part.ts","../src/tools/studio/clone-instance.ts","../src/tools/studio/group-instances.ts","../src/tools/studio/build-multiple.ts","../src/tools/studio/serialize-ui.ts","../src/tools/studio/move-instance.ts","../src/tools/studio/bulk-set-properties.ts","../src/tools/studio/find-replace-scripts.ts","../src/tools/memory/recall.ts","../src/tools/memory/remember.ts","../src/tools/cloud/upload-asset.ts","../src/tools/studio/undo-redo.ts","../src/mcp/server.ts","../src/ui/components/Welcome.tsx","../src/ui/components/Setup.tsx","../src/ui/components/StatusBar.tsx","../src/ui/components/OutputPane.tsx","../src/ui/components/ChatPane.tsx","../src/utils/clipboard.ts","../src/ui/components/InputBar.tsx","../src/ui/components/Explorer.tsx","../src/ui/components/ToolCallView.tsx","../src/ui/components/Layout.tsx","../src/ui/hooks/useStudio.ts","../src/app.tsx","../src/index.tsx","../src/ai/provider.ts","../src/agent/system-prompt.ts","../src/agent/context-builder.ts","../src/ai/models.ts","../src/agent/loop.ts","../src/tools/registry.ts","../src/utils/update-checker.ts"],"names":["fs","path","os","WebSocket","EventEmitter","result","tool","React","jsxs","Box","jsx","Text","Fragment","formatTime","useState","useInput","TextInput","useRef","useEffect","useCallback","nanoid","recallFacts","storeFact","getScriptIndex","execSync","__dirname","startMcpServer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgGO,SAAS,qBAAA,GAA6E;AAC3F,EAAA,MAAM,WAA6B,CAAC,QAAA,EAAU,WAAA,EAAa,QAAA,EAAU,OAAO,YAAY,CAAA;AACxF,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,MAAM,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,CAAC,EAAE,MAAM,CAAA;AAC3C,IAAA,IAAI,KAAK,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,QAAQ,GAAA,EAAI;AAAA,EAC7C;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,wBAAwB,MAAA,EAGtC;AACA,EAAA,MAAM,YAAA,GAAe,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,SAAS,MAAA,CAAO,UAAA,IAAc,YAAA,EAAc,OAAA,IAAW,UAAU,UAAA,CAAW,OAAA;AAAA,IAC5E,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,YAAA,EAAc,YAAA,IAAgB;AAAA,GACvD;AACF;AAgBA,SAAS,SAAA,GAAkB;AACzB,EAAA,IAAI,CAACA,GAAA,CAAG,UAAA,CAAW,WAAW,CAAA,EAAG;AAC/B,IAAAA,GAAA,CAAG,SAAA,CAAU,WAAA,EAAa,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC/C;AACF;AAEA,SAAS,QAAA,CAAY,UAAkB,QAAA,EAAgB;AACrD,EAAA,IAAI;AACF,IAAA,IAAIA,GAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,MAAA,MAAM,GAAA,GAAMA,GAAA,CAAG,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC7C,MAAA,OAAO,EAAE,GAAG,QAAA,EAAU,GAAG,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,EAAE;AAAA,IAC3C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAE,GAAG,QAAA,EAAS;AACvB;AAEA,SAAS,SAAA,CAAU,UAAkB,IAAA,EAAqB;AACxD,EAAA,SAAA,EAAU;AACV,EAAAA,GAAA,CAAG,aAAA,CAAc,UAAU,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AACnE;AAEO,SAAS,UAAA,GAA4B;AAC1C,EAAA,SAAA,EAAU;AACV,EAAA,OAAO,QAAA,CAAS,aAAa,QAAQ,CAAA;AACvC;AAEO,SAAS,WAAW,MAAA,EAA6B;AACtD,EAAA,SAAA,CAAU,aAAa,MAAM,CAAA;AAC/B;AAEO,SAAS,eAA8C,GAAA,EAA0B;AACtF,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,OAAO,OAAO,GAAG,CAAA;AACnB;AAEO,SAAS,cAAA,CACd,KACA,KAAA,EACM;AACN,EAAA,MAAM,SAAS,UAAA,EAAW;AAE1B,EAAC,MAAA,CAAe,GAAG,CAAA,GAAI,KAAA;AACvB,EAAA,UAAA,CAAW,MAAM,CAAA;AACnB;AAEO,SAAS,SAAA,GAA0B;AACxC,EAAA,SAAA,EAAU;AACV,EAAA,OAAO,QAAA,CAAS,YAAY,aAAa,CAAA;AAC3C;AAEO,SAAS,UAAU,KAAA,EAA2B;AACnD,EAAA,SAAA,CAAU,YAAY,KAAK,CAAA;AAC7B;AAEO,SAAS,aAAA,GAAwB;AACtC,EAAA,SAAA,EAAU;AACV,EAAA,OAAO,WAAA;AACT;AAEO,SAAS,SAAA,GAAoB;AAClC,EAAA,SAAA,EAAU;AACV,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,kBAAA,GAAmC;AACjD,EAAA,OAAO;AAAA,IACL,IAAO,GAAA,EAA4B;AACjC,MAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,MAAA,OAAO,OAAO,GAAG,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,GAAA,CAAI,KAAa,KAAA,EAAsB;AACrC,MAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AACd,MAAA,UAAA,CAAW,MAAkC,CAAA;AAAA,IAC/C,CAAA;AAAA,IACA,MAAA,GAAkC;AAChC,MAAA,OAAO,UAAA,EAAW;AAAA,IACpB;AAAA,GACF;AACF;AAtNA,IAKM,WAAA,EACA,WAAA,EACA,OAAA,EACA,UAAA,EAiBO,WAsDP,QAAA,EA+CA,aAAA;AA9HN,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sBAAA,GAAA;AAKA,IAAM,cAAcC,KAAA,CAAK,IAAA,CAAKC,GAAA,CAAG,OAAA,IAAW,UAAU,CAAA;AACtD,IAAM,WAAA,GAAcD,KAAA,CAAK,IAAA,CAAK,WAAA,EAAa,aAAa,CAAA;AACxD,IAAM,OAAA,GAAUA,KAAA,CAAK,IAAA,CAAK,WAAA,EAAa,YAAY,CAAA;AACnD,IAAM,UAAA,GAAaA,KAAA,CAAK,IAAA,CAAK,WAAA,EAAa,YAAY,CAAA;AAiB/C,IAAM,SAAA,GAAoD;AAAA,MAC/D,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,2BAAA;AAAA,QACT,MAAA,EAAQ,gBAAA;AAAA,QACR,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,+BAAA;AAAA,QACT,MAAA,EAAQ,mBAAA;AAAA,QACR,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,eAAA;AAAA,QACN,OAAA,EAAS,yDAAA;AAAA,QACT,MAAA,EAAQ,gBAAA;AAAA,QACR,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,GAAA,EAAK;AAAA,QACH,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,qBAAA;AAAA,QACT,MAAA,EAAQ,aAAA;AAAA,QACR,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,8BAAA;AAAA,QACT,MAAA,EAAQ,oBAAA;AAAA,QACR,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,EAAA;AAAA,QACT,MAAA,EAAQ,EAAA;AAAA,QACR,YAAA,EAAc;AAAA;AAChB,KACF;AAiBA,IAAM,QAAA,GAA0B;AAAA,MAC9B,QAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAY,EAAA;AAAA,MACZ,KAAA,EAAO,EAAA;AAAA,MACP,IAAA,EAAM,KAAA;AAAA,MACN,iBAAA,EAAmB,EAAA;AAAA,MACnB,gBAAA,EAAkB,CAAA;AAAA,MAClB,WAAA,EAAa,KAAA;AAAA,MACb,SAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,IAAA;AAAA,MACX,QAAA,EAAU;AAAA,KACZ;AAoCA,IAAM,aAAA,GAA8B;AAAA,MAClC,IAAI,EAAC;AAAA,MACL,MAAM,EAAC;AAAA,MACP,aAAa,EAAC;AAAA,MACd,OAAA,EAAS;AAAA,KACX;AAAA,EAAA;AAAA,CAAA,CAAA;AC6BO,SAAS,aAAA,CAAiB,MAAc,OAAA,EAA0B;AACvE,EAAA,OAAO,EAAE,IAAI,MAAA,EAAO,EAAG,MAAM,OAAA,EAAS,EAAA,EAAI,IAAA,CAAK,GAAA,EAAI,EAAE;AACvD;AAMO,SAAS,aAAa,GAAA,EAAwB;AACnD,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,MAAM,CAAA,mCAAA,EAAsC,GAAA,CAAI,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3E;AACF;AAEO,SAAS,iBAAiB,GAAA,EAAwB;AACvD,EAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAC3B;AAlLA,IASa,SAAA,EAcA,MAAA;AAvBb,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AASO,IAAM,SAAA,GAAY;AAAA,MACvB,SAAA,EAAW,kBAAA;AAAA,MACX,YAAA,EAAc,qBAAA;AAAA,MACd,QAAA,EAAU,iBAAA;AAAA,MACV,MAAA,EAAQ,eAAA;AAAA,MACR,KAAA,EAAO,cAAA;AAAA,MACP,SAAA,EAAW,kBAAA;AAAA,MACX,cAAA,EAAgB,uBAAA;AAAA,MAChB,cAAA,EAAgB,uBAAA;AAAA,MAChB,QAAA,EAAU,iBAAA;AAAA,MACV,UAAA,EAAY,mBAAA;AAAA,MACZ,YAAA,EAAc;AAAA,KAChB;AAEO,IAAM,MAAA,GAAS;AAAA,MACpB,YAAA,EAAc,kBAAA;AAAA,MACd,UAAA,EAAY,gBAAA;AAAA,MACZ,UAAA,EAAY,gBAAA;AAAA,MACZ,QAAA,EAAU,SAAA;AAAA,MACV,cAAA,EAAgB,oBAAA;AAAA,MAChB,0BAAA,EAA4B,gCAAA;AAAA,MAC5B,cAAA,EAAgB,oBAAA;AAAA,MAChB,eAAA,EAAiB,YAAA;AAAA,MACjB,eAAA,EAAiB,YAAA;AAAA,MACjB,aAAA,EAAe,mBAAA;AAAA,MACf,MAAA,EAAQ,YAAA;AAAA,MACR,cAAA,EAAgB,oBAAA;AAAA,MAChB,UAAA,EAAY,gBAAA;AAAA,MACZ,SAAA,EAAW,eAAA;AAAA,MACX,gBAAA,EAAkB,cAAA;AAAA,MAClB,iBAAA,EAAmB,eAAA;AAAA,MACnB,QAAA,EAAU,cAAA;AAAA,MACV,QAAA,EAAU,cAAA;AAAA,MACV,cAAA,EAAgB,oBAAA;AAAA,MAChB,YAAA,EAAc,kBAAA;AAAA,MACd,YAAA,EAAc,kBAAA;AAAA,MACd,aAAA,EAAe,mBAAA;AAAA,MACf,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,mBAAA,EAAqB,yBAAA;AAAA,MACrB,oBAAA,EAAsB;AAAA,KACxB;AAAA,EAAA;AAAA,CAAA,CAAA;AClDA,IAwCa,aAAA;AAxCb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEA,IAAA,aAAA,EAAA;AAsCO,IAAM,aAAA,GAAN,cAA4B,YAAA,CAAqC;AAAA,MAC9D,GAAA,GAA8B,IAAA;AAAA;AAAA,MAE9B,aAAA,uBAAoB,GAAA,EAA8B;AAAA;AAAA,MAElD,WAAA,uBAAkB,GAAA,EAAuB;AAAA;AAAA,MAEzC,aAAA,GAAgB,CAAA;AAAA,MAChB,WAAA,uBAAkB,GAAA,EAAe;AAAA,MACjC,eAAA,uBAAsB,GAAA,EAG5B;AAAA,MACM,aAAA,uBAAoB,GAAA,EAAuB;AAAA,MAC3C,IAAA;AAAA,MAER,WAAA,CAAY,OAAO,KAAA,EAAO;AACxB,QAAA,KAAA,EAAM;AACN,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,MACd;AAAA,MAEA,KAAA,CAAM,aAAa,CAAA,EAAkB;AACnC,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,UAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAc,OAAA,KAAoB;AACjD,YAAA,MAAM,GAAA,GAAM,IAAI,eAAA,CAAgB,EAAE,MAAM,CAAA;AAExC,YAAA,GAAA,CAAI,EAAA,CAAG,aAAa,MAAM;AACxB,cAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,cAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,cAAA,IAAA,CAAK,GAAA,CAAI,GAAG,YAAA,EAAc,CAAC,OAAO,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAC,CAAA;AAC3D,cAAA,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,EAAE,IAAA,EAAM,CAAA;AACpC,cAAA,OAAA,EAAQ;AAAA,YACV,CAAC,CAAA;AAED,YAAA,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAA+B;AAC9C,cAAA,IAAI,GAAA,CAAI,IAAA,KAAS,YAAA,IAAgB,OAAA,GAAU,UAAA,EAAY;AACrD,gBAAA,GAAA,CAAI,KAAA,EAAM;AACV,gBAAA,OAAA,CAAQ,IAAA,GAAO,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA;AAAA,cAC/B,CAAA,MAAO;AACL,gBAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,GAAG,CAAA;AAC7B,gBAAA,MAAA,CAAO,GAAG,CAAA;AAAA,cACZ;AAAA,YACF,CAAC,CAAA;AAAA,UACH,CAAA;AAEA,UAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,QACtB,CAAC,CAAA;AAAA,MACH;AAAA,MAEQ,iBAAiB,EAAA,EAAqB;AAC5C,QAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,QAAA,EAAA,CAAG,EAAA,CAAG,SAAA,EAAW,CAAC,GAAA,KAAQ;AACxB,UAAA,IAAI;AACF,YAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,CAAA;AAEvC,YAAA,IAAI,CAAC,UAAA,EAAY;AACf,cAAA,IAAI,GAAA,CAAI,IAAA,KAAS,SAAA,CAAU,SAAA,EAAW;AACpC,gBAAA,UAAA,GAAa,IAAA;AACb,gBAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,GAAG,CAAA;AAC5B,gBAAA;AAAA,cACF;AACA,cAAA,IAAI,GAAA,CAAI,SAAS,oBAAA,EAAsB;AACrC,gBAAA,UAAA,GAAa,IAAA;AACb,gBAAA,IAAA,CAAK,cAAc,EAAE,CAAA;AACrB,gBAAA,EAAA,CAAG,IAAA,CAAK,gBAAA,CAAiB,aAAA,CAAc,oBAAA,EAAsB;AAAA,kBAC3D,eAAA,EAAiB,KAAK,WAAA,EAAY;AAAA,kBAClC,MAAM,IAAA,CAAK,IAAA;AAAA,kBACX,WAAA,EAAa,KAAK,eAAA,EAAgB;AAAA,kBAClC,eAAe,IAAA,CAAK;AAAA,iBACrB,CAAC,CAAC,CAAA;AACH,gBAAA;AAAA,cACF;AAAA,YACF;AAEA,YAAA,IAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AAC5B,cAAA,IAAA,CAAK,uBAAA,CAAwB,IAAI,GAAG,CAAA;AAAA,YACtC,CAAA,MAAO;AACL,cAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,GAAG,CAAA;AAAA,YAClC;AAAA,UACF,SAAS,GAAA,EAAK;AACZ,YAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,GAAG,CAAA;AAAA,UAC/B;AAAA,QACF,CAAC,CAAA;AAED,QAAA,EAAA,CAAG,EAAA,CAAG,SAAS,MAAM;AACnB,UAAA,IAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AAC5B,YAAA,IAAA,CAAK,WAAA,CAAY,OAAO,EAAE,CAAA;AAC1B,YAAA,KAAA,MAAW,CAAC,EAAA,EAAI,YAAY,CAAA,IAAK,KAAK,aAAA,EAAe;AACnD,cAAA,IAAI,YAAA,KAAiB,EAAA,EAAI,IAAA,CAAK,aAAA,CAAc,OAAO,EAAE,CAAA;AAAA,YACvD;AAAA,UACF,CAAA,MAAO;AACL,YAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACvC,YAAA,IAAI,YAAY,MAAA,EAAW;AACzB,cAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA;AAC3C,cAAA,IAAA,CAAK,aAAA,CAAc,OAAO,OAAO,CAAA;AACjC,cAAA,IAAA,CAAK,WAAA,CAAY,OAAO,EAAE,CAAA;AAC1B,cAAA,IAAA,CAAK,KAAK,qBAAA,EAAuB,EAAE,SAAS,SAAA,EAAW,IAAA,EAAM,WAAW,CAAA;AACxE,cAAA,IAAA,CAAK,uBAAuB,qBAAA,EAAuB,EAAE,SAAS,SAAA,EAAW,IAAA,EAAM,WAAW,CAAA;AAE1F,cAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,CAAA,IAAK,KAAK,eAAA,EAAiB;AAChD,gBAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,gBAAA,OAAA,CAAQ,OAAO,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,GAAG,CAAC,CAAA;AAClE,gBAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,EAAE,CAAA;AAAA,cAChC;AAEA,cAAA,IAAI,IAAA,CAAK,kBAAkB,OAAA,EAAS;AAClC,gBAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AAAA,cACvB;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAED,QAAA,EAAA,CAAG,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACtB,UAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,GAAG,CAAA;AAAA,QAC/B,CAAC,CAAA;AAAA,MACH;AAAA,MAEQ,eAAA,CAAgB,IAAe,GAAA,EAAsB;AAC3D,QAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,QAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,CAAA;AAGnC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA;AAC/C,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,EAAA,KAAO,EAAA,EAAI;AAClC,UAAA,QAAA,CAAS,GAAG,KAAA,EAAM;AAClB,UAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,QACrC;AAEA,QAAA,MAAM,IAAA,GAAyB;AAAA,UAC7B,EAAA;AAAA,UACA,WAAA,EAAa,KAAK,GAAA,EAAI;AAAA,UACtB,eAAe,OAAA,CAAQ,aAAA;AAAA,UACvB,OAAA;AAAA,UACA,WAAW,OAAA,CAAQ;AAAA,SACrB;AACA,QAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAA,EAAS,IAAI,CAAA;AACpC,QAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA;AAEhC,QAAA,IAAA,CAAK,KAAK,kBAAA,EAAoB,EAAE,GAAG,OAAA,EAAS,SAAS,CAAA;AACrD,QAAA,IAAA,CAAK,uBAAuB,kBAAA,EAAoB,EAAE,GAAG,OAAA,EAAS,SAAS,CAAA;AAAA,MACzE;AAAA,MAEQ,cAAc,EAAA,EAAqB;AACzC,QAAA,IAAA,CAAK,WAAA,CAAY,IAAI,EAAE,CAAA;AACvB,QAAA,IAAA,CAAK,KAAK,sBAAsB,CAAA;AAAA,MAClC;AAAA,MAEQ,sBAAA,CAAuB,MAAc,OAAA,EAAwB;AACnE,QAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,aAAA,CAAc,IAAA,EAAM,OAAO,CAAC,CAAA;AACzD,QAAA,KAAA,MAAW,EAAA,IAAM,KAAK,WAAA,EAAa;AACjC,UAAA,IAAI,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AACpC,YAAA,EAAA,CAAG,KAAK,GAAG,CAAA;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,uBAAA,CAAwB,cAAyB,GAAA,EAAsB;AAC7E,QAAA,MAAM,MAAA,GAAS,KAAK,aAAA,EAAc;AAClC,QAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,EAAA,CAAG,UAAA,KAAe,UAAU,IAAA,EAAM;AACtD,UAAA,YAAA,CAAa,KAAK,gBAAA,CAAiB;AAAA,YACjC,IAAI,GAAA,CAAI,EAAA;AAAA,YACR,MAAM,SAAA,CAAU,QAAA;AAAA,YAChB,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,CAAK,gBAAe,EAAE;AAAA,YACxC,EAAA,EAAI,KAAK,GAAA;AAAI,WACd,CAAC,CAAA;AACF,UAAA;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,YAAY,CAAA;AAC3C,QAAA,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,MACtC;AAAA,MAEQ,mBAAA,CAAoB,IAAe,GAAA,EAAsB;AAC/D,QAAA,IAAI,GAAA,CAAI,IAAA,KAAS,SAAA,CAAU,SAAA,EAAW;AAEpC,UAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACvC,UAAA,IAAI,YAAY,MAAA,EAAW;AACzB,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA;AAC3C,YAAA,IAAI,IAAA,EAAM;AACR,cAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AAC7B,cAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,cAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AAAA,YAC3B;AAAA,UACF;AACA,UAAA,IAAA,CAAK,IAAA,CAAK,oBAAoB,OAAO,CAAA;AACrC,UAAA,IAAA,CAAK,sBAAA,CAAuB,oBAAoB,OAAO,CAAA;AACvD,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,GAAA,CAAI,IAAA,KAAS,SAAA,CAAU,QAAA,EAAU;AAEnC,UAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAI,EAAE,CAAA;AAClD,UAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AAC9D,YAAA,YAAA,CAAa,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA;AACvC,YAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAChC,YAAA;AAAA,UACF;AAGA,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,EAAE,CAAA;AAC/C,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,YAAA,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACnB,YAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,UACpC;AACA,UAAA;AAAA,QACF;AAGA,QAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAO,CAAA;AAC/B,QAAA,IAAA,CAAK,IAAA,CAAK,WAAW,GAAG,CAAA;AACxB,QAAA,IAAA,CAAK,sBAAA,CAAuB,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAO,CAAA;AAAA,MACnD;AAAA;AAAA,MAGQ,aAAA,GAAyC;AAC/C,QAAA,IAAI,IAAA,CAAK,aAAA,CAAc,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AAG1C,QAAA,IAAI,IAAA,CAAK,kBAAkB,CAAA,EAAG;AAC5B,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,aAAa,CAAA;AACtD,UAAA,IAAI,QAAQ,IAAA,CAAK,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,MAAM,OAAO,IAAA;AAC1D,UAAA,OAAO,IAAA;AAAA,QACT;AAGA,QAAA,IAAI,IAAA,CAAK,aAAA,CAAc,IAAA,KAAS,CAAA,EAAG;AACjC,UAAA,MAAM,OAAO,IAAA,CAAK,aAAA,CAAc,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA;AAChD,UAAA,IAAI,IAAA,CAAK,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,MAAM,OAAO,IAAA;AAClD,UAAA,OAAO,IAAA;AAAA,QACT;AAGA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA,MAGQ,cAAA,GAAyB;AAC/B,QAAA,IAAI,IAAA,CAAK,aAAA,CAAc,IAAA,KAAS,CAAA,EAAG,OAAO,sBAAA;AAC1C,QAAA,IAAI,IAAA,CAAK,kBAAkB,CAAA,EAAG;AAC5B,UAAA,OAAO,CAAA,aAAA,EAAgB,KAAK,aAAa,CAAA,4DAAA,CAAA;AAAA,QAC3C;AACA,QAAA,MAAM,SAAS,CAAC,GAAG,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,SAAA,IAAa,SAAS,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAA,CAAG,CAAA;AACrG,QAAA,OAAO,CAAA,qCAAA,EAAwC,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,qCAAA,CAAA;AAAA,MAClE;AAAA,MAEA,WAAA,CAAyB,IAAA,EAAc,OAAA,EAAkB,SAAA,GAAY,GAAA,EAA8B;AACjG,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,UAAA,MAAM,MAAA,GAAS,KAAK,aAAA,EAAc;AAClC,UAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,EAAA,CAAG,UAAA,KAAe,UAAU,IAAA,EAAM;AACtD,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,IAAA,CAAK,cAAA,EAAgB,CAAC,CAAA;AACvC,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AAEvC,UAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,YAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAClC,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAI,EAAE,CAAC,CAAA;AAAA,UAChD,GAAG,SAAS,CAAA;AAEZ,UAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI;AAAA,YAC/B,OAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA,WACD,CAAA;AAED,UAAA,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,QACtC,CAAC,CAAA;AAAA,MACH;AAAA,MAEA,gBAAA,CAAiB,MAAc,OAAA,EAAwB;AACrD,QAAA,MAAM,MAAA,GAAS,KAAK,aAAA,EAAc;AAClC,QAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,EAAA,CAAG,UAAA,KAAe,UAAU,IAAA,EAAM;AACxD,QAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AACvC,QAAA,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,MACtC;AAAA,MAEA,WAAA,GAAuB;AACrB,QAAA,OAAO,IAAA,CAAK,eAAc,KAAM,IAAA;AAAA,MAClC;AAAA,MAEA,iBAAA,GAA6C;AAC3C,QAAA,OAAO,KAAK,aAAA,EAAc;AAAA,MAC5B;AAAA,MAEA,eAAA,GAA+B;AAC7B,QAAA,OAAO,CAAC,GAAG,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,CAAA,CACnC,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,UAAA,KAAe,SAAA,CAAU,IAAI,CAAA,CAC9C,IAAI,CAAA,CAAA,MAAM;AAAA,UACT,OAAA,EAAS,EAAE,OAAA,IAAW,CAAA;AAAA,UACtB,WAAW,CAAA,CAAE,SAAA;AAAA,UACb,eAAe,CAAA,CAAE,aAAA;AAAA,UACjB,aAAa,CAAA,CAAE;AAAA,SACjB,CAAE,CAAA;AAAA,MACN;AAAA,MAEA,gBAAA,GAA2B;AACzB,QAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACd;AAAA,MAEA,iBAAiB,OAAA,EAAuB;AACtC,QAAA,IAAA,CAAK,aAAA,GAAgB,OAAA;AAAA,MACvB;AAAA,MAEA,OAAA,GAAkB;AAChB,QAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACd;AAAA,MAEA,IAAA,GAAsB;AACpB,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,UAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,aAAA,CAAc,MAAA,EAAO,EAAG;AAC9C,YAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AAAA,UAChB;AACA,UAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,UAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,UAAA,KAAA,MAAW,EAAA,IAAM,KAAK,WAAA,EAAa;AACjC,YAAA,EAAA,CAAG,KAAA,EAAM;AAAA,UACX;AACA,UAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,UAAA,KAAA,MAAW,GAAG,OAAO,CAAA,IAAK,KAAK,eAAA,EAAiB;AAC9C,YAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,YAAA,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAAA,UAClD;AACA,UAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,UAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAEzB,UAAA,IAAI,KAAK,GAAA,EAAK;AACZ,YAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAM,OAAA,EAAS,CAAA;AAAA,UAChC,CAAA,MAAO;AACL,YAAA,OAAA,EAAQ;AAAA,UACV;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;AClJA,eAAsB,YAAY,IAAA,EAAgC;AAChE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,EAAA,GAAK,IAAIE,SAAAA,CAAU,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAE,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,GAAG,GAAI,CAAA;AAEP,IAAA,EAAA,CAAG,EAAA,CAAG,QAAQ,MAAM;AAClB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAC,CAAA;AAED,IAAA,EAAA,CAAG,EAAA,CAAG,SAAS,MAAM;AACnB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAzPA,IAiBa,aAAA;AAjBb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEA,IAAA,aAAA,EAAA;AAeO,IAAM,aAAA,GAAN,cAA4BC,YAAAA,CAAqC;AAAA,MAC9D,EAAA,GAAuB,IAAA;AAAA,MACvB,IAAA;AAAA,MACA,eAAA,GAAkB,KAAA;AAAA,MAClB,WAAA,uBAAkB,GAAA,EAA0C;AAAA,MAC5D,aAAA,GAAgB,CAAA;AAAA,MAChB,eAAA,uBAAsB,GAAA,EAG5B;AAAA,MAEF,WAAA,CAAY,OAAO,KAAA,EAAO;AACxB,QAAA,KAAA,EAAM;AACN,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,MACd;AAAA,MAEA,OAAA,GAAyB;AACvB,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,UAAA,MAAM,GAAA,GAAM,CAAA,eAAA,EAAkB,IAAA,CAAK,IAAI,CAAA,CAAA;AACvC,UAAA,MAAM,EAAA,GAAK,IAAID,SAAAA,CAAU,GAAG,CAAA;AAE5B,UAAA,EAAA,CAAG,EAAA,CAAG,QAAQ,MAAM;AAClB,YAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,YAAA,EAAA,CAAG,KAAK,gBAAA,CAAiB,aAAA,CAAc,sBAAsB,EAAE,CAAC,CAAC,CAAA;AACjE,YAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAC5D,YAAA,OAAA,EAAQ;AAAA,UACV,CAAC,CAAA;AAED,UAAA,EAAA,CAAG,EAAA,CAAG,SAAA,EAAW,CAAC,GAAA,KAAQ;AACxB,YAAA,IAAI;AACF,cAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,CAAA;AACvC,cAAA,IAAA,CAAK,cAAc,GAAG,CAAA;AAAA,YACxB,SAAS,GAAA,EAAK;AACZ,cAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,GAAG,CAAA;AAAA,YAC/B;AAAA,UACF,CAAC,CAAA;AAED,UAAA,EAAA,CAAG,EAAA,CAAG,SAAS,MAAM;AACnB,YAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,YAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,YAAA,IAAA,CAAK,KAAK,qBAAqB,CAAA;AAC/B,YAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,CAAA,IAAK,KAAK,eAAA,EAAiB;AAChD,cAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,cAAA,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,uBAAuB,CAAC,CAAA;AACjD,cAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,EAAE,CAAA;AAAA,YAChC;AAAA,UACF,CAAC,CAAA;AAED,UAAA,EAAA,CAAG,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACtB,YAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAA,CAAO,GAAG,CAAA;AACxB,YAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,GAAG,CAAA;AAAA,UAC/B,CAAC,CAAA;AAAA,QACH,CAAC,CAAA;AAAA,MACH;AAAA,MAEQ,cAAc,GAAA,EAAsB;AAC1C,QAAA,IAAI,GAAA,CAAI,SAAS,oBAAA,EAAsB;AACrC,UAAA,MAAM,IAAI,GAAA,CAAI,OAAA;AAKd,UAAA,IAAA,CAAK,kBAAkB,CAAA,CAAE,eAAA;AACzB,UAAA,IAAI,EAAE,WAAA,EAAa;AACjB,YAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,YAAA,KAAA,MAAW,CAAA,IAAK,EAAE,WAAA,EAAa;AAC7B,cAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,OAAA,EAAS;AAAA,gBAC9B,aAAa,CAAA,CAAE,WAAA;AAAA,gBACf,eAAe,CAAA,CAAE,aAAA;AAAA,gBACjB,SAAS,CAAA,CAAE,OAAA;AAAA,gBACX,WAAW,CAAA,CAAE;AAAA,eACd,CAAA;AAAA,YACH;AAAA,UACF;AACA,UAAA,IAAI,CAAA,CAAE,kBAAkB,MAAA,EAAW;AACjC,YAAA,IAAA,CAAK,gBAAgB,CAAA,CAAE,aAAA;AAAA,UACzB;AACA,UAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,YAAA,IAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB,EAAE,CAAA;AAAA,UAClC;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,GAAA,CAAI,SAAS,kBAAA,EAAoB;AACnC,UAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,UAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,UAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,CAAA;AACnC,UAAA,IAAA,CAAK,WAAA,CAAY,IAAI,OAAA,EAAS;AAAA,YAC5B,WAAA,EAAa,KAAK,GAAA,EAAI;AAAA,YACtB,eAAe,OAAA,CAAQ,aAAA;AAAA,YACvB,OAAA;AAAA,YACA,WAAW,OAAA,CAAQ;AAAA,WACpB,CAAA;AACD,UAAA,IAAA,CAAK,IAAA,CAAK,oBAAoB,OAAO,CAAA;AACrC,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,GAAA,CAAI,SAAS,qBAAA,EAAuB;AACtC,UAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,UAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,CAAA;AACnC,UAAA,IAAA,CAAK,WAAA,CAAY,OAAO,OAAO,CAAA;AAC/B,UAAA,IAAI,IAAA,CAAK,WAAA,CAAY,IAAA,KAAS,CAAA,EAAG;AAC/B,YAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAAA,UACzB;AACA,UAAA,IAAI,IAAA,CAAK,kBAAkB,OAAA,EAAS;AAClC,YAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AAAA,UACvB;AACA,UAAA,IAAA,CAAK,IAAA,CAAK,uBAAuB,OAAO,CAAA;AACxC,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,GAAA,CAAI,IAAA,KAAS,SAAA,CAAU,QAAA,EAAU;AACnC,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,EAAE,CAAA;AAC/C,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,YAAA,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACnB,YAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,UACpC;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAO,CAAA;AAC/B,QAAA,IAAA,CAAK,IAAA,CAAK,WAAW,GAAG,CAAA;AAAA,MAC1B;AAAA,MAEA,WAAA,CAAyB,IAAA,EAAc,OAAA,EAAkB,SAAA,GAAY,GAAA,EAA8B;AACjG,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,UAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,KAAK,EAAA,CAAG,UAAA,KAAeA,UAAU,IAAA,EAAM;AACrD,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,iCAAiC,CAAC,CAAA;AACnD,YAAA;AAAA,UACF;AACA,UAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AACxC,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AAEvC,UAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,YAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAClC,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAI,EAAE,CAAC,CAAA;AAAA,UAChD,GAAG,SAAS,CAAA;AAEZ,UAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI;AAAA,YAC/B,OAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA,WACD,CAAA;AAED,UAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,QACpC,CAAC,CAAA;AAAA,MACH;AAAA,MAEA,gBAAA,CAAiB,MAAc,OAAA,EAAwB;AACrD,QAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,KAAK,EAAA,CAAG,UAAA,KAAeA,UAAU,IAAA,EAAM;AACvD,QAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AACvC,QAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,MACpC;AAAA,MAEA,WAAA,GAAuB;AACrB,QAAA,OAAO,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAA,CAAY,IAAA,GAAO,CAAA;AAAA,MACzD;AAAA,MAEA,iBAAA,GAA6C;AAC3C,QAAA,IAAI,IAAA,CAAK,WAAA,CAAY,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AAExC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,KAAkB,CAAA,GAClC,KAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,aAAa,IACvC,IAAA,CAAK,WAAA,CAAY,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA;AACrC,QAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,QAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,EAAA,EAAI,KAAK,EAAA,EAAI;AAAA,MACnC;AAAA,MAEA,eAAA,GAA+B;AAC7B,QAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA,CAAE,IAAI,CAAA,CAAA,MAAM;AAAA,UAC9C,OAAA,EAAS,EAAE,OAAA,IAAW,CAAA;AAAA,UACtB,WAAW,CAAA,CAAE,SAAA;AAAA,UACb,eAAe,CAAA,CAAE,aAAA;AAAA,UACjB,aAAa,CAAA,CAAE;AAAA,SACjB,CAAE,CAAA;AAAA,MACJ;AAAA,MAEA,gBAAA,GAA2B;AACzB,QAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACd;AAAA,MAEA,iBAAiB,OAAA,EAAuB;AACtC,QAAA,IAAA,CAAK,aAAA,GAAgB,OAAA;AAAA,MACvB;AAAA,MAEA,OAAA,GAAkB;AAChB,QAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACd;AAAA,MAEA,IAAA,GAAsB;AACpB,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,UAAA,KAAA,MAAW,GAAG,OAAO,CAAA,IAAK,KAAK,eAAA,EAAiB;AAC9C,YAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,YAAA,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAAA,UAClD;AACA,UAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,UAAA,IAAI,KAAK,EAAA,EAAI;AACX,YAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,YAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,UACZ;AACA,UAAA,OAAA,EAAQ;AAAA,QACV,CAAC,CAAA;AAAA,MACH;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjOA,IAUa,eAAA;AAVb,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AAUO,IAAM,eAAA,GAAkB,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACV/B,IAAA,aAAA,GAAA,EAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,YAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAwDA,SAAS,OAAA,GAAgB;AACvB,EAAA,IAAI,CAAC,EAAA,EAAI;AACT,EAAA,MAAM,IAAA,GAAO,GAAG,MAAA,EAAO;AACvB,EAAAH,IAAG,aAAA,CAAc,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAC5C;AAEA,eAAsB,eAAA,GAAiC;AACrD,EAAA,IAAI,EAAA,EAAI;AACR,EAAA,MAAA,GAAS,SAAA,EAAU;AACnB,EAAA,MAAM,GAAA,GAAM,MAAM,SAAA,EAAU;AAE5B,EAAA,IAAIA,GAAAA,CAAG,UAAA,CAAW,MAAM,CAAA,EAAG;AACzB,IAAA,MAAM,MAAA,GAASA,GAAAA,CAAG,YAAA,CAAa,MAAM,CAAA;AACrC,IAAA,EAAA,GAAK,IAAI,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA;AAAA,EAC9B,CAAA,MAAO;AACL,IAAA,EAAA,GAAK,IAAI,IAAI,QAAA,EAAS;AAAA,EACxB;AAEA,EAAA,EAAA,CAAG,IAAI,MAAM,CAAA;AACb,EAAA,OAAA,EAAQ;AACV;AAEO,SAAS,KAAA,GAAkB;AAChC,EAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,MAAM,6DAA6D,CAAA;AACtF,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,gBAAA,GAAyB;AACvC,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,OAAA,EAAQ;AACR,IAAA,EAAA,CAAG,KAAA,EAAM;AACT,IAAA,EAAA,GAAK,IAAA;AAAA,EACP;AACF;AAIO,SAAS,UAAU,IAAA,EAAgC;AACxD,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,CAAA,CAAE,GAAA;AAAA,IACA,CAAA;AAAA,iCAAA,CAAA;AAAA,IAEA;AAAA,MACE,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,OAAA;AAAA,MACL,IAAA,CAAK,QAAA;AAAA,MACL,KAAK,MAAA,IAAU,IAAA;AAAA,MACf,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK;AAAA;AACP,GACF;AACA,EAAA,OAAA,EAAQ;AACR,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,OAAA,CAAQ,4BAA4B,CAAA;AACnD,EAAA,IAAA,CAAK,IAAA,EAAK;AACV,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,IAAA,CAAK,IAAA,EAAK;AACV,EAAA,OAAQ,GAAA,GAAM,CAAC,CAAA,IAAgB,CAAA;AACjC;AAEO,SAAS,WAAA,CAAY,SAAA,EAAmB,KAAA,EAAe,KAAA,GAAQ,EAAA,EAAY;AAChF,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,QAAA,GAAW,KAAA,CACd,WAAA,EAAY,CACZ,KAAA,CAAM,KAAK,CAAA,CACX,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAE7B,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,MAAMK,UAAS,CAAA,CAAE,IAAA;AAAA,MACf,CAAA,0FAAA,CAAA;AAAA,MACA,CAAC,WAAW,KAAK;AAAA,KACnB;AACA,IAAA,OAAO,YAAYA,OAAM,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,cAAc,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,qBAAA,CAAuB,CAAA,CAAE,KAAK,MAAM,CAAA;AAC3E,EAAA,MAAM,aAAa,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAE/C,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AAAA,IACf,iDAAiD,WAAW,CAAA;AAAA,sDAAA,CAAA;AAAA,IAE5D,CAAC,SAAA,EAAW,GAAG,UAAA,EAAY,KAAK;AAAA,GAClC;AAEA,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM,CAAA;AAGhC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,CAAA,CAAE,GAAA,CAAI,iDAAiD,CAAC,IAAA,CAAK,KAAI,EAAG,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAC9E;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAA,EAAQ;AAE9B,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,YAAY,SAAA,EAA2B;AACrD,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AAAA,IACf,CAAA,gEAAA,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,OAAO,YAAY,MAAM,CAAA;AAC3B;AAEA,SAAS,YAAY,MAAA,EAAmC;AACtD,EAAA,IAAI,CAAC,MAAA,CAAO,CAAC,CAAA,SAAU,EAAC;AACxB,EAAA,OAAO,OAAO,CAAC,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACpC,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IACT,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,IACd,QAAA,EAAU,IAAI,CAAC,CAAA;AAAA,IACf,MAAA,EAAQ,IAAI,CAAC,CAAA;AAAA,IACb,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,UAAA,EAAY,IAAI,CAAC;AAAA,GACnB,CAAE,CAAA;AACJ;AAIO,SAAS,aAAa,GAAA,EAAoC;AAC/D,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,CAAA,CAAE,GAAA;AAAA,IACA,CAAA;AAAA,2BAAA,CAAA;AAAA,IAEA,CAAC,GAAA,CAAI,SAAA,EAAW,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,QAAA,IAAY,IAAA,EAAM,GAAA,CAAI,SAAS;AAAA,GAC5E;AACA,EAAA,OAAA,EAAQ;AACV;AAEO,SAAS,kBAAA,CAAmB,SAAA,EAAmB,KAAA,GAAQ,GAAA,EAAoB;AAChF,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AAAA,IACf,CAAA,2EAAA,CAAA;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,GACnB;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,CAAC,CAAA,SAAU,EAAC;AACxB,EAAA,OAAO,OAAO,CAAC,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACpC,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IACT,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,IACX,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,IACd,QAAA,EAAW,GAAA,CAAI,CAAC,CAAA,IAAgB,MAAA;AAAA,IAChC,SAAA,EAAW,IAAI,CAAC;AAAA,GAClB,CAAE,CAAA;AACJ;AAIO,SAAS,aAAa,OAAA,EAA2C;AACtE,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,CAAA,CAAE,GAAA;AAAA,IACA,CAAA;AAAA,wBAAA,CAAA;AAAA,IAEA,CAAC,QAAQ,SAAA,EAAW,OAAA,CAAQ,WAAW,OAAA,CAAQ,OAAA,EAAS,QAAQ,SAAS;AAAA,GAC3E;AACA,EAAA,OAAA,EAAQ;AACV;AAEO,SAAS,mBAAA,CAAoB,SAAA,EAAmB,KAAA,GAAQ,EAAA,EAAsB;AACnF,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AAAA,IACf,CAAA,6EAAA,CAAA;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,GACnB;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,CAAC,CAAA,SAAU,EAAC;AACxB,EAAA,OAAO,OAAO,CAAC,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACpC,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IACT,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,IACd,SAAA,EAAW,IAAI,CAAC;AAAA,GAClB,CAAE,CAAA;AACJ;AAIO,SAAS,aAAa,KAAA,EAAsC;AACjE,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,WAAW,CAAA,CAAE,IAAA;AAAA,IACjB,CAAA,6DAAA,CAAA;AAAA,IACA,CAAC,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,IAAI;AAAA,GAC9B;AAEA,EAAA,IAAI,QAAA,CAAS,CAAC,CAAA,EAAG,MAAA,CAAO,MAAA,EAAQ;AAC9B,IAAA,CAAA,CAAE,GAAA;AAAA,MACA,CAAA;AAAA,wCAAA,CAAA;AAAA,MAEA;AAAA,QACE,KAAA,CAAM,SAAA;AAAA,QACN,MAAM,OAAA,IAAW,IAAA;AAAA,QACjB,MAAM,SAAA,IAAa,IAAA;AAAA,QACnB,MAAM,QAAA,IAAY,IAAA;AAAA,QAClB,KAAA,CAAM,SAAA;AAAA,QACN,KAAA,CAAM,SAAA;AAAA,QACN,KAAA,CAAM;AAAA;AACR,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,CAAA,CAAE,GAAA;AAAA,MACA,CAAA;AAAA,mCAAA,CAAA;AAAA,MAEA;AAAA,QACE,KAAA,CAAM,SAAA;AAAA,QACN,KAAA,CAAM,IAAA;AAAA,QACN,KAAA,CAAM,SAAA;AAAA,QACN,MAAM,OAAA,IAAW,IAAA;AAAA,QACjB,MAAM,SAAA,IAAa,IAAA;AAAA,QACnB,MAAM,QAAA,IAAY,IAAA;AAAA,QAClB,KAAA,CAAM;AAAA;AACR,KACF;AAAA,EACF;AACA,EAAA,OAAA,EAAQ;AACV;AAEO,SAAS,eACd,SAAA,EACyD;AACzD,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AAAA,IACf,CAAA,qFAAA,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,CAAC,CAAA,SAAU,EAAC;AACxB,EAAA,OAAO,OAAO,CAAC,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACpC,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,IACX,OAAA,EAAU,GAAA,CAAI,CAAC,CAAA,IAAgB,MAAA;AAAA,IAC/B,SAAA,EAAW,IAAI,CAAC;AAAA,GAClB,CAAE,CAAA;AACJ;AAEO,SAAS,cAAA,CAAe,WAAmB,UAAA,EAAwC;AACxF,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AAAA,IACf,CAAA,4DAAA,CAAA;AAAA,IACA,CAAC,WAAW,UAAU;AAAA,GACxB;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,CAAC,CAAA,EAAG,MAAA,CAAO,QAAQ,OAAO,IAAA;AACtC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAC,CAAA,CAAE,OAAO,CAAC,CAAA;AAC9B,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IACT,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,IACX,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,OAAA,EAAU,GAAA,CAAI,CAAC,CAAA,IAAgB,MAAA;AAAA,IAC/B,SAAA,EAAY,GAAA,CAAI,CAAC,CAAA,IAAgB,MAAA;AAAA,IACjC,QAAA,EAAW,GAAA,CAAI,CAAC,CAAA,IAAgB,MAAA;AAAA,IAChC,SAAA,EAAW,IAAI,CAAC;AAAA,GAClB;AACF;AAIO,SAAS,cAAA,CAAe,SAAA,EAAmB,MAAA,GAAS,IAAA,EAAY;AACrE,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,CAAA,CAAE,GAAA,CAAI,CAAA,+DAAA,CAAA,EAAmE,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAC5F,EAAA,OAAA,EAAQ;AACV;AA5TA,IAMI,IACA,MAAA,EAEE,MAAA;AATN,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qBAAA,GAAA;AAGA,IAAA,WAAA,EAAA;AAGA,IAAI,EAAA,GAAsB,IAAA;AAG1B,IAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACTf,IAAA,mBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,mBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAIa,IAAA;AAJb,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAM,IAAA,GAAa;AAAA,MACxB,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EACE,8HAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAMJ,QAAO,MAAA,CAAO,IAAA;AACpB,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAmC,OAAO,UAAA,EAAY,EAAE,IAAA,EAAAA,KAAAA,EAAM,CAAA;AAEzF,QAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACrB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,kBAAA,EAAqBA,KAAI,CAAA,CAAA,EAAG;AAAA,QAC9D;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,SAAS,OAAA,CAAQ,IAAA;AAAA,YACvB,SAAA,EAAW,SAAS,OAAA,CAAQ,SAAA;AAAA,YAC5B,MAAA,EAAQ,SAAS,OAAA,CAAQ,MAAA;AAAA,YACzB,SAAA,EAAW,SAAS,OAAA,CAAQ;AAAA;AAC9B,SACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACzCA,IAAA,mBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,mBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAK;AAAA,CAAA,CAAA;AAAA,IAGaA,KAAAA;AAHb,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EACE,6GAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAA,EAAQ,QAAQ;AAAA,OAC7B;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAML,QAAO,MAAA,CAAO,IAAA;AACpB,QAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,YAAY,EAAE,IAAA,EAAAA,KAAAA,EAAM,MAAA,EAAQ,CAAA;AAC3E,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AAEzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,uBAAA,EAAwB;AAAA,QAC3E;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,EAAE,IAAA,EAAAA,KAAAA,EAAM,YAAA,EAAc,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,QAAO,EAAE;AAAA,MAClF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvCA,IAAA,gBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,gBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAK;AAAA,CAAA,CAAA;AAAA,IAIaA,KAAAA;AAJb,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,UAAA;AAAA,MACN,WAAA,EACE,sIAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAqC,OAAO,QAAA,EAAU,EAAE,MAAM,CAAA;AACzF,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AAEzB,QAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,EAAE;AAAA,QAClF;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,MAAM,EAAE,MAAA,EAAQ,QAAQ,MAAA,EAAQ,QAAA,EAAU,QAAQ,QAAA;AAAS,SAC7D;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrCA,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,KAAAA;AAJb,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,cAAA;AAAA,MACN,WAAA,EACE,qGAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,wCAAA;AAAA,YACb,OAAA,EAAS;AAAA;AACX;AACF,OACF;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAuC,OAAO,YAAA,EAAc;AAAA,UACrF,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,UAC7B,QAAA,EAAU,OAAO,QAAA,IAAY;AAAA,SAC9B,CAAA;AAED,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAS,OAAA,EAAQ;AAAA,MACjD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACnCA,IAAA,sBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,KAAAA;AAJb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EAAa,4OAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,SAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,OAAA,GAAU,OAAO,OAAA,KAAY,KAAA;AAEnC,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA;AAAA,UACzB,MAAA,CAAO,cAAA;AAAA,UACP,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,OAAA;AAAQ,SAC/B;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAS,OAAA,EAAQ;AAAA,MACjD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpCA,IAAA,kCAAA,GAAA,EAAA;AAAA,QAAA,CAAA,kCAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,KAAAA;AAHb,IAAA,+BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gDAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,4BAAA;AAAA,MACN,WAAA,EAAa,yNAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,SAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,OAAA,GAAU,OAAO,OAAA,KAAY,KAAA;AAEnC,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA;AAAA,UACzB,MAAA,CAAO,0BAAA;AAAA,UACP,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,OAAA,EAAQ;AAAA,UAC7B,MAAO,EAAA,GAAK;AAAA;AAAA,SACd;AAEA,QAAA,IAAI,MAAA,CAAO,UAAA,IAAc,OAAO,MAAA,CAAO,eAAe,QAAA,EAAU;AAC5D,UAAA,MAAMN,GAAAA,GAAK,MAAM,OAAO,aAAa,CAAA;AACrC,UAAA,MAAMC,KAAAA,GAAO,MAAM,OAAO,MAAM,CAAA;AAChC,UAAA,MAAM,aAAaA,KAAAA,CAAK,OAAA,CAAQ,QAAQ,GAAA,EAAI,EAAG,OAAO,UAAU,CAAA;AAChE,UAAA,MAAMD,GAAAA,CAAG,SAAA,CAAU,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,SAAS,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AACjF,UAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,CAAA,kCAAA,EAAqC,UAAU,CAAA,CAAA,EAAG;AAAA,QACpF;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAS,OAAA,EAAQ;AAAA,MACjD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChDA,IAAA,sBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAM;AAAA,CAAA,CAAA;AAAA,IAGaA,KAAAA;AAHb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EAAa,iDAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAA,EAAQ,YAAY;AAAA,OACjC;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAa,OAAO,cAAA,EAAgB;AAAA,UAC7D,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,YAAY,MAAA,CAAO;AAAA,SACpB,CAAA;AAED,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,0BAAA,EAA2B;AAAA,QAC9E;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,UAAoB,GAAE,EAAE;AAAA,MACzG;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtCA,IAAA,uBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,uBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,KAAAA;AAHb,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,iBAAA;AAAA,MACN,WAAA,EAAa,yDAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,WAAA,EAAa,YAAA,EAAc,MAAM;AAAA,OAC9C;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAa,OAAO,eAAA,EAAiB;AAAA,UAC9D,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc;AAAC,SACnC,CAAA;AAED,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,2BAAA,EAA4B;AAAA,QAC/E;AAEA,QAAA,OAAO,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAK,EAAE;AAAA,MACvD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChDA,IAAA,uBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,uBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,KAAAA;AAHb,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,iBAAA;AAAA,MACN,WAAA,EAAa,8DAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,iBAAiB,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,CAAA;AACrF,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AAEzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,2BAAA,EAA4B;AAAA,QAC/E;AAEA,QAAA,OAAO,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,CAAO,MAAK,EAAE;AAAA,MACzD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/BA,IAAA,kBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,kBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,YAAA;AAAA,MACN,WAAA,EAAa,8EAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,uDAAA;AAAA,YACb,OAAA,EAAS;AAAA,WACX;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,qBAAA;AAAA,YACb,IAAA,EAAM,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO;AAAA;AAChC;AACF,OACF;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAA2C,OAAO,UAAA,EAAY;AAAA,UACvF,KAAA,EAAO,OAAO,KAAA,IAAS,EAAA;AAAA,UACvB,KAAA,EAAO,OAAO,KAAA,IAAS;AAAA,SACxB,CAAA;AAED,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAS,OAAA,EAAQ;AAAA,MACjD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACnCA,IAAA,qBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,qBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,eAAA;AAAA,MACN,WAAA,EAAa,wDAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,YAAY;AAAC,OACf;AAAA,MAEA,MAAM,OAAA,CAAQ,OAAA,EAAkC,GAAA,EAAuC;AACrF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,WAAW,MAAM,GAAA,CAAI,aAA+B,MAAA,CAAO,aAAA,EAAe,EAAE,CAAA;AAClF,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAS,OAAA,EAAQ;AAAA,MACjD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpBA,IAAA,sBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EACE,qGAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,gDAAA;AAAA,YACb,OAAA,EAAS;AAAA;AACX,SACF;AAAA,QACA,QAAA,EAAU,CAAC,OAAO;AAAA,OACpB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAkC,OAAO,cAAA,EAAgB;AAAA,UAClF,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,UAAA,EAAY,OAAO,UAAA,IAAc;AAAA,SAClC,CAAA;AAED,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAS,OAAA,EAAQ;AAAA,MACjD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpCA,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,WAAA;AAAA,MACN,WAAA,EACE,mGAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf;AACF,OACF;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAA+C,OAAO,SAAA,EAAW;AAAA,UAC1F,QAAA,EAAU,OAAO,QAAA,IAAY;AAAA,SAC9B,CAAA;AAED,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,OAAA,IAAW,EAAC;AAC7C,QAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA;AAC/C,QAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA;AAEhD,QAAA,OAAO;AAAA,UACL,SAAS,MAAA,KAAW,CAAA;AAAA,UACpB,MAAM,EAAE,KAAA,EAAO,QAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,OAAA;AAAQ,SACzD;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpCA,IAAA,sBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EACE,iWAAA;AAAA,MAIF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,WAAW;AAAA,OACxB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAQxB,MAAA,CAAO,gBAAgB,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,CAAA;AAEzD,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,QAAQ,KAAA,EAAM;AAAA,QAChD;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,MACxC;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3CA,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,WAAA;AAAA,MACN,WAAA,EACE,kkCAAA;AAAA,MA2BF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EACE;AAAA,WAeJ;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,SAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAKxB,OAAO,QAAA,EAAU;AAAA,UAClB,MAAA,EAAQ,OAAO,MAAA,IAAU,YAAA;AAAA,UACzB,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,MAAM,MAAA,CAAO;AAAA,SACd,CAAA;AAED,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,iBAAA,EAAkB;AAAA,QACrE;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,MAAM,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,aAAA,EAAe,QAAQ,aAAA;AAAc,SACnE;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7FA,IAAA,wBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,wBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,kBAAA;AAAA,MACN,WAAA,EACE,iWAAA;AAAA,MAKF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,WAAA,EACE;AAAA;AAEJ;AACF,OACF;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA;AAAA,UACzB,MAAA,CAAO,gBAAA;AAAA,UACP,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,IAAA,EAAK;AAAA,UAC5B;AAAA,SACF;AAEA,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,sBAAA,EAAuB;AAAA,QAC1E;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,UAAU,OAAA,CAAQ;AAAA;AACpB,SACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/CA,IAAA,yBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,yBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,mBAAA;AAAA,MACN,WAAA,EACE,4VAAA;AAAA,MAKF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,WAAA,EACE;AAAA;AAEJ;AACF,OACF;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA;AAAA,UACzB,MAAA,CAAO,iBAAA;AAAA,UACP,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,IAAA,EAAK;AAAA,UAC5B;AAAA,SACF;AAEA,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,uBAAA,EAAwB;AAAA,QAC3E;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,UAAU,OAAA,CAAQ;AAAA;AACpB,SACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/CA,IAAA,mBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,mBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EACE,oKAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mBAAA,EAAoB;AAAA,UACzD,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,MAAM,CAAC,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,SAAS,aAAa,CAAA;AAAA,YAC1D,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,YAAY,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,YAClF,WAAA,EAAa;AAAA,WACf;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,YAAY,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,YAClF,WAAA,EAAa;AAAA,WACf;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,6BAAA,EAA8B;AAAA,UAC3E,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,8CAAA,EAA+C;AAAA,UACzF,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,gCAAA;AAAiC,SAC/E;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,MAAA,GAAU,OAAO,MAAA,IAAqB,WAAA;AAC5C,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,QAAA,MAAM,MAAM,MAAA,CAAO,QAAA;AACnB,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAEpB,QAAA,MAAM,aAAsC,EAAC;AAE7C,QAAA,IAAI,GAAA,EAAK,UAAA,CAAW,QAAA,GAAW,EAAE,GAAG,GAAA,CAAI,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,EAAE;AAC7E,QAAA,IAAI,IAAA,EAAM,UAAA,CAAW,IAAA,GAAO,EAAE,GAAG,IAAA,CAAK,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAE;AAC7E,QAAA,IAAI,OAAO,KAAA,EAAO;AAChB,UAAA,MAAM,IAAI,MAAA,CAAO,KAAA;AACjB,UAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACrB,YAAA,UAAA,CAAW,KAAA,GAAQ,CAAA;AAAA,UACrB,CAAA,MAAA,IAAW,CAAA,CAAE,UAAA,CAAW,KAAK,CAAA,EAAG;AAC9B,YAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA;AAC1B,YAAA,IAAI,CAAA,IAAK,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG;AACtB,cAAA,UAAA,CAAW,QAAQ,EAAE,GAAA,EAAK,SAAS,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,KAAA,EAAO,SAAS,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,IAAA,EAAM,SAAS,CAAA,CAAE,CAAC,CAAC,CAAA,EAAE;AAAA,YACxF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,UAAA,CAAW,UAAA,GAAa,CAAA;AAAA,UAC1B;AAAA,QACF;AACA,QAAA,IAAI,MAAA,CAAO,QAAA,EAAU,UAAA,CAAW,QAAA,GAAW,MAAA,CAAO,QAAA;AAClD,QAAA,IAAI,MAAA,CAAO,YAAA,KAAiB,MAAA,EAAW,UAAA,CAAW,eAAe,MAAA,CAAO,YAAA;AACxE,QAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW,UAAA,CAAW,WAAW,MAAA,CAAO,QAAA;AAAA,wBAChD,QAAA,GAAW,IAAA;AAC3B,QAAA,IAAI,MAAA,CAAO,UAAA,KAAe,MAAA,EAAW,UAAA,CAAW,aAAa,MAAA,CAAO,UAAA;AACpE,QAAA,IAAI,OAAO,KAAA,IAAS,MAAA,CAAO,UAAU,OAAA,EAAS,UAAA,CAAW,QAAQ,MAAA,CAAO,KAAA;AAExE,QAAA,MAAM,SAAA,GAAa,OAAO,KAAA,KAAU,OAAA,GAAW,cAC1C,MAAA,CAAO,KAAA,KAAU,gBAAiB,iBAAA,GACnC,MAAA;AAEJ,QAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,YAAA,CAAa,OAAO,eAAA,EAAiB;AAAA,UACzD,SAAA;AAAA,UACA,UAAA,EAAY,MAAA;AAAA,UACZ,IAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,uBAAA,EAAwB;AAAA,QAC3E;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAM,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAE,SAClE;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpGA,IAAA,sBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAuCA,SAAS,eAAe,MAAA,EAAyC;AAC/D,EAAA,MAAML,QAAO,MAAA,CAAO,IAAA;AACpB,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,EAAA,IAAI,OAAA,GAAU,MAAA;AACd,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,OAAA,IAAW,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,EACnB;AAEA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,gBAAgB,OAAO,CAAA,CAAA;AAAA,IACvB,CAAA,0BAAA;AAAA,GACF;AAEA,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,MAAA,CAAO,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,MAAM,WAAA,GAAe,MAAA,CAAO,SAAA,CAAqB,KAAA,CAAM,GAAG,CAAA;AAC1D,IAAA,IAAI,aAAA,GAAgB,MAAA;AACpB,IAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,MAAA,aAAA,IAAiB,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,IACzB;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,aAAa,CAAA,CAAE,CAAA;AAAA,EAC9C,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAK,CAAA,0BAAA,CAA4B,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,CAAM,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAC1C,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gDAAA,EAAmD,MAAA,CAAO,CAAA,IAAK,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,IAAK,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,IAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAClH,IAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAAA,EAClB;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,wCAAA,CAA0C,CAAA;AACrD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AA5EA,IAGaK,MAAAA;AAHb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EACE,wIAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,2BAAA,EAA4B;AAAA,UACjE,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+BAAA,EAAgC;AAAA,UACxE,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+DAAA,EAAgE;AAAA,UAC1G,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,YAAY,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,YAClF,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,IAAA,GAAO,eAAe,MAAM,CAAA;AAClC,QAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,YAAA,CAAa,OAAO,QAAA,EAAU,EAAE,MAAM,CAAA;AAC5D,QAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AAEpB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,iBAAA,EAAkB;AAAA,QACrE;AAEA,QAAA,OAAO,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAA,CAAQ,QAAO,EAAE;AAAA,MAC3D;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrCA,IAAA,uBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,uBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,iBAAA;AAAA,MACN,WAAA,EACE,qJAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACxB,WAAA,EAAa;AAAA,WACf;AAAA,UACA,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,wBAAA,EAAyB;AAAA,UACnE,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,CAAC,OAAA,EAAS,QAAQ,CAAA;AAAA,YACxB,WAAA,EAAa;AAAA,WACf;AAAA,UACA,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,kCAAA;AAAmC,SAC5E;AAAA,QACA,QAAA,EAAU,CAAC,OAAA,EAAS,WAAW;AAAA,OACjC;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,QAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,QAAA,MAAM,UAAA,GAAc,OAAO,UAAA,IAAyB,OAAA;AACpD,QAAA,MAAM,MAAA,GAAU,OAAO,MAAA,IAAqB,WAAA;AAE5C,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAChC,UAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AACzB,UAAA,IAAI,CAAA,GAAI,MAAA;AACR,UAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,CAAA,IAAK,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,CAAA;AACxC,UAAA,OAAO,CAAA;AAAA,QACT,CAAC,CAAA;AAED,QAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACpC,QAAA,IAAI,aAAA,GAAgB,MAAA;AACpB,QAAA,KAAA,MAAW,CAAA,IAAK,WAAA,EAAa,aAAA,IAAiB,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,CAAA;AAEpD,QAAA,MAAM,IAAA,GAAO;AAAA,UACX,+BAA+B,UAAU,CAAA,EAAA,CAAA;AAAA,UACzC,iBAAiB,SAAS,CAAA,CAAA,CAAA;AAAA,UAC1B,kBAAkB,aAAa,CAAA,CAAA;AAAA,UAC/B,GAAG,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,eAAA,CAAiB,CAAA;AAAA,UAC5C,UAAA,KAAe,UAAU,CAAA,4EAAA,CAAA,GAAiF,EAAA;AAAA,UAC1G,CAAA,eAAA,EAAkB,MAAM,MAAM,CAAA,0CAAA;AAAA,SAChC,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAE3B,QAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,YAAA,CAAa,OAAO,QAAA,EAAU,EAAE,MAAM,CAAA;AAC5D,QAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AAEpB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,iBAAA,EAAkB;AAAA,QACrE;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,EAAE,SAAA,EAAW,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,KAAA,EAAO,KAAA,CAAM,QAAO,EAAE;AAAA,MAC7F;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjEA,IAAA,sBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAyFA,SAAS,iBAAA,CAAkB,KAAA,EAAmB,SAAA,EAAoB,WAAA,EAA8B;AAC9F,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,SAAS,cAAcL,KAAAA,EAAsB;AAC3C,IAAA,MAAM,IAAA,GAAOA,KAAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,IAAI,CAAA,GAAI,MAAA;AACR,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,EAAM,CAAA,IAAK,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,CAAA;AACjC,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,WAA0B,CAAA;AACnD,IAAA,KAAA,CAAM,KAAK,CAAA,oCAAA,CAAsC,CAAA;AACjD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAA,CAAG,CAAA;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,EAAE,CAAA,CAAE,CAAA;AAAA,EACpC;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA,CAAA;AACtB,IAAA,MAAM,KAAK,CAAA,CAAE,SAAA,KAAc,CAAA,CAAE,KAAA,KAAU,UAAU,WAAA,GAAc,MAAA,CAAA;AAE/D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,OAAO,CAAA,iBAAA,EAAoB,EAAE,CAAA,EAAA,CAAI,CAAA;AACrD,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAA;AAE1C,IAAA,IAAI,EAAE,QAAA,EAAU;AACd,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,2BAA2B,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,EAAA,EAAK,EAAE,QAAA,CAAS,CAAA,IAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAClH;AACA,IAAA,IAAI,EAAE,IAAA,EAAM;AACV,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,uBAAuB,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,EAAK,EAAE,IAAA,CAAK,CAAA,IAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAClG;AACA,IAAA,IAAI,EAAE,KAAA,EAAO;AACX,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,QAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,CAAA,yBAAA,EAA4B,CAAA,CAAE,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,MAC9D,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,CAAA,8BAAA,EAAiC,CAAA,CAAE,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,MACnE;AAAA,IACF;AACA,IAAA,IAAI,EAAE,QAAA,EAAU;AACd,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,CAAA,0BAAA,EAA6B,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA;AAAA,IAChE;AACA,IAAA,IAAI,CAAA,CAAE,iBAAiB,MAAA,EAAW;AAChC,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,CAAA,gBAAA,EAAmB,CAAA,CAAE,YAAY,CAAA,CAAE,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,CAAA,CAAE,aAAa,MAAA,EAAW;AAC5B,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,CAAA,YAAA,EAAe,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA;AAAA,IAClD,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACzC;AACA,IAAA,IAAI,EAAE,KAAA,IAAS,CAAA,CAAE,KAAA,KAAU,OAAA,IAAW,OAAO,MAAA,EAAQ;AACnD,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,CAAA,uBAAA,EAA0B,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,MAAM,MAAA,GAAS,EAAE,MAAA,IAAU,WAAA;AAC3B,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,aAAa,aAAA,CAAc,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,KAAA,CAAM,MAAM,CAAA,MAAA,EAAS,YAAY,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA,GAAK,EAAE,CAAA,EAAA,CAAI,CAAA;AACvF,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAxJA,IAgBaK,MAAAA;AAhBb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAeO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EACE,mOAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,WAAA,EAAY;AAAA,gBACjD,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,2BAAA,EAA4B;AAAA,gBACtE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,kCAAA,EAAmC;AAAA,gBAC1E,QAAA,EAAU;AAAA,kBACR,IAAA,EAAM,QAAA;AAAA,kBACN,YAAY,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS;AAAE,iBACpF;AAAA,gBACA,IAAA,EAAM;AAAA,kBACJ,IAAA,EAAM,QAAA;AAAA,kBACN,YAAY,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS;AAAE,iBACpF;AAAA,gBACA,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,kCAAA,EAAmC;AAAA,gBACzE,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBAC3B,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBAC/B,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,gBAC5B,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAA;AAAE,eACxE;AAAA,cACA,QAAA,EAAU,CAAC,MAAM;AAAA,aACnB;AAAA,YACA,WAAA,EAAa;AAAA,WACf;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,WAAA,EAAa;AAAA,YACX,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,OAAO;AAAA,OACpB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,QAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,QAAA,MAAM,WAAA,GAAe,OAAO,WAAA,IAA0B,WAAA;AAEtD,QAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,KAAA,EAAO,SAAA,EAAW,WAAW,CAAA;AAC5D,QAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,YAAA,CAAa,OAAO,QAAA,EAAU,EAAE,MAAM,CAAA;AAC5D,QAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AAEpB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,oBAAA,EAAqB;AAAA,QACxE;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,OAAO,KAAA,CAAM,MAAA;AAAA,YACb,OAAO,SAAA,IAAa,IAAA;AAAA,YACpB,QAAQ,OAAA,CAAQ;AAAA;AAClB,SACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvFA,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,cAAA;AAAA,MACN,WAAA,EACE,2cAAA;AAAA,MAKF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAIxB,OAAO,YAAA,EAAc;AAAA,UACtB,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,QAAA,EAAU,OAAO,QAAA,IAAY;AAAA,SAC/B,EAAG,GAAA,GAAO,EAAA,GAAK,CAAC,CAAA;AAEhB,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,sBAAA,EAAuB;AAAA,QAC1E;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,MAC7C;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/CA,IAAA,qBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,qBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,eAAA;AAAA,MACN,WAAA,EACE,8NAAA;AAAA,MAGF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAA,EAAQ,WAAW;AAAA,OAChC;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAIxB,OAAO,aAAA,EAAe;AAAA,UACvB,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,WAAW,MAAA,CAAO;AAAA,SACnB,CAAA;AAED,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,aAAA,EAAc;AAAA,QACjE;AAEA,QAAA,OAAO,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,EAAE,OAAA,EAAS,OAAA,CAAQ,SAAQ,EAAE;AAAA,MAC7D;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7CA,IAAA,2BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,2BAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,wBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,qBAAA;AAAA,MACN,WAAA,EACE,sfAAA;AAAA,MAMF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,OAAA;AAAA,YACN,WAAA,EAAa,wDAAA;AAAA,YACb,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,WAAA,EAAa;AAAA;AACf,WACF;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf;AACF,OACF;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAKxB,OAAO,mBAAA,EAAqB;AAAA,UAC7B,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,YAAY,MAAA,CAAO;AAAA,SACrB,EAAG,MAAO,EAAE,CAAA;AAEZ,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,iBAAA,EAAkB;AAAA,QACrE;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,UAAU,OAAA,CAAQ,QAAA;AAAA,YAClB,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,MAAA,GAAS,QAAQ,MAAA,GAAS;AAAA;AACpD,SACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpEA,IAAA,4BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,4BAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,yBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0CAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,sBAAA;AAAA,MACN,WAAA,EACE,yTAAA;AAAA,MAIF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,SAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,SAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAA,EAAQ,SAAS;AAAA,OAC9B;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAMxB,OAAO,oBAAA,EAAsB;AAAA,UAC9B,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,UAAA,EAAY,OAAO,UAAA,IAAc,KAAA;AAAA,UACjC,MAAA,EAAQ,OAAO,MAAA,IAAU;AAAA,SAC3B,EAAG,GAAA,GAAO,EAAA,GAAK,CAAC,CAAA;AAEhB,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,qBAAA,EAAsB;AAAA,QACzE;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,YAAY,OAAA,CAAQ,UAAA;AAAA,YACpB,cAAc,OAAA,CAAQ,YAAA;AAAA,YACtB,UAAU,OAAA,CAAQ,QAAA;AAAA,YAClB,MAAA,EAAQ,OAAO,MAAA,IAAU;AAAA;AAC3B,SACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvEA,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AACA,IAAA,UAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,eAAA;AAAA,MACN,WAAA,EACE,kKAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,6CAAA;AAAA,YACb,OAAA,EAAS;AAAA;AACX,SACF;AAAA,QACA,QAAA,EAAU,CAAC,OAAO;AAAA,OACpB;AAAA,MAEA,MAAM,QAAQ,MAAA,EAAsD;AAClE,QAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,QAAA,MAAM,KAAA,GAAS,OAAO,KAAA,IAAoB,EAAA;AAC1C,QAAA,MAAM,SAAA,GAAY,SAAA;AAElB,QAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,SAAA,EAAW,KAAA,EAAO,KAAK,CAAA;AACjD,QAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,SAAA,EAAW,CAAC,CAAA;AAElD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,OAAA,EAAS,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS,CAAE,CAAA;AAAA,YACtE,gBAAgB,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO;AAAA;AAChD,SACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvCA,IAAA,gBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,gBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AACA,IAAA,UAAA,EAAA;AAGO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,UAAA;AAAA,MACN,WAAA,EACE,gMAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,sBAAA;AAAA,YACb,MAAM,CAAC,cAAA,EAAgB,WAAW,YAAA,EAAc,KAAA,EAAO,OAAO,SAAS;AAAA;AACzE,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAA,EAAQ,UAAU;AAAA,OAC/B;AAAA,MAEA,MAAM,QAAQ,MAAA,EAAsD;AAClE,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,QAAA,MAAM,QAAA,GAAY,OAAO,QAAA,IAA6B,SAAA;AACtD,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,QAAA,SAAA,CAAU;AAAA,UACR,SAAA,EAAW,SAAA;AAAA,UACX,OAAA,EAAS,IAAA;AAAA,UACT,QAAA;AAAA,UACA,MAAA,EAAQ,OAAA;AAAA,UACR,SAAA,EAAW,CAAA;AAAA,UACX,SAAA,EAAW,GAAA;AAAA,UACX,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,OAAO,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,UAAS,EAAE;AAAA,MAC3D;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACzCA,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AAIO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,cAAA;AAAA,MACN,WAAA,EACE,mIAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,eAAA;AAAA,YACb,IAAA,EAAM,CAAC,OAAA,EAAS,OAAA,EAAS,OAAO;AAAA,WAClC;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,WAAA,EAAa;AAAA,YACX,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,UAAA,EAAY,WAAA,EAAa,MAAM;AAAA,OAC5C;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,GAAA,CAAY,iBAAiB,CAAA;AACvD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO;AAAA,WACT;AAAA,QACF;AAEA,QAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,QAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,QAAA,MAAM,WAAA,GAAe,OAAO,WAAA,IAA0B,EAAA;AAEtD,QAAA,IAAI,CAACN,GAAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAA,EAAG;AAAA,QAChE;AAEA,QAAA,MAAM,UAAA,GAAaA,GAAAA,CAAG,YAAA,CAAa,QAAQ,CAAA;AAC3C,QAAA,MAAM,QAAA,GAAWC,KAAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAEvC,QAAA,MAAM,WAAA,GAAsC;AAAA,UAC1C,KAAA,EAAO,OAAA;AAAA,UACP,KAAA,EAAO,OAAA;AAAA,UACP,KAAA,EAAO;AAAA,SACT;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,UAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,UAAU,CAAC,CAAA;AAClC,UAAA,QAAA,CAAS,MAAA,CAAO,aAAA,EAAe,IAAA,EAAM,QAAQ,CAAA;AAC7C,UAAA,QAAA,CAAS,MAAA;AAAA,YACP,SAAA;AAAA,YACA,KAAK,SAAA,CAAU;AAAA,cACb,SAAA,EAAW,WAAA,CAAY,SAAS,CAAA,IAAK,SAAA;AAAA,cACrC,WAAA,EAAa,IAAA;AAAA,cACb,WAAA;AAAA,cACA,iBAAiB,EAAE,OAAA,EAAS,EAAE,MAAA,EAAQ,MAAK;AAAE,aAC9C;AAAA,WACH;AAEA,UAAA,MAAM,WAAW,MAAM,KAAA;AAAA,YACrB,0CAAA;AAAA,YACA;AAAA,cACE,MAAA,EAAQ,MAAA;AAAA,cACR,OAAA,EAAS;AAAA,gBACP,WAAA,EAAa;AAAA,eACf;AAAA,cACA,IAAA,EAAM;AAAA;AACR,WACF;AAEA,UAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,YAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,YAAA,OAAO,EAAE,SAAS,KAAA,EAAO,KAAA,EAAO,kBAAkB,QAAA,CAAS,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAG;AAAA,UAChF;AAEA,UAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,IAAA,EAAM;AAAA,cACJ,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,EAAA;AAAA,cAC9B,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,IAAA;AAAA,cACtC,IAAA;AAAA,cACA,IAAA,EAAM;AAAA;AACR,WACF;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,iBAAiB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,WAC1E;AAAA,QACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1GA,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,QAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAGa,QAAA,EA6BA,QAAA;AAhCb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAM,QAAA,GAAiB;AAAA,MAC5B,IAAA,EAAM,MAAA;AAAA,MACN,WAAA,EACE,2HAAA;AAAA,MAEF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,YAAY;AAAC,OACf;AAAA,MAEA,MAAM,OAAA,CAAQ,OAAA,EAAkC,GAAA,EAAuC;AACrF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,WAAW,MAAM,GAAA,CAAI,aAGxB,MAAA,CAAO,IAAA,EAAM,EAAE,CAAA;AAElB,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,aAAA,EAAc;AAAA,QACjE;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,gBAAA,EAAiB;AAAA,MACjD;AAAA,KACF;AAEO,IAAM,QAAA,GAAiB;AAAA,MAC5B,IAAA,EAAM,MAAA;AAAA,MACN,WAAA,EACE,kGAAA;AAAA,MAEF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,YAAY;AAAC,OACf;AAAA,MAEA,MAAM,OAAA,CAAQ,OAAA,EAAkC,GAAA,EAAuC;AACrF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,WAAW,MAAM,GAAA,CAAI,aAGxB,MAAA,CAAO,IAAA,EAAM,EAAE,CAAA;AAElB,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,aAAA,EAAc;AAAA,QACjE;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,gBAAA,EAAiB;AAAA,MACjD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3DA,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,cAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAYA,eAAsB,cAAA,GAAgC;AACpD,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,MAAM,eAAA,EAAgB;AAEtB,EAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AAC/C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAC5C,IAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,IAAA,MAAA,GAAS,MAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAC5C,IAAA,MAAM,OAAO,KAAA,EAAM;AACnB,IAAA,MAAA,GAAS,MAAA;AAAA,EACX;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU;AAAA,IACxB,IAAA,EAAM,SAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX,EAAG;AAAA,IACD,YAAA,EAAc;AAAA,GACf,CAAA;AAID,EAAA,SAAS,OAAO,CAAA,EAAmB;AACjC,IAAA,OAAO,IAAI,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,MAAM,EAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,CAAE,QAAQ,KAAA,EAAO,KAAK,EAAE,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,EACtG;AAEA,EAAA,SAAS,YAAY,OAAA,EAAyB;AAC5C,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAA,IAAI,CAAA,GAAI,MAAA;AACR,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO,CAAA,IAAK,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,CAAA;AACzC,IAAA,OAAO,CAAA;AAAA,EACT;AAKA,EAAA,SAAS,SAAS,CAAA,EAAmB;AACnC,IAAA,IAAI,OAAO,SAAA,CAAU,CAAC,CAAA,EAAG,OAAO,OAAO,CAAC,CAAA;AAExC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA;AACvC,IAAA,OAAO,OAAO,OAAO,CAAA;AAAA,EACvB;AAGA,EAAA,SAAS,qBAAA,CACP,IAAA,EACA,aAAA,EACA,SAAA,EACQ;AACR,IAAA,MAAM,UAAU,SAAA,KAAc,OAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,UAAU,OAAA,GAAU,OAAA;AAEhC,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,GAAG,8CAA8C,OAAA,GAAU,OAAA,GAAU,OAAO,CAAA,CAAA,CAAG,CAAA;AACnG,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,CAAM,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAAA,IAC5C;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,aAAa,CAAA,EAAA,CAAI,CAAA;AAC9C,IAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAY,UAAA,CAAW,IAAA,EAAM,CAAC,CAAC,CAAA,CAAE,CAAA;AAC5C,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,aAAa,CAAA,CAAE,CAAA;AAEpC,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,SAAS,UAAA,CAAW,MAA+B,KAAA,EAAuB;AACxE,IAAA,MAAM,MAAA,GAAS,GAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAChC,IAAA,MAAM,OAAA,GAAU,GAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AACrC,IAAA,MAAM,SAAA,GAAa,KAAK,SAAA,IAAwB,OAAA;AAChD,IAAA,MAAM,QAAA,GAAY,IAAA,CAAK,QAAA,IAA0C,EAAC;AAClE,IAAa,IAAA,CAAK;AAGlB,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,QAAA,mBAAW,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,QAAQ,UAAA,EAAY,WAAA,EAAa,MAAA,EAAQ,UAAU,CAAC,CAAA;AAC3F,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC7C,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,QAAA,CAAS,GAAA,EAAK,KAAA,GAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9D;AAGA,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,MAAM,SAAA,GAAa,KAAA,CAAM,IAAA,IAAoB,KAAA,CAAM,SAAA,IAAwB,OAAA;AAC3E,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,EAAG,SAAS,CAAA,GAAA,EAAM,UAAA,CAAW,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/E;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,GAAS,CAAA;AAChC,IAAA,MAAM,WAAA,GAAc,aAAa,MAAA,GAAS,CAAA;AAE1C,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,WAAA,EAAa;AAC7B,MAAA,OAAO,MAAM,SAAS,CAAA,MAAA,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,SAAS,CAAA,IAAA,CAAM,CAAA;AAChC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,IAAA,CAAM,CAAA;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,YAAY,CAAA;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAA,CAAI,CAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAA,CAAI,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,SAAS,QAAA,CAAS,KAAc,MAAA,EAAwB;AACtD,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW,OAAO,KAAA;AAC9C,IAAA,IAAI,OAAO,GAAA,KAAQ,SAAA,EAAW,OAAO,OAAO,GAAG,CAAA;AAC/C,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,SAAS,GAAG,CAAA;AAChD,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAE3B,MAAA,IAAI,IAAI,UAAA,CAAW,GAAG,CAAA,IAAK,GAAA,CAAI,WAAW,CAAA,EAAG;AAC3C,QAAA,OAAO,mBAAmB,GAAG,CAAA,EAAA,CAAA;AAAA,MAC/B;AAEA,MAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,GAAG,CAAA,EAAG;AAChC,QAAA,OAAO,IAAI,GAAG,CAAA,CAAA,CAAA;AAAA,MAChB;AACA,MAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAClF;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAEtB,MAAA,IAAI,GAAA,CAAI,WAAW,CAAA,IAAK,GAAA,CAAI,MAAM,CAAA,CAAA,KAAK,OAAO,CAAA,KAAM,QAAQ,CAAA,EAAG;AAC7D,QAAA,OAAO,aAAa,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MAClD;AAEA,MAAA,IAAI,GAAA,CAAI,WAAW,CAAA,IAAK,GAAA,CAAI,MAAM,CAAA,CAAA,KAAK,OAAO,CAAA,KAAM,QAAQ,CAAA,EAAG;AAC7D,QAAA,OAAO,eAAe,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACpD;AAEA,MAAA,IAAI,GAAA,CAAI,WAAW,CAAA,IAAK,GAAA,CAAI,MAAM,CAAA,CAAA,KAAK,OAAO,CAAA,KAAM,QAAQ,CAAA,EAAG;AAC7D,QAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,CAAA,CAAA,KAAM,KAAgB,CAAC,CAAA;AAClD,QAAA,IAAI,QAAA,SAAiB,CAAA,WAAA,EAAc,GAAA,CAAI,IAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAC/D,QAAA,OAAO,CAAA,eAAA,EAAkB,GAAA,CAAI,GAAA,CAAI,CAAA,CAAA,KAAK,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAW,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACnF;AACA,MAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,CAAA,EAAG,MAAM,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,GAA8B,CAAA;AAC7D,MAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,MAAA,OAAO,CAAA;AAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,GAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,GAAA,EAAM,QAAA,CAAS,CAAA,EAAG,MAAA,GAAS,CAAC,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC;AAAA,EAAK,GAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA,CAAA;AAAA,IACzI;AACA,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AAIA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,aAAA;AAAA,IACA,mDAAA;AAAA,IACA,EAAE,IAAA,EAAM,CAAA,CAAE,QAAO,CAAE,QAAA,CAAS,4DAA4D,CAAA,EAAE;AAAA,IAC1F,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAK,KAAM;AAClB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAkC,OAAO,UAAA,EAAY,EAAE,IAAA,EAAAA,KAAAA,EAAM,CAAA;AACtF,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,aAAA;AAAA,IACA,6DAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oBAAoB,CAAA;AAAA,MAC9C,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0BAA0B;AAAA,KACxD;AAAA,IACA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,QAAO,KAAM;AAC1B,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,YAAY,EAAE,IAAA,EAAAA,KAAAA,EAAM,MAAA,EAAQ,CAAA;AACxE,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,EAAG,CAAA,EAAE;AAAA,IACnF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,UAAA;AAAA,IACA,6fAAA;AAAA,IAIA,EAAE,IAAA,EAAM,CAAA,CAAE,QAAO,CAAE,QAAA,CAAS,sBAAsB,CAAA,EAAE;AAAA,IACpD,OAAO,EAAE,IAAA,EAAK,KAAM;AAClB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAoC,OAAO,QAAA,EAAU,EAAE,MAAM,CAAA;AACtF,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,cAAA;AAAA,IACA,oDAAA;AAAA,IACA;AAAA,MACE,UAAU,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,gDAAgD,CAAA;AAAA,MACzF,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,QAAA,CAAS,oBAAoB;AAAA,KAC1E;AAAA,IACA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAS,KAAM;AAChC,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAsC,OAAO,YAAA,EAAc;AAAA,QAClF,UAAU,QAAA,IAAY,IAAA;AAAA,QACtB;AAAA,OACD,CAAA;AACD,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,gBAAA;AAAA,IACA,8OAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qEAAqE,CAAA;AAAA,MAC/F,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,GAAW,OAAA,CAAQ,IAAI,CAAA,CAAE,QAAA,CAAS,0GAA0G;AAAA,KACnK;AAAA,IACA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,SAAQ,KAAM;AAC3B,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAA6C,MAAA,CAAO,gBAAgB,EAAE,IAAA,EAAAA,KAAAA,EAAM,OAAA,EAAS,CAAA;AAC9G,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,4BAAA;AAAA,IACA,yNAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qEAAqE,CAAA;AAAA,MAC/F,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,GAAW,OAAA,CAAQ,IAAI,CAAA,CAAE,QAAA,CAAS,yEAAyE,CAAA;AAAA,MAChI,YAAY,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,8DAA8D;AAAA,KAC3G;AAAA,IACA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,OAAA,EAAS,YAAW,KAAM;AACvC,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAqB,OAAO,0BAAA,EAA4B,EAAE,IAAA,EAAAA,KAAAA,EAAM,OAAA,EAAS,UAAA,EAAW,EAAG,GAAA,GAAO,KAAK,CAAC,CAAA;AAC7H,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,gBAAA;AAAA,IACA,gDAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oBAAoB,CAAA;AAAA,MAC9C,UAAA,EAAY,EAAE,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA,CAAE,SAAS,sCAAsC;AAAA,KACnF;AAAA,IACA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,YAAW,KAAM;AAC9B,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,gBAAgB,EAAE,IAAA,EAAAA,KAAAA,EAAM,UAAA,EAAY,CAAA;AAChF,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,EAAG,CAAA,EAAE;AAAA,IACnF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,iBAAA;AAAA,IACA,sDAAA;AAAA,IACA;AAAA,MACE,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oCAAoC,CAAA;AAAA,MACnE,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,sBAAsB,CAAA;AAAA,MACtD,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2BAA2B,CAAA;AAAA,MACrD,UAAA,EAAY,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,4BAA4B;AAAA,KACpF;AAAA,IACA,OAAO,EAAE,SAAA,EAAW,UAAA,EAAY,IAAA,EAAM,YAAW,KAAM;AACrD,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAY,OAAO,eAAA,EAAiB;AAAA,QAC3D,SAAA;AAAA,QAAW,UAAA;AAAA,QAAY,IAAA;AAAA,QAAM,UAAA,EAAY,cAAc;AAAC,OACzD,CAAA;AACD,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,EAAG,CAAA,EAAE;AAAA,IACnF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,iBAAA;AAAA,IACA,qDAAA;AAAA,IACA,EAAE,IAAA,EAAM,CAAA,CAAE,QAAO,CAAE,QAAA,CAAS,8BAA8B,CAAA,EAAE;AAAA,IAC5D,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAK,KAAM;AAClB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAY,OAAO,eAAA,EAAiB,EAAE,IAAA,EAAAA,KAAAA,EAAM,CAAA;AACrE,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,EAAG,CAAA,EAAE;AAAA,IACnF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,eAAA;AAAA,IACA,6QAAA;AAAA,IAGA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,MAAM,MAAM,MAAA,CAAO,YAA8B,MAAA,CAAO,aAAA,EAAe,EAAE,CAAA;AAC/E,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,gBAAA;AAAA,IACA,wDAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oBAAoB,CAAA;AAAA,MAC/C,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,OAAA,CAAQ,EAAE,CAAA,CAAE,QAAA,CAAS,aAAa;AAAA,KACtE;AAAA,IACA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAW,KAAM;AAC/B,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAiC,OAAO,cAAA,EAAgB,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA;AACtG,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,YAAA;AAAA,IACA,0CAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,OAAA,CAAQ,EAAE,CAAA,CAAE,QAAA,CAAS,aAAa,CAAA;AAAA,MAC/D,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,iBAAiB;AAAA,KAChF;AAAA,IACA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAM,KAAM;AAC1B,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAA0C,OAAO,UAAA,EAAY;AAAA,QACpF,KAAA;AAAA,QAAO,OAAO,KAAA,IAAS;AAAA,OACxB,CAAA;AACD,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,gBAAA;AAAA,IACA,iPAAA;AAAA,IAEA,EAAE,SAAA,EAAW,CAAA,CAAE,QAAO,CAAE,QAAA,CAAS,kEAAkE,CAAA,EAAE;AAAA,IACrG,OAAO,EAAE,SAAA,EAAU,KAAM;AACvB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAqB,OAAO,cAAA,EAAgB,EAAE,WAAW,CAAA;AAClF,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,WAAA;AAAA,IACA,6TAAA;AAAA,IAGA;AAAA,MACE,QAAQ,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iEAAiE,CAAA;AAAA,MACxG,MAAM,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAAA,QAC1B;AAAA,OAEF;AAAA,MACA,SAAS,CAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,wGAAwG;AAAA,KACnJ;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAQ,KAAM;AACnC,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA;AAAA,QACvB,MAAA,CAAO,QAAA;AAAA,QAAU,EAAE,MAAA,EAAQ,MAAA,IAAU,YAAA,EAAc,MAAM,OAAA;AAAQ,OACnE;AACA,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,WAAA;AAAA,IACA,wJAAA;AAAA,IACA,EAAE,UAAU,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAA,CAAS,wCAAwC,CAAA,EAAE;AAAA,IACrF,OAAO,EAAE,QAAA,EAAS,KAAM;AACtB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAA8C,OAAO,SAAA,EAAW;AAAA,QACvF,UAAU,QAAA,IAAY;AAAA,OACvB,CAAA;AACD,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,kBAAA;AAAA,IACA,sVAAA;AAAA,IAIA,EAAE,MAAM,CAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAA,CAAS,mGAAmG,CAAA,EAAE;AAAA,IAC7I,OAAO,EAAE,IAAA,EAAK,KAAM;AAClB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAqC,MAAA,CAAO,gBAAA,EAAkB,EAAE,IAAA,EAAM,IAAA,IAAQ,IAAA,EAAK,EAAG,IAAO,CAAA;AACtH,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,mBAAA;AAAA,IACA,uWAAA;AAAA,IAIA,EAAE,MAAM,CAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAA,CAAS,mGAAmG,CAAA,EAAE;AAAA,IAC7I,OAAO,EAAE,IAAA,EAAK,KAAM;AAClB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAqC,MAAA,CAAO,iBAAA,EAAmB,EAAE,IAAA,EAAM,IAAA,IAAQ,IAAA,EAAK,EAAG,IAAO,CAAA;AACvH,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAIA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,aAAA;AAAA,IACA,0HAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mBAAmB,CAAA;AAAA,MAC7C,QAAQ,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,kCAAkC,CAAA;AAAA,MACzE,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,CAAC,SAAS,MAAA,EAAQ,UAAA,EAAY,OAAA,EAAS,aAAa,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,YAAY,CAAA;AAAA,MACrG,QAAA,EAAU,EAAE,MAAA,CAAO,EAAE,GAAG,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,CAAA,CAAE,QAAO,EAAG,CAAA,EAAG,EAAE,MAAA,EAAO,EAAG,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,gBAAgB,CAAA;AAAA,MACxG,IAAA,EAAM,EAAE,MAAA,CAAO,EAAE,GAAG,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,CAAA,CAAE,QAAO,EAAG,CAAA,EAAG,EAAE,MAAA,EAAO,EAAG,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,eAAe,CAAA;AAAA,MACnG,OAAO,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,mDAAmD,CAAA;AAAA,MACzF,UAAU,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yCAAyC,CAAA;AAAA,MAClF,cAAc,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,uBAAuB,CAAA;AAAA,MACpE,UAAU,CAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,0BAA0B,CAAA;AAAA,MACpE,YAAY,CAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,eAAe;AAAA,KAC7D;AAAA,IACA,OAAO,MAAA,KAAW;AAChB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,aAAsC,EAAC;AAC7C,MAAA,IAAI,OAAO,QAAA,EAAU,UAAA,CAAW,QAAA,GAAW,EAAE,GAAG,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,OAAO,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,SAAS,CAAA,EAAE;AAC9G,MAAA,IAAI,OAAO,IAAA,EAAM,UAAA,CAAW,IAAA,GAAO,EAAE,GAAG,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,OAAO,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,EAAE;AAC1F,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,MAAM,IAAI,MAAA,CAAO,KAAA;AACjB,QAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,aAAc,KAAA,GAAQ,CAAA;AAAA,aAAA,IACjC,CAAA,CAAE,UAAA,CAAW,KAAK,CAAA,EAAG;AAC5B,UAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA;AAC1B,UAAA,IAAI,CAAA,IAAK,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,UAAA,CAAW,QAAQ,EAAE,GAAA,EAAK,QAAA,CAAS,CAAA,CAAE,CAAC,CAAC,GAAG,KAAA,EAAO,QAAA,CAAS,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,MAAM,QAAA,CAAS,CAAA,CAAE,CAAC,CAAC,CAAA,EAAE;AAAA,QAChH,CAAA,iBAAkB,UAAA,GAAa,CAAA;AAAA,MACjC;AACA,MAAA,IAAI,MAAA,CAAO,QAAA,EAAU,UAAA,CAAW,QAAA,GAAW,MAAA,CAAO,QAAA;AAClD,MAAA,IAAI,MAAA,CAAO,YAAA,KAAiB,MAAA,EAAW,UAAA,CAAW,eAAe,MAAA,CAAO,YAAA;AACxE,MAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW,UAAA,CAAW,WAAW,MAAA,CAAO,QAAA;AAAA,sBAChD,QAAA,GAAW,IAAA;AAC3B,MAAA,IAAI,MAAA,CAAO,UAAA,KAAe,MAAA,EAAW,UAAA,CAAW,aAAa,MAAA,CAAO,UAAA;AACpE,MAAA,IAAI,OAAO,KAAA,IAAS,MAAA,CAAO,UAAU,OAAA,EAAS,UAAA,CAAW,QAAQ,MAAA,CAAO,KAAA;AAExE,MAAA,MAAM,SAAA,GAAY,OAAO,KAAA,KAAU,OAAA,GAAU,cAAc,MAAA,CAAO,KAAA,KAAU,gBAAgB,iBAAA,GAAoB,MAAA;AAEhH,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAiE,OAAO,eAAA,EAAiB;AAAA,QAChH,SAAA;AAAA,QACA,UAAA,EAAY,OAAO,MAAA,IAAU,WAAA;AAAA,QAC7B,MAAM,MAAA,CAAO,IAAA;AAAA,QACb;AAAA,OACD,CAAA;AACD,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,gBAAA;AAAA,IACA,mFAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2BAA2B,CAAA;AAAA,MACrD,SAAS,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,oBAAoB,CAAA;AAAA,MAC5D,WAAW,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,2BAA2B,CAAA;AAAA,MACrE,MAAA,EAAQ,EAAE,MAAA,CAAO,EAAE,GAAG,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,CAAA,CAAE,QAAO,EAAG,CAAA,EAAG,EAAE,MAAA,EAAO,EAAG,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,+BAA+B;AAAA,KACvH;AAAA,IACA,OAAO,MAAA,KAAW;AAChB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,aAAA,EAAgB,WAAA,CAAY,OAAO,IAAI,CAAC,IAAI,CAAA,0BAAA,CAA4B,CAAA;AACvF,MAAA,IAAI,MAAA,CAAO,SAAS,KAAA,CAAM,IAAA,CAAK,gBAAgB,MAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,CAAA;AACvE,MAAA,IAAI,OAAO,SAAA,EAAW;AACpB,QAAA,KAAA,CAAM,KAAK,CAAA,eAAA,EAAkB,WAAA,CAAY,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,MAC9D,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,KAAK,CAAA,0BAAA,CAA4B,CAAA;AAAA,MACzC;AACA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,KAAA,CAAM,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAC1C,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gDAAA,EAAmD,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AACxH,QAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAAA,MAClB;AACA,MAAA,KAAA,CAAM,KAAK,CAAA,wCAAA,CAA0C,CAAA;AAErD,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAoC,MAAA,CAAO,QAAA,EAAU,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA;AACxG,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,iBAAA;AAAA,IACA,yGAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,EAAE,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,kCAAkC,CAAA;AAAA,MACtE,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oBAAoB,CAAA;AAAA,MACnD,UAAA,EAAY,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,kCAAkC,CAAA;AAAA,MAC9F,QAAQ,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,kCAAkC;AAAA,KAC3E;AAAA,IACA,OAAO,MAAA,KAAW;AAChB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,EAAA,GAAK,OAAO,UAAA,IAAc,OAAA;AAChC,MAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,WAAA;AAEhC,MAAA,MAAM,IAAA,GAAO;AAAA,QACX,CAAA,2BAAA,EAA8B,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,QACxC,CAAA,aAAA,EAAgB,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAAA,QACxC,CAAA,eAAA,EAAkB,WAAA,CAAY,MAAM,CAAC,CAAA,CAAA;AAAA,QACrC,GAAG,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,WAAA,CAAY,CAAC,CAAC,CAAA,eAAA,CAAiB,CAAA;AAAA,QAC7D,CAAA,eAAA,EAAkB,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,0CAAA;AAAA,OACvC,CAAE,KAAK,IAAI,CAAA;AAEX,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAoC,OAAO,QAAA,EAAU,EAAE,MAAM,CAAA;AACtF,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,gBAAA;AAAA,IACA,kNAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO;AAAA,QACtB,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,QACf,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC/B,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC5B,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,CAAA,EAAG,CAAA,CAAE,QAAO,EAAG,CAAA,EAAG,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,CAAA,CAAE,QAAO,EAAG,EAAE,QAAA,EAAS;AAAA,QAC7E,MAAM,CAAA,CAAE,MAAA,CAAO,EAAE,CAAA,EAAG,CAAA,CAAE,QAAO,EAAG,CAAA,EAAG,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,CAAA,CAAE,QAAO,EAAG,EAAE,QAAA,EAAS;AAAA,QACzE,OAAO,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iDAAiD,CAAA;AAAA,QACvF,UAAU,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,sDAAsD,CAAA;AAAA,QAC/F,YAAA,EAAc,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAClC,QAAA,EAAU,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,QAC/B,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,QACjC,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,QAAQ,UAAA,EAAY,OAAO,CAAC,CAAA,CAAE,QAAA;AAAS,OAChE,CAAC,CAAA,CAAE,QAAA,CAAS,8BAA8B,CAAA;AAAA,MAC3C,WAAW,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,6CAA6C,CAAA;AAAA,MACvF,aAAa,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,2CAA2C;AAAA,KACzF;AAAA,IACA,OAAO,MAAA,KAAW;AAChB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,MAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,MAAA,MAAM,WAAA,GAAc,OAAO,WAAA,IAAe,WAAA;AAE1C,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,KAAA,CAAM,KAAK,CAAA,oCAAA,CAAsC,CAAA;AACjD,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,CAAA;AAC/C,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,WAAA,CAAY,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,MAC1D;AACA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,QAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA,CAAA;AAChB,QAAA,MAAM,KAAK,CAAA,CAAE,SAAA,KAAc,CAAA,CAAE,KAAA,KAAU,UAAU,WAAA,GAAc,MAAA,CAAA;AAC/D,QAAA,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,CAAC,mBAAmB,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AACrD,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,CAAA;AAC1C,QAAA,IAAI,EAAE,QAAA,EAAU,KAAA,CAAM,KAAK,CAAA,EAAG,CAAC,2BAA2B,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAA,EAAK,EAAE,QAAA,CAAS,CAAC,KAAK,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,CAAA,CAAG,CAAA;AAC3G,QAAA,IAAI,EAAE,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA,EAAG,CAAC,uBAAuB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAA,EAAK,EAAE,IAAA,CAAK,CAAC,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AACvF,QAAA,IAAI,EAAE,KAAA,EAAO;AACX,UAAA,IAAI,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,YAAA,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,wBAAA,EAA2B,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,UAC9D,CAAA,MAAA,IAAW,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,EAAG;AACrC,YAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,4CAA4C,CAAA;AACpE,YAAA,IAAI,GAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,CAAC,2BAA2B,CAAA,CAAE,CAAC,CAAC,CAAA,EAAA,EAAK,EAAE,CAAC,CAAC,KAAK,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,UAC5E,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,6BAAA,EAAgC,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,UACnE;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,UAAU,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,0BAAA,EAA6B,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA;AACxE,QAAA,IAAI,CAAA,CAAE,YAAA,KAAiB,MAAA,EAAW,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,gBAAA,EAAmB,CAAA,CAAE,YAAY,CAAA,CAAE,CAAA;AACpF,QAAA,KAAA,CAAM,KAAK,CAAA,EAAG,CAAC,eAAe,CAAA,CAAE,QAAA,IAAY,IAAI,CAAA,CAAE,CAAA;AAClD,QAAA,IAAI,CAAA,CAAE,UAAA,KAAe,MAAA,EAAW,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,cAAA,EAAiB,CAAA,CAAE,UAAU,CAAA,CAAE,CAAA;AAC9E,QAAA,IAAI,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA,KAAU,WAAW,EAAA,KAAO,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,uBAAA,EAA0B,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACvG,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,UAAA,EAAa,SAAA,GAAY,QAAA,GAAW,WAAA,CAAY,CAAA,CAAE,MAAA,IAAU,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,MAC3F;AACA,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,KAAA,CAAM,MAAM,CAAA,MAAA,EAAS,YAAY,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA,GAAK,EAAE,CAAA,EAAA,CAAI,CAAA;AAEvF,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAoC,MAAA,CAAO,QAAA,EAAU,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA;AACxG,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAIA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,cAAA;AAAA,IACA,mfAAA;AAAA,IAKA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,4DAA4D,CAAA;AAAA,MACtF,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,OAAA,CAAQ,EAAE,CAAA,CAAE,QAAA,CAAS,iCAAiC;AAAA,KACxF;AAAA,IACA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,UAAS,KAAM;AAC5B,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA;AAAA,QACvB,MAAA,CAAO,YAAA;AAAA,QAAc,EAAE,IAAA,EAAAA,KAAAA,EAAM,QAAA,EAAS;AAAA,QAAG,MAAO,EAAA,GAAK;AAAA,OACvD;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS;AACxB,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,CAAA,OAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,KAAA,IAAS,sBAAsB,CAAA,CAAA,EAAI,CAAA,EAAE;AAAA,MAC/G;AACA,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,QAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IACjG;AAAA,GACF;AAMA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,mBAAA;AAAA,IACA,CAAA,6SAAA,CAAA;AAAA,IAGA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,eAAA,EAAgB;AAEhB,MAAA,MAAM,SAAS,MAAM,MAAA,CAAO,YAA8B,MAAA,CAAO,aAAA,EAAe,EAAE,CAAA;AAClF,MAAA,MAAM,KAAA,GAAkB,MAAA,CAAO,OAAA,EAAS,KAAA,IAAS,EAAC;AAClD,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,kCAAA,EAAoC,CAAA,EAAE;AAAA,MAC1F;AAGA,MAAA,MAAM,UAAmC,EAAC;AAC1C,MAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG;AAClC,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,WAAA;AAAA,YAC3B,MAAA,CAAO,cAAA;AAAA,YAAgB,EAAE,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,IAAA;AAAK,WAClD;AACA,UAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,cAAc,OAAA,CAAQ,OAAA;AAAA,QACrD,CAAA,CAAA,MAAQ;AACN,UAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,EAAE,KAAA,EAAO,2BAAA,EAA4B;AAAA,QACpD;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,EAAA,EAAI;AACrB,QAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,CAAA,EAAG,KAAA,CAAM,SAAS,EAAE,CAAA,yBAAA,CAAA;AAAA,MAC9C;AAEA,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IACxF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,kBAAA;AAAA,IACA,4NAAA;AAAA,IAGA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+CAA+C,CAAA;AAAA,MACzE,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,QAAA,CAAS,gDAAgD;AAAA,KACxG;AAAA,IACA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,YAAW,KAAM;AAC9B,MAAA,eAAA,EAAgB;AAEhB,MAAA,MAAM,CAAC,OAAA,EAAS,OAAO,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QAC3C,MAAA,CAAO,WAAA;AAAA,UACL,MAAA,CAAO,cAAA;AAAA,UAAgB,EAAE,IAAA,EAAAA,KAAAA,EAAM,OAAA,EAAS,IAAA;AAAK,SAC/C;AAAA,QACA,MAAA,CAAO,WAAA;AAAA,UACL,MAAA,CAAO,YAAA;AAAA,UAAc,EAAE,QAAA,EAAUA,KAAAA,EAAM,QAAA,EAAU,cAAc,CAAA;AAAE;AACnE,OACD,CAAA;AAED,MAAA,OAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,OAAA;AAAA,YAClD,QAAA,EAAU,OAAA,CAAQ,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ;AAAA,WAC5C,EAAG,MAAM,CAAC;AAAA,SACX;AAAA,OACH;AAAA,IACF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,oBAAA;AAAA,IACA,mQAAA;AAAA,IAGA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,8EAA8E,CAAA;AAAA,MACxG,SAAA,EAAW,CAAA,CAAE,IAAA,CAAK,CAAC,SAAS,OAAO,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,OAAO,CAAA,CAAE,SAAS,oEAAoE,CAAA;AAAA,MAC/I,eAAe,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,8DAA8D;AAAA,KAC9G;AAAA,IACA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,SAAA,EAAW,eAAc,KAAM;AAC5C,MAAA,eAAA,EAAgB;AAEhB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA;AAAA,QACvB,MAAA,CAAO,YAAA;AAAA,QAAc,EAAE,IAAA,EAAAA,KAAAA,EAAM,QAAA,EAAU,EAAA,EAAG;AAAA,QAAG,MAAO,EAAA,GAAK;AAAA,OAC3D;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,CAAQ,WAAW,CAAC,GAAA,CAAI,QAAQ,IAAA,EAAM;AAC7C,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,CAAA,sBAAA,EAAyB,GAAA,CAAI,OAAA,CAAQ,KAAA,IAAS,eAAe,CAAA,CAAA,EAAI,CAAA,EAAE;AAAA,MACvH;AAEA,MAAA,MAAM,IAAA,GAAO,IAAI,OAAA,CAAQ,IAAA;AACzB,MAAA,MAAM,IAAA,GAAO,aAAA,IAAkB,IAAA,CAAK,IAAA,IAAmB,oBAAA;AACvD,MAAA,MAAM,KAAK,SAAA,IAAa,OAAA;AAGxB,MAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AACjD,MAAA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,EAAM,CAAA,EAAE;AAAA,IAC5D;AAAA,GACF;AAIA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,kBAAA;AAAA,IACA,8KAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,MAAM,WAAA,GAAc,OAAO,eAAA,EAAgB;AAC3C,MAAA,MAAM,aAAA,GAAgB,OAAO,gBAAA,EAAiB;AAC9C,MAAA,OAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,eAAe,aAAA,IAAiB,MAAA;AAAA,YAChC,WAAA,EAAa,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,cACjC,GAAG,CAAA;AAAA,cACH,MAAA,EAAQ,kBAAkB,CAAA,IAAK,WAAA,CAAY,WAAW,CAAA,GAAI,IAAA,GACtD,EAAE,OAAA,KAAY;AAAA,aACpB,CAAE;AAAA,WACJ,EAAG,MAAM,CAAC;AAAA,SACX;AAAA,OACH;AAAA,IACF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,kBAAA;AAAA,IACA,yMAAA;AAAA,IAEA;AAAA,MACE,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uDAAuD;AAAA,KACtF;AAAA,IACA,OAAO,EAAE,OAAA,EAAQ,KAAM;AACrB,MAAA,MAAM,WAAA,GAAc,OAAO,eAAA,EAAgB;AAC3C,MAAA,IAAI,OAAA,KAAY,KAAK,CAAC,WAAA,CAAY,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,KAAY,OAAO,CAAA,EAAG;AAClE,QAAA,MAAM,SAAA,GAAY,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,SAAA,IAAa,SAAS,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAC9F,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA,MAAA,EAAS,OAAO,CAAA,8BAAA,EAAiC,aAAa,MAAM,CAAA;AAAA,WAC3E;AAAA,SACH;AAAA,MACF;AACA,MAAA,MAAA,CAAO,iBAAiB,OAAO,CAAA;AAC/B,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,oCAAA,EAAsC,CAAA,EAAE;AAAA,MAC5F;AACA,MAAA,MAAM,SAAS,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,OAAO,CAAA;AAC1D,MAAA,OAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,IAAA,EAAM,MAAA;AAAA,UACN,MAAM,CAAA,oBAAA,EAAuB,MAAA,EAAQ,SAAA,IAAa,SAAS,KAAK,OAAO,CAAA,CAAA;AAAA,SACxE;AAAA,OACH;AAAA,IACF;AAAA,GACF;AAIA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,eAAA;AAAA,IACA,qEAAA;AAAA,IACA,EAAE,KAAA,EAAO,CAAA,CAAE,QAAO,CAAE,QAAA,CAAS,oBAAoB,CAAA,EAAE;AAAA,IACnD,OAAO,EAAE,KAAA,EAAM,KAAM;AACnB,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,SAAA,EAAW,KAAA,EAAO,EAAE,CAAA;AAC9C,MAAA,MAAM,OAAA,GAAU,eAAe,SAAS,CAAA;AACxC,MAAA,OAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,EAAG,WAAA,EAAa,OAAA,EAAQ,EAAG,MAAM,CAAC;AAAA,SACzF;AAAA,OACH;AAAA,IACF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,UAAA;AAAA,IACA,yEAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,sBAAsB,CAAA;AAAA,MAChD,QAAA,EAAU,CAAA,CAAE,IAAA,CAAK,CAAC,cAAA,EAAgB,SAAA,EAAW,YAAA,EAAc,KAAA,EAAO,KAAA,EAAO,SAAS,CAAC,CAAA,CAAE,SAAS,UAAU;AAAA,KAC1G;AAAA,IACA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAS,KAAM;AAC5B,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,SAAA,CAAU,EAAE,SAAA,EAAW,SAAA,EAAW,OAAA,EAAS,MAAM,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,CAAA,EAAK,SAAA,EAAW,GAAA,EAAK,UAAA,EAAY,KAAK,CAAA;AAC3H,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,CAAA,YAAA,EAAe,IAAI,CAAA,CAAA,EAAI,CAAA,EAAE;AAAA,IAC7E;AAAA,GACF;AAIA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA,YAAY;AACV,MAAA,MAAM,IAAA,GAAO,OAAO,iBAAA,EAAkB;AACtC,MAAA,OAAO;AAAA,QACL,UAAU,CAAC;AAAA,UACT,GAAA,EAAK,iBAAA;AAAA,UACL,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,SAAA,EAAW,OAAO,WAAA,EAAY;AAAA,YAC9B,WAAW,IAAA,EAAM,SAAA;AAAA,YACjB,SAAS,IAAA,EAAM,OAAA;AAAA,YACf,eAAe,IAAA,EAAM,aAAA;AAAA,YACrB,IAAA,EAAM,OAAO,OAAA;AAAQ,WACvB,EAAG,MAAM,CAAC,CAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACX;AAAA,OACH;AAAA,IACF;AAAA,GACF;AAGA,EAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,EAAqB;AAC3C,EAAA,MAAM,GAAA,CAAI,QAAQ,SAAS,CAAA;AAC7B;AAEA,SAAS,eAAA,GAAwB;AAC/B,EAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAY,EAAG;AACzB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF;AAv0BA,IAUI,MAAA;AAVJ,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mBAAA,GAAA;AAGA,IAAA,cAAA,EAAA;AACA,IAAA,cAAA,EAAA;AACA,IAAA,aAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACLA,IAAM,SAAA,GAAY,CAAA;AAAA;AAAA;AAAA;AAAA,0GAAA,CAAA;AAMlB,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,MAAM,IAAA,GAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,QAAA,EAAS;AACjC,EAAA,IAAI,QAAQ,CAAA,IAAK,IAAA,GAAO,EAAA,EAAI,OAAO,gBAAgB,IAAI,CAAA,CAAA,CAAA;AACvD,EAAA,IAAI,QAAQ,EAAA,IAAM,IAAA,GAAO,EAAA,EAAI,OAAO,kBAAkB,IAAI,CAAA,CAAA,CAAA;AAC1D,EAAA,IAAI,QAAQ,EAAA,IAAM,IAAA,GAAO,EAAA,EAAI,OAAO,gBAAgB,IAAI,CAAA,CAAA,CAAA;AACxD,EAAA,OAAO,6BAA6B,IAAI,CAAA,CAAA,CAAA;AAC1C;AAaO,IAAM,OAAA,GAAkCM,MAAA,CAAM,IAAA,CAAK,CAAC;AAAA,EACzD,QAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,QAAA,GAAW,YAAY,QAAQ,CAAA;AAErC,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,OAAM,MAAA,EAEhC,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAY,OAAA;AAAA,QACZ,WAAA,EAAY,SAAA;AAAA,QACZ,QAAA,EAAU,CAAA;AAAA,QACV,cAAA,EAAe,eAAA;AAAA,QAEf,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,KAAA,EAAM,SAAA,EAAU,QAAA,EAAA;AAAA,YAAA,WAAA;AAAA,YACf;AAAA,WAAA,EACZ,CAAA;AAAA,0BACA,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,gCAAA,EAA8B;AAAA;AAAA;AAAA,KAC/C;AAAA,yBAGC,GAAA,EAAA,EAEC,QAAA,EAAA;AAAA,sBAAA,IAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,QAAA;AAAA,UACd,WAAA,EAAY,OAAA;AAAA,UACZ,WAAA,EAAY,MAAA;AAAA,UACZ,QAAA,EAAU,CAAA;AAAA,UACV,QAAA,EAAU,CAAA;AAAA,UACV,KAAA,EAAM,KAAA;AAAA,UAEN,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,KAAA,EAAM,QACd,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,4BACA,GAAA,CAAC,QAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,YAEN,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,CAAE,IAAI,CAAC,IAAA,EAAM,CAAA,qBAChC,GAAA,CAAC,IAAA,EAAA,EAAa,KAAA,EAAM,QAAA,EACjB,QAAA,EAAA,IAAA,EAAA,EADQ,CAEX,CACD,CAAA;AAAA,4BAED,GAAA,CAAC,QAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,4BACP,IAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EACX,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,cAAS,QAAA;AAAA,cAAI,KAAA,IAAS;AAAA,aAAA,EACzB,CAAA;AAAA,4BACA,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAE,QAAA,EAAA,GAAA,EAAI;AAAA;AAAA;AAAA,OACtB;AAAA,sBAGA,GAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,QAAA;AAAA,UACd,WAAA,EAAY,OAAA;AAAA,UACZ,WAAA,EAAY,MAAA;AAAA,UACZ,QAAA,EAAU,CAAA;AAAA,UACV,QAAA,EAAU,CAAA;AAAA,UACV,KAAA,EAAM,KAAA;AAAA,UAEL,sCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,KAAA,EAAM,UAAS,QAAA,EAAA,0BAAA,EAE1B,CAAA;AAAA,4BACA,GAAA,CAAC,QAAK,QAAA,EAAA,+CAAA,EAEN,CAAA;AAAA,iCACC,IAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,MAAA;AAAA,8BACA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,cAAO;AAAA,aAAA,EACrC,CAAA;AAAA,iCACC,IAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,MAAA;AAAA,8BACA,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA;AAAA,gBAAA,OAAA;AAAA,gBAAM;AAAA,eAAA,EAAS,CAAA;AAAA,cAAO;AAAA,aAAA,EAC/C,CAAA;AAAA,4BACA,GAAA,CAAC,QAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,gCACN,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,KAAA,EAAM,UAAS,QAAA,EAAA,mBAAA,EAE1B,CAAA;AAAA,YACC,4BACC,GAAA,CAAC,IAAA,EAAA,EAAK,OAAM,OAAA,EAAQ,QAAA,EAAA,mCAAA,EAA4B,oBAEhD,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,qCAAA,EAA8B,CAAA;AAAA,8BAChD,IAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,gBAAA,2BAAA;AAAA,gBAA0B;AAAA,eAAA,EAAK,CAAA;AAAA,8BAC9C,IAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,gBAAA,MAAA;AAAA,gCACT,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,wBAAA,EAAsB,CAAA;AAAA,gBAAO;AAAA,eAAA,EACtD;AAAA,aAAA,EACF;AAAA,WAAA,EAEJ,oBAEA,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,KAAA,EAAM,UAAS,QAAA,EAAA,gCAAA,EAE1B,CAAA;AAAA,4BACA,GAAA,CAAC,QAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,iCACN,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAI,MAAC,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,8BACpC,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,8BACnB,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,gBAAA,EAAc;AAAA,aAAA,EACnC,CAAA;AAAA,iCACC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAI,MAAC,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,8BACpC,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,8BACnB,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,mBAAA,EAAiB;AAAA,aAAA,EACtC,CAAA;AAAA,iCACC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAI,MAAC,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,8BACpC,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,8BACnB,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,gBAAA,EAAc;AAAA,aAAA,EACnC,CAAA;AAAA,iCACC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAI,MAAC,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,8BACpC,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,8BACnB,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,aAAA,EAAW;AAAA,aAAA,EAChC,CAAA;AAAA,iCACC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAI,MAAC,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,8BACpC,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,8BACnB,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,oBAAA,EAAkB;AAAA,aAAA,EACvC,CAAA;AAAA,4BACA,GAAA,CAAC,QAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,4BACP,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,wBAAA,EAAsB,CAAA;AAAA,gCACpC,IAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAA,EAAM,MAAA,EAAO,gDAAkC,CAAA,EACvD,CAAA;AAAA,gCACC,IAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAA,EAAM,MAAA,EAAO,8CAAgC,CAAA,EACrD;AAAA,WAAA,EACF;AAAA;AAAA;AAEJ,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC,CAAA;;;ACrKD,WAAA,EAAA;AAMA,IAAM,gBAAA,GAA2E;AAAA,EAC/E,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,MAAM,2BAAA,EAA4B;AAAA,EACpE,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,WAAA,EAAa,MAAM,6BAAA,EAA8B;AAAA,EAC5E,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,eAAA,EAAiB,MAAM,2BAAA,EAA4B;AAAA,EAC3E,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,YAAA,EAAc,MAAM,kBAAA,EAAmB;AAAA,EAC5D,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,YAAA,EAAc,MAAM,sBAAA;AAClD,CAAA;AAEO,IAAM,KAAA,GAA8B,CAAC,EAAE,UAAA,EAAW,KAAM;AAC7D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAA6B,UAAU,CAAA;AAC/D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAyB,QAAQ,CAAA;AACjF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,EAAE,CAAA;AAEvC,EAAA,QAAA,CAAS,CAAC,OAAO,GAAA,KAAQ;AACvB,IAAA,IAAI,SAAS,UAAA,EAAY;AAEzB,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,GAAO,CAAC,CAAC,CAAA;AAAA,IAChD,CAAA,MAAA,IAAW,IAAI,SAAA,EAAW;AACxB,MAAA,cAAA,CAAe,CAAC,SAAS,IAAA,CAAK,GAAA,CAAI,iBAAiB,MAAA,GAAS,CAAA,EAAG,IAAA,GAAO,CAAC,CAAC,CAAA;AAAA,IAC1E,CAAA,MAAA,IAAW,IAAI,MAAA,EAAQ;AACrB,MAAA,mBAAA,CAAoB,gBAAA,CAAiB,WAAW,CAAA,CAAE,GAAG,CAAA;AACrD,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAkB;AACzC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,UAAA,CAAW,kBAAkB,OAAO,CAAA;AAAA,IACtC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,UAAU,gBAAgB,CAAA;AAE/C,EAAA,uBACEC,KAACC,GAAAA,EAAA,EAAI,eAAc,QAAA,EAAS,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,CAAA,EACjD,QAAA,EAAA;AAAA,oBAAAC,IAACC,IAAAA,EAAA,EAAK,MAAI,IAAA,EAAC,KAAA,EAAM,WAAU,QAAA,EAAA,wCAAA,EAE3B,CAAA;AAAA,oBACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,IAEN,IAAA,KAAS,UAAA,oBACRH,IAAAA,CAAAI,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAI,MAAC,QAAA,EAAA,0BAAA,EAAwB,CAAA;AAAA,sBACnCD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,MACN,gBAAA,CAAiB,IAAI,CAAC,GAAA,EAAK,sBAC1BH,IAAAA,CAACC,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,IAAAA,CAACG,IAAAA,EAAA,EAAK,KAAA,EAAO,CAAA,KAAM,cAAc,MAAA,GAAS,MAAA,EAAW,IAAA,EAAM,CAAA,KAAM,WAAA,EAC9D,QAAA,EAAA;AAAA,UAAA,CAAA,KAAM,cAAc,UAAA,GAAQ,KAAA;AAAA,UAC5B,GAAA,CAAI;AAAA,SAAA,EACP,CAAA;AAAA,wBACAH,IAAAA,CAACG,IAAAA,EAAA,EAAK,UAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UAAG,GAAA,CAAI;AAAA,SAAA,EAAK;AAAA,OAAA,EAAA,EALnB,GAAA,CAAI,GAMd,CACD,CAAA;AAAA,sBACDD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACPD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,2CAAA,EAA+B;AAAA,KAAA,EAChD,CAAA;AAAA,IAGD,IAAA,KAAS,KAAA,oBACRH,IAAAA,CAAAI,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAJ,IAAAA,CAACG,MAAA,EAAK,QAAA,EAAA;AAAA,QAAA,YAAA;AAAA,wBACMD,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,IAAA,EAAI,IAAA,EAAE,QAAA,EAAA,SAAA,CAAU,gBAAgB,CAAA,CAAE,IAAA,EAAK;AAAA,OAAA,EACtE,CAAA;AAAA,sBACAH,IAAAA,CAACG,IAAAA,EAAA,EAAK,QAAA,EAAA;AAAA,QAAA,iBAAA;AAAA,wBACWD,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAS,uBAAa,YAAA,EAAa;AAAA,OAAA,EAChE,CAAA;AAAA,sBACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACPD,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAI,MAAC,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,sBAC9BD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,wCAAA,EAEf,CAAA;AAAA,sBACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACPH,IAAAA,CAACC,GAAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,QAAO,QAAA,EAAA,SAAA,EAAE,CAAA;AAAA,wBACrBD,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,MAAA;AAAA,YACP,QAAA,EAAU,SAAA;AAAA,YACV,QAAA,EAAU,eAAA;AAAA,YACV,IAAA,EAAK,GAAA;AAAA,YACL,WAAA,EAAY;AAAA;AAAA;AACd,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ,CAAA;ACvFO,IAAM,SAAA,GAAsCH,MAAAA,CAAM,IAAA,CAAK,CAAC;AAAA,EAC7D,SAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,WAAA,GAAc,YAAY,OAAA,GAAU,KAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,eAAA,KAAoB,SAAA,GAAY,CAAA,GAAI,CAAA,CAAA;AAClD,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,UAAA,GAAa,qBAAA;AAAA,EACf,CAAA,MAAA,IAAW,QAAQ,CAAA,EAAG;AACpB,IAAA,UAAA,GAAa,UAAK,KAAK,CAAA,QAAA,EAAW,YAAY,CAAA,gBAAA,EAAc,SAAS,KAAK,EAAE,CAAA,CAAA;AAAA,EAC9E,CAAA,MAAO;AACL,IAAA,UAAA,GAAa,CAAA,gBAAA,EAAc,SAAA,GAAY,CAAA,QAAA,EAAM,SAAS,KAAK,EAAE,CAAA,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,aAAa,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,KAAA;AAE7C,EAAA,uBACEC,IAAAA;AAAA,IAACC,GAAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAY,QAAA;AAAA,MACZ,WAAA,EAAY,MAAA;AAAA,MACZ,QAAA,EAAU,CAAA;AAAA,MACV,cAAA,EAAe,eAAA;AAAA,MACf,KAAA,EAAM,MAAA;AAAA,MAEN,QAAA,EAAA;AAAA,wBAAAD,IAAAA,CAACC,GAAAA,EAAA,EAAI,GAAA,EAAK,CAAA,EACR,QAAA,EAAA;AAAA,0BAAAC,IAACC,IAAAA,EAAA,EAAK,MAAI,IAAA,EAAC,KAAA,EAAM,WAAU,QAAA,EAAA,SAAA,EAE3B,CAAA;AAAA,0BACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAO,aAAc,QAAA,EAAA,UAAA,EAAW;AAAA,SAAA,EACxC,CAAA;AAAA,wBACAH,IAAAA,CAACC,GAAAA,EAAA,EAAI,KAAK,CAAA,EACP,QAAA,EAAA;AAAA,UAAA,aAAA,KAAkB,0BACjBD,IAAAA,CAACG,IAAAA,EAAA,EAAK,UAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,YAAA,GAAA;AAAA,YAAE,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,GAAI,CAAA;AAAA,YAAE;AAAA,WAAA,EAAQ,CAAA;AAAA,0BAE5DD,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,QAAQ,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,0BAC/BD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,gBAAA,EAAc;AAAA,SAAA,EAC/B;AAAA;AAAA;AAAA,GACF;AAEJ,CAAC,CAAA;ACtCD,SAAS,WAAW,EAAA,EAAoB;AACtC,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,EAAE,CAAA;AACrB,EAAA,OAAO,EAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,MAAA,EAAQ,OAAO,CAAA;AACxD;AAEA,IAAM,YAAA,GAAuC;AAAA,EAC3C,IAAA,EAAM,OAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,WAAA,GAAsC;AAAA,EAC1C,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEO,IAAM,UAAA,GAAwCJ,OAAM,IAAA,CAAK,CAAC,EAAE,OAAA,EAAS,QAAA,GAAW,IAAG,KAAM;AAC9F,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,QAAQ,CAAA;AAEvC,EAAA,uBACEC,IAAAA,CAACC,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,WAAA,EAAY,QAAA,EAAS,WAAA,EAAY,MAAA,EAAO,QAAA,EAAU,CAAA,EAC5E,QAAA,EAAA;AAAA,oBAAAC,IAACC,IAAAA,EAAA,EAAK,MAAI,IAAA,EAAC,QAAA,EAAQ,MAAC,QAAA,EAAA,QAAA,EAEpB,CAAA;AAAA,IACC,OAAA,CAAQ,MAAA,KAAW,CAAA,mBAClBD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,MAAA,EAAM,IAAA,EAAC,QAAA,EAAA,8BAAA,EAEtB,CAAA,GAEA,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,qBAClBH,IAAAA,CAACG,IAAAA,EAAA,EAAa,KAAA,EAAO,YAAA,CAAa,KAAA,CAAM,KAAK,CAAA,IAAK,OAAA,EAChD,QAAA,EAAA;AAAA,sBAAAH,IAAAA,CAACG,IAAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QAAE,UAAA,CAAW,MAAM,SAAS,CAAA;AAAA,QAAE;AAAA,OAAA,EAAC,CAAA;AAAA,MAAQ,GAAA;AAAA,sBACtDD,IAACC,IAAAA,EAAA,EAAM,sBAAY,KAAA,CAAM,KAAK,KAAK,QAAA,EAAI,CAAA;AAAA,MAAO,GAAA;AAAA,MAAE,KAAA,CAAM;AAAA,KAAA,EAAA,EAF7C,CAGX,CACD;AAAA,GAAA,EAEL,CAAA;AAEJ,CAAC,CAAA;ACtCD,SAASE,YAAW,EAAA,EAAoB;AACtC,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,EAAE,CAAA;AACrB,EAAA,OAAO,EAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,MAAA,EAAQ,OAAO,CAAA;AACxD;AAEO,IAAM,QAAA,GAAoCN,OAAM,IAAA,CAAK,CAAC,EAAE,OAAA,EAAS,SAAA,EAAW,QAAA,GAAW,EAAA,EAAG,KAAM;AACrG,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,QAAQ,CAAA;AAEvC,EAAA,uBACEC,KAACC,GAAAA,EAAA,EAAI,eAAc,QAAA,EAAS,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,CAAA,EAChD,QAAA,EAAA;AAAA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,qBACnBD,IAAAA,CAACC,GAAAA,EAAA,EAAY,aAAA,EAAc,UAAS,YAAA,EAAc,KAAA,CAAM,IAAA,KAAS,MAAA,GAAS,IAAI,CAAA,EAC3E,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,IAAA,KAAS,MAAA,oBACdD,IAAAA,CAACC,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,KAACG,IAAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,MAAI,IAAA,EAAC,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAClB;AAAA,SAAA,EACN,CAAA;AAAA,wBACAH,IAAAA,CAACG,IAAAA,EAAA,EAAK,UAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UAAEE,WAAAA,CAAW,MAAM,SAAS,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC;AAAA,OAAA,EAChD,CAAA;AAAA,MAED,MAAM,IAAA,KAAS,WAAA,oBACdL,IAAAA,CAACC,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,KAACG,IAAAA,EAAA,EAAK,KAAA,EAAM,SAAA,EAAU,MAAI,IAAA,EAAC,QAAA,EAAA;AAAA,UAAA,SAAA;AAAA,UACjB;AAAA,SAAA,EACV,CAAA;AAAA,wBACAH,IAAAA,CAACG,IAAAA,EAAA,EAAK,UAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UAAEE,WAAAA,CAAW,MAAM,SAAS,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC;AAAA,OAAA,EAChD,CAAA;AAAA,MAED,KAAA,CAAM,SAAS,MAAA,oBACdL,KAACG,IAAAA,EAAA,EAAK,OAAM,QAAA,EAAS,QAAA,EAAA;AAAA,QAAA,SAAA;AAAA,QAChB,MAAM,QAAA,IAAY,MAAA;AAAA,QAAO,IAAA;AAAA,QAAG,KAAA,CAAM;AAAA,OAAA,EACvC,CAAA;AAAA,MAED,KAAA,CAAM,IAAA,KAAS,QAAA,oBACdD,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,QAAA,EAAS,IAAA,EAAI,IAAA,EAAC,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,MAEnC,KAAA,CAAM,SAAS,OAAA,oBACdH,KAACG,IAAAA,EAAA,EAAK,OAAM,KAAA,EAAM,QAAA,EAAA;AAAA,QAAA,gBAAA;AAAA,QAAU,KAAA,CAAM;AAAA,OAAA,EAAQ,CAAA;AAAA,MAAA,CAE1C,MAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,IAAA,KAAS,eAAe,KAAA,CAAM,IAAA,KAAS,QAAA,qBACtED,IAACC,IAAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAQ,gBAAM,OAAA,EAAQ;AAAA,KAAA,EAAA,EA7B3B,CA+BV,CACD,CAAA;AAAA,IAEA,6BACCH,IAAAA,CAACC,GAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,sBAAAD,IAAAA,CAACC,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,KAACG,IAAAA,EAAA,EAAK,KAAA,EAAM,SAAA,EAAU,MAAI,IAAA,EAAC,QAAA,EAAA;AAAA,UAAA,SAAA;AAAA,UACjB;AAAA,SAAA,EACV,CAAA;AAAA,wBACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,aAAA,EAAW;AAAA,OAAA,EAC5B,CAAA;AAAA,sBACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAK,QAAQ,QAAA,EAAA,SAAA,EAAU;AAAA,KAAA,EAC/B;AAAA,GAAA,EAEJ,CAAA;AAEJ,CAAC,CAAA;ACnDM,SAAS,iBAAA,GAA2C;AACzD,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,OAAO,qBAAA,EAAsB;AAAA,EAC/B;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,EAAO,EAAG,CAAA,aAAA,EAAgB,WAAA,CAAY,CAAC,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,IAAA,CAAM,CAAA;AAEnF,EAAA,IAAI;AACF,IAAA,QAAA;AAAA,MACE,CAAA,6KAAA,EAAgL,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,8DAAA,CAAA;AAAA,MAC3M,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,GAAA;AAAK,KACjC;AAEA,IAAA,IAAI,CAAC,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AAEjC,IAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,IAAA,UAAA,CAAW,OAAO,CAAA;AAElB,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,GAAA,EAAK,OAAO,IAAA;AAEhC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAAA,MAChC,QAAA,EAAU;AAAA,KACZ;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,IAAI;AAAE,MAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG,UAAA,CAAW,OAAO,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAe;AAC3E,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,qBAAA,GAA+C;AACtD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,EAAO,EAAG,CAAA,aAAA,EAAgB,WAAA,CAAY,CAAC,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,IAAA,CAAM,CAAA;AAEnF,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,CAAQ,aAAa,QAAA,EAAU;AACjC,MAAA,QAAA,CAAS,CAAA,yGAAA,EAAsG,OAAO,CAAA,gEAAA,CAAA,EAAoE,EAAE,OAAO,MAAA,EAAQ,OAAA,EAAS,KAAM,CAAA;AAAA,IAC5N,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,CAAA,8CAAA,EAAiD,OAAO,CAAA,CAAA,CAAA,EAAK,EAAE,OAAO,MAAA,EAAQ,OAAA,EAAS,KAAM,CAAA;AAAA,IACxG;AAEA,IAAA,IAAI,CAAC,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AAEjC,IAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,IAAA,UAAA,CAAW,OAAO,CAAA;AAElB,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,GAAA,EAAK,OAAO,IAAA;AAEhC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAAA,MAChC,QAAA,EAAU;AAAA,KACZ;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,IAAI;AAAE,MAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG,UAAA,CAAW,OAAO,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAe;AAC3E,IAAA,OAAO,IAAA;AAAA,EACT;AACF;ACpEA,IAAM,QAAA,GAAgC;AAAA,EACpC,EAAE,OAAA,EAAS,OAAA,EAAS,WAAA,EAAa,kCAAA,EAAmC;AAAA,EACpE,EAAE,OAAA,EAAS,QAAA,EAAU,WAAA,EAAa,qBAAA,EAAsB;AAAA,EACxD,EAAE,OAAA,EAAS,SAAA,EAAW,WAAA,EAAa,8CAAA,EAA+C;AAAA,EAClF,EAAE,OAAA,EAAS,SAAA,EAAW,WAAA,EAAa,mCAAA,EAAoC;AAAA,EACvE,EAAE,OAAA,EAAS,QAAA,EAAU,WAAA,EAAa,oBAAA,EAAqB;AAAA,EACvD,EAAE,OAAA,EAAS,QAAA,EAAU,WAAA,EAAa,uCAAA;AACpC,CAAA;AAgBA,IAAM,gBAAqFJ,MAAAA,CAAM,IAAA;AAAA,EAC/F,CAAC,EAAE,WAAA,EAAa,WAAA,EAAY,qBAC1BC,IAAAA,CAACC,GAAAA,EAAA,EAAI,aAAA,EAAc,UAAS,QAAA,EAAU,CAAA,EAAG,WAAA,EAAY,QAAA,EAAS,aAAY,MAAA,EACvE,QAAA,EAAA;AAAA,IAAA,WAAA,CAAY,IAAI,CAAC,CAAA,EAAG,sBACnBD,IAAAA,CAACC,KAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,WAAA,GAAc,MAAA,GAAS,MAAA,EAAW,IAAA,EAAM,CAAA,KAAM,WAAA,EAC9D,QAAA,EAAA,CAAA,KAAM,WAAA,GAAc,YAAO,IAAA,EAC9B,CAAA;AAAA,sBACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,WAAA,GAAc,MAAA,GAAS,OAAA,EAAS,IAAA,EAAM,MAAM,WAAA,EAC5D,QAAA,EAAA,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA,EACtB,CAAA;AAAA,sBACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAE,YAAE,WAAA,EAAY;AAAA,KAAA,EAAA,EAPtB,CAAA,CAAE,OAQZ,CACD,CAAA;AAAA,oBACDD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,6DAAA,EAA2C;AAAA,GAAA,EAC5D;AAEJ,CAAA;AAEO,IAAM,QAAA,GAAoCJ,MAAAA,CAAM,IAAA,CAAK,CAAC;AAAA,EAC3D,QAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,gDAAA;AAAA,EACd,aAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIO,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAA2C,MAAM,CAAA;AACvF,EAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAEnB,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAM;AAChC,IAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,IAAK,MAAM,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,EAAC;AAC3D,IAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAChC,IAAA,OAAO,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,EAAE,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,EAC3D,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,MAAM,MAAA,GAAS,CAAA;AAEjE,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,IAAI,CAAC,cAAc,OAAO,KAAA;AAC1B,IAAA,cAAA,CAAe,UAAU,CAAA;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,iBAAA,EAAkB;AAC9B,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,YAAA,CAAa,GAAG,CAAA;AAChB,QAAA,cAAA,CAAe,MAAM,CAAA;AACrB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAe;AACvB,IAAA,cAAA,CAAe,UAAU,CAAA;AACzB,IAAA,UAAA,CAAW,MAAM,cAAA,CAAe,MAAM,CAAA,EAAG,GAAI,CAAA;AAC7C,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAiB;AAChC,MAAA,IAAI,YAAA,EAAc;AAClB,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAE1B,MAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,OAAA,EAAS;AACtC,QAAA,aAAA,EAAc;AACd,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,QAAQ,GAAA,EAAQ;AAClB,QAAA,aAAA,EAAc;AACd,QAAA;AAAA,MACF;AAAA,IACF,CAAA;AACA,IAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,OAAO,CAAA;AAChC,IAAA,OAAO,MAAM;AAAE,MAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AAAA,IAAG,CAAA;AAAA,EACrD,CAAA,EAAG,CAAC,YAAA,EAAc,aAAa,CAAC,CAAA;AAEhC,EAAAC,QAAAA,CAAS,CAAC,MAAA,EAAQ,GAAA,KAAQ;AACxB,IAAA,IAAI,YAAA,EAAc;AAElB,IAAA,IAAI,CAAC,eAAA,EAAiB;AAEtB,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,GAAO,CAAC,CAAC,CAAA;AAAA,IAChD,CAAA,MAAA,IAAW,IAAI,SAAA,EAAW;AACxB,MAAA,cAAA,CAAe,CAAC,SAAS,IAAA,CAAK,GAAA,CAAI,YAAY,MAAA,GAAS,CAAA,EAAG,IAAA,GAAO,CAAC,CAAC,CAAA;AAAA,IACrE,CAAA,MAAA,IAAW,IAAI,GAAA,EAAK;AAClB,MAAA,MAAM,QAAA,GAAW,YAAY,WAAW,CAAA;AACxC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,QAAA,CAAS,UAAU,GAAG,CAAA;AAC/B,QAAA,cAAA,CAAe,CAAC,CAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,CAAA,KAAc;AAC9C,IAAA,QAAA,CAAS,CAAC,CAAA;AACV,IAAA,cAAA,CAAe,CAAC,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,IAAA,KAAiB;AACjD,IAAA,IAAI,YAAA,EAAc;AAGlB,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,OAAkB,QAAA,EAAU;AAC1C,MAAA,aAAA,EAAc;AACd,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,eAAe,QAAA,CAAS,OAAA;AAC9B,IAAA,MAAM,qBAAqB,QAAA,CAAS,MAAA;AAAA,MAClC,CAAC,CAAA,KAAM,YAAA,CAAa,UAAA,CAAW,GAAG,KAAK,CAAC,YAAA,CAAa,QAAA,CAAS,GAAG,KAAK,CAAA,CAAE,OAAA,CAAQ,UAAA,CAAW,YAAA,CAAa,aAAa;AAAA,KACvH;AACA,IAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,MAAA,GAAS,CAAA,IAAK,aAAa,MAAA,GAAS,CAAA;AAE9E,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,CAAC,CAAA,EAAG,OAAA;AACnC,MAAA,IAAI,OAAO,YAAA,KAAiB,GAAA,IAAO,CAAC,YAAA,CAAa,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9D,QAAA,MAAM,YAAY,CAAC,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,WAAW,QAAQ,CAAA;AACpE,QAAA,QAAA,CAAS,OAAO,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA;AACnD,QAAA,cAAA,CAAe,CAAC,CAAA;AAChB,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,MAAK,EAAG;AACf,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AACpB,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,cAAA,CAAe,CAAC,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,QAAA,EAAU,aAAa,CAAC,CAAA;AAE1C,EAAA,uBACEP,IAAAA,CAACC,GAAAA,EAAA,EAAI,eAAc,QAAA,EAChB,QAAA,EAAA;AAAA,IAAA,eAAA,oBACCC,GAAAA,CAAC,aAAA,EAAA,EAAc,WAAA,EAA0B,WAAA,EAA0B,CAAA;AAAA,IAGpE,aAAA,oBACCF,IAAAA,CAACC,GAAAA,EAAA,EAAI,QAAA,EAAU,CAAA,EAAG,KAAK,CAAA,EACrB,QAAA,EAAA;AAAA,sBAAAC,IAACC,IAAAA,EAAA,EAAK,OAAM,OAAA,EAAQ,IAAA,EAAI,MAAC,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,sBAClCD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,wCAAA,EAAiC;AAAA,KAAA,EAClD,CAAA;AAAA,IAGD,WAAA,KAAgB,UAAA,oBACfD,GAAAA,CAACD,KAAA,EAAI,QAAA,EAAU,CAAA,EACb,QAAA,kBAAAC,IAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,QAAA,EAAS,mCAAqB,CAAA,EAC5C,CAAA;AAAA,IAGD,WAAA,KAAgB,UAAA,oBACfD,GAAAA,CAACD,KAAA,EAAI,QAAA,EAAU,CAAA,EACb,QAAA,kBAAAC,IAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,KAAA,EAAM,gGAAkF,CAAA,EACtG,CAAA;AAAA,oBAGFH,IAAAA,CAACC,GAAAA,EAAA,EAAI,WAAA,EAAY,QAAA,EAAS,WAAA,EAAa,YAAA,GAAe,QAAA,GAAW,aAAA,GAAgB,OAAA,GAAU,MAAA,EAAQ,UAAU,CAAA,EAC3G,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAO,YAAA,GAAe,QAAA,GAAW,MAAA,EAAQ,IAAA,EAAI,IAAA,EAChD,QAAA,EAAA,YAAA,GAAe,SAAA,GAAO,aAAA,GAAgB,eAAQ,SAAA,EACjD,CAAA;AAAA,MACC,YAAA,mBACCD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,eAAA,EAAa,CAAA,mBAE5BD,GAAAA;AAAA,QAACM,SAAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,QAAA,EAAU,YAAA;AAAA,UACV,QAAA,EAAU,YAAA;AAAA,UACV,WAAA,EAAa,gBAAgB,4CAAA,GAA+C;AAAA;AAAA;AAC9E,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC,CAAA;AC5MD,IAAM,WAAA,GAAsC;AAAA,EAC1C,SAAA,EAAW,WAAA;AAAA,EACX,mBAAA,EAAqB,cAAA;AAAA,EACrB,iBAAA,EAAmB,WAAA;AAAA,EACnB,eAAA,EAAiB,WAAA;AAAA,EACjB,UAAA,EAAY,iBAAA;AAAA,EACZ,WAAA,EAAa,WAAA;AAAA,EACb,aAAA,EAAe,WAAA;AAAA,EACf,OAAA,EAAS,WAAA;AAAA,EACT,QAAA,EAAU,WAAA;AAAA,EACV,YAAA,EAAc,WAAA;AAAA,EACd,MAAA,EAAQ,WAAA;AAAA,EACR,WAAA,EAAa,WAAA;AAAA,EACb,YAAA,EAAc,WAAA;AAAA,EACd,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,WAAA;AAAA,EACP,MAAA,EAAQ,WAAA;AAAA,EACR,WAAA,EAAa,WAAA;AAAA,EACb,cAAA,EAAgB,WAAA;AAAA,EAChB,aAAA,EAAe;AACjB,CAAA;AAEA,SAAS,QAAQ,SAAA,EAA2B;AAC1C,EAAA,OAAO,WAAA,CAAY,SAAS,CAAA,IAAK,QAAA;AACnC;AAQA,IAAM,WAKD,CAAC,EAAE,MAAM,KAAA,EAAO,QAAA,EAAU,cAAa,KAAM;AAChD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAChC,EAAA,MAAM,UAAA,GAAa,KAAK,IAAA,KAAS,YAAA;AACjC,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA;AAC5D,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAEnC,EAAA,uBACER,IAAAA,CAACC,GAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAACG,MAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAE,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,sBACvBD,GAAAA,CAACC,IAAAA,EAAA,EAAM,QAAA,EAAA,WAAA,GAAc,YAAO,IAAA,EAAK,CAAA;AAAA,sBACjCH,IAAAA,CAACG,IAAAA,EAAA,EAAM,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QAAK;AAAA,OAAA,EAAC,CAAA;AAAA,sBACbD,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,UAAA,GAAa,MAAA,GAAS,MAAA,EAClD,QAAA,EAAA,IAAA,CAAK,IAAA,EACR,CAAA;AAAA,sBACAH,IAAAA,CAACG,IAAAA,EAAA,EAAK,UAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QAAG,IAAA,CAAK,SAAA;AAAA,QAAU;AAAA,OAAA,EAAC;AAAA,KAAA,EACpC,CAAA;AAAA,IACC,WAAA,IACC,QAAQ,QAAA,IACR,IAAA,CAAK,SAAU,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,qBACzBD,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAM,KAAA;AAAA,QACN,OAAO,KAAA,GAAQ,CAAA;AAAA,QACf,QAAA;AAAA,QACA;AAAA,OAAA;AAAA,MAJK,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,KAM1B;AAAA,GAAA,EACL,CAAA;AAEJ,CAAA;AAEO,IAAM,YAAA,GAA4CH,MAAAA,CAAM,IAAA,CAAK,CAAC;AAAA,EACnE,IAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,KAAM;AACJ,EAAA,uBACEC,IAAAA;AAAA,IAACC,GAAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAc,QAAA;AAAA,MACd,WAAA,EAAY,QAAA;AAAA,MACZ,WAAA,EAAY,MAAA;AAAA,MACZ,QAAA,EAAU,CAAA;AAAA,MACV,KAAA,EAAO,EAAA;AAAA,MACP,QAAA,EAAU,EAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAC,IAACC,IAAAA,EAAA,EAAK,MAAI,IAAA,EAAC,QAAA,EAAQ,MAAC,QAAA,EAAA,UAAA,EAEpB,CAAA;AAAA,QACC,KAAK,MAAA,KAAW,CAAA,mBACfD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,MAAA,EAAM,IAAA,EAAC,sCAEtB,CAAA,GAEA,IAAA,CAAK,IAAI,CAAC,IAAA,EAAM,sBACdD,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA;AAAA,YACA,KAAA,EAAO,CAAA;AAAA,YACP,QAAA;AAAA,YACA;AAAA,WAAA;AAAA,UAJK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,SAMzB;AAAA;AAAA;AAAA,GAEL;AAEJ,CAAC,CAAA;AC3FD,SAAS,cAAc,IAAA,EAAuC;AAC5D,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,MAAM,MAAM,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AACpE,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAI,MAAA,GAAS,EAAA,GAAK,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA,GAAQ,GAAG,CAAA,CAAE,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,IAAM,eAA4CH,MAAAA,CAAM,IAAA,CAAK,CAAC,EAAE,OAAM,KAAM;AACjF,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,uBACEG,GAAAA,CAACD,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,UAAU,CAAA,EACnC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,qBAChBD,KAACC,GAAAA,EAAA,EAAY,KAAK,CAAA,EACf,QAAA,EAAA;AAAA,IAAA,IAAA,CAAK,MAAA,KAAW,SAAA,oBACfC,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,QAAA,EACV,QAAA,kBAAAD,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,QAAO,CAAA,EACvB,CAAA;AAAA,IAED,IAAA,CAAK,WAAW,MAAA,oBAAUA,IAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,IAC/C,IAAA,CAAK,WAAW,OAAA,oBAAWD,IAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,oBAC/CD,IAACC,IAAAA,EAAA,EAAK,OAAM,QAAA,EAAS,IAAA,EAAI,IAAA,EACtB,QAAA,EAAA,IAAA,CAAK,IAAA,EACR,CAAA;AAAA,oBACAH,IAAAA,CAACG,IAAAA,EAAA,EAAK,UAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAAE,aAAA,CAAc,KAAK,IAAI,CAAA;AAAA,MAAE;AAAA,KAAA,EAAC,CAAA;AAAA,IAC1C,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,oBAC3BH,IAAAA,CAACG,IAAAA,EAAA,EAAK,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA;AAAA,MAAA,UAAA;AAAA,MAAI,KAAK,MAAA,CAAO;AAAA,KAAA,EAAM;AAAA,GAAA,EAAA,EAblC,CAeV,CACD,CAAA,EACH,CAAA;AAEJ,CAAC,CAAA;ACvBM,IAAM,MAAA,GAAgCJ,MAAAA,CAAM,IAAA,CAAK,CAAC;AAAA,EACvD,SAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,uBACEC,IAAAA,CAACC,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,OAAM,MAAA,EAChC,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAsB,SAAA,EAAsB,iBAAkC,KAAA,EAAc,CAAA;AAAA,oBAEvGF,IAAAA,CAACC,GAAAA,EAAA,EAAI,UAAU,CAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,YAAA,EAAc,CAAA;AAAA,sBAElCF,IAAAA,CAACC,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,UAAU,CAAA,EACpC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAS,WAAA,EAAa,SAAA,EAAsB,CAAA;AAAA,QACrD,UAAU,MAAA,GAAS,CAAA,oBAAKA,GAAAA,CAAC,YAAA,EAAA,EAAa,OAAO,SAAA,EAAW;AAAA,OAAA,EAC3D;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,aAAA,EAAe,UAAU,CAAA,EAAG,CAAA;AAAA,oBACjDA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,YAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ,CAAC,CAAA;;;AC/DD,aAAA,EAAA;AAYO,SAAS,UAAU,MAAA,EAAsB;AAC9C,EAAA,MAAM,QAAA,GAAW,OAAO,iBAAA,EAAkB;AAC1C,EAAA,MAAM,WAAA,GAAc,OAAO,eAAA,EAAgB;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAII,QAAAA,CAAsB;AAAA,IAC9C,SAAA,EAAW,OAAO,WAAA,EAAY;AAAA,IAC9B,WAAW,QAAA,EAAU,SAAA;AAAA,IACrB,SAAS,QAAA,EAAU,OAAA;AAAA,IACnB,iBAAiB,WAAA,CAAY,MAAA;AAAA,IAC7B,cAAc,EAAC;AAAA,IACf,WAAW;AAAC,GACb,CAAA;AAED,EAAA,MAAM,QAAA,GAAWG,OAAO,KAAK,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAEnB,EAAAC,UAAU,MAAM;AAEd,IAAA,IAAI,OAAO,WAAA,EAAY,IAAK,CAAC,QAAA,CAAS,QAAQ,SAAA,EAAW;AACvD,MAAA,MAAM,IAAA,GAAO,OAAO,iBAAA,EAAkB;AACtC,MAAA,MAAM,KAAA,GAAQ,OAAO,eAAA,EAAgB;AACrC,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,SAAA,EAAW,IAAA;AAAA,QACX,WAAW,IAAA,EAAM,SAAA;AAAA,QACjB,SAAS,IAAA,EAAM,OAAA;AAAA,QACf,iBAAiB,KAAA,CAAM;AAAA,OACzB,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,OAAA,KAAoC;AACvD,MAAA,MAAM,KAAA,GAAQ,OAAO,eAAA,EAAgB;AACrC,MAAA,MAAM,IAAA,GAAO,OAAO,iBAAA,EAAkB;AACtC,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,SAAA,EAAW,IAAA;AAAA,QACX,SAAA,EAAW,IAAA,EAAM,SAAA,IAAa,OAAA,CAAQ,aAAa,IAAA,CAAK,SAAA;AAAA,QACxD,OAAA,EAAS,IAAA,EAAM,OAAA,IAAW,OAAA,CAAQ,WAAW,IAAA,CAAK,OAAA;AAAA,QAClD,iBAAiB,KAAA,CAAM;AAAA,OACzB,CAAE,CAAA;AAAA,IACJ,CAAA;AAEA,IAAA,MAAM,iBAAiB,MAAM;AAC3B,MAAA,MAAM,KAAA,GAAQ,OAAO,eAAA,EAAgB;AACrC,MAAA,MAAM,IAAA,GAAO,OAAO,iBAAA,EAAkB;AACtC,MAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,GAAS,CAAA;AACtC,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,SAAA,EAAW,cAAA;AAAA,QACX,SAAA,EAAW,cAAA,GAAiB,IAAA,EAAM,SAAA,GAAY,MAAA;AAAA,QAC9C,OAAA,EAAS,cAAA,GAAiB,IAAA,EAAM,OAAA,GAAU,MAAA;AAAA,QAC1C,iBAAiB,KAAA,CAAM;AAAA,OACzB,CAAE,CAAA;AAAA,IACJ,CAAA;AAEA,IAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAAsC;AACxD,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,cAAc,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAE,CAAE,CAAA;AAAA,IACpE,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,CAAC,OAAA,KAA2B;AAC3C,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,SAAA,EAAW;AAAA,UACT,GAAG,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAAA,UAC5B;AAAA,YACE,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,YACf,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAAA,YACzC,QAAQ,OAAA,CAAQ;AAAA;AAClB;AACF,OACF,CAAE,CAAA;AAAA,IACJ,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,OAAA,KAA2B;AAC1C,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,SAAA,EAAW;AAAA,UACT,GAAG,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAAA,UAC5B;AAAA,YACE,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,KAAA,EAAO,OAAA;AAAA,YACP,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAAA,YACzC,QAAQ,OAAA,CAAQ;AAAA;AAClB;AACF,OACF,CAAE,CAAA;AAAA,IACJ,CAAA;AAEA,IAAA,MAAA,CAAO,EAAA,CAAG,oBAAoB,WAAW,CAAA;AACzC,IAAA,MAAA,CAAO,EAAA,CAAG,uBAAuB,cAAc,CAAA;AAC/C,IAAA,MAAA,CAAO,EAAA,CAAG,SAAA,CAAU,QAAA,EAAU,UAAU,CAAA;AACxC,IAAA,MAAA,CAAO,EAAA,CAAG,SAAA,CAAU,MAAA,EAAQ,QAAQ,CAAA;AACpC,IAAA,MAAA,CAAO,EAAA,CAAG,SAAA,CAAU,KAAA,EAAO,OAAO,CAAA;AAElC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,GAAA,CAAI,oBAAoB,WAAW,CAAA;AAC1C,MAAA,MAAA,CAAO,GAAA,CAAI,uBAAuB,cAAc,CAAA;AAChD,MAAA,MAAA,CAAO,GAAA,CAAI,SAAA,CAAU,QAAA,EAAU,UAAU,CAAA;AACzC,MAAA,MAAA,CAAO,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,QAAQ,CAAA;AACrC,MAAA,MAAA,CAAO,GAAA,CAAI,SAAA,CAAU,KAAA,EAAO,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,WAAA,GAAcC,YAAY,MAAM;AACpC,IAAA,QAAA,CAAS,CAAC,UAAU,EAAE,GAAG,MAAM,SAAA,EAAW,IAAG,CAAE,CAAA;AAAA,EACjD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,WAAA,EAAY;AACjC;;;AChHA,WAAA,EAAA;AAQO,IAAM,MAA0B,CAAC,EAAE,QAAQ,KAAA,EAAO,YAAA,EAAc,SAAQ,KAAM;AACnF,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIL,SAAS,IAAI,CAAA;AACnD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA,CAAsB,EAAE,CAAA;AAC9D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA,CAA0B,EAAE,CAAA;AAC9D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,YAAY,CAAA;AAE/C,EAAA,MAAM,MAAA,GAAS,UAAU,MAAM,CAAA;AAC/B,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,MAAA,CAAO,MAAA;AAC3B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,QAAAA,CAAS,CAAC,SAAS,CAAA;AACvD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAiC,IAAI,CAAA;AAC7E,EAAA,MAAM,eAAA,GAAkBG,OAA+B,IAAI,CAAA;AAE3D,EAAA,MAAM,gBAAA,GAAmBE,WAAAA,CAAY,CAAC,KAAA,KAA2B;AAC/D,IAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,IAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,mBAAA,GAAsBA,WAAAA,CAAY,CAAC,QAAA,EAA0B,MAAA,KAAmB;AACpF,IAAA,cAAA,CAAe,YAAY,QAAQ,CAAA;AACnC,IAAA,cAAA,CAAe,UAAU,MAAM,CAAA;AAC/B,IAAA,MAAM,YAAA,GAAe,UAAU,QAAQ,CAAA;AACvC,IAAA,cAAA,CAAe,YAAA,EAAc,aAAa,OAAO,CAAA;AACjD,IAAA,cAAA,CAAe,OAAA,EAAS,aAAa,YAAY,CAAA;AACjD,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,WAAAA,CAAY,CAAC,OAAA,KAAoB;AACxD,IAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AAAA,MACvB,GAAG,IAAA;AAAA,MACH,EAAE,IAAA,EAAM,QAAA,EAAmB,SAAS,SAAA,EAAW,IAAA,CAAK,KAAI;AAAE,KAC3D,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,IAAA,KAA0B;AACzB,MAAA,MAAM,KAAA,GAAQ,KAAK,UAAA,CAAW,GAAG,IAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AACrD,MAAA,MAAM,CAAC,GAAA,EAAK,GAAG,IAAI,CAAA,GAAI,KAAA,CAAM,MAAM,GAAG,CAAA;AACtC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AACzB,MAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AAEjC,MAAA,MAAM,eAAe,KAAA,EAAO,QAAA,EAAS,IAAK,uBAAA,CAAwB,MAAM,CAAA,CAAE,KAAA;AAC1E,MAAA,MAAM,eAAe,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA,EAAG,QAAQ,MAAA,CAAO,QAAA;AAChE,MAAA,MAAM,YAAY,MAAA,CAAO,MAAA,GACrB,CAAA,EAAG,MAAA,CAAO,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,MAAM,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA,GACzD,SAAA;AAEJ,MAAA,QAAQ,QAAA;AAAU,QAChB,KAAK,MAAA;AAAA,QACL,KAAK,GAAA;AAAA,QACL,KAAK,GAAA;AACH,UAAA,gBAAA,CAAiB;AAAA,YACf,yMAAA;AAAA,YACA,gBAAgB,YAAY,CAAA,CAAA;AAAA,YAC5B,gBAAgB,YAAY,CAAA,CAAA;AAAA,YAC5B,gBAAgB,SAAS,CAAA,CAAA;AAAA,YACzB,CAAA,aAAA,EAAgB,MAAA,CAAO,SAAA,GAAY,kBAAA,IAAiB,MAAA,CAAO,SAAA,GAAY,CAAA,EAAA,EAAK,MAAA,CAAO,SAAS,CAAA,CAAA,CAAA,GAAM,EAAA,CAAA,GAAM,qBAAgB,CAAA,CAAA;AAAA,YACxH,EAAA;AAAA,YACA,wNAAA;AAAA,YACA,qCAAA;AAAA,YACA,sCAAA;AAAA,YACA,4CAAA;AAAA,YACA,wCAAA;AAAA,YACA,yCAAA;AAAA,YACA,EAAA;AAAA,YACA,oHAAA;AAAA,YACA,sCAAA;AAAA,YACA,8DAAA;AAAA,YACA,mCAAA;AAAA,YACA,uBAAA;AAAA,YACA,0BAAA;AAAA,YACA,uBAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AACZ,UAAA,OAAO,IAAA;AAAA,QAET,KAAK,OAAA;AACH,UAAA,KAAA,EAAO,YAAA,EAAa;AACpB,UAAA,cAAA,CAAe,EAAE,CAAA;AACjB,UAAA,YAAA,CAAa,EAAE,CAAA;AACf,UAAA,OAAO,IAAA;AAAA,QAET,KAAK,OAAA;AACH,UAAA,IAAI,OAAO,KAAA,EAAO;AAChB,YAAA,KAAA,CAAM,SAAS,GAAG,CAAA;AAClB,YAAA,gBAAA,CAAiB,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAE,CAAA;AAAA,UAC9C,CAAA,MAAO;AACL,YAAA,gBAAA,CAAiB,4BAA4B,CAAA;AAAA,UAC/C;AACA,UAAA,OAAO,IAAA;AAAA,QAET,KAAK,QAAA,EAAU;AACb,UAAA,IAAI,CAAC,KAAA,EAAO;AACV,YAAA,gBAAA,CAAiB,mDAA8C,CAAA;AAC/D,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,gBAAA,CAAiB,CAAA,qBAAA,EAAwB,YAAY,CAAA,GAAA,CAAK,CAAA;AAC1D,UAAA,KAAA,CAAM,UAAA,EAAW,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AAClC,YAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,cAAA,gBAAA,CAAiB,6CAA6C,CAAA;AAC9D,cAAA;AAAA,YACF;AACA,YAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AACxD,YAAA,gBAAA,CAAiB;AAAA,cACf,CAAA,aAAA,EAAM,YAAY,CAAA,SAAA,EAAY,MAAA,CAAO,MAAM,CAAA,oBAAA,CAAA;AAAA,cAC3C,GAAG,KAAA;AAAA,cACH,OAAO,MAAA,GAAS,EAAA,GAAK,aAAa,MAAA,CAAO,MAAA,GAAS,EAAE,CAAA,KAAA,CAAA,GAAU,EAAA;AAAA,cAC9D,EAAA;AAAA,cACA,cAAc,YAAY,CAAA,CAAA;AAAA,cAC1B;AAAA,aACF,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,UACd,CAAC,CAAA;AACD,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,QAEA,KAAK,QAAA;AACH,UAAA,gBAAA,CAAiB;AAAA,YACf,kOAAA;AAAA,YACA,gBAAgB,YAAY,CAAA,CAAA;AAAA,YAC5B,gBAAgB,YAAY,CAAA,CAAA;AAAA,YAC5B,gBAAgB,SAAS,CAAA,CAAA;AAAA,YACzB,CAAA,aAAA,EAAgB,MAAA,CAAO,OAAA,EAAS,CAAA,CAAA;AAAA,YAChC,CAAA,aAAA,EAAgB,MAAA,CAAO,SAAA,GAAY,kBAAA,IAAiB,MAAA,CAAO,SAAA,GAAY,CAAA,EAAA,EAAK,MAAA,CAAO,SAAS,CAAA,CAAA,CAAA,GAAM,EAAA,CAAA,GAAM,qBAAgB,CAAA;AAAA,WAC1H,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AACZ,UAAA,OAAO,IAAA;AAAA,QAET;AACE,UAAA,OAAO,KAAA;AAAA;AACX,IACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,QAAQ,gBAAgB;AAAA,GAClD;AAEA,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,OAAO,IAAA,KAAiB;AACtB,MAAA,IAAI,YAAA,EAAc;AAIlB,MAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY,KAAM,QAAA,IAAY,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY,KAAM,OAAA,EAAS;AAErF,MAAA,MAAM,SAAA,GAAY,KAAK,UAAA,CAAW,GAAG,KAAK,CAAC,MAAA,EAAQ,GAAA,EAAK,GAAA,EAAK,OAAA,EAAS,OAAA,EAAS,UAAU,QAAQ,CAAA,CAAE,SAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA;AAC5I,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA;AAAA,MACF;AAGA,MAAA,cAAA,CAAe,KAAK,CAAA;AAEpB,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AAAA,UACvB,GAAG,IAAA;AAAA,UACH,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,SAAA,EAAW,IAAA,CAAK,KAAI,EAAE;AAAA,UACrD;AAAA,YACE,IAAA,EAAM,OAAA;AAAA,YACN,OAAA,EAAS,6IAAA;AAAA,YACT,SAAA,EAAW,KAAK,GAAA;AAAI;AACtB,SACD,CAAA;AACD,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,QAAQ,eAAA,CAAgB,OAAA;AAC9B,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAE1B,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,YAAA,CAAa,EAAE,CAAA;AAEf,MAAA,MAAM,WAAA,GAAc,KAAA,GAAQ,CAAA,EAAG,IAAI;AAAA,SAAA,CAAA,GAAgB,IAAA;AACnD,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AAAA,QACvB,GAAG,IAAA;AAAA,QACH,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,aAAa,SAAA,EAAW,IAAA,CAAK,KAAI;AAAE,OAC7D,CAAA;AAED,MAAA,IAAI,QAAA,GAAW,EAAA;AAEf,MAAA,IAAI;AACF,QAAA,WAAA,MAAiB,KAAA,IAAS,KAAA,CAAM,GAAA,CAAI,IAAA,EAAM,QAAQ,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS,GAAI,MAAS,CAAA,EAAG;AACjH,UAAA,QAAQ,MAAM,IAAA;AAAM,YAClB,KAAK,MAAA;AACH,cAAA,QAAA,IAAY,KAAA,CAAM,OAAA;AAClB,cAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,cAAA;AAAA,YAEF,KAAK,WAAA;AACH,cAAA,YAAA,CAAa,CAAC,IAAA,KAAS;AAAA,gBACrB,GAAG,IAAA;AAAA,gBACH,EAAE,MAAM,KAAA,CAAM,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA,EAAM,QAAQ,SAAA;AAAU,eACzD,CAAA;AACD,cAAA;AAAA,YAEF,KAAK,aAAA;AACH,cAAA,YAAA;AAAA,gBAAa,CAAC,SACZ,IAAA,CAAK,GAAA;AAAA,kBAAI,CAAC,OACR,EAAA,CAAG,IAAA,KAAS,MAAM,IAAA,IAAQ,EAAA,CAAG,WAAW,SAAA,GACpC,EAAE,GAAG,EAAA,EAAI,MAAA,EAAQ,MAAM,MAAA,CAAO,OAAA,GAAU,SAAS,OAAA,EAAS,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAO,GAC/E;AAAA;AACN,eACF;AACA,cAAA;AAAA,YAEF,KAAK,OAAA;AACH,cAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AAAA,gBACvB,GAAG,IAAA;AAAA,gBACH,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,MAAM,OAAA,EAAS,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI;AAAE,eAChE,CAAA;AACD,cAAA;AAAA;AACJ,QACF;AAEA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AAAA,YACvB,GAAG,IAAA;AAAA,YACH,EAAE,MAAM,WAAA,EAAa,OAAA,EAAS,UAAU,SAAA,EAAW,IAAA,CAAK,KAAI;AAAE,WAC/D,CAAA;AAAA,QACH;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AAAA,UACvB,GAAG,IAAA;AAAA,UACH;AAAA,YACE,IAAA,EAAM,OAAA;AAAA,YACN,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,YACxD,SAAA,EAAW,KAAK,GAAA;AAAI;AACtB,SACD,CAAA;AAAA,MACH,CAAA,SAAE;AACA,QAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,QAAA,YAAA,CAAa,EAAE,CAAA;AACf,QAAA,YAAA,CAAa,EAAE,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,YAAA,EAAc,aAAa;AAAA,GACrC;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBAAOT,GAAAA,CAAC,KAAA,EAAA,EAAM,UAAA,EAAY,mBAAA,EAAqB,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,uBACEF,IAAAA,CAACC,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,OAAM,MAAA,EAChC,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,OAAA;AAAA,UACA,KAAA,EAAO,uBAAA,CAAwB,MAAM,CAAA,CAAE,KAAA;AAAA,UACvC,UAAU,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA,EAAG,QAAQ,MAAA,CAAO,QAAA;AAAA,UACrD,IAAA,EAAM,OAAO,OAAA,EAAQ;AAAA,UACrB,SAAA;AAAA,UACA,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,GAAA,EAAK,QAAQ,GAAA;AAAI;AAAA,OACnB;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,YAAA;AAAA,UACV,YAAA,EAAc,gBAAA;AAAA,UACd,YAAA,EAAc,KAAA;AAAA,UACd,aAAA,EAAe,CAAC,CAAC,YAAA;AAAA,UACjB,YAAA,EAAc,gBAAA;AAAA,UACd,WAAA,EACE,YACI,yDAAA,GACA;AAAA;AAAA;AAER,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,iBAAiB,MAAA,CAAO,eAAA;AAAA,MACxB,OAAO,KAAA,EAAO,QAAA,EAAS,IAAK,uBAAA,CAAwB,MAAM,CAAA,CAAE,KAAA;AAAA,MAC5D,WAAA;AAAA,MACA,eAAe,MAAA,CAAO,SAAA;AAAA,MACtB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,SAAA;AAAA,MACA,WAAW,SAAA,IAAa,MAAA;AAAA,MACxB,YAAA;AAAA,MACA,QAAA,EAAU,YAAA;AAAA,MACV,YAAA,EAAc,gBAAA;AAAA,MACd,aAAA,EAAe,CAAC,CAAC,YAAA;AAAA,MACjB,YAAA,EAAc;AAAA;AAAA,GAChB;AAEJ,CAAA;;;ACxTA,cAAA,EAAA;AACA,cAAA,EAAA;;;ACJA,WAAA,EAAA;AAgBO,IAAM,aAAN,MAAiB;AAAA,EACd,MAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EAER,YAAY,MAAA,EAAuB;AACjC,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,MAAA,MAAM,IAAI,MAAM,mEAAmE,CAAA;AAAA,IACrF;AAEA,IAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,wBAAwB,MAAM,CAAA;AACzD,IAAA,IAAA,CAAK,eAAe,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA,EAAG,QAAQ,MAAA,CAAO,QAAA;AAE/D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO;AAAA,MACvB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,SAAS,KAAA,EAAqB;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,eAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,MAAM,UAAA,GAA2D;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,EAAK;AAC3C,MAAA,MAAM,SAA8C,EAAC;AACrD,MAAA,WAAA,MAAiB,KAAK,IAAA,EAAM;AAC1B,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,EAAA,EAAI,CAAA,CAAE,IAAI,QAAA,EAAU,CAAA,CAAE,UAAU,CAAA;AAAA,MAChD;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,EAAA,CAAG,aAAA,CAAc,CAAA,CAAE,EAAE,CAAC,CAAA;AAC9C,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,CACJ,QAAA,EACA,KAAA,EACqB;AACrB,IAAA,MAAM,WAAA,GAAc,KAAA,EAAO,GAAA,CAAI,YAAY,CAAA;AAE3C,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,MACzD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA;AAAA,MACA,KAAA,EAAO,WAAA,EAAa,MAAA,GAAS,WAAA,GAAc,MAAA;AAAA,MAC3C,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AACjC,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAElD,IAAA,MAAM,SAAA,GAAA,CAAyB,OAAO,OAAA,CAAQ,UAAA,IAAc,EAAC,EAAG,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,MAC3E,IAAI,EAAA,CAAG,EAAA;AAAA,MACP,IAAA,EAAM,GAAG,QAAA,CAAS,IAAA;AAAA,MAClB,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,SAAS,SAAS;AAAA,KAC7C,CAAE,CAAA;AAEF,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAO,OAAA,CAAQ,OAAA;AAAA,MACxB,SAAA;AAAA,MACA,YAAA,EAAc,OAAO,aAAA,IAAiB,MAAA;AAAA,MACtC,KAAA,EAAO,SAAS,KAAA,GACZ;AAAA,QACE,YAAA,EAAc,SAAS,KAAA,CAAM,aAAA;AAAA,QAC7B,gBAAA,EAAkB,SAAS,KAAA,CAAM,iBAAA;AAAA,QACjC,WAAA,EAAa,SAAS,KAAA,CAAM;AAAA,OAC9B,GACA;AAAA,KACN;AAAA,EACF;AAAA,EAEA,OAAO,UAAA,CACL,QAAA,EACA,KAAA,EAC6B;AAC7B,IAAA,MAAM,WAAA,GAAc,KAAA,EAAO,GAAA,CAAI,YAAY,CAAA;AAE3C,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,MACvD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA;AAAA,MACA,KAAA,EAAO,WAAA,EAAa,MAAA,GAAS,WAAA,GAAc,MAAA;AAAA,MAC3C,WAAA,EAAa,GAAA;AAAA,MACb,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAwD;AAEpF,IAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA;AAChC,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,MAC/C;AAEA,MAAA,IAAI,MAAM,UAAA,EAAY;AACpB,QAAA,KAAA,MAAW,EAAA,IAAM,MAAM,UAAA,EAAY;AACjC,UAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA,EAAG;AAClC,YAAA,eAAA,CAAgB,GAAA,CAAI,GAAG,KAAA,EAAO;AAAA,cAC5B,EAAA,EAAI,GAAG,EAAA,IAAM,EAAA;AAAA,cACb,IAAA,EAAM,EAAA,CAAG,QAAA,EAAU,IAAA,IAAQ,EAAA;AAAA,cAC3B,IAAA,EAAM;AAAA,aACP,CAAA;AACD,YAAA,IAAI,EAAA,CAAG,UAAU,IAAA,EAAM;AACrB,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,iBAAA;AAAA,gBACN,QAAA,EAAU,EAAE,EAAA,EAAI,EAAA,CAAG,IAAI,IAAA,EAAM,EAAA,CAAG,SAAS,IAAA;AAAK,eAChD;AAAA,YACF;AAAA,UACF;AAEA,UAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA;AAC3C,UAAA,IAAI,EAAA,CAAG,EAAA,EAAI,MAAA,CAAO,EAAA,GAAK,EAAA,CAAG,EAAA;AAC1B,UAAA,IAAI,GAAG,QAAA,EAAU,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,GAAG,QAAA,CAAS,IAAA;AACjD,UAAA,IAAI,EAAA,CAAG,UAAU,SAAA,EAAW;AAC1B,YAAA,MAAA,CAAO,IAAA,IAAQ,GAAG,QAAA,CAAS,SAAA;AAC3B,YAAA,MAAM;AAAA,cACJ,IAAA,EAAM,iBAAA;AAAA,cACN,OAAA,EAAS,GAAG,QAAA,CAAS,SAAA;AAAA,cACrB,UAAU,EAAE,EAAA,EAAI,OAAO,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA;AAAK,aAC/C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,kBAAkB,YAAA,EAAc;AACpD,QAAA,KAAA,MAAW,GAAG,MAAM,CAAA,IAAK,eAAA,EAAiB;AACxC,UAAA,IAAI,OAAgC,EAAC;AACrC,UAAA,IAAI;AACF,YAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AAAA,UAC/B,CAAA,CAAA,MAAQ;AAAA,UAER;AACA,UAAA,MAAM;AAAA,YACJ,IAAA,EAAM,eAAA;AAAA,YACN,QAAA,EAAU,EAAE,EAAA,EAAI,MAAA,CAAO,IAAI,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,SAAA,EAAW,IAAA;AAAK,WAChE;AAAA,QACF;AACA,QAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AAAA,EACvB;AACF,CAAA;AAEA,SAAS,aAAaJ,MAAAA,EAAuC;AAC3D,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,MAAMA,MAAAA,CAAK,IAAA;AAAA,MACX,aAAaA,MAAAA,CAAK,WAAA;AAAA,MAClB,YAAYA,MAAAA,CAAK;AAAA;AACnB,GACF;AACF;;;ACrLA,oBAAA,EAAA;AAEO,SAAS,kBAAkB,IAAA,EAQvB;AACT,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA;AAAA,WAAA,EACA,KAAK,QAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+CAAA,CA+BsB,CAAA;AAG9C,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA;AAAA,mBAAA,EACM,IAAA,CAAK,SAAA,GAAY,CAAA,EAAA,EAAK,IAAA,CAAK,SAAS,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAG,IAAA,CAAK,OAAA,GAAU,CAAA,WAAA,EAAc,IAAA,CAAK,OAAO,MAAM,EAAE;AAAA,+BAAA,CACrF,CAAA;AAAA,EAC9B,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,6DAAA,CAG+C,CAAA;AAAA,EAC5D;AAGA,EAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAC5B,IAAA,KAAA,CAAM,KAAK,sBAAsB,CAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,CAAY,GAAA;AAAA,MAC7B,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,SAAS,CAAA,CAAA,EAAI,EAAE,OAAA,GAAU,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,KAAK,EAAE,CAAA;AAAA,KACzE;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,EAAA,EAAI;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,MAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AACxC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,KAAA,CAAM,MAAA,GAAS,EAAE,CAAA,aAAA,CAAe,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAC7B;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAQ;AACtB,IAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AACpC,IAAA,KAAA,MAAW,QAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG;AAC1C,MAAA,KAAA,CAAM,KAAK,CAAA,GAAA,EAAM,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAAA,IACnD;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAC3B,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI;AAChC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MACxB;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAC/B,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM;AAClC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MACxB;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACrC,MAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AACpC,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,WAAA,EAAa;AACzC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MACxB;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,MAAM,OAAA,EAAS;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA;AAAA,EAAyB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAC1D;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA,EA+IX,eAAe,CAAA,CAAE,CAAA;AAEjB,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;AC5PA,UAAA,EAAA;AACA,WAAA,EAAA;;;ACOO,IAAM,cAAA,GAA8B;AAAA;AAAA,EAEzC,EAAE,EAAA,EAAI,eAAA,EAAiB,IAAA,EAAM,eAAA,EAAiB,eAAe,KAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS;AAAA,EAC7G,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,eAAe,KAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS;AAAA,EACjG,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,eAAe,KAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS;AAAA,EAC/F,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,eAAe,GAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS;AAAA;AAAA,EAGjG,EAAE,EAAA,EAAI,iBAAA,EAAmB,IAAA,EAAM,iBAAA,EAAmB,eAAe,GAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,WAAA,EAAY;AAAA,EACpH,EAAE,EAAA,EAAI,mBAAA,EAAqB,IAAA,EAAM,mBAAA,EAAqB,eAAe,GAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,WAAA,EAAY;AAAA;AAAA,EAGxH,EAAE,EAAA,EAAI,gBAAA,EAAkB,IAAA,EAAM,gBAAA,EAAkB,eAAe,OAAA,EAAS,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS;AAAA,EAChH,EAAE,EAAA,EAAI,kBAAA,EAAoB,IAAA,EAAM,kBAAA,EAAoB,eAAe,OAAA,EAAS,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS;AAAA;AAAA,EAGpH,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,eAAe,KAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM;AAAA,EAChG,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,eAAe,MAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM;AAAA;AAAA,EAG5F,EAAE,EAAA,EAAI,2BAAA,EAA6B,IAAA,EAAM,iBAAA,EAAmB,eAAe,GAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,YAAA,EAAa;AAAA,EAC/H,EAAE,EAAA,EAAI,6BAAA,EAA+B,IAAA,EAAM,mBAAA,EAAqB,eAAe,GAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,YAAA,EAAa;AAAA,EACnI,EAAE,EAAA,EAAI,sBAAA,EAAwB,IAAA,EAAM,eAAA,EAAiB,eAAe,KAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,YAAA,EAAa;AAAA,EACxH,EAAE,EAAA,EAAI,gBAAA,EAAkB,IAAA,EAAM,SAAA,EAAW,eAAe,KAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,YAAA,EAAa;AAAA,EAC5G,EAAE,EAAA,EAAI,uBAAA,EAAyB,IAAA,EAAM,gBAAA,EAAkB,eAAe,OAAA,EAAS,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,YAAA,EAAa;AAAA,EAC3H,EAAE,EAAA,EAAI,eAAA,EAAiB,IAAA,EAAM,UAAA,EAAY,eAAe,KAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,YAAA,EAAa;AAAA,EAC5G,EAAE,EAAA,EAAI,wBAAA,EAA0B,IAAA,EAAM,eAAA,EAAiB,eAAe,GAAA,EAAS,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,YAAA;AAChH,CAAA;AAEO,SAAS,aAAa,OAAA,EAAwC;AACnE,EAAA,OAAO,eAAe,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACpD;AAMO,SAAS,iBAAiB,OAAA,EAAyB;AACxD,EAAA,OAAO,YAAA,CAAa,OAAO,CAAA,EAAG,aAAA,IAAiB,KAAA;AACjD;;;ADzCA,IAAM,eAAA,GAAkB,CAAA;AAOjB,SAAS,eAAe,IAAA,EAAsB;AACnD,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,eAAe,CAAA;AAChD;AAEO,SAAS,aAAa,IAAA,EAMN;AACrB,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,MAAA,CAAO,KAAK,CAAA;AAGnD,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,IAAI,CAAA;AACpD,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,IAAI,CAAA;AACpD,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,IAAI,CAAA;AAI1D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,iBAAA,EAAkB;AAC/C,EAAA,MAAM,QAAQ,WAAA,CAAY,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,aAAa,EAAE,CAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA;AACjD,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,IAAA,CAAK,SAAA,EAAW,CAAC,CAAA;AAEvD,EAAA,IAAI,eAAe,iBAAA,CAAkB;AAAA,IACnC,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,WAAA,EAAY;AAAA,IACnC,WAAW,QAAA,EAAU,SAAA;AAAA,IACrB,SAAS,QAAA,EAAU,OAAA;AAAA,IACnB,WAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,IAAI,cAAA,CAAe,YAAY,CAAA,GAAI,YAAA,EAAc;AAC/C,IAAA,YAAA,GAAe,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,YAAA,GAAe,eAAe,CAAA;AAAA,EACrE;AAGA,EAAA,MAAM,QAAA,GAAgD;AAAA,IACpD,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,YAAA;AAAa,GAC1C;AAGA,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,MAAM,WAAA,GAAc,UACjB,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,OAAO,CAAA,CACpB,IAAA,CAAK,IAAI,CAAA;AACZ,IAAA,IAAI,cAAA,CAAe,WAAW,CAAA,IAAK,YAAA,EAAc;AAC/C,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,CAAA;AAAA,EAAgC,WAAW,CAAA;AAAA,OACrD,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,MAAM,kBAAuD,EAAC;AAG9D,EAAA,MAAM,UAAA,GAAgD;AAAA,IACpD,IAAA,EAAM,MAAA;AAAA,IACN,SAAS,IAAA,CAAK;AAAA,GAChB;AAGA,EAAA,KAAA,IAAS,IAAI,IAAA,CAAK,mBAAA,CAAoB,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,mBAAA,CAAoB,CAAC,CAAA;AACtC,IAAA,MAAM,OAAA,GACJ,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,IAAI,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAC5E,IAAA,MAAM,MAAA,GAAS,eAAe,OAAO,CAAA;AAErC,IAAA,IAAI,aAAA,GAAgB,SAAS,kBAAA,EAAoB;AACjD,IAAA,aAAA,IAAiB,MAAA;AACjB,IAAA,eAAA,CAAgB,QAAQ,GAAG,CAAA;AAAA,EAC7B;AAEA,EAAA,QAAA,CAAS,IAAA,CAAK,GAAG,eAAA,EAAiB,UAAU,CAAA;AAE5C,EAAA,MAAM,WAAA,GAAc,cAAA;AAAA,IAClB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAO,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,CAAA,CAAE,OAAA,GAAU,EAAG,CAAA,CAAE,KAAK,EAAE;AAAA,GAC/E;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,aAAA,EAAe,WAAA,EAAY;AAChD;;;AEpGA,WAAA,EAAA;AACA,WAAA,EAAA;AACA,UAAA,EAAA;AAMO,IAAM,YAAN,MAAgB;AAAA,EACb,EAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,sBAA2D,EAAC;AAAA,EAC5D,SAAA,GAAY,SAAA;AAAA,EACZ,SAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EAER,WAAA,CAAY,QAAsB,KAAA,EAAqB;AACrD,IAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,IAAA,IAAA,CAAK,EAAA,GAAK,IAAI,UAAA,CAAW,MAAM,CAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,YAAYc,MAAAA,EAAO;AACxB,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,iBAAA;AAC5B,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,gBAAA;AAAA,EAC3B;AAAA,EAEA,YAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,SAAS,KAAA,EAAqB;AAC5B,IAAA,IAAA,CAAK,EAAA,CAAG,SAAS,KAAK,CAAA;AAAA,EACxB;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,GAAG,QAAA,EAAS;AAAA,EAC1B;AAAA,EAEA,MAAM,UAAA,GAA2D;AAC/D,IAAA,OAAO,IAAA,CAAK,GAAG,UAAA,EAAW;AAAA,EAC5B;AAAA,EAEA,aAAa,SAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA,EAEA,OAAO,GAAA,CACL,WAAA,EACA,eAAA,EAC4B;AAC5B,IAAA,YAAA,CAAa;AAAA,MACX,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,WAAA,IAAe,eAAA,GAAkB,mBAAA,GAAsB,EAAA,CAAA;AAAA,MAChE,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAED,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,YAAA,CAAa;AAAA,MAChC,WAAA;AAAA,MACA,qBAAqB,IAAA,CAAK,mBAAA;AAAA,MAC1B,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AAGD,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAC5C,MAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAQ;AACtC,QAAC,QAAgB,OAAA,GAAU;AAAA,UACzB,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAO,QAAQ,OAAA,KAAY,QAAA,GAAW,OAAA,CAAQ,OAAA,GAAU,WAAA,EAAY;AAAA,UAC1F;AAAA,YACE,IAAA,EAAM,WAAA;AAAA,YACN,SAAA,EAAW;AAAA,cACT,KAAK,CAAA,KAAA,EAAQ,eAAA,CAAgB,QAAQ,CAAA,QAAA,EAAW,gBAAgB,MAAM,CAAA,CAAA;AAAA,cACtE,MAAA,EAAQ;AAAA;AACV;AACF,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,iBAAA,EAAkB;AACvC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO;AACnC,IAAA,IAAI,eAAA,GAAkB,CAAC,GAAG,QAAQ,CAAA;AAClC,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,OAAO,SAAA,GAAY,KAAK,aAAA,EAAe;AACrC,MAAA,SAAA,EAAA;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AAG7D,QAAA,IAAI,SAAS,OAAA,EAAS;AACpB,UAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,OAAA,EAAQ;AAEhD,UAAA,YAAA,CAAa;AAAA,YACX,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,IAAA,EAAM,WAAA;AAAA,YACN,SAAS,QAAA,CAAS,OAAA;AAAA,YAClB,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AAED,UAAA,IAAA,CAAK,mBAAA,CAAoB,KAAK,EAAE,IAAA,EAAM,aAAa,OAAA,EAAS,QAAA,CAAS,SAAS,CAAA;AAAA,QAChF;AAGA,QAAA,IAAI,QAAA,CAAS,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACnC,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,cAAwD,EAAC;AAE/D,QAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,SAAA,EAAW;AACrC,UAAA,MAAM,EAAE,MAAM,WAAA,EAAa,IAAA,EAAM,KAAK,IAAA,EAAM,IAAA,EAAM,KAAK,SAAA,EAAU;AAEjE,UAAA,MAAM,SAAS,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,OAAO,CAAA;AACrD,UAAA,WAAA,CAAY,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AAEjC,UAAA,MAAM,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,IAAA,CAAK,MAAM,MAAA,EAAO;AAErD,UAAA,YAAA,CAAa;AAAA,YACX,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,IAAA,EAAM,WAAA;AAAA,YACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,YACjE,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AAED,UAAA,YAAA,CAAa;AAAA,YACX,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,IAAA,EAAM,aAAA;AAAA,YACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,YAC9B,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,YAAA,GAA2D;AAAA,UAC/D,IAAA,EAAM,WAAA;AAAA,UACN,OAAA,EAAS,SAAS,OAAA,IAAW,IAAA;AAAA,UAC7B,UAAA,EAAY,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,YAC1C,IAAI,EAAA,CAAG,EAAA;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU,EAAE,IAAA,EAAM,EAAA,CAAG,IAAA,EAAM,WAAW,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,SAAS,CAAA;AAAE,WACrE,CAAE;AAAA,SACJ;AACA,QAAA,eAAA,CAAgB,KAAK,YAAY,CAAA;AAGjC,QAAA,KAAA,MAAW,EAAE,IAAA,EAAM,MAAA,EAAO,IAAK,WAAA,EAAa;AAC1C,UAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,YACnB,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,YAC9B,cAAc,IAAA,CAAK;AAAA,WACpB,CAAA;AAAA,QACH;AAEA,QAAA,IAAA,CAAK,mBAAA,CAAoB,KAAK,YAAY,CAAA;AAC1C,QAAA,KAAA,MAAW,EAAE,IAAA,EAAM,MAAA,EAAO,IAAK,WAAA,EAAa;AAC1C,UAAA,IAAA,CAAK,oBAAoB,IAAA,CAAK;AAAA,YAC5B,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,YAC9B,cAAc,IAAA,CAAK;AAAA,WACpB,CAAA;AAAA,QACH;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAQ;AAC/B,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AAAA,EACvB;AAAA,EAEA,OAAO,SAAA,CACL,WAAA,EACA,eAAA,EAC4B;AAC5B,IAAA,WAAA,MAAiB,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,eAAe,CAAA,EAAG;AAChE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,iBAAA,GAAiC;AACvC,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,CAAc,IAAA,EAAc,OAAA,EAAkB,SAAA,KAA8C;AACxG,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,WAAA,CAAe,IAAA,EAAM,SAAS,SAAS,CAAA;AAAA,MAC5D,CAAA;AAAA,MACA,iBAAA,EAAmB,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,EAAY;AAAA,MACjD,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,CAAC,KAAA,EAAe,SAAA,EAAmB,KAAA,KAAmB;AAC5D,UAAA,MAAM,EAAE,WAAA,EAAAC,YAAAA,EAAY,IAAI,UAAA,EAAA,EAAA,YAAA,CAAA,aAAA,CAAA,CAAA;AACxB,UAAA,MAAM,QAAQA,YAAAA,CAAY,SAAA,IAAa,IAAA,CAAK,SAAA,EAAW,OAAO,KAAK,CAAA;AACnE,UAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAA2B,EAAE,OAAO,CAAA;AAAA,QACxD,CAAA;AAAA,QACA,KAAA,EAAO,CAAC,SAAA,EAAmB,KAAA,KAAmD;AAC5E,UAAA,MAAM,EAAE,SAAA,EAAAC,UAAAA,EAAU,IAAI,UAAA,EAAA,EAAA,YAAA,CAAA,aAAA,CAAA,CAAA;AACtB,UAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,UAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,YAAAA,UAAAA,CAAU;AAAA,cACR,SAAA,EAAW,aAAa,IAAA,CAAK,SAAA;AAAA,cAC7B,SAAS,CAAA,CAAE,OAAA;AAAA,cACX,UAAU,CAAA,CAAE,QAAA;AAAA,cACZ,MAAA,EAAQ,OAAA;AAAA,cACR,SAAA,EAAW,CAAA;AAAA,cACX,SAAA,EAAW,GAAA;AAAA,cACX,UAAA,EAAY;AAAA,aACb,CAAA;AAAA,UACH;AAAA,QACF,CAAA;AAAA,QACA,cAAA,EAAgB,CAAC,SAAA,KAAsB;AACrC,UAAA,MAAM,EAAE,cAAA,EAAAC,eAAAA,EAAe,IAAI,UAAA,EAAA,EAAA,YAAA,CAAA,aAAA,CAAA,CAAA;AAC3B,UAAA,OAAOA,eAAAA,CAAe,SAAA,IAAa,IAAA,CAAK,SAAS,CAAA;AAAA,QACnD;AAAA,OACF;AAAA,MACA,QAAQ,kBAAA;AAAmB,KAC7B;AAAA,EACF;AAAA,EAEA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,sBAAsB,EAAC;AAC5B,IAAA,IAAA,CAAK,YAAYH,MAAAA,EAAO;AAAA,EAC1B;AACF,CAAA;;;ACxOO,IAAM,eAAN,MAAmB;AAAA,EAChB,KAAA,uBAAY,GAAA,EAAkB;AAAA,EAEtC,SAASd,MAAAA,EAAkB;AACzB,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIA,MAAAA,CAAK,IAAI,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4BA,MAAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,IACzD;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIA,MAAAA,CAAK,IAAA,EAAMA,MAAI,CAAA;AAAA,EAChC;AAAA,EAEA,IAAI,IAAA,EAAgC;AAClC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAA,GAAiB;AACf,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,EACvC;AAAA,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,KAAK,MAAA,EAAO;AAAA,EACrB;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAgB,GAAA,EAAuC;AACnE,IAAA,MAAMA,MAAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI,CAAA;AACrC,IAAA,IAAI,CAACA,MAAAA,EAAM;AACT,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAO,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAI,CAAA,CAAA,EAAG;AAAA,IAC/D;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,MAAMA,MAAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,WAAW,GAAG,CAAA;AAAA,IAC/C,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,EAAQ;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,SAAA,GAAsB;AACpB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,EACrC;AACF,CAAA;AAEO,SAAS,qBAAA,GAAsC;AACpD,EAAA,MAAM,QAAA,GAAW,IAAI,YAAA,EAAa;AAGlC,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,gBAAA,EAAA,EAAA,mBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,gBAAA,EAAA,EAAA,mBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,aAAA,EAAA,EAAA,gBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,iBAAA,EAAA,EAAA,oBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,mBAAA,EAAA,EAAA,sBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,+BAAA,EAAA,EAAA,kCAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,mBAAA,EAAA,EAAA,sBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,oBAAA,EAAA,EAAA,uBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,oBAAA,EAAA,EAAA,uBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,kBAAA,EAAA,EAAA,qBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,mBAAA,EAAA,EAAA,sBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,cAAA,EAAA,EAAA,iBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,mBAAA,EAAA,EAAA,sBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,cAAA,EAAA,EAAA,iBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,qBAAA,EAAA,EAAA,wBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,sBAAA,EAAA,EAAA,yBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,gBAAA,EAAA,EAAA,mBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,mBAAA,EAAA,EAAA,sBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,oBAAA,EAAA,EAAA,uBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,mBAAA,EAAA,EAAA,sBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,iBAAA,EAAA,EAAA,oBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,kBAAA,EAAA,EAAA,qBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,wBAAA,EAAA,EAAA,2BAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,yBAAA,EAAA,EAAA,4BAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,aAAA,EAAA,EAAA,gBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,iBAAA,EAAA,EAAA,oBAAA,CAAA;AAAA,GACF;AAIA,EAAA,KAAK,OAAA,CAAQ,GAAA;AAAA,IACX,WAAA,CAAY,GAAA,CAAI,OAAO,GAAA,KAAQ;AAC7B,MAAA,MAAM,IAAI,MAAM,GAAA;AAChB,MAAA,IAAI,CAAA,CAAE,IAAA,EAAM,QAAA,CAAS,QAAA,CAAS,EAAE,IAAI,CAAA;AAAA,IACtC,CAAC;AAAA,GACH;AAGA,EAAA,KAAK,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,cAAA,EAAA,EAAA,iBAAA,CAAA,CAAA,CAAgC,IAAA,CAAK,CAAC,CAAA,KAAM;AAC/C,IAAA,QAAA,CAAS,QAAA,CAAS,EAAE,QAAQ,CAAA;AAC5B,IAAA,QAAA,CAAS,QAAA,CAAS,EAAE,QAAQ,CAAA;AAAA,EAC9B,CAAC,CAAA;AAED,EAAA,OAAO,QAAA;AACT;;;ANtFA,UAAA,EAAA;AACA,WAAA,EAAA;AOHA,IAAM,YAAYL,KAAAA,CAAK,IAAA,CAAKC,GAAAA,CAAG,OAAA,IAAW,UAAU,CAAA;AACpD,IAAM,UAAA,GAAaD,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,mBAAmB,CAAA;AAC3D,IAAM,iBAAA,GAAoB,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,GAAA;AACxC,IAAM,WAAA,GAAc,aAAA;AAOpB,SAAS,SAAA,GAAyB;AAChC,EAAA,IAAI;AACF,IAAA,IAAID,GAAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7B,MAAA,OAAO,KAAK,KAAA,CAAMA,GAAAA,CAAG,YAAA,CAAa,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,IACxD;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAC;AACT,EAAA,OAAO,EAAE,SAAA,EAAW,CAAA,EAAG,aAAA,EAAe,IAAA,EAAK;AAC7C;AAEA,SAAS,WAAW,KAAA,EAA0B;AAC5C,EAAA,IAAI;AACF,IAAA,IAAI,CAACA,GAAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAGA,GAAAA,CAAG,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC1E,IAAAA,IAAG,aAAA,CAAc,UAAA,EAAY,KAAK,SAAA,CAAU,KAAK,GAAG,OAAO,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AAAA,EAAC;AACX;AAEA,SAAS,kBAAA,GAA6C;AACpD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,MAAM,KAAA,CAAM,GAAA;AAAA,MAChB,8BAA8B,WAAW,CAAA,OAAA,CAAA;AAAA,MACzC,EAAE,OAAA,EAAS,EAAE,QAAQ,kBAAA,EAAmB,EAAG,SAAS,GAAA,EAAK;AAAA,MACzD,CAAC,GAAA,KAAQ;AACP,QAAA,IAAI,GAAA,CAAI,eAAe,GAAA,EAAK;AAAE,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAG,UAAA,GAAA,CAAI,MAAA,EAAO;AAAG,UAAA;AAAA,QAAQ;AACnE,QAAA,IAAI,IAAA,GAAO,EAAA;AACX,QAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAO,QAAQ,CAAE,CAAA;AACjC,QAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,UAAA,IAAI;AAAE,YAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,WAAW,IAAI,CAAA;AAAA,UAAG,CAAA,CAAA,MAC3C;AAAE,YAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,UAAG;AAAA,QACzB,CAAC,CAAA;AAAA,MACH;AAAA,KACF;AACA,IAAA,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAC,CAAA;AACnC,IAAA,GAAA,CAAI,EAAA,CAAG,WAAW,MAAM;AAAE,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAG,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IAAG,CAAC,CAAA;AAAA,EAC3D,CAAC,CAAA;AACH;AAEA,SAAS,eAAA,CAAgB,SAAiB,MAAA,EAAwB;AAChE,EAAA,MAAM,IAAI,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACvC,EAAA,MAAM,IAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACtC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,KAAM,EAAE,CAAC,CAAA,IAAK,IAAI,OAAO,CAAA;AACtC,IAAA,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,KAAM,EAAE,CAAC,CAAA,IAAK,IAAI,OAAO,EAAA;AAAA,EACxC;AACA,EAAA,OAAO,CAAA;AACT;AAYA,eAAsB,eAAe,cAAA,EAAoD;AACvF,EAAA,IAAI;AACF,IAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,GAAA,GAAM,KAAA,CAAM,SAAA,GAAY,iBAAA,IAAqB,MAAM,aAAA,EAAe;AACpE,MAAA,IAAI,eAAA,CAAgB,cAAA,EAAgB,KAAA,CAAM,aAAa,IAAI,CAAA,EAAG;AAC5D,QAAA,OAAO,EAAE,eAAA,EAAiB,IAAA,EAAM,cAAA,EAAgB,aAAA,EAAe,MAAM,aAAA,EAAc;AAAA,MACrF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,EAAmB;AACxC,IAAA,UAAA,CAAW,EAAE,SAAA,EAAW,GAAA,EAAK,aAAA,EAAe,QAAQ,CAAA;AAEpD,IAAA,IAAI,MAAA,IAAU,eAAA,CAAgB,cAAA,EAAgB,MAAM,IAAI,CAAA,EAAG;AACzD,MAAA,OAAO,EAAE,eAAA,EAAiB,IAAA,EAAM,cAAA,EAAgB,eAAe,MAAA,EAAO;AAAA,IACxE;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAC;AACT,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,oBAAoB,IAAA,EAA0B;AAC5D,EAAA,MAAM,QAAQ,CAAA,kBAAA,EAAqB,IAAA,CAAK,cAAc,CAAA,QAAA,EAAM,KAAK,aAAa,CAAA,CAAA;AAC9E,EAAA,MAAM,KAAA,GAAQ,iBAAiB,WAAW,CAAA,CAAA;AAC1C,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,MAAA,EAAQ,KAAA,CAAM,MAAM,CAAA,GAAI,CAAA;AACrD,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAc,CAAA,UAAA,EAAQ,CAAC,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,CAAA,CAAE,MAAA,GAAS,CAAC,CAAC,CAAA,QAAA,CAAA;AACvE,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,CAAA,QAAA,EAAM,QAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,MAAA,CAAA;AAAA,IACvB,IAAI,KAAK,CAAA;AAAA,IACT,IAAI,KAAK,CAAA;AAAA,IACT,CAAA,QAAA,EAAM,QAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,MAAA,CAAA;AAAA,IACvB;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACb;AAMA,eAAsB,WAAW,cAAA,EAAiG;AAChI,EAAA,MAAM,IAAA,GAAO,MAAM,cAAA,CAAe,cAAc,CAAA;AAChD,EAAA,IAAI,CAAC,MAAM,eAAA,EAAiB;AAC1B,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,cAAA,EAAgB,IAAI,cAAA,EAAe;AAAA,EACnE;AAGA,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,0BAAA,EAA4B,KAAK,gCAAA,EAAiC;AAAA,IACzF,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA2B,KAAK,mCAAA,EAAoC;AAAA,IAC1F,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,wCAAA,EAA0C,KAAK,oCAAA;AAAqC,GAC7G;AAEA,EAAA,IAAI,UAAA,GAA4B,IAAA;AAChC,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAMwB,QAAAA,CAAS,GAAA,CAAI,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAO,CAAA,CAAE,QAAA,EAAS;AAC5E,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,aAAa,CAAA,EAAG;AAC/B,QAAA,UAAA,GAAa,GAAA,CAAI,GAAA;AACjB,QAAA;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAGA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAMA,QAAAA,CAAS,0BAAA,EAA4B,EAAE,KAAA,EAAO,QAAQ,OAAA,EAAS,GAAA,EAAO,CAAA,CAAE,QAAA,EAAS;AAC7F,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,EAAG;AAEzB,QAAA,MAAM,OAAA,GAAUvB,KAAAA,CAAK,OAAA,CAAQwB,WAAA,EAAW,IAAI,CAAA;AAC5C,QAAA,IAAIzB,IAAG,UAAA,CAAWC,KAAAA,CAAK,KAAK,OAAA,EAAS,MAAM,CAAC,CAAA,EAAG;AAC7C,UAAA,IAAI;AACF,YAAAuB,QAAAA,CAAS,YAAY,EAAE,GAAA,EAAK,SAAS,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAO,CAAA;AACpE,YAAAA,QAAAA,CAAS,gBAAgB,EAAE,GAAA,EAAK,SAAS,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAO,CAAA;AACxE,YAAAA,QAAAA,CAAS,cAAc,EAAE,GAAA,EAAK,SAAS,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAO,CAAA;AACtE,YAAAA,QAAAA,CAAS,qBAAqB,EAAE,GAAA,EAAK,SAAS,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAO,CAAA;AAC7E,YAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAM,cAAA,EAAgB,EAAA,EAAI,KAAK,aAAA,EAAc;AAAA,UACvE,SAAS,GAAA,EAAK;AACZ,YAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,cAAA,EAAgB,EAAA,EAAI,IAAA,CAAK,aAAA,EAAe,KAAA,EAAO,CAAA,yBAAA,EAA4B,GAAG,CAAA,CAAA,EAAG;AAAA,UAClH;AAAA,QACF;AACA,QAAA,OAAO,EAAE,SAAS,KAAA,EAAO,IAAA,EAAM,gBAAgB,EAAA,EAAI,IAAA,CAAK,aAAA,EAAe,KAAA,EAAO,yEAAA,EAAqE;AAAA,MACrJ;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,UAAA,GAAa,kBAAkB,WAAW,CAAA,OAAA,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI;AACF,IAAAA,SAAS,UAAA,EAAY,EAAE,OAAO,MAAA,EAAQ,OAAA,EAAS,MAAQ,CAAA;AAEvD,IAAA,UAAA,CAAW,EAAE,SAAA,EAAW,CAAA,EAAG,aAAA,EAAe,MAAM,CAAA;AAChD,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAM,cAAA,EAAgB,EAAA,EAAI,KAAK,aAAA,EAAc;AAAA,EACvE,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,cAAA,EAAgB,EAAA,EAAI,IAAA,CAAK,aAAA,EAAe,KAAA,EAAO,CAAA,uBAAA,EAA0B,GAAG,CAAA,CAAA,EAAG;AAAA,EAChH;AACF;AAGA,IAAMC,WAAA,GAAYxB,KAAAA,CAAK,OAAA,CAAQ,IAAI,GAAA,CAAI,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,aAAA,EAAe,IAAI,CAAC,CAAA;APpJ7F,IAAMwB,aAAYxB,KAAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC7D,IAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAMD,GAAAA,CAAG,YAAA,CAAaC,KAAAA,CAAK,IAAA,CAAKwB,UAAAA,EAAW,IAAA,EAAM,cAAc,CAAA,EAAG,OAAO,CAAC,CAAA,CAAE,OAAA;AAEjG,IAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAE5B,OAAA,CACG,KAAK,SAAS,CAAA,CACd,YAAY,2DAA2D,CAAA,CACvE,QAAQ,OAAO,CAAA;AAGlB,OAAA,CACG,QAAQ,OAAA,EAAS,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA,CACpC,WAAA,CAAY,8BAA8B,CAAA,CAC1C,OAAO,mBAAA,EAAqB,uBAAA,EAAyB,OAAO,CAAA,CAC5D,MAAA,CAAO,OAAO,IAAA,KAAS;AACtB,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,IAAI,KAAK,MAAA,CAAO,IAAA;AAG3C,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,IAAA,MAAM,WAAW,qBAAA,EAAsB;AACvC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,cAAA,CAAe,UAAA,EAAY,SAAS,QAAQ,CAAA;AAC5C,MAAA,cAAA,CAAe,QAAA,EAAU,SAAS,MAAM,CAAA;AAAA,IAC1C;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,aAAa,WAAA,EAAa;AACnC,IAAA,MAAM,UAAU,OAAA,CAAQ,GAAA,CAAI,IAAA,IAAQ,OAAA,CAAQ,IAAI,QAAA,IAAY,WAAA;AAC5D,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACtC,IAAA,IAAI,SAAA,IAAa,cAAc,WAAA,EAAa;AAC1C,MAAA,cAAA,CAAe,YAAY,SAAS,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,cAAA,CAAe,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS;AACrC,IAAA,IAAI,MAAM,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,mBAAA,CAAoB,IAAI,CAAC,CAAA;AAAA,EAC1D,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,EAAC,CAAC,CAAA;AAEjB,EAAA,MAAM,UAAU,IAAI,CAAA;AACtB,CAAC,CAAA;AAGH,IAAM,YAAY,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,CAAE,YAAY,8BAA8B,CAAA;AAEtF,SAAA,CACG,OAAA,CAAQ,mBAAmB,CAAA,CAC3B,WAAA,CAAY,oBAAoB,CAAA,CAChC,MAAA,CAAO,CAAC,GAAA,EAAa,KAAA,KAAkB;AACtC,EAAA,MAAM,WAAA,GAAc,CAAC,MAAA,EAAQ,mBAAA,EAAqB,oBAAoB,aAAa,CAAA;AACnF,EAAA,MAAM,WAAA,GAAc,CAAC,WAAA,EAAa,WAAW,CAAA;AAC7C,EAAA,MAAM,iBAAiB,CAAC,QAAA,EAAU,aAAa,QAAA,EAAU,KAAA,EAAO,cAAc,QAAQ,CAAA;AAEtF,EAAA,IAAI,MAAA,GAAkB,KAAA;AACtB,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG;AAC7B,IAAA,MAAA,GAAS,SAAS,KAAK,CAAA;AAAA,EACzB,CAAA,MAAA,IAAW,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG;AACpC,IAAA,MAAA,GAAS,KAAA,KAAU,MAAA;AAAA,EACrB,CAAA,MAAA,IAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,cAAA,CAAe,QAAA,CAAS,KAAK,CAAA,EAAG;AACnC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2BAAA,EAAyB,KAAK,CAAA,CAAE,CAAA;AAC5C,MAAA,OAAA,CAAQ,IAAI,CAAA,mBAAA,EAAsB,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC7D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,UAAU,KAAuB,CAAA;AACtD,IAAA,cAAA,CAAe,YAAA,EAAc,aAAa,OAAO,CAAA;AACjD,IAAA,cAAA,CAAe,OAAA,EAAS,aAAa,YAAY,CAAA;AAAA,EACnD;AAEA,EAAA,cAAA,CAAe,KAA4B,MAA4C,CAAA;AACvF,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAW,GAAG,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AACvC,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,CAAA,GAAI,UAAU,KAAuB,CAAA;AAC3C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAiB,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACxC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAAsB,CAAA,CAAE,YAAY,CAAA,CAAE,CAAA;AAAA,EACpD;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oBAAA,EAAuB,aAAA,EAAe,CAAA,YAAA,CAAc,CAAA;AAClE,CAAC,CAAA;AAEH,SAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA,CAAY,oBAAoB,CAAA,CAChC,MAAA,CAAO,CAAC,GAAA,KAAgB;AACvB,EAAA,MAAM,KAAA,GAAQ,eAAe,GAA0B,CAAA;AACvD,EAAA,IAAI,GAAA,CAAI,aAAY,CAAE,QAAA,CAAS,KAAK,CAAA,IAAK,OAAO,UAAU,QAAA,EAAU;AAClE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,GAAG,CAAA,GAAA,EAAM,MAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,EAAM,KAAA,CAAM,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACpE,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,GAAG,CAAA,GAAA,EAAM,KAAK,SAAA,CAAU,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EACnD;AACF,CAAC,CAAA;AAEH,SAAA,CACG,QAAQ,MAAM,CAAA,CACd,YAAY,wBAAwB,CAAA,CACpC,OAAO,MAAM;AACZ,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,0BAA0B,CAAA;AACtC,EAAA,OAAA,CAAQ,IAAI,kIAAyB,CAAA;AACrC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,MAAM,OAAA,GACJ,GAAA,CAAI,WAAA,EAAY,CAAE,QAAA,CAAS,KAAK,CAAA,IAAK,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,MAAA,GAAS,EAAA,GAC7E,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,EAAM,KAAA,CAAM,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA,GACzC,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAC1B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,EACpC;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAkB,aAAA,EAAe,CAAA,YAAA,CAAc,CAAA;AAC3D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB,CAAC,CAAA;AAGH,IAAM,WAAW,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,CAAE,YAAY,+BAAgC,CAAA;AAEtF,QAAA,CACG,OAAA,CAAQ,eAAe,CAAA,CACvB,WAAA,CAAY,yCAAyC,CAAA,CACrD,MAAA,CAAO,CAAC,IAAA,KAAiB;AACxB,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,KAAA,CAAM,EAAA,CAAG,KAAK,IAAI,CAAA;AAClB,EAAA,SAAA,CAAU,KAAK,CAAA;AACf,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAAsB,IAAI,CAAA,CAAE,CAAA;AAC1C,CAAC,CAAA;AAEH,QAAA,CACG,OAAA,CAAQ,iBAAiB,CAAA,CACzB,WAAA,CAAY,6CAA6C,CAAA,CACzD,MAAA,CAAO,CAAC,IAAA,KAAiB;AACxB,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AACpB,EAAA,SAAA,CAAU,KAAK,CAAA;AACf,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2BAAA,EAAyB,IAAI,CAAA,CAAE,CAAA;AAC7C,CAAC,CAAA;AAEH,QAAA,CACG,QAAQ,MAAM,CAAA,CACd,YAAY,gBAAgB,CAAA,CAC5B,OAAO,MAAM;AACZ,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,GAAG,MAAA,EAAQ;AACnB,IAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,CAAC,EAAE,CAAC,CAAA;AAAA,EAC9D;AACA,EAAA,IAAI,KAAA,CAAM,KAAK,MAAA,EAAQ;AACrB,IAAA,OAAA,CAAQ,IAAI,UAAU,CAAA;AACtB,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,CAAC,EAAE,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAQ;AAC5B,IAAA,OAAA,CAAQ,IAAI,gBAAgB,CAAA;AAC5B,IAAA,KAAA,CAAM,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,CAAC,EAAE,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,EAAA,CAAG,MAAA,IAAU,CAAC,KAAA,CAAM,IAAA,CAAK,MAAA,IAAU,CAAC,KAAA,CAAM,WAAA,CAAY,MAAA,EAAQ;AACvE,IAAA,OAAA,CAAQ,IAAI,4BAA4B,CAAA;AACxC,IAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACpE,IAAA,OAAA,CAAQ,IAAI,2DAA2D,CAAA;AAAA,EACzE;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB,CAAC,CAAA;AAGH,OAAA,CACG,QAAQ,QAAQ,CAAA,CAChB,YAAY,2CAA2C,CAAA,CACvD,OAAO,YAAY;AAClB,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsB,OAAO,CAAA,CAAE,CAAA;AAC3C,EAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AAEvC,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAO,CAAA;AACvC,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,CAAO,EAAA,IAAM,OAAO,OAAA,EAAS;AAC/C,IAAA,OAAA,CAAQ,IAAI,kCAAkC,CAAA;AAC9C,IAAA;AAAA,EACF;AACA,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAA,CAAQ,IAAI,CAAA,kBAAA,EAAgB,MAAA,CAAO,IAAI,CAAA,QAAA,EAAM,MAAA,CAAO,EAAE,CAAA,CAAE,CAAA;AACxD,IAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AAAA,EACzD,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wBAAA,EAAsB,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAAA,EACpD;AACF,CAAC,CAAA;AAEH,OAAA,CACG,QAAQ,gBAAgB,CAAA,CACxB,YAAY,uDAAuD,CAAA,CACnE,OAAO,YAAY;AAClB,EAAA,MAAM,EAAE,QAAA,EAAAD,SAAAA,EAAS,GAAI,MAAM,OAAO,eAAoB,CAAA;AAEtD,EAAA,MAAM,cAAcvB,KAAAA,CAAK,OAAA,CAAQ,MAAA,CAAA,IAAA,CAAY,OAAA,IAAWwB,YAAW,IAAI,CAAA;AACvE,EAAA,MAAM,SAAA,GAAYxB,KAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgBA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,sBAAsB,CAAA;AACjE,EAAA,MAAM,gBAAgBA,KAAAA,CAAK,IAAA;AAAA,IACzBC,IAAG,OAAA,EAAQ;AAAA,IACX,SAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,QAAA,GAAWD,KAAAA,CAAK,IAAA,CAAK,aAAA,EAAe,cAAc,CAAA;AAExD,EAAA,IAAI,CAACD,GAAAA,CAAG,UAAA,CAAW,aAAa,CAAA,EAAG;AACjC,IAAA,OAAA,CAAQ,IAAI,mCAA8B,CAAA;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAE,CAAA;AACzC,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,CAACA,GAAAA,CAAG,UAAA,CAAW,aAAa,CAAA,EAAG;AACjC,IAAAA,IAAG,SAAA,CAAU,aAAA,EAAe,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACjD;AAGA,EAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,EAAA,IAAI;AACF,IAAAwB,SAAAA,CAAS,gBAAA,EAAkB,EAAE,KAAA,EAAO,QAAQ,CAAA;AAC5C,IAAA,aAAA,GAAgB,IAAA;AAAA,EAClB,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAI,gCAAgC,CAAA;AAC5C,MAAAA,SAAAA,CAAS,eAAe,SAAS,CAAA,MAAA,EAAS,QAAQ,CAAA,CAAA,CAAA,EAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA;AACxE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wCAAA,EAAsC,QAAQ,CAAA,CAAE,CAAA;AAC5D,MAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AAAA,IAC3D,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAI,CAAA,4BAAA,EAA0B,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,GAAG,CAAA,CAAE,CAAA;AAAA,IAClF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,OAAA,CAAQ,IAAI,qDAAgD,CAAA;AAC5D,IAAA,cAAA,CAAe,SAAA,EAAW,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAC,CAAA;AAAA,EAC/D;AACF,CAAC,CAAA;AAGH,OAAA,CACG,OAAA,CAAQ,KAAK,CAAA,CACb,WAAA,CAAY,iEAAiE,CAAA,CAC7E,MAAA,CAAO,mBAAA,EAAqB,6CAAA,EAA+C,OAAO,CAAA,CAClF,MAAA,CAAO,YAAY;AAClB,EAAA,MAAM,EAAE,cAAA,EAAAE,eAAAA,EAAe,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AACjC,EAAA,MAAMA,eAAAA,EAAe;AACvB,CAAC,CAAA;AASH,SAAS,aAAA,GAA6B;AACpC,EAAA,MAAM,IAAA,GAAOxB,IAAG,OAAA,EAAQ;AACxB,EAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,OAAA,IAAWD,MAAK,IAAA,CAAK,IAAA,EAAM,WAAW,SAAS,CAAA;AAC3E,EAAA,MAAM,YAAA,GAAe,QAAQ,GAAA,CAAI,YAAA,IAAgBA,MAAK,IAAA,CAAK,IAAA,EAAM,WAAW,OAAO,CAAA;AACnF,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAExB,EAAA,OAAO;AAAA,IACL;AAAA,MACE,IAAA,EAAM,kBAAA;AAAA,MACN,UAAA,EAAYA,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,WAAW,UAAU,CAAA;AAAA,MAChD,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,iBAAA;AAAA,MACN,UAAA,EAAYA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,WAAW,UAAU,CAAA;AAAA,MACjD,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,gBAAA;AAAA,MACN,UAAA,EAAYA,KAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,UAAU,4BAA4B,CAAA;AAAA,MACrE,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,UAAA,EAAYA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,cAAc,CAAA;AAAA,MAC1C,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,oBAAA;AAAA,MACN,UAAA,EAAYA,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,aAAa,UAAU,CAAA;AAAA,MAClD,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,mBAAA;AAAA,MACN,YAAYA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,YAAY,iBAAiB,CAAA;AAAA,MACrE,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,mBAAA;AAAA,MACN,UAAA,EAAYA,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,WAAW,UAAU,CAAA;AAAA,MAChD,OAAA,EAAS,CAAC,SAAS;AAAA,KACrB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,kBAAA;AAAA,MACN,YAAYA,KAAAA,CAAK,IAAA,CAAK,YAAA,EAAc,MAAA,EAAQ,QAAQ,eAAe,CAAA;AAAA,MACnE,OAAA,EAAS,CAAC,KAAA,EAAO,SAAS;AAAA;AAC5B,GACF;AACF;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,EACZ,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,gBAAgB,MAAA,EAAoE;AAC3F,EAAA,IAAI,SAAkC,EAAC;AACvC,EAAA,IAAID,GAAAA,CAAG,UAAA,CAAW,MAAA,CAAO,UAAU,CAAA,EAAG;AACpC,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,KAAK,KAAA,CAAMA,GAAAA,CAAG,aAAa,MAAA,CAAO,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,IACjE,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,GAAS,EAAC;AAAA,IACZ;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,GAAM,MAAA;AACV,EAAA,KAAA,MAAW,GAAA,IAAO,OAAO,OAAA,EAAS;AAChC,IAAA,IAAI,CAAC,IAAI,GAAG,CAAA,IAAK,OAAO,GAAA,CAAI,GAAG,MAAM,QAAA,EAAU;AAC7C,MAAA,GAAA,CAAI,GAAG,IAAI,EAAC;AAAA,IACd;AACA,IAAA,GAAA,GAAM,IAAI,GAAG,CAAA;AAAA,EACf;AAEA,EAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,IAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAAA,EAC7B;AAEA,EAAA,GAAA,CAAI,SAAS,CAAA,GAAI,EAAE,GAAG,YAAA,EAAa;AAEnC,EAAA,MAAM,GAAA,GAAMC,KAAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AAC1C,EAAA,IAAI,CAACD,GAAAA,CAAG,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,IAAAA,IAAG,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACvC;AACA,EAAAA,GAAAA,CAAG,aAAA,CAAc,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAE5E,EAAA,OAAO,EAAE,QAAQA,GAAAA,CAAG,UAAA,CAAW,OAAO,UAAU,CAAA,GAAI,cAAc,SAAA,EAAU;AAC9E;AAEA,OAAA,CACG,OAAA,CAAQ,aAAa,CAAA,CACrB,WAAA,CAAY,+EAA+E,CAAA,CAC3F,MAAA,CAAO,WAAA,EAAa,iCAAiC,CAAA,CACrD,MAAA,CAAO,OAAO,IAAA,KAAS;AACtB,EAAA,MAAM,UAAU,aAAA,EAAc;AAE9B,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAC1C,EAAA,OAAA,CAAQ,IAAI,0JAA6B,CAAA;AACzC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,IAAI,KAAK,GAAA,EAAK;AACZ,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,MAAA,GAAS,gBAAgB,MAAM,CAAA;AACrC,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,KAAW,SAAA,GAAY,QAAA,GAAM,QAAA;AACjD,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,KAAW,SAAA,GAAY,oBAAA,GAAuB,WAAA;AACjE,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAAA,IAChD;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACpE,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAqD,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC7E,MAAA,EAAQ,CAAA;AAAA,IACR,QAAQA,GAAAA,CAAG,UAAA,CAAWC,MAAK,OAAA,CAAQ,CAAA,CAAE,UAAU,CAAC;AAAA,GAClD,CAAE,CAAA;AAEF,EAAA,MAAM,YAAY,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAEjD,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,IAAI,kCAAkC,CAAA;AAC9C,IAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AACzD,IAAA,OAAA,CAAQ,IAAI,gDAAiD,CAAA;AAC7D,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AACjB,IAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAC9B,IAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AACzC,IAAA,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AACnC,IAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,IAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AACjB,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AACjC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,KAAA,MAAW,EAAE,MAAA,EAAO,IAAK,SAAA,EAAW;AAClC,IAAA,MAAM,MAAA,GAAS,gBAAgB,MAAM,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,KAAW,SAAA,GAAY,QAAA,GAAM,QAAA;AACjD,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,KAAW,SAAA,GAAY,oBAAA,GAAuB,WAAA;AACjE,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAC9C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,UAAU,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,MAAM,CAAA;AAChD,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AACvC,IAAA,KAAA,MAAW,EAAE,MAAA,EAAO,IAAK,OAAA,EAAS;AAChC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAS,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAClE,EAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACpE,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB,CAAC,CAAA;AAGH,OAAA,CACG,QAAQ,WAAW,CAAA,CACnB,YAAY,0CAA0C,CAAA,CACtD,OAAO,MAAM;AACZ,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,mCAA8B,CAAA;AAC1C,EAAA,OAAA,CAAQ,IAAI,0JAA6B,CAAA;AACzC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,2DAA2D,CAAA;AACvE,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,yCAA0C,CAAA;AACtD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AACjB,EAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAC9B,EAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AACzC,EAAA,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AACnC,EAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,EAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AACjB,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,0BAA0B,CAAA;AACtC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AACrD,EAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AACvD,EAAA,OAAA,CAAQ,IAAI,oEAAoE,CAAA;AAChF,EAAA,OAAA,CAAQ,IAAI,uCAAuC,CAAA;AACnD,EAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AACvD,EAAA,OAAA,CAAQ,IAAI,4DAA4D,CAAA;AACxE,EAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AACrD,EAAA,OAAA,CAAQ,IAAI,+DAA+D,CAAA;AAC3E,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,+DAA+D,CAAA;AAC3E,EAAA,OAAA,CAAQ,IAAI,qEAAqE,CAAA;AACjF,EAAA,OAAA,CAAQ,IAAI,yDAAyD,CAAA;AACrE,EAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AACvC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB,CAAC,CAAA;AAEH,SAAS,cAAA,CAAe,WAAmB,QAAA,EAAwB;AACjE,EAAA,MAAM,MAAA,GAASA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AACzC,EAAA,IAAI,CAACD,GAAAA,CAAG,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4CAAA,EAA0C,MAAM,CAAA,CAAE,CAAA;AAC9D,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQA,GAAAA,CAAG,WAAA,CAAY,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AACrE,EAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,MAAM,iBAAiB,CAAA;AAC1D,EAAA,MAAM,cAAc,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,iBAAiB,CAAA;AAE/D,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAA,CAAQ,IAAI,qDAAgD,CAAA;AAC5D,IAAA;AAAA,EACF;AAKA,EAAA,MAAM,UAAA,GAAaA,IAAG,YAAA,CAAaC,KAAAA,CAAK,KAAK,MAAA,EAAQ,QAAQ,GAAG,OAAO,CAAA;AAEvE,EAAA,IAAI,WAAA,GAAc,EAAA;AAClB,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACrC,IAAA,MAAM,SAAA,GAAYD,IAAG,YAAA,CAAaC,KAAAA,CAAK,KAAK,MAAA,EAAQ,EAAE,GAAG,OAAO,CAAA;AAChE,IAAA,WAAA,IAAe;AAAA,2CAAA,EAC0B,OAAO,CAAA;AAAA;AAAA,8BAAA,EAEpB,OAAO,CAAA;AAAA,kDAAA,EACa,SAAS,CAAA;AAAA;AAAA,aAAA,CAAA;AAAA,EAG3D;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,8CAAA,EAIgC,UAAU,CAAA;AAAA;AAAA,iBAAA,EAEvC,WAAW;AAAA;AAAA,SAAA,CAAA;AAI5B,EAAAD,GAAAA,CAAG,aAAA,CAAc,QAAA,EAAU,KAAA,EAAO,OAAO,CAAA;AACzC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8BAAA,EAA4B,QAAQ,CAAA,CAAE,CAAA;AAClD,EAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AAC3D;AAEA,eAAe,UAAU,IAAA,EAA6B;AACpD,EAAA,MAAM,eAAA,EAAgB;AAEtB,EAAA,IAAI,MAAA;AAEJ,EAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,IAAI,CAAA;AACxC,EAAA,IAAI,SAAA,EAAW;AAEb,IAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,IAAA,MAAA,GAAS,MAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,MAAM,GAAA,GAAM,IAAI,aAAA,CAAc,IAAI,CAAA;AAClC,IAAA,MAAM,IAAI,KAAA,EAAM;AAChB,IAAA,MAAA,GAAS,GAAA;AAAA,EACX;AAEA,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,IAAI,KAAA,GAA0B,IAAA;AAE9B,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,MAAM,QAAQ,qBAAA,EAAsB;AACpC,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3C,IAAA,KAAA,GAAQ,IAAI,SAAA,CAAU,MAAA,EAAQ,KAAK,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,EAAE,eAAc,GAAI,MAAA;AAAA,oBACxBU,GAAAA,CAAC,GAAA,EAAA,EAAI,MAAA,EAAgB,KAAA,EAAc,SAAS,OAAA,EAAS;AAAA,GACvD;AAEA,EAAA,MAAM,UAAU,YAAY;AAC1B,IAAA,gBAAA,EAAiB;AACjB,IAAA,MAAM,OAAO,IAAA,EAAK;AAAA,EACpB,CAAA;AAEA,EAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,YAAY;AAC/B,IAAA,MAAM,OAAA,EAAQ;AACd,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,YAAY;AAChC,IAAA,MAAM,OAAA,EAAQ;AACd,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AAED,EAAA,MAAM,aAAA,EAAc;AACpB,EAAA,MAAM,OAAA,EAAQ;AAChB;AAEA,OAAA,CAAQ,KAAA,EAAM","file":"index.js","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport type { ConfigAccess } from '../tools/types.js';\n\nconst DOMINUS_DIR = path.join(os.homedir(), '.dominus');\nconst CONFIG_PATH = path.join(DOMINUS_DIR, 'config.json');\nconst DB_PATH = path.join(DOMINUS_DIR, 'dominus.db');\nconst RULES_PATH = path.join(DOMINUS_DIR, 'rules.json');\n\nexport type AIProviderType =\n | 'openai'\n | 'anthropic'\n | 'gemini'\n | 'xai'\n | 'openrouter'\n | 'custom';\n\nexport interface ProviderConfig {\n name: string;\n baseUrl: string;\n envVar: string;\n defaultModel: string;\n}\n\nexport const PROVIDERS: Record<AIProviderType, ProviderConfig> = {\n openai: {\n name: 'OpenAI',\n baseUrl: 'https://api.openai.com/v1',\n envVar: 'OPENAI_API_KEY',\n defaultModel: 'gpt-5.3-codex',\n },\n anthropic: {\n name: 'Anthropic',\n baseUrl: 'https://api.anthropic.com/v1/',\n envVar: 'ANTHROPIC_API_KEY',\n defaultModel: 'claude-sonnet-4-6',\n },\n gemini: {\n name: 'Google Gemini',\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai',\n envVar: 'GEMINI_API_KEY',\n defaultModel: 'gemini-3.1-pro',\n },\n xai: {\n name: 'xAI (Grok)',\n baseUrl: 'https://api.x.ai/v1',\n envVar: 'XAI_API_KEY',\n defaultModel: 'grok-4.2',\n },\n openrouter: {\n name: 'OpenRouter',\n baseUrl: 'https://openrouter.ai/api/v1',\n envVar: 'OPENROUTER_API_KEY',\n defaultModel: 'anthropic/claude-sonnet-4-6',\n },\n custom: {\n name: 'Custom',\n baseUrl: '',\n envVar: '',\n defaultModel: '',\n },\n};\n\nexport interface DominusConfig {\n provider: AIProviderType;\n apiKey?: string;\n apiBaseUrl: string;\n model: string;\n port: number;\n maxToolIterations: number;\n maxVerifyRetries: number;\n tokenBudget: number;\n autoIndex: boolean;\n autoLearn: boolean;\n userName: string;\n openCloudApiKey?: string;\n}\n\nconst DEFAULTS: DominusConfig = {\n provider: 'openai',\n apiBaseUrl: '',\n model: '',\n port: 18088,\n maxToolIterations: 25,\n maxVerifyRetries: 3,\n tokenBudget: 128000,\n autoIndex: true,\n autoLearn: true,\n userName: 'Developer',\n};\n\n/**\n * Auto-detect provider from environment variables.\n * Returns the first provider whose env var is set, or null.\n */\nexport function detectProviderFromEnv(): { provider: AIProviderType; apiKey: string } | null {\n const priority: AIProviderType[] = ['openai', 'anthropic', 'gemini', 'xai', 'openrouter'];\n for (const p of priority) {\n const key = process.env[PROVIDERS[p].envVar];\n if (key) return { provider: p, apiKey: key };\n }\n return null;\n}\n\n/**\n * Resolve the effective base URL and model for a provider config.\n */\nexport function resolveProviderSettings(config: DominusConfig): {\n baseUrl: string;\n model: string;\n} {\n const providerInfo = PROVIDERS[config.provider];\n return {\n baseUrl: config.apiBaseUrl || providerInfo?.baseUrl || PROVIDERS.openrouter.baseUrl,\n model: config.model || providerInfo?.defaultModel || 'gpt-4o',\n };\n}\n\nexport interface DominusRules {\n do: string[];\n dont: string[];\n conventions: string[];\n context: string;\n}\n\nconst DEFAULT_RULES: DominusRules = {\n do: [],\n dont: [],\n conventions: [],\n context: '',\n};\n\nfunction ensureDir(): void {\n if (!fs.existsSync(DOMINUS_DIR)) {\n fs.mkdirSync(DOMINUS_DIR, { recursive: true });\n }\n}\n\nfunction readJson<T>(filePath: string, defaults: T): T {\n try {\n if (fs.existsSync(filePath)) {\n const raw = fs.readFileSync(filePath, 'utf-8');\n return { ...defaults, ...JSON.parse(raw) };\n }\n } catch {\n // Corrupted file; reset to defaults\n }\n return { ...defaults };\n}\n\nfunction writeJson(filePath: string, data: unknown): void {\n ensureDir();\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\n}\n\nexport function loadConfig(): DominusConfig {\n ensureDir();\n return readJson(CONFIG_PATH, DEFAULTS);\n}\n\nexport function saveConfig(config: DominusConfig): void {\n writeJson(CONFIG_PATH, config);\n}\n\nexport function getConfigValue<K extends keyof DominusConfig>(key: K): DominusConfig[K] {\n const config = loadConfig();\n return config[key];\n}\n\nexport function setConfigValue<K extends keyof DominusConfig>(\n key: K,\n value: DominusConfig[K],\n): void {\n const config = loadConfig();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (config as any)[key] = value;\n saveConfig(config);\n}\n\nexport function loadRules(): DominusRules {\n ensureDir();\n return readJson(RULES_PATH, DEFAULT_RULES);\n}\n\nexport function saveRules(rules: DominusRules): void {\n writeJson(RULES_PATH, rules);\n}\n\nexport function getDominusDir(): string {\n ensureDir();\n return DOMINUS_DIR;\n}\n\nexport function getDbPath(): string {\n ensureDir();\n return DB_PATH;\n}\n\nexport function createConfigAccess(): ConfigAccess {\n return {\n get<T>(key: string): T | undefined {\n const config = loadConfig() as unknown as Record<string, unknown>;\n return config[key] as T | undefined;\n },\n set(key: string, value: unknown): void {\n const config = loadConfig() as unknown as Record<string, unknown>;\n config[key] = value;\n saveConfig(config as unknown as DominusConfig);\n },\n getAll(): Record<string, unknown> {\n return loadConfig() as unknown as Record<string, unknown>;\n },\n };\n}\n","import { nanoid } from 'nanoid';\r\n\r\nexport interface WsMessage<T = unknown> {\r\n id: string;\r\n type: string;\r\n payload: T;\r\n ts: number;\r\n}\r\n\r\nexport const StudioMsg = {\r\n CONNECTED: 'studio:connected',\r\n DISCONNECTED: 'studio:disconnected',\r\n EXPLORER: 'studio:explorer',\r\n OUTPUT: 'studio:output',\r\n ERROR: 'studio:error',\r\n SELECTION: 'studio:selection',\r\n SCRIPT_CONTENT: 'studio:script:content',\r\n SCRIPT_CHANGED: 'studio:script:changed',\r\n RESPONSE: 'studio:response',\r\n REFLECTION: 'studio:reflection',\r\n TEST_RESULTS: 'studio:test:results',\r\n} as const;\r\n\r\nexport const CliMsg = {\r\n GET_EXPLORER: 'cli:get:explorer',\r\n GET_SCRIPT: 'cli:get:script',\r\n SET_SCRIPT: 'cli:set:script',\r\n RUN_CODE: 'cli:run',\r\n GET_PROPERTIES: 'cli:get:properties',\r\n GET_DESCENDANTS_PROPERTIES: 'cli:get:descendants:properties',\r\n SET_PROPERTIES: 'cli:set:properties',\r\n INSERT_INSTANCE: 'cli:insert',\r\n DELETE_INSTANCE: 'cli:delete',\r\n GET_SELECTION: 'cli:get:selection',\r\n SELECT: 'cli:select',\r\n SEARCH_SCRIPTS: 'cli:search:scripts',\r\n GET_OUTPUT: 'cli:get:output',\r\n RUN_TESTS: 'cli:run:tests',\r\n EXECUTE_RUN_TEST: 'cli:test:run',\r\n EXECUTE_PLAY_TEST: 'cli:test:play',\r\n END_TEST: 'cli:test:end',\r\n BUILD_UI: 'cli:build:ui',\r\n GET_REFLECTION: 'cli:get:reflection',\r\n UPLOAD_ASSET: 'cli:upload:asset',\r\n SERIALIZE_UI: 'cli:serialize:ui',\r\n MOVE_INSTANCE: 'cli:move:instance',\r\n UNDO: 'cli:undo',\r\n REDO: 'cli:redo',\r\n BULK_SET_PROPERTIES: 'cli:bulk:set:properties',\r\n FIND_REPLACE_SCRIPTS: 'cli:find:replace:scripts',\r\n} as const;\r\n\r\nexport type StudioMsgType = (typeof StudioMsg)[keyof typeof StudioMsg];\r\nexport type CliMsgType = (typeof CliMsg)[keyof typeof CliMsg];\r\n\r\nexport interface ExplorerNode {\r\n name: string;\r\n className: string;\r\n path: string;\r\n children?: ExplorerNode[];\r\n}\r\n\r\nexport interface StudioConnectedPayload {\r\n studioVersion: string;\r\n placeId?: number;\r\n placeName?: string;\r\n engineVersion?: string;\r\n}\r\n\r\nexport interface ScriptContentPayload {\r\n path: string;\r\n className: 'Script' | 'LocalScript' | 'ModuleScript';\r\n source: string;\r\n lineCount: number;\r\n}\r\n\r\nexport interface ScriptChangedPayload {\r\n path: string;\r\n source: string;\r\n}\r\n\r\nexport interface OutputPayload {\r\n message: string;\r\n level: 'info' | 'warn' | 'error';\r\n timestamp: number;\r\n source?: string;\r\n}\r\n\r\nexport interface SelectionPayload {\r\n paths: string[];\r\n classNames: string[];\r\n}\r\n\r\nexport interface PropertyEntry {\r\n name: string;\r\n value: string;\r\n type: string;\r\n category?: string;\r\n}\r\n\r\nexport interface TestResultPayload {\r\n name: string;\r\n passed: boolean;\r\n duration: number;\r\n error?: string;\r\n}\r\n\r\nexport interface StudioTestPayload {\r\n args?: unknown;\r\n}\r\n\r\nexport interface StudioTestResultPayload {\r\n success: boolean;\r\n result?: unknown;\r\n error?: string;\r\n duration?: number;\r\n}\r\n\r\nexport interface ReflectionPayload {\r\n className: string;\r\n properties: { name: string; type: string; category: string }[];\r\n methods: { name: string; parameters: string[] }[];\r\n events: { name: string; parameters: string[] }[];\r\n}\r\n\r\nexport interface RunCodePayload {\r\n code: string;\r\n}\r\n\r\nexport interface RunCodeResponsePayload {\r\n output: string;\r\n error?: string;\r\n duration: number;\r\n}\r\n\r\nexport interface SearchScriptsPayload {\r\n query: string;\r\n maxResults?: number;\r\n}\r\n\r\nexport interface SearchResultPayload {\r\n results: {\r\n path: string;\r\n className: string;\r\n matches: { line: number; text: string }[];\r\n }[];\r\n}\r\n\r\nexport interface InsertInstancePayload {\r\n className: string;\r\n parentPath: string;\r\n name: string;\r\n properties?: Record<string, unknown>;\r\n}\r\n\r\nexport interface SetPropertiesPayload {\r\n path: string;\r\n properties: Record<string, unknown>;\r\n}\r\n\r\nexport function createMessage<T>(type: string, payload: T): WsMessage<T> {\r\n return { id: nanoid(), type, payload, ts: Date.now() };\r\n}\r\n\r\nexport function createRequest<T>(type: string, payload: T): WsMessage<T> {\r\n return createMessage(type, payload);\r\n}\r\n\r\nexport function parseMessage(raw: string): WsMessage {\r\n try {\r\n return JSON.parse(raw) as WsMessage;\r\n } catch {\r\n throw new Error(`Failed to parse WebSocket message: ${raw.slice(0, 100)}`);\r\n }\r\n}\r\n\r\nexport function serializeMessage(msg: WsMessage): string {\r\n return JSON.stringify(msg);\r\n}\r\n","import { WebSocketServer, WebSocket } from 'ws';\nimport { EventEmitter } from 'node:events';\nimport {\n parseMessage,\n serializeMessage,\n createMessage,\n StudioMsg,\n type WsMessage,\n type StudioConnectedPayload,\n} from './protocol.js';\n\nexport interface StudioConnection {\n ws: WebSocket;\n studioVersion?: string;\n placeId?: number;\n placeName?: string;\n connectedAt: number;\n}\n\nexport interface PlaceInfo {\n placeId: number;\n placeName?: string;\n studioVersion?: string;\n connectedAt: number;\n}\n\nexport interface StudioBridge extends EventEmitter {\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs?: number): Promise<WsMessage<T>>;\n sendNotification(type: string, payload: unknown): void;\n isConnected(): boolean;\n getConnectionInfo(): StudioConnection | null;\n getPort(): number;\n stop(): Promise<void>;\n /** List all connected Studio instances */\n listConnections(): PlaceInfo[];\n /** Get/set which placeId is the active target. 0 = auto (single connection). */\n getActivePlaceId(): number;\n setActivePlaceId(placeId: number): void;\n}\n\nexport class DominusServer extends EventEmitter implements StudioBridge {\n private wss: WebSocketServer | null = null;\n /** All connected Studio instances, keyed by placeId (0 for unknown) */\n private studioClients = new Map<number, StudioConnection>();\n /** Reverse lookup: ws → placeId */\n private wsToPlaceId = new Map<WebSocket, number>();\n /** Which placeId to target. 0 = auto-select if only one is connected. */\n private activePlaceId = 0;\n private controllers = new Set<WebSocket>();\n private pendingRequests = new Map<\n string,\n { resolve: (msg: WsMessage) => void; reject: (err: Error) => void; timer: ReturnType<typeof setTimeout> }\n >();\n private relayRequests = new Map<string, WebSocket>();\n private port: number;\n\n constructor(port = 18088) {\n super();\n this.port = port;\n }\n\n start(maxRetries = 0): Promise<void> {\n return new Promise((resolve, reject) => {\n const tryPort = (port: number, attempt: number) => {\n const wss = new WebSocketServer({ port });\n\n wss.on('listening', () => {\n this.wss = wss;\n this.port = port;\n this.wss.on('connection', (ws) => this.handleConnection(ws));\n this.emit('server:started', { port });\n resolve();\n });\n\n wss.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE' && attempt < maxRetries) {\n wss.close();\n tryPort(port + 1, attempt + 1);\n } else {\n this.emit('server:error', err);\n reject(err);\n }\n });\n };\n\n tryPort(this.port, 0);\n });\n }\n\n private handleConnection(ws: WebSocket): void {\n let identified = false;\n\n ws.on('message', (raw) => {\n try {\n const msg = parseMessage(raw.toString());\n\n if (!identified) {\n if (msg.type === StudioMsg.CONNECTED) {\n identified = true;\n this.setStudioClient(ws, msg);\n return;\n }\n if (msg.type === 'controller:connect') {\n identified = true;\n this.addController(ws);\n ws.send(serializeMessage(createMessage('controller:welcome', {\n studioConnected: this.isConnected(),\n port: this.port,\n connections: this.listConnections(),\n activePlaceId: this.activePlaceId,\n })));\n return;\n }\n }\n\n if (this.controllers.has(ws)) {\n this.handleControllerMessage(ws, msg);\n } else {\n this.handleStudioMessage(ws, msg);\n }\n } catch (err) {\n this.emit('server:error', err);\n }\n });\n\n ws.on('close', () => {\n if (this.controllers.has(ws)) {\n this.controllers.delete(ws);\n for (const [id, controllerWs] of this.relayRequests) {\n if (controllerWs === ws) this.relayRequests.delete(id);\n }\n } else {\n const placeId = this.wsToPlaceId.get(ws);\n if (placeId !== undefined) {\n const conn = this.studioClients.get(placeId);\n this.studioClients.delete(placeId);\n this.wsToPlaceId.delete(ws);\n this.emit('studio:disconnected', { placeId, placeName: conn?.placeName });\n this.broadcastToControllers('studio:disconnected', { placeId, placeName: conn?.placeName });\n // Reject pending requests that were targeting this ws\n for (const [id, pending] of this.pendingRequests) {\n clearTimeout(pending.timer);\n pending.reject(new Error(`Studio disconnected (place ${placeId})`));\n this.pendingRequests.delete(id);\n }\n // If the active place disconnected, reset to auto\n if (this.activePlaceId === placeId) {\n this.activePlaceId = 0;\n }\n }\n }\n });\n\n ws.on('error', (err) => {\n this.emit('server:error', err);\n });\n }\n\n private setStudioClient(ws: WebSocket, msg: WsMessage): void {\n const payload = msg.payload as StudioConnectedPayload;\n const placeId = payload.placeId ?? 0;\n\n // If same placeId reconnects, close the old one\n const existing = this.studioClients.get(placeId);\n if (existing && existing.ws !== ws) {\n existing.ws.close();\n this.wsToPlaceId.delete(existing.ws);\n }\n\n const conn: StudioConnection = {\n ws,\n connectedAt: Date.now(),\n studioVersion: payload.studioVersion,\n placeId,\n placeName: payload.placeName,\n };\n this.studioClients.set(placeId, conn);\n this.wsToPlaceId.set(ws, placeId);\n\n this.emit('studio:connected', { ...payload, placeId });\n this.broadcastToControllers('studio:connected', { ...payload, placeId });\n }\n\n private addController(ws: WebSocket): void {\n this.controllers.add(ws);\n this.emit('controller:connected');\n }\n\n private broadcastToControllers(type: string, payload: unknown): void {\n const msg = serializeMessage(createMessage(type, payload));\n for (const ws of this.controllers) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(msg);\n }\n }\n }\n\n private handleControllerMessage(controllerWs: WebSocket, msg: WsMessage): void {\n const target = this.resolveTarget();\n if (!target || target.ws.readyState !== WebSocket.OPEN) {\n controllerWs.send(serializeMessage({\n id: msg.id,\n type: StudioMsg.RESPONSE,\n payload: { error: this.getTargetError() },\n ts: Date.now(),\n }));\n return;\n }\n\n this.relayRequests.set(msg.id, controllerWs);\n target.ws.send(serializeMessage(msg));\n }\n\n private handleStudioMessage(ws: WebSocket, msg: WsMessage): void {\n if (msg.type === StudioMsg.CONNECTED) {\n // Re-handshake — update existing connection info\n const payload = msg.payload as StudioConnectedPayload;\n const placeId = this.wsToPlaceId.get(ws);\n if (placeId !== undefined) {\n const conn = this.studioClients.get(placeId);\n if (conn) {\n conn.studioVersion = payload.studioVersion;\n conn.placeId = payload.placeId;\n conn.placeName = payload.placeName;\n }\n }\n this.emit('studio:connected', payload);\n this.broadcastToControllers('studio:connected', payload);\n return;\n }\n\n if (msg.type === StudioMsg.RESPONSE) {\n // Check if this is a relayed request from a controller\n const controllerWs = this.relayRequests.get(msg.id);\n if (controllerWs && controllerWs.readyState === WebSocket.OPEN) {\n controllerWs.send(serializeMessage(msg));\n this.relayRequests.delete(msg.id);\n return;\n }\n\n // Otherwise handle locally (MCP or direct)\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n clearTimeout(pending.timer);\n pending.resolve(msg);\n this.pendingRequests.delete(msg.id);\n }\n return;\n }\n\n // Forward events to controllers and local listeners\n this.emit(msg.type, msg.payload);\n this.emit('message', msg);\n this.broadcastToControllers(msg.type, msg.payload);\n }\n\n /** Resolve which Studio connection to target */\n private resolveTarget(): StudioConnection | null {\n if (this.studioClients.size === 0) return null;\n\n // Explicit active place\n if (this.activePlaceId !== 0) {\n const conn = this.studioClients.get(this.activePlaceId);\n if (conn && conn.ws.readyState === WebSocket.OPEN) return conn;\n return null;\n }\n\n // Auto: if exactly one connection, use it\n if (this.studioClients.size === 1) {\n const conn = this.studioClients.values().next().value!;\n if (conn.ws.readyState === WebSocket.OPEN) return conn;\n return null;\n }\n\n // Multiple connections, no active set — return null (ambiguous)\n return null;\n }\n\n /** Generate an appropriate error message when no target found */\n private getTargetError(): string {\n if (this.studioClients.size === 0) return 'No Studio connection';\n if (this.activePlaceId !== 0) {\n return `Active place ${this.activePlaceId} is not connected. Use set_active_place or list_connections.`;\n }\n const places = [...this.studioClients.values()].map(c => `${c.placeName ?? 'Unknown'} (${c.placeId})`);\n return `Multiple Studio instances connected: ${places.join(', ')}. Use set_active_place to choose one.`;\n }\n\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs = 10000): Promise<WsMessage<T>> {\n return new Promise((resolve, reject) => {\n const target = this.resolveTarget();\n if (!target || target.ws.readyState !== WebSocket.OPEN) {\n reject(new Error(this.getTargetError()));\n return;\n }\n\n const msg = createMessage(type, payload);\n\n const timer = setTimeout(() => {\n this.pendingRequests.delete(msg.id);\n reject(new Error(`Request timed out: ${type}`));\n }, timeoutMs);\n\n this.pendingRequests.set(msg.id, {\n resolve: resolve as (msg: WsMessage) => void,\n reject,\n timer,\n });\n\n target.ws.send(serializeMessage(msg));\n });\n }\n\n sendNotification(type: string, payload: unknown): void {\n const target = this.resolveTarget();\n if (!target || target.ws.readyState !== WebSocket.OPEN) return;\n const msg = createMessage(type, payload);\n target.ws.send(serializeMessage(msg));\n }\n\n isConnected(): boolean {\n return this.resolveTarget() !== null;\n }\n\n getConnectionInfo(): StudioConnection | null {\n return this.resolveTarget();\n }\n\n listConnections(): PlaceInfo[] {\n return [...this.studioClients.values()]\n .filter(c => c.ws.readyState === WebSocket.OPEN)\n .map(c => ({\n placeId: c.placeId ?? 0,\n placeName: c.placeName,\n studioVersion: c.studioVersion,\n connectedAt: c.connectedAt,\n }));\n }\n\n getActivePlaceId(): number {\n return this.activePlaceId;\n }\n\n setActivePlaceId(placeId: number): void {\n this.activePlaceId = placeId;\n }\n\n getPort(): number {\n return this.port;\n }\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n for (const conn of this.studioClients.values()) {\n conn.ws.close();\n }\n this.studioClients.clear();\n this.wsToPlaceId.clear();\n for (const ws of this.controllers) {\n ws.close();\n }\n this.controllers.clear();\n for (const [, pending] of this.pendingRequests) {\n clearTimeout(pending.timer);\n pending.reject(new Error('Server shutting down'));\n }\n this.pendingRequests.clear();\n this.relayRequests.clear();\n\n if (this.wss) {\n this.wss.close(() => resolve());\n } else {\n resolve();\n }\n });\n }\n}\n","import { WebSocket } from 'ws';\r\nimport { EventEmitter } from 'node:events';\r\nimport {\r\n parseMessage,\r\n serializeMessage,\r\n createMessage,\r\n StudioMsg,\r\n type WsMessage,\r\n type StudioConnectedPayload,\r\n} from './protocol.js';\r\nimport type { StudioBridge, StudioConnection, PlaceInfo } from './ws-server.js';\r\n\r\n/**\r\n * Connects as a relay client to an existing DominusServer.\r\n * Has the same interface as DominusServer so the TUI/Agent\r\n * can use either transparently.\r\n */\r\nexport class DominusClient extends EventEmitter implements StudioBridge {\r\n private ws: WebSocket | null = null;\r\n private port: number;\r\n private studioConnected = false;\r\n private connections = new Map<number, Omit<StudioConnection, 'ws'>>();\r\n private activePlaceId = 0;\r\n private pendingRequests = new Map<\r\n string,\r\n { resolve: (msg: WsMessage) => void; reject: (err: Error) => void; timer: ReturnType<typeof setTimeout> }\r\n >();\r\n\r\n constructor(port = 18088) {\r\n super();\r\n this.port = port;\r\n }\r\n\r\n connect(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const url = `ws://localhost:${this.port}`;\r\n const ws = new WebSocket(url);\r\n\r\n ws.on('open', () => {\r\n this.ws = ws;\r\n ws.send(serializeMessage(createMessage('controller:connect', {})));\r\n this.emit('server:started', { port: this.port, relay: true });\r\n resolve();\r\n });\r\n\r\n ws.on('message', (raw) => {\r\n try {\r\n const msg = parseMessage(raw.toString());\r\n this.handleMessage(msg);\r\n } catch (err) {\r\n this.emit('server:error', err);\r\n }\r\n });\r\n\r\n ws.on('close', () => {\r\n this.ws = null;\r\n this.studioConnected = false;\r\n this.emit('studio:disconnected');\r\n for (const [id, pending] of this.pendingRequests) {\r\n clearTimeout(pending.timer);\r\n pending.reject(new Error('Relay connection lost'));\r\n this.pendingRequests.delete(id);\r\n }\r\n });\r\n\r\n ws.on('error', (err) => {\r\n if (!this.ws) reject(err);\r\n this.emit('server:error', err);\r\n });\r\n });\r\n }\r\n\r\n private handleMessage(msg: WsMessage): void {\r\n if (msg.type === 'controller:welcome') {\r\n const p = msg.payload as {\r\n studioConnected: boolean;\r\n connections?: PlaceInfo[];\r\n activePlaceId?: number;\r\n };\r\n this.studioConnected = p.studioConnected;\r\n if (p.connections) {\r\n this.connections.clear();\r\n for (const c of p.connections) {\r\n this.connections.set(c.placeId, {\r\n connectedAt: c.connectedAt,\r\n studioVersion: c.studioVersion,\r\n placeId: c.placeId,\r\n placeName: c.placeName,\r\n });\r\n }\r\n }\r\n if (p.activePlaceId !== undefined) {\r\n this.activePlaceId = p.activePlaceId;\r\n }\r\n if (this.studioConnected) {\r\n this.emit('studio:connected', {});\r\n }\r\n return;\r\n }\r\n\r\n if (msg.type === 'studio:connected') {\r\n this.studioConnected = true;\r\n const payload = msg.payload as StudioConnectedPayload & { placeId?: number };\r\n const placeId = payload.placeId ?? 0;\r\n this.connections.set(placeId, {\r\n connectedAt: Date.now(),\r\n studioVersion: payload.studioVersion,\r\n placeId,\r\n placeName: payload.placeName,\r\n });\r\n this.emit('studio:connected', payload);\r\n return;\r\n }\r\n\r\n if (msg.type === 'studio:disconnected') {\r\n const payload = msg.payload as { placeId?: number };\r\n const placeId = payload.placeId ?? 0;\r\n this.connections.delete(placeId);\r\n if (this.connections.size === 0) {\r\n this.studioConnected = false;\r\n }\r\n if (this.activePlaceId === placeId) {\r\n this.activePlaceId = 0;\r\n }\r\n this.emit('studio:disconnected', payload);\r\n return;\r\n }\r\n\r\n if (msg.type === StudioMsg.RESPONSE) {\r\n const pending = this.pendingRequests.get(msg.id);\r\n if (pending) {\r\n clearTimeout(pending.timer);\r\n pending.resolve(msg);\r\n this.pendingRequests.delete(msg.id);\r\n }\r\n return;\r\n }\r\n\r\n this.emit(msg.type, msg.payload);\r\n this.emit('message', msg);\r\n }\r\n\r\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs = 10000): Promise<WsMessage<T>> {\r\n return new Promise((resolve, reject) => {\r\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\r\n reject(new Error('Not connected to Dominus server'));\r\n return;\r\n }\r\n if (!this.studioConnected) {\r\n reject(new Error('Studio not connected'));\r\n return;\r\n }\r\n\r\n const msg = createMessage(type, payload);\r\n\r\n const timer = setTimeout(() => {\r\n this.pendingRequests.delete(msg.id);\r\n reject(new Error(`Request timed out: ${type}`));\r\n }, timeoutMs);\r\n\r\n this.pendingRequests.set(msg.id, {\r\n resolve: resolve as (msg: WsMessage) => void,\r\n reject,\r\n timer,\r\n });\r\n\r\n this.ws.send(serializeMessage(msg));\r\n });\r\n }\r\n\r\n sendNotification(type: string, payload: unknown): void {\r\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\r\n const msg = createMessage(type, payload);\r\n this.ws.send(serializeMessage(msg));\r\n }\r\n\r\n isConnected(): boolean {\r\n return this.studioConnected && this.connections.size > 0;\r\n }\r\n\r\n getConnectionInfo(): StudioConnection | null {\r\n if (this.connections.size === 0) return null;\r\n // Return active or first connection\r\n const target = this.activePlaceId !== 0\r\n ? this.connections.get(this.activePlaceId)\r\n : this.connections.values().next().value;\r\n if (!target) return null;\r\n return { ...target, ws: this.ws! } as StudioConnection;\r\n }\r\n\r\n listConnections(): PlaceInfo[] {\r\n return [...this.connections.values()].map(c => ({\r\n placeId: c.placeId ?? 0,\r\n placeName: c.placeName,\r\n studioVersion: c.studioVersion,\r\n connectedAt: c.connectedAt,\r\n }));\r\n }\r\n\r\n getActivePlaceId(): number {\r\n return this.activePlaceId;\r\n }\r\n\r\n setActivePlaceId(placeId: number): void {\r\n this.activePlaceId = placeId;\r\n }\r\n\r\n getPort(): number {\r\n return this.port;\r\n }\r\n\r\n stop(): Promise<void> {\r\n return new Promise((resolve) => {\r\n for (const [, pending] of this.pendingRequests) {\r\n clearTimeout(pending.timer);\r\n pending.reject(new Error('Client shutting down'));\r\n }\r\n this.pendingRequests.clear();\r\n if (this.ws) {\r\n this.ws.close();\r\n this.ws = null;\r\n }\r\n resolve();\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Check if a Dominus server is already running on the given port.\r\n */\r\nexport async function isPortInUse(port: number): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const ws = new WebSocket(`ws://localhost:${port}`);\r\n const timer = setTimeout(() => {\r\n ws.close();\r\n resolve(false);\r\n }, 1000);\r\n\r\n ws.on('open', () => {\r\n clearTimeout(timer);\r\n ws.close();\r\n resolve(true);\r\n });\r\n\r\n ws.on('error', () => {\r\n clearTimeout(timer);\r\n resolve(false);\r\n });\r\n });\r\n}\r\n","/**\r\n * INTERNAL_MEMORY — lessons learned and quirks that ship with Dominus.\r\n *\r\n * These are baked into every system prompt so the agent doesn't repeat\r\n * known mistakes. Add entries here when you discover a pattern that caused\r\n * a failure, an unintuitive API, or a workaround that should be remembered.\r\n *\r\n * Keep entries short, specific, and actionable. Prefer bullet points over prose.\r\n */\r\n\r\nexport const INTERNAL_MEMORY = `## Internal Memory — Known Quirks & Lessons\r\n\r\nThese are built-in lessons that ship with Dominus. Follow them exactly.\r\n\r\n### create_ui — property format\r\n- Each node accepts properties in **either** of two shapes:\r\n - **Flattened (preferred)**: props as top-level keys next to \\`ClassName\\`, \\`Name\\`, \\`Children\\`.\r\n \\`\\`\\`json\r\n { \"ClassName\": \"TextButton\", \"Name\": \"Btn\", \"Text\": \"OK\", \"Size\": [0, 100, 0, 40] }\r\n \\`\\`\\`\r\n - **Nested bag**: props grouped under \\`properties\\` / \\`Properties\\` / \\`props\\` / \\`Props\\`.\r\n \\`\\`\\`json\r\n { \"ClassName\": \"TextButton\", \"Name\": \"Btn\",\r\n \"properties\": { \"Text\": \"OK\", \"Size\": [0, 100, 0, 40] } }\r\n \\`\\`\\`\r\n- Do NOT mix a nested \\`properties\\` bag with flattened props of the same name — the bag wins.\r\n- Reserved keys (never treated as instance properties): \\`ClassName\\`, \\`className\\`, \\`Name\\`, \\`name\\`, \\`Children\\`, \\`children\\`, \\`properties\\`, \\`Properties\\`, \\`props\\`, \\`Props\\`.\r\n\r\n### build_multiple — schema is strict\r\n- Top-level keys only: \\`name\\`, \\`className\\`, \\`position\\`, \\`size\\`, \\`color\\`, \\`material\\`, \\`anchored\\`, \\`shape\\`, \\`transparency\\`, \\`parent\\`, \\`canCollide\\`.\r\n- Does NOT accept a nested \\`properties\\` bag. For anything outside those fields use \\`insert_instance\\` + \\`set_properties\\`.\r\n- \\`shape\\` values: \\`Block\\`, \\`Ball\\`, \\`Cylinder\\`, \\`Wedge\\`.\r\n\r\n### Color formats (accepted everywhere)\r\n- Hex: \\`\"#RRGGBB\"\\`\r\n- RGB string: \\`\"rgb(255, 128, 0)\"\\`\r\n- BrickColor name: \\`\"Bright red\"\\`, \\`\"Institutional white\"\\`, \\`\"Really black\"\\`, etc.\r\n- Array: \\`[r, g, b]\\` (0–1 floats) or \\`[255, 128, 0]\\` (auto-detected if any value > 1)\r\n\r\n### UDim2 / UDim / Vector2 / Color3 coercion (create_ui)\r\n- UDim2: \\`[xScale, xOffset, yScale, yOffset]\\` or \\`{XScale, XOffset, YScale, YOffset}\\`.\r\n- UDim: \\`[scale, offset]\\` or a plain number (treated as pixels).\r\n- Vector2 (e.g. \\`AnchorPoint\\`): \\`[x, y]\\` or \\`{x, y}\\`.\r\n- 2-element arrays are auto-disambiguated by property name (\\`AnchorPoint\\` → Vector2, \\`CornerRadius\\` → UDim).\r\n\r\n### Common GUI property names\r\n- GUI uses \\`Size\\`/\\`Position\\` as **UDim2** — never Vector3.\r\n- \\`BackgroundColor3\\`, \\`TextColor3\\`, \\`BorderColor3\\`, \\`ImageColor3\\` → Color3.\r\n- \\`Font\\` accepts a string enum name like \\`\"GothamBold\"\\`, \\`\"SourceSans\"\\`.\r\n- Enum properties take the string name: \\`\"Center\"\\`, \\`\"Left\"\\`, \\`\"Fit\"\\`.\r\n\r\n### Tool selection cheat-sheet\r\n- Single 3D part → \\`create_part\\`\r\n- Many 3D parts (tree, building, vehicle) → \\`build_multiple\\` with \\`groupName\\`\r\n- Full UI tree → \\`create_ui\\` (one call, never loop \\`insert_instance\\` for UI)\r\n- **Convert/export existing UI → \\`serialize_ui\\`** (NOT get_descendants_properties)\r\n- Adjusting an existing instance → \\`set_properties\\` (not \\`run_code\\`)\r\n- **Inspecting user's selection → \\`get_selection\\`, then \\`get_properties\\` or \\`serialize_ui\\`**\r\n- **Reading properties → \\`get_properties\\` (NEVER \\`run_code\\` with dump scripts)**\r\n- **Browsing the tree → \\`get_explorer\\`**\r\n- **Multiple Studios open → \\`list_connections\\` to see all, \\`set_active_place\\` to target one**\r\n- Anything exotic or procedural → \\`run_code\\` as last resort\r\n\r\n### NEVER use run_code for:\r\n- Getting properties of an instance → use \\`get_properties\\` or \\`serialize_ui\\`\r\n- Dumping selection info → use \\`inspect_selection\\` (ONE call does it all)\r\n- Inspecting an instance + its children → use \\`inspect_instance\\`\r\n- Converting UI to Roact/React → use \\`convert_ui_to_code\\`\r\n- Creating instances → use \\`create_part\\`, \\`create_ui\\`, \\`insert_instance\\`, \\`build_multiple\\`\r\n- Modifying properties → use \\`set_properties\\` or \\`bulk_set_properties\\`\r\n- Reading scripts → use \\`read_script\\`\r\n- Browsing the explorer → use \\`get_explorer\\`\r\n\\`run_code\\` is ONLY for procedural logic, terrain generation, raycasts, physics queries, or custom algorithms with no tool equivalent.\r\n\r\n### Composite skill tools (prefer these over chaining)\r\n- \\`inspect_selection\\` — Returns paths + compact properties for all selected instances in ONE call. Use when user says \"my selection\" or \"what I selected\".\r\n- \\`inspect_instance\\` — Returns compact properties + children tree for a single instance in ONE call. Combines get_properties + get_explorer.\r\n- \\`convert_ui_to_code\\` — Serializes a UI tree and generates a Roact/React component. Use when user says \"turn this into a component\" or \"convert to React\".\r\n\r\n### Verification habits\r\n- After a build, call \\`get_explorer\\` or \\`get_selection\\` to confirm the tree looks right.\r\n- After editing a script, read it back.\r\n- After \\`run_code\\`, check \\`get_output\\` for errors.\r\n\r\n### serialize_ui — the RIGHT tool for UI conversion\r\n- **Use \\`serialize_ui\\` when converting existing UI to Roact/React/Fusion components.** It returns a minimal JSON tree with only non-default properties, already in JSON-friendly formats.\r\n- **Do NOT use \\`get_descendants_properties\\` for UI conversion** — it returns a flat list with ~50+ properties per instance (including read-only, deprecated, nil, and default values), which bloats context and confuses conversion.\r\n- \\`serialize_ui\\` output maps 1:1 to \\`create_ui\\` input — you can round-trip UI through it.\r\n- The tree structure preserves parent-child hierarchy, so Roact/React children mapping is direct.\r\n\r\n### UI → Roact/React conversion cheat-sheet\r\n- \\`serialize_ui\\` path → JSON tree → map each node to \\`Roact.createElement(ClassName, props, childrenDict)\\`\r\n- UDim2 arrays \\`[xS, xO, yS, yO]\\` → \\`UDim2.new(xS, xO, yS, yO)\\`\r\n- Color3 hex strings → \\`Color3.fromHex(\"#RRGGBB\")\\`\r\n- Vector2 arrays → \\`Vector2.new(x, y)\\`\r\n- UDim arrays → \\`UDim.new(s, o)\\`\r\n- Enum strings like \\`\"Center\"\\` → \\`Enum.TextXAlignment.Center\\`\r\n- FontFace → \\`Font.new(family, weight, style)\\`\r\n- UI modifiers (UICorner, UIStroke, UIGradient, UIListLayout, UIPadding) are CHILDREN not props\r\n- Use instance Name as dictionary key in children table\r\n`;\r\n","import fs from 'node:fs';\r\nimport initSqlJs from 'sql.js';\r\nimport type { Database, QueryExecResult } from 'sql.js';\r\nimport { getDbPath } from '../config/config.js';\r\nimport type { Fact, FactCategory, SessionSummary, ChatMessage, ScriptEntry } from './types.js';\r\n\r\nlet db: Database | null = null;\r\nlet dbPath: string;\r\n\r\nconst SCHEMA = `\r\nCREATE TABLE IF NOT EXISTS facts (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n content TEXT NOT NULL,\r\n category TEXT NOT NULL,\r\n source TEXT,\r\n relevance REAL DEFAULT 1.0,\r\n created_at INTEGER NOT NULL,\r\n accessed_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS summaries (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n session_id TEXT NOT NULL,\r\n summary TEXT NOT NULL,\r\n created_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS messages (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n session_id TEXT NOT NULL,\r\n role TEXT NOT NULL,\r\n content TEXT NOT NULL,\r\n tool_name TEXT,\r\n created_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS script_index (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n path TEXT NOT NULL,\r\n class_name TEXT NOT NULL,\r\n summary TEXT,\r\n line_count INTEGER,\r\n last_hash TEXT,\r\n updated_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE INDEX IF NOT EXISTS idx_facts_project ON facts(project_id);\r\nCREATE INDEX IF NOT EXISTS idx_facts_category ON facts(project_id, category);\r\nCREATE INDEX IF NOT EXISTS idx_scripts_project ON script_index(project_id);\r\nCREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id);\r\nCREATE INDEX IF NOT EXISTS idx_summaries_project ON summaries(project_id);\r\n`;\r\n\r\nfunction persist(): void {\r\n if (!db) return;\r\n const data = db.export();\r\n fs.writeFileSync(dbPath, Buffer.from(data));\r\n}\r\n\r\nexport async function initMemoryStore(): Promise<void> {\r\n if (db) return;\r\n dbPath = getDbPath();\r\n const SQL = await initSqlJs();\r\n\r\n if (fs.existsSync(dbPath)) {\r\n const buffer = fs.readFileSync(dbPath);\r\n db = new SQL.Database(buffer);\r\n } else {\r\n db = new SQL.Database();\r\n }\r\n\r\n db.run(SCHEMA);\r\n persist();\r\n}\r\n\r\nexport function getDb(): Database {\r\n if (!db) throw new Error('Memory store not initialized. Call initMemoryStore() first.');\r\n return db;\r\n}\r\n\r\nexport function closeMemoryStore(): void {\r\n if (db) {\r\n persist();\r\n db.close();\r\n db = null;\r\n }\r\n}\r\n\r\n// --- Facts ---\r\n\r\nexport function storeFact(fact: Omit<Fact, 'id'>): number {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO facts (project_id, content, category, source, relevance, created_at, accessed_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n fact.projectId,\r\n fact.content,\r\n fact.category,\r\n fact.source ?? null,\r\n fact.relevance,\r\n fact.createdAt,\r\n fact.accessedAt,\r\n ],\r\n );\r\n persist();\r\n const stmt = d.prepare('SELECT last_insert_rowid()');\r\n stmt.step();\r\n const row = stmt.get();\r\n stmt.free();\r\n return (row?.[0] as number) ?? 0;\r\n}\r\n\r\nexport function recallFacts(projectId: string, query: string, limit = 10): Fact[] {\r\n const d = getDb();\r\n const keywords = query\r\n .toLowerCase()\r\n .split(/\\s+/)\r\n .filter((w) => w.length > 2);\r\n\r\n if (keywords.length === 0) {\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? ORDER BY relevance DESC, accessed_at DESC LIMIT ?`,\r\n [projectId, limit],\r\n );\r\n return rowsToFacts(result);\r\n }\r\n\r\n const likeClauses = keywords.map(() => `LOWER(content) LIKE ?`).join(' OR ');\r\n const likeParams = keywords.map((k) => `%${k}%`);\r\n\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? AND (${likeClauses})\r\n ORDER BY relevance DESC, accessed_at DESC LIMIT ?`,\r\n [projectId, ...likeParams, limit],\r\n );\r\n\r\n const facts = rowsToFacts(result);\r\n\r\n // Update accessed_at for recalled facts\r\n for (const fact of facts) {\r\n if (fact.id) {\r\n d.run(`UPDATE facts SET accessed_at = ? WHERE id = ?`, [Date.now(), fact.id]);\r\n }\r\n }\r\n if (facts.length > 0) persist();\r\n\r\n return facts;\r\n}\r\n\r\nexport function getAllFacts(projectId: string): Fact[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? ORDER BY relevance DESC`,\r\n [projectId],\r\n );\r\n return rowsToFacts(result);\r\n}\r\n\r\nfunction rowsToFacts(result: QueryExecResult[]): Fact[] {\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n content: row[2] as string,\r\n category: row[3] as FactCategory,\r\n source: row[4] as string | undefined,\r\n relevance: row[5] as number,\r\n createdAt: row[6] as number,\r\n accessedAt: row[7] as number,\r\n }));\r\n}\r\n\r\n// --- Messages ---\r\n\r\nexport function storeMessage(msg: Omit<ChatMessage, 'id'>): void {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO messages (session_id, role, content, tool_name, created_at)\r\n VALUES (?, ?, ?, ?, ?)`,\r\n [msg.sessionId, msg.role, msg.content, msg.toolName ?? null, msg.createdAt],\r\n );\r\n persist();\r\n}\r\n\r\nexport function getSessionMessages(sessionId: string, limit = 100): ChatMessage[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM messages WHERE session_id = ? ORDER BY created_at ASC LIMIT ?`,\r\n [sessionId, limit],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n sessionId: row[1] as string,\r\n role: row[2] as ChatMessage['role'],\r\n content: row[3] as string,\r\n toolName: (row[4] as string) || undefined,\r\n createdAt: row[5] as number,\r\n }));\r\n}\r\n\r\n// --- Summaries ---\r\n\r\nexport function storeSummary(summary: Omit<SessionSummary, 'id'>): void {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO summaries (project_id, session_id, summary, created_at)\r\n VALUES (?, ?, ?, ?)`,\r\n [summary.projectId, summary.sessionId, summary.summary, summary.createdAt],\r\n );\r\n persist();\r\n}\r\n\r\nexport function getProjectSummaries(projectId: string, limit = 20): SessionSummary[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM summaries WHERE project_id = ? ORDER BY created_at DESC LIMIT ?`,\r\n [projectId, limit],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n sessionId: row[2] as string,\r\n summary: row[3] as string,\r\n createdAt: row[4] as number,\r\n }));\r\n}\r\n\r\n// --- Script Index ---\r\n\r\nexport function upsertScript(entry: Omit<ScriptEntry, 'id'>): void {\r\n const d = getDb();\r\n const existing = d.exec(\r\n `SELECT id FROM script_index WHERE project_id = ? AND path = ?`,\r\n [entry.projectId, entry.path],\r\n );\r\n\r\n if (existing[0]?.values.length) {\r\n d.run(\r\n `UPDATE script_index SET class_name = ?, summary = ?, line_count = ?, last_hash = ?, updated_at = ?\r\n WHERE project_id = ? AND path = ?`,\r\n [\r\n entry.className,\r\n entry.summary ?? null,\r\n entry.lineCount ?? null,\r\n entry.lastHash ?? null,\r\n entry.updatedAt,\r\n entry.projectId,\r\n entry.path,\r\n ],\r\n );\r\n } else {\r\n d.run(\r\n `INSERT INTO script_index (project_id, path, class_name, summary, line_count, last_hash, updated_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n entry.projectId,\r\n entry.path,\r\n entry.className,\r\n entry.summary ?? null,\r\n entry.lineCount ?? null,\r\n entry.lastHash ?? null,\r\n entry.updatedAt,\r\n ],\r\n );\r\n }\r\n persist();\r\n}\r\n\r\nexport function getScriptIndex(\r\n projectId: string,\r\n): { path: string; summary?: string; className: string }[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT path, summary, class_name FROM script_index WHERE project_id = ? ORDER BY path`,\r\n [projectId],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n path: row[0] as string,\r\n summary: (row[1] as string) || undefined,\r\n className: row[2] as string,\r\n }));\r\n}\r\n\r\nexport function getScriptEntry(projectId: string, scriptPath: string): ScriptEntry | null {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM script_index WHERE project_id = ? AND path = ?`,\r\n [projectId, scriptPath],\r\n );\r\n if (!result[0]?.values.length) return null;\r\n const row = result[0].values[0];\r\n return {\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n path: row[2] as string,\r\n className: row[3] as string,\r\n summary: (row[4] as string) || undefined,\r\n lineCount: (row[5] as number) || undefined,\r\n lastHash: (row[6] as string) || undefined,\r\n updatedAt: row[7] as number,\r\n };\r\n}\r\n\r\n// --- Decay ---\r\n\r\nexport function decayRelevance(projectId: string, factor = 0.95): void {\r\n const d = getDb();\r\n d.run(`UPDATE facts SET relevance = relevance * ? WHERE project_id = ?`, [factor, projectId]);\r\n persist();\r\n}\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { ScriptContentPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'read_script',\r\n description:\r\n 'Read the source code of a script in Roblox Studio. Provide the full instance path (e.g., \"ServerScriptService.GameManager\").',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path of the script (e.g., \"ServerScriptService.GameManager\")',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const path = params.path as string;\r\n const response = await ctx.sendToStudio<ScriptContentPayload>(CliMsg.GET_SCRIPT, { path });\r\n\r\n if (!response.payload) {\r\n return { success: false, error: `Script not found: ${path}` };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n path: response.payload.path,\r\n className: response.payload.className,\r\n source: response.payload.source,\r\n lineCount: response.payload.lineCount,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'edit_script',\r\n description:\r\n 'Replace the entire source code of a script in Roblox Studio. Provide the full path and the new source code.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path of the script',\r\n },\r\n source: {\r\n type: 'string',\r\n description: 'The new complete source code for the script',\r\n },\r\n },\r\n required: ['path', 'source'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const path = params.path as string;\r\n const source = params.source as string;\r\n\r\n const response = await ctx.sendToStudio(CliMsg.SET_SCRIPT, { path, source });\r\n const payload = response.payload as { success: boolean; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to edit script' };\r\n }\r\n\r\n return { success: true, data: { path, linesWritten: source.split('\\n').length } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { RunCodeResponsePayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'run_code',\r\n description:\r\n 'Execute arbitrary Luau code in Roblox Studio and return the output. The code runs in the Studio plugin context with full API access.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n code: {\r\n type: 'string',\r\n description: 'Luau code to execute in Studio',\r\n },\r\n },\r\n required: ['code'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const code = params.code as string;\r\n const response = await ctx.sendToStudio<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n const payload = response.payload;\r\n\r\n if (payload.error) {\r\n return { success: false, error: payload.error, data: { output: payload.output } };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { output: payload.output, duration: payload.duration },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_explorer',\r\n description:\r\n 'Get the DataModel explorer tree from Roblox Studio. Optionally filter by a root path and max depth.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n rootPath: {\r\n type: 'string',\r\n description: 'Root path to start from (e.g., \"ServerScriptService\"). Omit for entire tree.',\r\n },\r\n maxDepth: {\r\n type: 'number',\r\n description: 'Maximum depth of the tree (default: 3)',\r\n default: 3,\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ tree: ExplorerNode[] }>(CliMsg.GET_EXPLORER, {\r\n rootPath: params.rootPath ?? null,\r\n maxDepth: params.maxDepth ?? 3,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { PropertyEntry } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_properties',\r\n description: 'Get all properties of a single instance in Roblox Studio. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties. For inspecting UI trees, prefer serialize_ui or get_descendants_properties.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path (e.g., \"Workspace.Part\")',\r\n },\r\n compact: {\r\n type: 'boolean',\r\n description: 'Strip read-only, nil, deprecated, and default-valued properties (default true). Set false for full dump.',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const compact = params.compact !== false;\r\n\r\n const response = await ctx.sendToStudio<{ properties: PropertyEntry[] }>(\r\n CliMsg.GET_PROPERTIES,\r\n { path: params.path, compact },\r\n );\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_descendants_properties',\r\n description: 'Easily get all descendants of a UI instance (or any instance) and all of their properties. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties to keep responses small.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path (e.g., \"Workspace.Part\", \"StarterGui.ScreenGui\")',\r\n },\r\n compact: {\r\n type: 'boolean',\r\n description: 'When true (default), strips read-only, nil, deprecated, and default-valued properties to massively reduce response size. Set to false for full property dump.',\r\n },\r\n outputFile: {\r\n type: 'string',\r\n description: 'Optional file path to write the JSON result to, useful for very large trees where context limits apply.',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const compact = params.compact !== false; // default true\r\n\r\n const response = await ctx.sendToStudio<{ success: boolean; descendants?: unknown }>(\r\n CliMsg.GET_DESCENDANTS_PROPERTIES,\r\n { path: params.path, compact },\r\n 1000 * 60 * 5, // 5 minute timeout since getting ALL descendants can take a very long time\r\n );\r\n\r\n if (params.outputFile && typeof params.outputFile === 'string') {\r\n const fs = await import('fs/promises');\r\n const path = await import('path');\r\n const outputPath = path.resolve(process.cwd(), params.outputFile);\r\n await fs.writeFile(outputPath, JSON.stringify(response.payload, null, 2), 'utf-8');\r\n return { success: true, data: `Successfully saved descendants to ${outputPath}` };\r\n }\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'set_properties',\r\n description: 'Set properties on an instance in Roblox Studio.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path (e.g., \"Workspace.Part\")',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Key-value pairs of properties to set (e.g., {\"Name\": \"MyPart\", \"BrickColor\": \"Bright red\"})',\r\n },\r\n },\r\n required: ['path', 'properties'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.SET_PROPERTIES, {\r\n path: params.path,\r\n properties: params.properties,\r\n });\r\n\r\n const payload = response.payload as { success: boolean; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to set properties' };\r\n }\r\n\r\n return { success: true, data: { path: params.path, updated: Object.keys(params.properties as object) } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'insert_instance',\r\n description: 'Insert a new instance into the Roblox Studio DataModel.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n className: {\r\n type: 'string',\r\n description: 'Class name of the instance to create (e.g., \"Part\", \"Script\", \"ModuleScript\")',\r\n },\r\n parentPath: {\r\n type: 'string',\r\n description: 'Full path of the parent instance (e.g., \"Workspace\", \"ServerScriptService\")',\r\n },\r\n name: {\r\n type: 'string',\r\n description: 'Name for the new instance',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Optional properties to set on the new instance',\r\n },\r\n },\r\n required: ['className', 'parentPath', 'name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.INSERT_INSTANCE, {\r\n className: params.className,\r\n parentPath: params.parentPath,\r\n name: params.name,\r\n properties: params.properties ?? {},\r\n });\r\n\r\n const payload = response.payload as { success: boolean; path?: string; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to insert instance' };\r\n }\r\n\r\n return { success: true, data: { path: payload.path } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'delete_instance',\r\n description: 'Delete an instance from the Roblox Studio DataModel by path.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path to delete (e.g., \"Workspace.OldPart\")',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.DELETE_INSTANCE, { path: params.path });\r\n const payload = response.payload as { success: boolean; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to delete instance' };\r\n }\r\n\r\n return { success: true, data: { deleted: params.path } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { OutputPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_output',\r\n description: 'Get recent output log entries from Roblox Studio (prints, warnings, errors).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n limit: {\r\n type: 'number',\r\n description: 'Maximum number of log entries to return (default: 50)',\r\n default: 50,\r\n },\r\n level: {\r\n type: 'string',\r\n description: 'Filter by log level',\r\n enum: ['info', 'warn', 'error'],\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ entries: OutputPayload[] }>(CliMsg.GET_OUTPUT, {\r\n limit: params.limit ?? 50,\r\n level: params.level ?? null,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { SelectionPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_selection',\r\n description: 'Get the currently selected instances in Roblox Studio.',\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n\r\n async execute(_params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { SearchResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'search_scripts',\r\n description:\r\n 'Search across all scripts in Roblox Studio for a text pattern. Returns matching lines with context.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n query: {\r\n type: 'string',\r\n description: 'Text or pattern to search for in script sources',\r\n },\r\n maxResults: {\r\n type: 'number',\r\n description: 'Maximum number of script results (default: 20)',\r\n default: 20,\r\n },\r\n },\r\n required: ['query'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<SearchResultPayload>(CliMsg.SEARCH_SCRIPTS, {\r\n query: params.query,\r\n maxResults: params.maxResults ?? 20,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { TestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'run_tests',\r\n description:\r\n 'Run tests in Roblox Studio using StudioTestService. Can run all tests or a specific test by name.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n testName: {\r\n type: 'string',\r\n description: 'Specific test name to run. Omit to run all tests.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ results: TestResultPayload[] }>(CliMsg.RUN_TESTS, {\r\n testName: params.testName ?? null,\r\n });\r\n\r\n const results = response.payload.results ?? [];\r\n const passed = results.filter((r) => r.passed).length;\r\n const failed = results.filter((r) => !r.passed).length;\r\n\r\n return {\r\n success: failed === 0,\r\n data: { total: results.length, passed, failed, results },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_class_info',\r\n description:\r\n 'Look up the full schema of a Roblox class using ReflectionService. ' +\r\n 'Returns all properties (with their types), methods (with parameters), and events. ' +\r\n 'ALWAYS call this before creating or modifying GUI/UI elements (Frame, TextLabel, ImageLabel, etc.) ' +\r\n 'to know the correct property names and expected types (e.g., Size is UDim2 for GUI, Vector3 for Parts).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n className: {\r\n type: 'string',\r\n description: 'Roblox class name, e.g. \"Frame\", \"TextLabel\", \"Part\", \"MeshPart\", \"Camera\"',\r\n },\r\n },\r\n required: ['className'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n className: string;\r\n properties: { name: string; type: string; category?: string; owner?: string }[];\r\n methods: { name: string; parameters: { name: string; type: string }[]; owner?: string }[];\r\n events: { name: string; parameters: { name: string; type: string }[]; owner?: string }[];\r\n superclass?: string;\r\n creatable?: boolean;\r\n error?: string;\r\n }>(CliMsg.GET_REFLECTION, { className: params.className });\r\n\r\n const payload = response.payload;\r\n if (payload.error) {\r\n return { success: false, error: payload.error };\r\n }\r\n\r\n return { success: true, data: payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'create_ui',\r\n description:\r\n 'Create an entire UI tree in Roblox Studio in a SINGLE call. ' +\r\n 'Pass a declarative JSON tree with ClassName, Name, properties, and Children. ' +\r\n 'All types are auto-coerced natively in Luau — UDim2, Color3, Font, enums all work. ' +\r\n 'This is 10x faster than run_code for UI because it handles everything in one round-trip ' +\r\n 'with no Luau syntax issues. Replaces any existing instance with the same name.\\n\\n' +\r\n 'Example: create a pastel hello world screen:\\n' +\r\n '{\\n' +\r\n ' \"parent\": \"StarterGui\",\\n' +\r\n ' \"tree\": {\\n' +\r\n ' \"ClassName\": \"ScreenGui\",\\n' +\r\n ' \"Name\": \"HelloWorld\",\\n' +\r\n ' \"ResetOnSpawn\": false,\\n' +\r\n ' \"Children\": [{\\n' +\r\n ' \"ClassName\": \"Frame\",\\n' +\r\n ' \"Name\": \"Background\",\\n' +\r\n ' \"Size\": [1, 0, 1, 0],\\n' +\r\n ' \"BackgroundColor3\": \"#F0E6FF\",\\n' +\r\n ' \"Children\": [\\n' +\r\n ' { \"ClassName\": \"UICorner\", \"CornerRadius\": [0, 12] },\\n' +\r\n ' { \"ClassName\": \"TextLabel\", \"Name\": \"Title\", \"Text\": \"Hello World!\",\\n' +\r\n ' \"Size\": [0.5, 0, 0.1, 0], \"Position\": [0.25, 0, 0.45, 0],\\n' +\r\n ' \"BackgroundTransparency\": 1, \"TextColor3\": \"#6C5CE7\",\\n' +\r\n ' \"TextScaled\": true, \"Font\": \"GothamBold\" }\\n' +\r\n ' ]\\n' +\r\n ' }]\\n' +\r\n ' }\\n' +\r\n '}',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n parent: {\r\n type: 'string',\r\n description: 'Parent path: \"StarterGui\", \"PlayerGui\", or any instance path. Default: StarterGui',\r\n },\r\n tree: {\r\n type: 'object',\r\n description:\r\n 'The root UI node. Each node has: ClassName (string), Name (string), ' +\r\n 'Children (array of child nodes), and properties. Properties may be ' +\r\n 'specified either flattened at the top level of the node, OR nested ' +\r\n 'under a \"properties\" / \"Properties\" / \"props\" key — both work. ' +\r\n 'Property values are auto-coerced:\\n' +\r\n ' UDim2: [xScale, xOffset, yScale, yOffset] or {XScale, XOffset, YScale, YOffset}\\n' +\r\n ' Color3: \"#hex\", \"rgb(r,g,b)\", [r,g,b], or BrickColor name\\n' +\r\n ' UDim: [scale, offset] or number\\n' +\r\n ' Vector2: [x, y] or {x, y} (auto-disambiguated from UDim by property name)\\n' +\r\n ' NumberRange: [min, max] or number\\n' +\r\n ' Rect: [minX, minY, maxX, maxY] or {MinX, MinY, MaxX, MaxY}\\n' +\r\n ' Font: \"GothamBold\", \"SourceSans\", etc. (Enum.Font names)\\n' +\r\n ' Enums: string name like \"Center\", \"Left\", \"Fit\"\\n' +\r\n ' FontFace: {Family, Weight, Style}\\n' +\r\n ' 2-element arrays are auto-disambiguated: AnchorPoint→Vector2, CornerRadius/Padding→UDim, etc.',\r\n },\r\n animate: {\r\n type: 'boolean',\r\n description: 'If true, task.wait() will be injected between creation of nodes so that the UI writes out dynamically.',\r\n },\r\n },\r\n required: ['tree'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n path?: string;\r\n instanceCount?: number;\r\n error?: string;\r\n }>(CliMsg.BUILD_UI, {\r\n parent: params.parent ?? 'StarterGui',\r\n animate: params.animate,\r\n tree: params.tree,\r\n });\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'UI build failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { path: payload.path, instanceCount: payload.instanceCount },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { StudioTestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'execute_run_test',\r\n description:\r\n 'Start a Run mode test session in Roblox Studio using StudioTestService:ExecuteRunModeAsync(). ' +\r\n 'Passes args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until the session ends (via EndTest or manual stop). ' +\r\n 'Returns the value passed to EndTest(). ' +\r\n 'Use this for headless automated tests — no player character, just server scripts running.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n args: {\r\n description:\r\n 'Arguments to pass to the test session. Server scripts retrieve this with StudioTestService:GetTestArgs(). ' +\r\n 'Can be a string (e.g. test suite name), table, or any serializable value.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<StudioTestResultPayload>(\r\n CliMsg.EXECUTE_RUN_TEST,\r\n { args: params.args ?? null },\r\n 120_000,\r\n );\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Run mode test failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n result: payload.result,\r\n duration: payload.duration,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { StudioTestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'execute_play_test',\r\n description:\r\n 'Start a solo Play mode test session in Roblox Studio using StudioTestService:ExecutePlayModeAsync(). ' +\r\n 'Passes args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until the session ends (via EndTest or manual stop). ' +\r\n 'Returns the value passed to EndTest(). ' +\r\n 'Use this for tests that need a player character and full client-server simulation.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n args: {\r\n description:\r\n 'Arguments to pass to the test session. Server scripts retrieve this with StudioTestService:GetTestArgs(). ' +\r\n 'Can be a string (e.g. test suite name), table, or any serializable value.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<StudioTestResultPayload>(\r\n CliMsg.EXECUTE_PLAY_TEST,\r\n { args: params.args ?? null },\r\n 120_000,\r\n );\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Play mode test failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n result: payload.result,\r\n duration: payload.duration,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'create_part',\r\n description:\r\n 'Create a Part in Roblox Studio with position, size, color, material and more — all in one call. Much faster than insert_instance + set_properties separately.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n name: { type: 'string', description: 'Name for the part' },\r\n parent: {\r\n type: 'string',\r\n description: 'Parent path (default: \"Workspace\")',\r\n },\r\n shape: {\r\n type: 'string',\r\n enum: ['Block', 'Ball', 'Cylinder', 'Wedge', 'CornerWedge'],\r\n description: 'Part shape (default: Block)',\r\n },\r\n position: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'World position {x, y, z}',\r\n },\r\n size: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'Size in studs {x, y, z} (default: {4, 1, 2})',\r\n },\r\n color: {\r\n type: 'string',\r\n description: 'Color as hex \"#FF0000\", BrickColor name \"Bright red\", or RGB \"rgb(255,0,0)\"',\r\n },\r\n material: {\r\n type: 'string',\r\n description: 'Material name: Plastic, Wood, Grass, Ice, Metal, Concrete, Sand, Neon, Glass, etc.',\r\n },\r\n transparency: { type: 'number', description: '0 (opaque) to 1 (invisible)' },\r\n anchored: { type: 'boolean', description: 'Whether the part is anchored (default: true)' },\r\n canCollide: { type: 'boolean', description: 'Whether the part has collision' },\r\n },\r\n required: ['name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const parent = (params.parent as string) || 'Workspace';\r\n const name = params.name as string;\r\n const pos = params.position as { x?: number; y?: number; z?: number } | undefined;\r\n const size = params.size as { x?: number; y?: number; z?: number } | undefined;\r\n\r\n const properties: Record<string, unknown> = {};\r\n\r\n if (pos) properties.Position = { X: pos.x ?? 0, Y: pos.y ?? 0, Z: pos.z ?? 0 };\r\n if (size) properties.Size = { X: size.x ?? 4, Y: size.y ?? 1, Z: size.z ?? 2 };\r\n if (params.color) {\r\n const c = params.color as string;\r\n if (c.startsWith('#')) {\r\n properties.Color = c;\r\n } else if (c.startsWith('rgb')) {\r\n const m = c.match(/(\\d+)/g);\r\n if (m && m.length >= 3) {\r\n properties.Color = { red: parseInt(m[0]), green: parseInt(m[1]), blue: parseInt(m[2]) };\r\n }\r\n } else {\r\n properties.BrickColor = c;\r\n }\r\n }\r\n if (params.material) properties.Material = params.material;\r\n if (params.transparency !== undefined) properties.Transparency = params.transparency;\r\n if (params.anchored !== undefined) properties.Anchored = params.anchored;\r\n else properties.Anchored = true;\r\n if (params.canCollide !== undefined) properties.CanCollide = params.canCollide;\r\n if (params.shape && params.shape !== 'Block') properties.Shape = params.shape;\r\n\r\n const className = (params.shape === 'Wedge') ? 'WedgePart'\r\n : (params.shape === 'CornerWedge') ? 'CornerWedgePart'\r\n : 'Part';\r\n\r\n const res = await ctx.sendToStudio(CliMsg.INSERT_INSTANCE, {\r\n className,\r\n parentPath: parent,\r\n name,\r\n properties,\r\n });\r\n\r\n const payload = res.payload as { success: boolean; path?: string; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to create part' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { path: payload.path, properties: Object.keys(properties) },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'clone_instance',\r\n description:\r\n 'Clone an existing instance in Roblox Studio and optionally reposition/rename it. Great for duplicating parts, models, or entire trees.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: { type: 'string', description: 'Path of instance to clone' },\r\n newName: { type: 'string', description: 'Name for the clone (optional)' },\r\n newParent: { type: 'string', description: 'Parent path for the clone (optional, defaults to same parent)' },\r\n offset: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'Position offset from original {x, y, z}',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const code = buildCloneCode(params);\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to clone' };\r\n }\r\n\r\n return { success: true, data: { output: payload.output } };\r\n },\r\n};\r\n\r\nfunction buildCloneCode(params: Record<string, unknown>): string {\r\n const path = params.path as string;\r\n const parts = path.split('.');\r\n let resolve = 'game';\r\n for (const p of parts) {\r\n resolve += `[\"${p}\"]`;\r\n }\r\n\r\n const lines = [\r\n `local orig = ${resolve}`,\r\n `local clone = orig:Clone()`,\r\n ];\r\n\r\n if (params.newName) {\r\n lines.push(`clone.Name = \"${params.newName}\"`);\r\n }\r\n\r\n if (params.newParent) {\r\n const parentParts = (params.newParent as string).split('.');\r\n let parentResolve = 'game';\r\n for (const p of parentParts) {\r\n parentResolve += `[\"${p}\"]`;\r\n }\r\n lines.push(`clone.Parent = ${parentResolve}`);\r\n } else {\r\n lines.push(`clone.Parent = orig.Parent`);\r\n }\r\n\r\n const offset = params.offset as { x?: number; y?: number; z?: number } | undefined;\r\n if (offset) {\r\n lines.push(`if clone:IsA(\"BasePart\") then`);\r\n lines.push(` clone.Position = clone.Position + Vector3.new(${offset.x ?? 0}, ${offset.y ?? 0}, ${offset.z ?? 0})`);\r\n lines.push(`end`);\r\n }\r\n\r\n lines.push(`print(\"Cloned: \" .. clone:GetFullName())`);\r\n return lines.join('\\n');\r\n}\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'group_instances',\r\n description:\r\n 'Group multiple instances under a new Model or Folder. Useful for organizing parts into objects (e.g., grouping trunk + leaves into a \"Tree\" model).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n paths: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of instance paths to group together',\r\n },\r\n groupName: { type: 'string', description: 'Name for the new group' },\r\n groupClass: {\r\n type: 'string',\r\n enum: ['Model', 'Folder'],\r\n description: 'Class for the group container (default: Model)',\r\n },\r\n parent: { type: 'string', description: 'Parent path (default: Workspace)' },\r\n },\r\n required: ['paths', 'groupName'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const paths = params.paths as string[];\r\n const groupName = params.groupName as string;\r\n const groupClass = (params.groupClass as string) || 'Model';\r\n const parent = (params.parent as string) || 'Workspace';\r\n\r\n const resolves = paths.map((p) => {\r\n const parts = p.split('.');\r\n let r = 'game';\r\n for (const part of parts) r += `[\"${part}\"]`;\r\n return r;\r\n });\r\n\r\n const parentParts = parent.split('.');\r\n let parentResolve = 'game';\r\n for (const p of parentParts) parentResolve += `[\"${p}\"]`;\r\n\r\n const code = [\r\n `local group = Instance.new(\"${groupClass}\")`,\r\n `group.Name = \"${groupName}\"`,\r\n `group.Parent = ${parentResolve}`,\r\n ...resolves.map((r) => `${r}.Parent = group`),\r\n groupClass === 'Model' ? `if group:IsA(\"Model\") then group:MoveTo(group:GetBoundingBox().Position) end` : '',\r\n `print(\"Grouped ${paths.length} instances into: \" .. group:GetFullName())`,\r\n ].filter(Boolean).join('\\n');\r\n\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to group' };\r\n }\r\n\r\n return { success: true, data: { groupPath: `${parent}.${groupName}`, count: paths.length } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\ninterface PartSpec {\r\n name: string;\r\n className?: string;\r\n parent?: string;\r\n position?: { x: number; y: number; z: number };\r\n size?: { x: number; y: number; z: number };\r\n color?: string;\r\n material?: string;\r\n transparency?: number;\r\n anchored?: boolean;\r\n shape?: string;\r\n}\r\n\r\nexport const tool: Tool = {\r\n name: 'build_multiple',\r\n description:\r\n 'Create multiple parts/instances in one batch call. Send an array of specs and they all get created in a single Studio round-trip. Ideal for building trees, houses, vehicles, terrain — anything composed of multiple parts.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n parts: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n properties: {\r\n name: { type: 'string', description: 'Part name' },\r\n className: { type: 'string', description: 'ClassName (default: Part)' },\r\n parent: { type: 'string', description: 'Parent path (default: Workspace)' },\r\n position: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n },\r\n size: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n },\r\n color: { type: 'string', description: 'Hex \"#RRGGBB\" or BrickColor name' },\r\n material: { type: 'string' },\r\n transparency: { type: 'number' },\r\n anchored: { type: 'boolean' },\r\n shape: { type: 'string', enum: ['Block', 'Ball', 'Cylinder', 'Wedge'] },\r\n },\r\n required: ['name'],\r\n },\r\n description: 'Array of part specifications',\r\n },\r\n groupName: {\r\n type: 'string',\r\n description: 'Optional: group all parts under a Model with this name',\r\n },\r\n groupParent: {\r\n type: 'string',\r\n description: 'Parent for the group Model (default: Workspace)',\r\n },\r\n },\r\n required: ['parts'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const parts = params.parts as PartSpec[];\r\n const groupName = params.groupName as string | undefined;\r\n const groupParent = (params.groupParent as string) || 'Workspace';\r\n\r\n const code = generateBatchCode(parts, groupName, groupParent);\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Batch build failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n count: parts.length,\r\n group: groupName ?? null,\r\n output: payload.output,\r\n },\r\n };\r\n },\r\n};\r\n\r\nfunction generateBatchCode(parts: PartSpec[], groupName?: string, groupParent?: string): string {\r\n const lines: string[] = [];\r\n\r\n function resolveParent(path: string): string {\r\n const segs = path.split('.');\r\n let r = 'game';\r\n for (const s of segs) r += `[\"${s}\"]`;\r\n return r;\r\n }\r\n\r\n if (groupName) {\r\n const gp = resolveParent(groupParent || 'Workspace');\r\n lines.push(`local _group = Instance.new(\"Model\")`);\r\n lines.push(`_group.Name = \"${groupName}\"`);\r\n lines.push(`_group.Parent = ${gp}`);\r\n }\r\n\r\n for (let i = 0; i < parts.length; i++) {\r\n const p = parts[i];\r\n const varName = `_p${i}`;\r\n const cn = p.className || (p.shape === 'Wedge' ? 'WedgePart' : 'Part');\r\n\r\n lines.push(`local ${varName} = Instance.new(\"${cn}\")`);\r\n lines.push(`${varName}.Name = \"${p.name}\"`);\r\n\r\n if (p.position) {\r\n lines.push(`${varName}.Position = Vector3.new(${p.position.x ?? 0}, ${p.position.y ?? 0}, ${p.position.z ?? 0})`);\r\n }\r\n if (p.size) {\r\n lines.push(`${varName}.Size = Vector3.new(${p.size.x ?? 4}, ${p.size.y ?? 1}, ${p.size.z ?? 2})`);\r\n }\r\n if (p.color) {\r\n if (p.color.startsWith('#')) {\r\n lines.push(`${varName}.Color = Color3.fromHex(\"${p.color}\")`);\r\n } else {\r\n lines.push(`${varName}.BrickColor = BrickColor.new(\"${p.color}\")`);\r\n }\r\n }\r\n if (p.material) {\r\n lines.push(`${varName}.Material = Enum.Material.${p.material}`);\r\n }\r\n if (p.transparency !== undefined) {\r\n lines.push(`${varName}.Transparency = ${p.transparency}`);\r\n }\r\n if (p.anchored !== undefined) {\r\n lines.push(`${varName}.Anchored = ${p.anchored}`);\r\n } else {\r\n lines.push(`${varName}.Anchored = true`);\r\n }\r\n if (p.shape && p.shape !== 'Block' && cn === 'Part') {\r\n lines.push(`${varName}.Shape = Enum.PartType.${p.shape}`);\r\n }\r\n\r\n if (groupName) {\r\n lines.push(`${varName}.Parent = _group`);\r\n } else {\r\n const parent = p.parent || 'Workspace';\r\n lines.push(`${varName}.Parent = ${resolveParent(parent)}`);\r\n }\r\n }\r\n\r\n lines.push(`print(\"Built ${parts.length} parts${groupName ? ` in ${groupName}` : ''}\")`);\r\n return lines.join('\\n');\r\n}\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'serialize_ui',\r\n description:\r\n 'Serialize an existing UI tree from Roblox Studio into create_ui-compatible JSON. ' +\r\n 'This is the reverse of create_ui — read any instance and get back a declarative JSON tree ' +\r\n 'you can modify and pass back to create_ui. Perfect for cloning, templating, or refactoring UIs.\\n\\n' +\r\n 'The output includes ClassName, Name, all non-default properties (with values converted to ' +\r\n 'JSON-friendly formats like [r,g,b] for Color3, [xS,xO,yS,yO] for UDim2, etc.), and Children.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Instance path to serialize (e.g. \"StarterGui.MyScreenGui\")',\r\n },\r\n maxDepth: {\r\n type: 'number',\r\n description: 'Maximum depth to serialize (default: 50)',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n tree?: unknown;\r\n error?: string;\r\n }>(CliMsg.SERIALIZE_UI, {\r\n path: params.path,\r\n maxDepth: params.maxDepth ?? 50,\r\n }, 1000 * 60 * 2);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Serialization failed' };\r\n }\r\n\r\n return { success: true, data: payload.tree };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'move_instance',\r\n description:\r\n 'Move (reparent) an instance to a new parent in Roblox Studio. ' +\r\n 'This preserves the instance and all its descendants — much better than delete + recreate. ' +\r\n 'Sets a ChangeHistoryService waypoint so the move can be undone.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full path of the instance to move (e.g. \"Workspace.OldFolder.MyPart\")',\r\n },\r\n newParent: {\r\n type: 'string',\r\n description: 'Full path of the new parent (e.g. \"Workspace.NewFolder\")',\r\n },\r\n },\r\n required: ['path', 'newParent'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n newPath?: string;\r\n error?: string;\r\n }>(CliMsg.MOVE_INSTANCE, {\r\n path: params.path,\r\n newParent: params.newParent,\r\n });\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Move failed' };\r\n }\r\n\r\n return { success: true, data: { newPath: payload.newPath } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'bulk_set_properties',\r\n description:\r\n 'Set properties on multiple instances at once in a single call. ' +\r\n 'Much faster than calling set_properties repeatedly. Supports two modes:\\n' +\r\n '1. Explicit paths: provide an array of {path, properties} objects\\n' +\r\n '2. By class filter: provide a root path, className filter, and properties to apply to all matches\\n\\n' +\r\n 'Example (explicit): [{\"path\": \"StarterGui.HUD.Title\", \"properties\": {\"TextColor3\": \"#fff\"}}, ...]\\n' +\r\n 'Example (filter): root=\"StarterGui.HUD\", className=\"TextLabel\", properties={\"Font\": \"GothamBold\"}',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n targets: {\r\n type: 'array',\r\n description: 'Array of {path, properties} objects for explicit mode.',\r\n items: {\r\n type: 'object',\r\n description: 'A target with path and properties to set.',\r\n },\r\n },\r\n root: {\r\n type: 'string',\r\n description: 'Root instance path to search under (filter mode)',\r\n },\r\n className: {\r\n type: 'string',\r\n description: 'Only apply to instances of this ClassName (filter mode)',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Properties to set on all matched instances (filter mode)',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n modified?: number;\r\n errors?: string[];\r\n error?: string;\r\n }>(CliMsg.BULK_SET_PROPERTIES, {\r\n targets: params.targets,\r\n root: params.root,\r\n className: params.className,\r\n properties: params.properties,\r\n }, 1000 * 60);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Bulk set failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n modified: payload.modified,\r\n errors: payload.errors?.length ? payload.errors : undefined,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'find_replace_scripts',\r\n description:\r\n 'Find and replace text across all scripts in the game (or under a root path). ' +\r\n 'Supports plain text and Lua pattern matching. Returns a list of modified scripts with match counts.\\n\\n' +\r\n 'Use dryRun=true to preview changes without applying them.\\n' +\r\n 'Example: find=\"workspace\" replace=\"Workspace\" root=\"ServerScriptService\"',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n find: {\r\n type: 'string',\r\n description: 'Text or Lua pattern to search for',\r\n },\r\n replace: {\r\n type: 'string',\r\n description: 'Replacement text (supports Lua pattern captures like %1, %2)',\r\n },\r\n root: {\r\n type: 'string',\r\n description: 'Root path to limit search scope (optional, searches entire game if omitted)',\r\n },\r\n usePattern: {\r\n type: 'boolean',\r\n description: 'If true, treat find/replace as Lua patterns. Default: false (plain text)',\r\n },\r\n dryRun: {\r\n type: 'boolean',\r\n description: 'If true, report matches but do not modify scripts. Default: false',\r\n },\r\n },\r\n required: ['find', 'replace'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n modified?: { path: string; matches: number }[];\r\n totalMatches?: number;\r\n totalFiles?: number;\r\n error?: string;\r\n }>(CliMsg.FIND_REPLACE_SCRIPTS, {\r\n find: params.find,\r\n replace: params.replace,\r\n root: params.root,\r\n usePattern: params.usePattern ?? false,\r\n dryRun: params.dryRun ?? false,\r\n }, 1000 * 60 * 5);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Find/replace failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n totalFiles: payload.totalFiles,\r\n totalMatches: payload.totalMatches,\r\n modified: payload.modified,\r\n dryRun: params.dryRun ?? false,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolResult } from '../types.js';\r\nimport { recallFacts, getProjectSummaries } from '../../memory/store.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'recall_memory',\r\n description:\r\n 'Search your memory for previously learned facts about the current project. Use this to recall architecture decisions, patterns, known bugs, or user preferences.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n query: {\r\n type: 'string',\r\n description: 'What to search for in memory (e.g., \"player data storage\", \"combat system architecture\")',\r\n },\r\n limit: {\r\n type: 'number',\r\n description: 'Max number of facts to return (default: 10)',\r\n default: 10,\r\n },\r\n },\r\n required: ['query'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\r\n const query = params.query as string;\r\n const limit = (params.limit as number) ?? 10;\r\n const projectId = 'current';\r\n\r\n const facts = recallFacts(projectId, query, limit);\r\n const summaries = getProjectSummaries(projectId, 5);\r\n\r\n return {\r\n success: true,\r\n data: {\r\n facts: facts.map((f) => ({ content: f.content, category: f.category })),\r\n recentSessions: summaries.map((s) => s.summary),\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolResult } from '../types.js';\r\nimport { storeFact } from '../../memory/store.js';\r\nimport type { FactCategory } from '../../memory/types.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'remember',\r\n description:\r\n 'Store a fact about the current project in persistent memory. Use this to remember architecture decisions, patterns, bugs found, or user preferences so you can recall them in future sessions.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n fact: {\r\n type: 'string',\r\n description: 'The fact to remember (e.g., \"PlayerData DataStore uses key format Player_{UserId}\")',\r\n },\r\n category: {\r\n type: 'string',\r\n description: 'Category of the fact',\r\n enum: ['architecture', 'pattern', 'preference', 'bug', 'api', 'general'],\r\n },\r\n },\r\n required: ['fact', 'category'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\r\n const fact = params.fact as string;\r\n const category = (params.category as FactCategory) ?? 'general';\r\n const now = Date.now();\r\n\r\n storeFact({\r\n projectId: 'current',\r\n content: fact,\r\n category,\r\n source: 'agent',\r\n relevance: 1.0,\r\n createdAt: now,\r\n accessedAt: now,\r\n });\r\n\r\n return { success: true, data: { stored: fact, category } };\r\n },\r\n};\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport type { Tool, ToolContext, ToolResult } from '../types.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'upload_asset',\r\n description:\r\n 'Upload a local file (image, model, audio) to Roblox via the Open Cloud API. Requires an Open Cloud API key configured in dominus.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n filePath: {\r\n type: 'string',\r\n description: 'Local file path of the asset to upload',\r\n },\r\n assetType: {\r\n type: 'string',\r\n description: 'Type of asset',\r\n enum: ['Image', 'Audio', 'Model'],\r\n },\r\n name: {\r\n type: 'string',\r\n description: 'Display name for the asset on Roblox',\r\n },\r\n description: {\r\n type: 'string',\r\n description: 'Description of the asset',\r\n },\r\n },\r\n required: ['filePath', 'assetType', 'name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n const apiKey = ctx.config.get<string>('openCloudApiKey');\r\n if (!apiKey) {\r\n return {\r\n success: false,\r\n error: 'Open Cloud API key not configured. Run: dominus config set openCloudApiKey <key>',\r\n };\r\n }\r\n\r\n const filePath = params.filePath as string;\r\n const assetType = params.assetType as string;\r\n const name = params.name as string;\r\n const description = (params.description as string) ?? '';\r\n\r\n if (!fs.existsSync(filePath)) {\r\n return { success: false, error: `File not found: ${filePath}` };\r\n }\r\n\r\n const fileBuffer = fs.readFileSync(filePath);\r\n const fileName = path.basename(filePath);\r\n\r\n const typeMapping: Record<string, string> = {\r\n Image: 'Decal',\r\n Audio: 'Audio',\r\n Model: 'Model',\r\n };\r\n\r\n try {\r\n const formData = new FormData();\r\n const blob = new Blob([fileBuffer]);\r\n formData.append('fileContent', blob, fileName);\r\n formData.append(\r\n 'request',\r\n JSON.stringify({\r\n assetType: typeMapping[assetType] ?? assetType,\r\n displayName: name,\r\n description,\r\n creationContext: { creator: { userId: 'me' } },\r\n }),\r\n );\r\n\r\n const response = await fetch(\r\n 'https://apis.roblox.com/assets/v1/assets',\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'x-api-key': apiKey,\r\n },\r\n body: formData,\r\n },\r\n );\r\n\r\n if (!response.ok) {\r\n const text = await response.text();\r\n return { success: false, error: `Upload failed (${response.status}): ${text}` };\r\n }\r\n\r\n const data = await response.json();\r\n return {\r\n success: true,\r\n data: {\r\n assetId: data.assetId ?? data.id,\r\n operationId: data.operationId ?? data.path,\r\n name,\r\n type: assetType,\r\n },\r\n };\r\n } catch (err) {\r\n return {\r\n success: false,\r\n error: `Upload error: ${err instanceof Error ? err.message : String(err)}`,\r\n };\r\n }\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const undoTool: Tool = {\r\n name: 'undo',\r\n description:\r\n 'Undo the last action in Roblox Studio using ChangeHistoryService. ' +\r\n 'Works just like Ctrl+Z. Use this to roll back mistakes.',\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n\r\n async execute(_params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n error?: string;\r\n }>(CliMsg.UNDO, {});\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Undo failed' };\r\n }\r\n\r\n return { success: true, data: 'Undo performed' };\r\n },\r\n};\r\n\r\nexport const redoTool: Tool = {\r\n name: 'redo',\r\n description:\r\n 'Redo the last undone action in Roblox Studio using ChangeHistoryService. ' +\r\n 'Works just like Ctrl+Y.',\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n\r\n async execute(_params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n error?: string;\r\n }>(CliMsg.REDO, {});\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Redo failed' };\r\n }\r\n\r\n return { success: true, data: 'Redo performed' };\r\n },\r\n};\r\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport { z } from 'zod';\r\nimport { DominusServer, type StudioBridge } from '../transport/ws-server.js';\r\nimport { DominusClient, isPortInUse } from '../transport/ws-client.js';\r\nimport { CliMsg, type ExplorerNode, type ScriptContentPayload, type RunCodeResponsePayload, type SearchResultPayload, type OutputPayload, type SelectionPayload, type PropertyEntry, type TestResultPayload, type StudioTestResultPayload } from '../transport/protocol.js';\r\nimport { initMemoryStore, recallFacts, storeFact, getScriptIndex } from '../memory/store.js';\r\nimport { loadConfig } from '../config/config.js';\r\nimport { INTERNAL_MEMORY } from '../agent/internal-memory.js';\r\n\r\nlet bridge: StudioBridge;\r\n\r\nexport async function startMcpServer(): Promise<void> {\r\n const config = loadConfig();\r\n await initMemoryStore();\r\n\r\n const portTaken = await isPortInUse(config.port);\r\n if (portTaken) {\r\n const client = new DominusClient(config.port);\r\n await client.connect();\r\n bridge = client;\r\n } else {\r\n const server = new DominusServer(config.port);\r\n await server.start();\r\n bridge = server;\r\n }\r\n\r\n const mcp = new McpServer({\r\n name: 'dominus',\r\n version: '0.6.0',\r\n }, {\r\n instructions: INTERNAL_MEMORY,\r\n });\r\n\r\n // --- Helpers: safe Lua string generation ---\r\n /** Escape a string for safe embedding in Lua code */\r\n function luaStr(s: string): string {\r\n return `\"${s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r')}\"`;\r\n }\r\n /** Convert a dot-path like \"Workspace.Folder.Part\" to game[\"Workspace\"][\"Folder\"][\"Part\"] */\r\n function resolvePath(dotPath: string): string {\r\n const parts = dotPath.split('.');\r\n let r = 'game';\r\n for (const p of parts) r += `[${luaStr(p)}]`;\r\n return r;\r\n }\r\n\r\n // --- Code Generation Helpers ---\r\n\r\n /** Round a number to 3 decimal places, drop trailing zeros. Integers stay as-is. */\r\n function cleanNum(n: number): string {\r\n if (Number.isInteger(n)) return String(n);\r\n // Round to 3 decimals, strip trailing zeros\r\n const rounded = Math.round(n * 1000) / 1000;\r\n return String(rounded);\r\n }\r\n\r\n /** Convert a serialized UI tree node into a Roact/React createElement call */\r\n function generateComponentCode(\r\n tree: Record<string, unknown>,\r\n componentName: string,\r\n framework: string,\r\n ): string {\r\n const isReact = framework === 'react';\r\n const lib = isReact ? 'React' : 'Roact';\r\n\r\n const lines: string[] = [];\r\n lines.push(`local ${lib} = require(game.ReplicatedStorage.Packages.${isReact ? 'React' : 'Roact'})`);\r\n if (isReact) {\r\n lines.push(`local e = React.createElement`);\r\n } else {\r\n lines.push(`local e = Roact.createElement`);\r\n }\r\n lines.push('');\r\n\r\n // Collect all ClassName types used so we can note them\r\n lines.push(`local function ${componentName}()`);\r\n lines.push(`\\treturn ${renderNode(tree, 1)}`);\r\n lines.push('end');\r\n lines.push('');\r\n lines.push(`return ${componentName}`);\r\n\r\n return lines.join('\\n');\r\n }\r\n\r\n function renderNode(node: Record<string, unknown>, depth: number): string {\r\n const indent = '\\t'.repeat(depth);\r\n const indent2 = '\\t'.repeat(depth + 1);\r\n const className = (node.ClassName as string) || 'Frame';\r\n const children = (node.Children as Record<string, unknown>[]) || [];\r\n const name = node.Name as string | undefined;\r\n\r\n // Build props table\r\n const props: string[] = [];\r\n const skipKeys = new Set(['ClassName', 'Name', 'Children', 'className', 'name', 'children']);\r\n for (const [key, val] of Object.entries(node)) {\r\n if (skipKeys.has(key)) continue;\r\n props.push(`${indent2}${key} = ${luaValue(val, depth + 1)},`);\r\n }\r\n\r\n // Build children table\r\n const childEntries: string[] = [];\r\n for (const child of children) {\r\n const childName = (child.Name as string) || (child.ClassName as string) || 'Child';\r\n childEntries.push(`${indent2}${childName} = ${renderNode(child, depth + 1)},`);\r\n }\r\n\r\n // Combine\r\n const hasProps = props.length > 0;\r\n const hasChildren = childEntries.length > 0;\r\n\r\n if (!hasProps && !hasChildren) {\r\n return `e(\"${className}\", {})`;\r\n }\r\n\r\n const parts: string[] = [];\r\n parts.push(`e(\"${className}\", {`);\r\n if (hasProps) {\r\n parts.push(...props);\r\n }\r\n if (hasChildren) {\r\n parts.push(`${indent2}}, {`);\r\n parts.push(...childEntries);\r\n parts.push(`${indent}})`);\r\n } else {\r\n parts.push(`${indent}})`);\r\n }\r\n\r\n return parts.join('\\n');\r\n }\r\n\r\n function luaValue(val: unknown, _depth: number): string {\r\n if (val === null || val === undefined) return 'nil';\r\n if (typeof val === 'boolean') return String(val);\r\n if (typeof val === 'number') return cleanNum(val);\r\n if (typeof val === 'string') {\r\n // Detect special Roblox types from serialize_ui output\r\n if (val.startsWith('#') && val.length === 7) {\r\n return `Color3.fromHex(\"${val}\")`;\r\n }\r\n // Enum-like strings (single word, PascalCase)\r\n if (/^[A-Z][a-zA-Z]+$/.test(val)) {\r\n return `\"${val}\"`; // keep as string, Roact handles enum coercion\r\n }\r\n return `\"${val.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n')}\"`;\r\n }\r\n if (Array.isArray(val)) {\r\n // UDim2: [xS, xO, yS, yO]\r\n if (val.length === 4 && val.every(v => typeof v === 'number')) {\r\n return `UDim2.new(${val.map(cleanNum).join(', ')})`;\r\n }\r\n // Vector2 / UDim: [x, y]\r\n if (val.length === 2 && val.every(v => typeof v === 'number')) {\r\n return `Vector2.new(${val.map(cleanNum).join(', ')})`;\r\n }\r\n // Color3: [r, g, b]\r\n if (val.length === 3 && val.every(v => typeof v === 'number')) {\r\n const allSmall = val.every(v => (v as number) <= 1);\r\n if (allSmall) return `Color3.new(${val.map(cleanNum).join(', ')})`;\r\n return `Color3.fromRGB(${val.map(v => String(Math.round(v as number))).join(', ')})`;\r\n }\r\n return `{${val.map(v => luaValue(v, _depth)).join(', ')}}`;\r\n }\r\n if (typeof val === 'object') {\r\n const entries = Object.entries(val as Record<string, unknown>);\r\n if (entries.length === 0) return '{}';\r\n return `{\\n${entries.map(([k, v]) => `${'\\t'.repeat(_depth + 1)}${k} = ${luaValue(v, _depth + 1)}`).join(',\\n')}\\n${'\\t'.repeat(_depth)}}`;\r\n }\r\n return String(val);\r\n }\r\n\r\n // --- Studio Tools ---\r\n\r\n mcp.tool(\r\n 'read_script',\r\n 'Read the source code of a script in Roblox Studio',\r\n { path: z.string().describe('Full instance path, e.g. \"ServerScriptService.GameManager\"') },\r\n async ({ path }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<ScriptContentPayload>(CliMsg.GET_SCRIPT, { path });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'edit_script',\r\n 'Replace the entire source code of a script in Roblox Studio',\r\n {\r\n path: z.string().describe('Full instance path'),\r\n source: z.string().describe('New complete source code'),\r\n },\r\n async ({ path, source }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.SET_SCRIPT, { path, source });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'run_code',\r\n 'Execute arbitrary Luau code in Roblox Studio. LAST RESORT — only use when no dedicated tool exists. ' +\r\n 'Do NOT use for: reading properties (use get_properties/inspect_selection/serialize_ui), creating instances (use create_part/create_ui/insert_instance/build_multiple), ' +\r\n 'modifying properties (use set_properties/bulk_set_properties), or inspecting the tree (use get_explorer). ' +\r\n 'Valid uses: complex procedural generation, terrain algorithms, raycasting, physics queries, custom logic with no tool equivalent.',\r\n { code: z.string().describe('Luau code to execute') },\r\n async ({ code }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_explorer',\r\n 'Get the DataModel explorer tree from Roblox Studio',\r\n {\r\n rootPath: z.string().optional().describe('Root path to start from. Omit for entire tree.'),\r\n maxDepth: z.number().optional().default(3).describe('Maximum tree depth'),\r\n },\r\n async ({ rootPath, maxDepth }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ tree: ExplorerNode[] }>(CliMsg.GET_EXPLORER, {\r\n rootPath: rootPath ?? null,\r\n maxDepth,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_properties',\r\n 'Get all properties of a single instance in Roblox Studio. Returns property name, value, type, and category. For inspecting UI trees, prefer serialize_ui (structured tree) or get_descendants_properties (flat list with compact filtering).',\r\n {\r\n path: z.string().describe('Full instance path (e.g. \"Workspace.Part\", \"StarterGui.MyUI.Frame\")'),\r\n compact: z.boolean().optional().default(true).describe('Strip read-only, nil, deprecated, and default-valued properties (default true). Set false for full dump.'),\r\n },\r\n async ({ path, compact }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ properties: PropertyEntry[] }>(CliMsg.GET_PROPERTIES, { path, compact });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_descendants_properties',\r\n 'Easily get all descendants of a UI instance (or any instance) and all of their properties. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties to keep responses small.',\r\n { \r\n path: z.string().describe('Full instance path (e.g., \"Workspace.Part\", \"StarterGui.ScreenGui\")'),\r\n compact: z.boolean().optional().default(true).describe('Strip noisy/default properties (default true). Set false for full dump.'),\r\n outputFile: z.string().optional().describe('Optional file path to write to prevent limit errors/timeouts'),\r\n },\r\n async ({ path, compact, outputFile }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<unknown>(CliMsg.GET_DESCENDANTS_PROPERTIES, { path, compact, outputFile }, 1000 * 60 * 5);\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'set_properties',\r\n 'Set properties on an instance in Roblox Studio',\r\n {\r\n path: z.string().describe('Full instance path'),\r\n properties: z.record(z.unknown()).describe('Key-value pairs of properties to set'),\r\n },\r\n async ({ path, properties }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.SET_PROPERTIES, { path, properties });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'insert_instance',\r\n 'Create a new instance in the Roblox Studio DataModel',\r\n {\r\n className: z.string().describe('Class name (e.g. \"Part\", \"Script\")'),\r\n parentPath: z.string().describe('Parent instance path'),\r\n name: z.string().describe('Name for the new instance'),\r\n properties: z.record(z.unknown()).optional().describe('Optional properties to set'),\r\n },\r\n async ({ className, parentPath, name, properties }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.INSERT_INSTANCE, {\r\n className, parentPath, name, properties: properties ?? {},\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'delete_instance',\r\n 'Delete an instance from the Roblox Studio DataModel',\r\n { path: z.string().describe('Full instance path to delete') },\r\n async ({ path }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.DELETE_INSTANCE, { path });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_selection',\r\n 'Get the currently selected instances in Roblox Studio. Returns paths and class names of all selected objects. ' +\r\n 'Use this FIRST when the user says \"my selection\" or \"what I have selected\". ' +\r\n 'Then use get_properties or serialize_ui on the returned paths to inspect details.',\r\n {},\r\n async () => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'search_scripts',\r\n 'Search all scripts in Roblox Studio for a text pattern',\r\n {\r\n query: z.string().describe('Text to search for'),\r\n maxResults: z.number().optional().default(20).describe('Max results'),\r\n },\r\n async ({ query, maxResults }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<SearchResultPayload>(CliMsg.SEARCH_SCRIPTS, { query, maxResults });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_output',\r\n 'Get recent output log from Roblox Studio',\r\n {\r\n limit: z.number().optional().default(50).describe('Max entries'),\r\n level: z.enum(['info', 'warn', 'error']).optional().describe('Filter by level'),\r\n },\r\n async ({ limit, level }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ entries: OutputPayload[] }>(CliMsg.GET_OUTPUT, {\r\n limit, level: level ?? null,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_class_info',\r\n 'Look up the schema of any Roblox class using ReflectionService. Returns all properties (with types), methods (with parameters), and events. ' +\r\n 'ALWAYS use this before creating or modifying GUI elements to know correct property names and types.',\r\n { className: z.string().describe('Roblox class name, e.g. \"Frame\", \"TextLabel\", \"Part\", \"MeshPart\"') },\r\n async ({ className }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<unknown>(CliMsg.GET_REFLECTION, { className });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'create_ui',\r\n 'Create an entire UI tree in one call. Pass a declarative JSON tree — ClassName, Name, properties, Children. ' +\r\n 'All types auto-coerced in Luau (UDim2, Color3, Font, enums). 10x faster than run_code. ' +\r\n 'UDim2: [xScale, xOffset, yScale, yOffset]. Color3: \"#hex\" or \"rgb(r,g,b)\". Font: \"GothamBold\". Enums: string names.',\r\n {\r\n parent: z.string().optional().describe('Parent: \"StarterGui\", \"PlayerGui\", or path. Default: StarterGui'),\r\n tree: z.record(z.unknown()).describe(\r\n 'Root UI node: {ClassName, Name, properties..., Children: [{...}, ...]}. ' +\r\n 'UDim2 as [xScale, xOffset, yScale, yOffset], Color3 as \"#hex\", Font as \"GothamBold\"',\r\n ),\r\n animate: z.boolean().optional().describe('If true, task.wait() will be injected between creation of nodes so that the UI writes out dynamically.'),\r\n },\r\n async ({ parent, tree, animate }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ success: boolean; path?: string; instanceCount?: number; error?: string }>(\r\n CliMsg.BUILD_UI, { parent: parent ?? 'StarterGui', tree, animate },\r\n );\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'run_tests',\r\n 'Run tests by requiring ModuleScripts matching test naming conventions (*.test, *.spec, *Test, *Spec). Lightweight — does not enter Run/Play mode.',\r\n { testName: z.string().optional().describe('Specific test name, or omit to run all') },\r\n async ({ testName }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ results: TestResultPayload[] }>(CliMsg.RUN_TESTS, {\r\n testName: testName ?? null,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'execute_run_test',\r\n 'Start a Run mode test session using StudioTestService:ExecuteRunModeAsync(). ' +\r\n 'This actually enters Run mode in Studio. Pass args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until EndTest() is called or the session stops. Returns the value from EndTest(). ' +\r\n 'Use for headless automated tests — no player, just server scripts.',\r\n { args: z.unknown().optional().describe('Arguments passed to the test session. Server scripts get this via StudioTestService:GetTestArgs()') },\r\n async ({ args }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<StudioTestResultPayload>(CliMsg.EXECUTE_RUN_TEST, { args: args ?? null }, 120_000);\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'execute_play_test',\r\n 'Start a solo Play mode test session using StudioTestService:ExecutePlayModeAsync(). ' +\r\n 'This enters Play mode with a player character. Pass args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until EndTest() is called or the session stops. Returns the value from EndTest(). ' +\r\n 'Use for tests needing a player character and full client-server simulation.',\r\n { args: z.unknown().optional().describe('Arguments passed to the test session. Server scripts get this via StudioTestService:GetTestArgs()') },\r\n async ({ args }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<StudioTestResultPayload>(CliMsg.EXECUTE_PLAY_TEST, { args: args ?? null }, 120_000);\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- Builder Tools ---\r\n\r\n mcp.tool(\r\n 'create_part',\r\n 'Create a Part with position, size, color, material — all in one call. Faster than insert_instance + set_properties.',\r\n {\r\n name: z.string().describe('Name for the part'),\r\n parent: z.string().optional().describe('Parent path (default: Workspace)'),\r\n shape: z.enum(['Block', 'Ball', 'Cylinder', 'Wedge', 'CornerWedge']).optional().describe('Part shape'),\r\n position: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('World position'),\r\n size: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('Size in studs'),\r\n color: z.string().optional().describe('Hex \"#00FF00\", BrickColor name, or \"rgb(0,255,0)\"'),\r\n material: z.string().optional().describe('Plastic, Wood, Grass, Neon, Metal, etc.'),\r\n transparency: z.number().optional().describe('0=opaque, 1=invisible'),\r\n anchored: z.boolean().optional().describe('Anchored (default: true)'),\r\n canCollide: z.boolean().optional().describe('Has collision'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const properties: Record<string, unknown> = {};\r\n if (params.position) properties.Position = { X: params.position.x, Y: params.position.y, Z: params.position.z };\r\n if (params.size) properties.Size = { X: params.size.x, Y: params.size.y, Z: params.size.z };\r\n if (params.color) {\r\n const c = params.color;\r\n if (c.startsWith('#')) properties.Color = c;\r\n else if (c.startsWith('rgb')) {\r\n const m = c.match(/(\\d+)/g);\r\n if (m && m.length >= 3) properties.Color = { red: parseInt(m[0]), green: parseInt(m[1]), blue: parseInt(m[2]) };\r\n } else properties.BrickColor = c;\r\n }\r\n if (params.material) properties.Material = params.material;\r\n if (params.transparency !== undefined) properties.Transparency = params.transparency;\r\n if (params.anchored !== undefined) properties.Anchored = params.anchored;\r\n else properties.Anchored = true;\r\n if (params.canCollide !== undefined) properties.CanCollide = params.canCollide;\r\n if (params.shape && params.shape !== 'Block') properties.Shape = params.shape;\r\n\r\n const className = params.shape === 'Wedge' ? 'WedgePart' : params.shape === 'CornerWedge' ? 'CornerWedgePart' : 'Part';\r\n\r\n const res = await bridge.sendRequest<{ success: boolean; path?: string; error?: string }>(CliMsg.INSERT_INSTANCE, {\r\n className,\r\n parentPath: params.parent ?? 'Workspace',\r\n name: params.name,\r\n properties,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'clone_instance',\r\n 'Clone an existing instance, optionally rename it, move it, or offset its position',\r\n {\r\n path: z.string().describe('Path of instance to clone'),\r\n newName: z.string().optional().describe('Name for the clone'),\r\n newParent: z.string().optional().describe('Parent path for the clone'),\r\n offset: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('Position offset from original'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const lines = [`local orig = ${resolvePath(params.path)}`, `local clone = orig:Clone()`];\r\n if (params.newName) lines.push(`clone.Name = ${luaStr(params.newName)}`);\r\n if (params.newParent) {\r\n lines.push(`clone.Parent = ${resolvePath(params.newParent)}`);\r\n } else {\r\n lines.push(`clone.Parent = orig.Parent`);\r\n }\r\n if (params.offset) {\r\n lines.push(`if clone:IsA(\"BasePart\") then`);\r\n lines.push(` clone.Position = clone.Position + Vector3.new(${params.offset.x}, ${params.offset.y}, ${params.offset.z})`);\r\n lines.push(`end`);\r\n }\r\n lines.push(`print(\"Cloned: \" .. clone:GetFullName())`);\r\n\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code: lines.join('\\n') });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'group_instances',\r\n 'Group multiple instances into a Model or Folder. All listed instances become children of the new group.',\r\n {\r\n paths: z.array(z.string()).describe('Array of instance paths to group'),\r\n groupName: z.string().describe('Name for the group'),\r\n groupClass: z.enum(['Model', 'Folder']).optional().describe('Container class (default: Model)'),\r\n parent: z.string().optional().describe('Parent path (default: Workspace)'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const gc = params.groupClass ?? 'Model';\r\n const parent = params.parent ?? 'Workspace';\r\n\r\n const code = [\r\n `local group = Instance.new(${luaStr(gc)})`,\r\n `group.Name = ${luaStr(params.groupName)}`,\r\n `group.Parent = ${resolvePath(parent)}`,\r\n ...params.paths.map((p) => `${resolvePath(p)}.Parent = group`),\r\n `print(\"Grouped ${params.paths.length} instances into: \" .. group:GetFullName())`,\r\n ].join('\\n');\r\n\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'build_multiple',\r\n 'Create many parts/instances in one batch. Send an array of specs — all created in a single round-trip. Ideal for building trees, houses, vehicles. Supports hex colors, rgb() colors, and BrickColor names.',\r\n {\r\n parts: z.array(z.object({\r\n name: z.string(),\r\n className: z.string().optional(),\r\n parent: z.string().optional(),\r\n position: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional(),\r\n size: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional(),\r\n color: z.string().optional().describe('Hex \"#RRGGBB\", \"rgb(r,g,b)\", or BrickColor name'),\r\n material: z.string().optional().describe('Enum.Material name: Plastic, Wood, Neon, Glass, etc.'),\r\n transparency: z.number().optional(),\r\n anchored: z.boolean().optional(),\r\n canCollide: z.boolean().optional(),\r\n shape: z.enum(['Block', 'Ball', 'Cylinder', 'Wedge']).optional(),\r\n })).describe('Array of part specifications'),\r\n groupName: z.string().optional().describe('Group all parts into a Model with this name'),\r\n groupParent: z.string().optional().describe('Parent for the group (default: Workspace)'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const parts = params.parts;\r\n const groupName = params.groupName;\r\n const groupParent = params.groupParent ?? 'Workspace';\r\n\r\n const lines: string[] = [];\r\n if (groupName) {\r\n lines.push(`local _group = Instance.new(\"Model\")`);\r\n lines.push(`_group.Name = ${luaStr(groupName)}`);\r\n lines.push(`_group.Parent = ${resolvePath(groupParent)}`);\r\n }\r\n for (let i = 0; i < parts.length; i++) {\r\n const p = parts[i];\r\n const v = `_p${i}`;\r\n const cn = p.className ?? (p.shape === 'Wedge' ? 'WedgePart' : 'Part');\r\n lines.push(`local ${v} = Instance.new(${luaStr(cn)})`);\r\n lines.push(`${v}.Name = ${luaStr(p.name)}`);\r\n if (p.position) lines.push(`${v}.Position = Vector3.new(${p.position.x}, ${p.position.y}, ${p.position.z})`);\r\n if (p.size) lines.push(`${v}.Size = Vector3.new(${p.size.x}, ${p.size.y}, ${p.size.z})`);\r\n if (p.color) {\r\n if (p.color.startsWith('#')) {\r\n lines.push(`${v}.Color = Color3.fromHex(${luaStr(p.color)})`);\r\n } else if (p.color.startsWith('rgb(')) {\r\n const m = p.color.match(/rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/);\r\n if (m) lines.push(`${v}.Color = Color3.fromRGB(${m[1]}, ${m[2]}, ${m[3]})`);\r\n } else {\r\n lines.push(`${v}.BrickColor = BrickColor.new(${luaStr(p.color)})`);\r\n }\r\n }\r\n if (p.material) lines.push(`${v}.Material = Enum.Material.${p.material}`);\r\n if (p.transparency !== undefined) lines.push(`${v}.Transparency = ${p.transparency}`);\r\n lines.push(`${v}.Anchored = ${p.anchored ?? true}`);\r\n if (p.canCollide !== undefined) lines.push(`${v}.CanCollide = ${p.canCollide}`);\r\n if (p.shape && p.shape !== 'Block' && cn === 'Part') lines.push(`${v}.Shape = Enum.PartType.${p.shape}`);\r\n lines.push(`${v}.Parent = ${groupName ? '_group' : resolvePath(p.parent ?? 'Workspace')}`);\r\n }\r\n lines.push(`print(\"Built ${parts.length} parts${groupName ? ` in ${groupName}` : ''}\")`);\r\n\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code: lines.join('\\n') });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- UI Serialization ---\r\n\r\n mcp.tool(\r\n 'serialize_ui',\r\n 'Serialize an existing Roblox UI tree into a compact, create_ui-compatible JSON tree. ' +\r\n 'This is the reverse of create_ui — reads any GUI instance and returns a declarative JSON tree ' +\r\n 'with ClassName, Name, non-default properties (Color3 as hex, UDim2 as arrays, etc.), and Children. ' +\r\n 'Perfect for: converting existing UI to Roact/React components, cloning/templating, understanding UI structure, ' +\r\n 'or refactoring. Use this INSTEAD of get_descendants_properties when you need to recreate or convert UI.',\r\n {\r\n path: z.string().describe('Instance path to serialize (e.g. \"StarterGui.MyScreenGui\")'),\r\n maxDepth: z.number().optional().default(50).describe('Maximum tree depth (default 50)'),\r\n },\r\n async ({ path, maxDepth }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ success: boolean; tree?: unknown; error?: string }>(\r\n CliMsg.SERIALIZE_UI, { path, maxDepth }, 1000 * 60 * 2,\r\n );\r\n if (!res.payload.success) {\r\n return { content: [{ type: 'text' as const, text: `Error: ${res.payload.error ?? 'Serialization failed'}` }] };\r\n }\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload.tree, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- Composite Skill Tools ---\r\n // Higher-level tools that combine multiple operations into a single call.\r\n // These prevent LLMs from falling back to run_code for common workflows.\r\n\r\n mcp.tool(\r\n 'inspect_selection',\r\n 'Inspect the user\\'s current selection in Roblox Studio. Returns the selected instance paths AND their properties (compact) in a single call. ' +\r\n 'Use this FIRST when the user says \"my selection\", \"what I selected\", or \"the selected thing\". ' +\r\n 'Much better than calling get_selection + get_properties separately.',\r\n {},\r\n async () => {\r\n assertConnected();\r\n // Step 1: get selection\r\n const selRes = await bridge.sendRequest<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n const paths: string[] = selRes.payload?.paths ?? [];\r\n if (paths.length === 0) {\r\n return { content: [{ type: 'text' as const, text: 'No instances selected in Studio.' }] };\r\n }\r\n\r\n // Step 2: get compact properties for each selected instance\r\n const results: Record<string, unknown> = {};\r\n for (const p of paths.slice(0, 10)) { // cap at 10 to avoid huge payloads\r\n try {\r\n const propRes = await bridge.sendRequest<{ properties?: PropertyEntry[]; error?: string }>(\r\n CliMsg.GET_PROPERTIES, { path: p, compact: true },\r\n );\r\n results[p] = propRes.payload.properties ?? propRes.payload;\r\n } catch {\r\n results[p] = { error: 'Failed to read properties' };\r\n }\r\n }\r\n if (paths.length > 10) {\r\n results['_truncated'] = `${paths.length - 10} more instances not shown`;\r\n }\r\n\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(results, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'inspect_instance',\r\n 'Inspect a single instance: returns its compact properties AND its children tree in one call. ' +\r\n 'Combines get_properties + get_explorer into a single round-trip. ' +\r\n 'Use when you need to understand an instance and its subtree.',\r\n {\r\n path: z.string().describe('Full instance path (e.g. \"Workspace.MyModel\")'),\r\n childDepth: z.number().optional().default(2).describe('How deep to show the children tree (default 2)'),\r\n },\r\n async ({ path, childDepth }) => {\r\n assertConnected();\r\n // Parallel: get properties + get children tree\r\n const [propRes, treeRes] = await Promise.all([\r\n bridge.sendRequest<{ properties?: PropertyEntry[]; error?: string }>(\r\n CliMsg.GET_PROPERTIES, { path, compact: true },\r\n ),\r\n bridge.sendRequest<{ tree?: ExplorerNode; error?: string }>(\r\n CliMsg.GET_EXPLORER, { rootPath: path, maxDepth: childDepth ?? 2 },\r\n ),\r\n ]);\r\n\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({\r\n properties: propRes.payload.properties ?? propRes.payload,\r\n children: treeRes.payload.tree ?? treeRes.payload,\r\n }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'convert_ui_to_code',\r\n 'Convert an existing Roblox UI tree into Roact/React-lua component code. ' +\r\n 'Serializes the UI at the given path, then generates a ready-to-use Luau component. ' +\r\n 'Use when the user asks to \"turn this into a component\", \"convert to React\", or \"make a Roact version\".',\r\n {\r\n path: z.string().describe('Path to the UI instance to convert (e.g. \"StarterGui.MyScreenGui.MainFrame\")'),\r\n framework: z.enum(['roact', 'react']).optional().default('react').describe('Target framework: \"roact\" (legacy) or \"react\" (react-lua, default)'),\r\n componentName: z.string().optional().describe('Name for the generated component (defaults to instance Name)'),\r\n },\r\n async ({ path, framework, componentName }) => {\r\n assertConnected();\r\n // Step 1: serialize the UI tree\r\n const res = await bridge.sendRequest<{ success: boolean; tree?: Record<string, unknown>; error?: string }>(\r\n CliMsg.SERIALIZE_UI, { path, maxDepth: 50 }, 1000 * 60 * 2,\r\n );\r\n if (!res.payload.success || !res.payload.tree) {\r\n return { content: [{ type: 'text' as const, text: `Error serializing UI: ${res.payload.error ?? 'Unknown error'}` }] };\r\n }\r\n\r\n const tree = res.payload.tree;\r\n const name = componentName || (tree.Name as string) || 'GeneratedComponent';\r\n const fw = framework || 'react';\r\n\r\n // Step 2: generate code from the serialized tree\r\n const code = generateComponentCode(tree, name, fw);\r\n return { content: [{ type: 'text' as const, text: code }] };\r\n },\r\n );\r\n\r\n // --- Connection Management Tools ---\r\n\r\n mcp.tool(\r\n 'list_connections',\r\n 'List all Roblox Studio instances currently connected to Dominus. Shows placeId, placeName, and connection time for each. Use this when working with multiple Studio windows.',\r\n {},\r\n async () => {\r\n const connections = bridge.listConnections();\r\n const activePlaceId = bridge.getActivePlaceId();\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({\r\n activePlaceId: activePlaceId || 'auto',\r\n connections: connections.map(c => ({\r\n ...c,\r\n active: activePlaceId === 0 && connections.length === 1 ? true\r\n : c.placeId === activePlaceId,\r\n })),\r\n }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'set_active_place',\r\n 'Set which Roblox Studio instance to target when multiple are connected. Pass placeId=0 to reset to auto mode (works when only one is connected). ' +\r\n 'Call list_connections first to see available placeIds.',\r\n {\r\n placeId: z.number().describe('The placeId to target. Use 0 to reset to auto-select.'),\r\n },\r\n async ({ placeId }) => {\r\n const connections = bridge.listConnections();\r\n if (placeId !== 0 && !connections.some(c => c.placeId === placeId)) {\r\n const available = connections.map(c => `${c.placeName ?? 'Unknown'} (${c.placeId})`).join(', ');\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: `Place ${placeId} is not connected. Available: ${available || 'none'}`,\r\n }],\r\n };\r\n }\r\n bridge.setActivePlaceId(placeId);\r\n if (placeId === 0) {\r\n return { content: [{ type: 'text' as const, text: 'Active place reset to auto-select.' }] };\r\n }\r\n const target = connections.find(c => c.placeId === placeId);\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: `Active place set to ${target?.placeName ?? 'Unknown'} (${placeId})`,\r\n }],\r\n };\r\n },\r\n );\r\n\r\n // --- Memory Tools ---\r\n\r\n mcp.tool(\r\n 'recall_memory',\r\n 'Search persistent memory for facts about the current Roblox project',\r\n { query: z.string().describe('What to search for') },\r\n async ({ query }) => {\r\n const facts = recallFacts('current', query, 15);\r\n const scripts = getScriptIndex('current');\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({ facts: facts.map(f => f.content), scriptIndex: scripts }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'remember',\r\n 'Store a fact about the project in persistent memory for future sessions',\r\n {\r\n fact: z.string().describe('The fact to remember'),\r\n category: z.enum(['architecture', 'pattern', 'preference', 'bug', 'api', 'general']).describe('Category'),\r\n },\r\n async ({ fact, category }) => {\r\n const now = Date.now();\r\n storeFact({ projectId: 'current', content: fact, category, source: 'mcp', relevance: 1.0, createdAt: now, accessedAt: now });\r\n return { content: [{ type: 'text' as const, text: `Remembered: ${fact}` }] };\r\n },\r\n );\r\n\r\n // --- Resources ---\r\n\r\n mcp.resource(\r\n 'studio://status',\r\n 'studio://status',\r\n async () => {\r\n const info = bridge.getConnectionInfo();\r\n return {\r\n contents: [{\r\n uri: 'studio://status',\r\n text: JSON.stringify({\r\n connected: bridge.isConnected(),\r\n placeName: info?.placeName,\r\n placeId: info?.placeId,\r\n studioVersion: info?.studioVersion,\r\n port: bridge.getPort(),\r\n }, null, 2),\r\n mimeType: 'application/json',\r\n }],\r\n };\r\n },\r\n );\r\n\r\n // Start the MCP server on stdio\r\n const transport = new StdioServerTransport();\r\n await mcp.connect(transport);\r\n}\r\n\r\nfunction assertConnected(): void {\r\n if (!bridge.isConnected()) {\r\n throw new Error(\r\n 'Roblox Studio is not connected. Open Studio and click the Dominus plugin Connect button.',\r\n );\r\n }\r\n}\r\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nconst CROWN_ART = ` ◆ ◆ ◆\n ╔█╗ ╔█╗ ╔█╗\n ║█║ ║█║ ║█║\n ╚█╚═════╝█╚═════╝█╝\n ╚═══════════════╝`;\n\nfunction getGreeting(name: string): string {\n const hour = new Date().getHours();\n if (hour >= 5 && hour < 12) return `Good morning ${name}!`;\n if (hour >= 12 && hour < 17) return `Good afternoon ${name}!`;\n if (hour >= 17 && hour < 21) return `Good evening ${name}!`;\n return `Burning the midnight oil, ${name}!`;\n}\n\ninterface WelcomeProps {\n userName: string;\n version: string;\n model: string;\n provider: string;\n port: number;\n hasApiKey: boolean;\n connected: boolean;\n cwd: string;\n}\n\nexport const Welcome: React.FC<WelcomeProps> = React.memo(({\n userName,\n version,\n model,\n provider,\n port,\n hasApiKey,\n connected,\n cwd,\n}) => {\n const greeting = getGreeting(userName);\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {/* Header */}\n <Box\n borderStyle=\"round\"\n borderColor=\"magenta\"\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text bold color=\"magenta\">\n Dominus v{version}\n </Text>\n <Text dimColor>AI-Powered Roblox Studio Agent</Text>\n </Box>\n\n {/* Main content: two columns */}\n <Box>\n {/* Left column: greeting + mascot */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n width=\"50%\"\n >\n <Text bold color=\"cyan\">\n {greeting}\n </Text>\n <Text> </Text>\n\n {CROWN_ART.split('\\n').map((line, i) => (\n <Text key={i} color=\"yellow\">\n {line}\n </Text>\n ))}\n\n <Text> </Text>\n <Text dimColor>\n {provider} · {model || 'no model set'}\n </Text>\n <Text dimColor>{cwd}</Text>\n </Box>\n\n {/* Right column: tips or setup */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n width=\"50%\"\n >\n {hasApiKey ? (\n <>\n <Text bold color=\"yellow\">\n Tips for getting started\n </Text>\n <Text>\n Just type a message to chat with the AI agent\n </Text>\n <Text>\n Use <Text color=\"cyan\">/help</Text> to see all commands\n </Text>\n <Text>\n Use <Text color=\"cyan\">/run {'<code>'}</Text> to execute Luau in Studio\n </Text>\n <Text> </Text>\n <Text bold color=\"yellow\">\n Studio connection\n </Text>\n {connected ? (\n <Text color=\"green\">● Connected to Roblox Studio</Text>\n ) : (\n <>\n <Text color=\"red\">○ Waiting for Studio plugin...</Text>\n <Text dimColor>WebSocket server on port {port}</Text>\n <Text dimColor>\n Run <Text color=\"cyan\">dominus install-plugin</Text> if needed\n </Text>\n </>\n )}\n </>\n ) : (\n <>\n <Text bold color=\"yellow\">\n Setup — pick any provider\n </Text>\n <Text> </Text>\n <Text>\n <Text color=\"green\" bold>OpenAI </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">OPENAI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Anthropic </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">ANTHROPIC_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Gemini </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">GEMINI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Grok (xAI) </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">XAI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>OpenRouter </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">OPENROUTER_API_KEY</Text>\n </Text>\n <Text> </Text>\n <Text dimColor>Or configure manually:</Text>\n <Text>\n <Text color=\"cyan\">dominus config set provider openai</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">dominus config set apiKey sk-...</Text>\n </Text>\n </>\n )}\n </Box>\n </Box>\n </Box>\n );\n});\n","import React, { useState } from 'react';\r\nimport { Box, Text, useInput } from 'ink';\r\nimport TextInput from 'ink-text-input';\r\nimport { PROVIDERS, type AIProviderType } from '../../config/config.js';\r\n\r\ninterface SetupProps {\r\n onComplete: (provider: AIProviderType, apiKey: string) => void;\r\n}\r\n\r\nconst PROVIDER_OPTIONS: { key: AIProviderType; label: string; hint: string }[] = [\r\n { key: 'openai', label: 'OpenAI', hint: 'GPT-5.3, GPT-5.2, o3-mini' },\r\n { key: 'anthropic', label: 'Anthropic', hint: 'Claude Opus 4-6, Sonnet 4-6' },\r\n { key: 'gemini', label: 'Google Gemini', hint: 'Gemini 3.1 Pro, 2.0 Flash' },\r\n { key: 'xai', label: 'xAI (Grok)', hint: 'Grok 4.2, Grok 3' },\r\n { key: 'openrouter', label: 'OpenRouter', hint: '300+ models, one key' },\r\n];\r\n\r\nexport const Setup: React.FC<SetupProps> = ({ onComplete }) => {\r\n const [step, setStep] = useState<'provider' | 'key'>('provider');\r\n const [selectedIdx, setSelectedIdx] = useState(0);\r\n const [selectedProvider, setSelectedProvider] = useState<AIProviderType>('openai');\r\n const [apiKey, setApiKey] = useState('');\r\n\r\n useInput((input, key) => {\r\n if (step !== 'provider') return;\r\n\r\n if (key.upArrow) {\r\n setSelectedIdx((prev) => Math.max(0, prev - 1));\r\n } else if (key.downArrow) {\r\n setSelectedIdx((prev) => Math.min(PROVIDER_OPTIONS.length - 1, prev + 1));\r\n } else if (key.return) {\r\n setSelectedProvider(PROVIDER_OPTIONS[selectedIdx].key);\r\n setStep('key');\r\n }\r\n });\r\n\r\n const handleKeySubmit = (value: string) => {\r\n const trimmed = value.trim();\r\n if (trimmed) {\r\n onComplete(selectedProvider, trimmed);\r\n }\r\n };\r\n\r\n const providerInfo = PROVIDERS[selectedProvider];\r\n\r\n return (\r\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\r\n <Text bold color=\"magenta\">\r\n ◆ Dominus — First Time Setup\r\n </Text>\r\n <Text> </Text>\r\n\r\n {step === 'provider' && (\r\n <>\r\n <Text bold>Select your AI provider:</Text>\r\n <Text> </Text>\r\n {PROVIDER_OPTIONS.map((opt, i) => (\r\n <Box key={opt.key}>\r\n <Text color={i === selectedIdx ? 'cyan' : undefined} bold={i === selectedIdx}>\r\n {i === selectedIdx ? ' ❯ ' : ' '}\r\n {opt.label}\r\n </Text>\r\n <Text dimColor> {opt.hint}</Text>\r\n </Box>\r\n ))}\r\n <Text> </Text>\r\n <Text dimColor>↑/↓ to select, Enter to confirm</Text>\r\n </>\r\n )}\r\n\r\n {step === 'key' && (\r\n <>\r\n <Text>\r\n Provider: <Text color=\"cyan\" bold>{PROVIDERS[selectedProvider].name}</Text>\r\n </Text>\r\n <Text>\r\n Default model: <Text color=\"green\">{providerInfo.defaultModel}</Text>\r\n </Text>\r\n <Text> </Text>\r\n <Text bold>Enter your API key:</Text>\r\n <Text dimColor>\r\n Get one from your provider's dashboard\r\n </Text>\r\n <Text> </Text>\r\n <Box>\r\n <Text color=\"cyan\">❯ </Text>\r\n <TextInput\r\n value={apiKey}\r\n onChange={setApiKey}\r\n onSubmit={handleKeySubmit}\r\n mask=\"*\"\r\n placeholder=\"sk-...\"\r\n />\r\n </Box>\r\n </>\r\n )}\r\n </Box>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\ninterface StatusBarProps {\r\n connected: boolean;\r\n placeName?: string;\r\n connectionCount?: number;\r\n model: string;\r\n sessionTokens?: number;\r\n}\r\n\r\nexport const StatusBar: React.FC<StatusBarProps> = React.memo(({\r\n connected,\r\n placeName,\r\n connectionCount,\r\n model,\r\n sessionTokens,\r\n}) => {\r\n const statusColor = connected ? 'green' : 'red';\r\n const count = connectionCount ?? (connected ? 1 : 0);\r\n let statusText: string;\r\n if (!connected) {\r\n statusText = '○ Disconnected';\r\n } else if (count > 1) {\r\n statusText = `● ${count} Studios${placeName ? ` — active: ${placeName}` : ''}`;\r\n } else {\r\n statusText = `● Connected${placeName ? ` — ${placeName}` : ''}`;\r\n }\r\n const shortModel = model.split('/').pop() ?? model;\r\n\r\n return (\r\n <Box\r\n borderStyle=\"single\"\r\n borderColor=\"gray\"\r\n paddingX={1}\r\n justifyContent=\"space-between\"\r\n width=\"100%\"\r\n >\r\n <Box gap={2}>\r\n <Text bold color=\"magenta\">\r\n DOMINUS\r\n </Text>\r\n <Text color={statusColor}>{statusText}</Text>\r\n </Box>\r\n <Box gap={2}>\r\n {sessionTokens !== undefined && (\r\n <Text dimColor>~{Math.round(sessionTokens / 1000)}k tokens</Text>\r\n )}\r\n <Text color=\"cyan\">{shortModel}</Text>\r\n <Text dimColor>Ctrl+C to quit</Text>\r\n </Box>\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\nexport interface OutputEntry {\r\n message: string;\r\n level: 'info' | 'warn' | 'error';\r\n timestamp: number;\r\n source?: string;\r\n}\r\n\r\ninterface OutputPaneProps {\r\n entries: OutputEntry[];\r\n maxLines?: number;\r\n}\r\n\r\nfunction formatTime(ts: number): string {\r\n const d = new Date(ts);\r\n return d.toLocaleTimeString('en-US', { hour12: false });\r\n}\r\n\r\nconst LEVEL_COLORS: Record<string, string> = {\r\n info: 'white',\r\n warn: 'yellow',\r\n error: 'red',\r\n};\r\n\r\nconst LEVEL_ICONS: Record<string, string> = {\r\n info: '│',\r\n warn: '⚠',\r\n error: '✖',\r\n};\r\n\r\nexport const OutputPane: React.FC<OutputPaneProps> = React.memo(({ entries, maxLines = 10 }) => {\r\n const visible = entries.slice(-maxLines);\r\n\r\n return (\r\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\r\n <Text bold dimColor>\r\n Output\r\n </Text>\r\n {visible.length === 0 ? (\r\n <Text dimColor italic>\r\n Waiting for Studio output...\r\n </Text>\r\n ) : (\r\n visible.map((entry, i) => (\r\n <Text key={i} color={LEVEL_COLORS[entry.level] ?? 'white'}>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>{' '}\r\n <Text>{LEVEL_ICONS[entry.level] ?? '│'}</Text> {entry.message}\r\n </Text>\r\n ))\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\nexport interface ChatEntry {\r\n role: 'user' | 'assistant' | 'tool' | 'error' | 'system';\r\n content: string;\r\n toolName?: string;\r\n timestamp: number;\r\n}\r\n\r\ninterface ChatPaneProps {\r\n entries: ChatEntry[];\r\n streaming?: string;\r\n maxLines?: number;\r\n}\r\n\r\nfunction formatTime(ts: number): string {\r\n const d = new Date(ts);\r\n return d.toLocaleTimeString('en-US', { hour12: false });\r\n}\r\n\r\nexport const ChatPane: React.FC<ChatPaneProps> = React.memo(({ entries, streaming, maxLines = 20 }) => {\r\n const visible = entries.slice(-maxLines);\r\n\r\n return (\r\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\r\n {visible.map((entry, i) => (\r\n <Box key={i} flexDirection=\"column\" marginBottom={entry.role === 'user' ? 1 : 0}>\r\n {entry.role === 'user' && (\r\n <Box>\r\n <Text color=\"cyan\" bold>\r\n You{' '}\r\n </Text>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>\r\n </Box>\r\n )}\r\n {entry.role === 'assistant' && (\r\n <Box>\r\n <Text color=\"magenta\" bold>\r\n Dominus{' '}\r\n </Text>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>\r\n </Box>\r\n )}\r\n {entry.role === 'tool' && (\r\n <Text color=\"yellow\">\r\n ⚡ {entry.toolName ?? 'tool'}: {entry.content}\r\n </Text>\r\n )}\r\n {entry.role === 'system' && (\r\n <Text color=\"yellow\" bold>Dominus </Text>\r\n )}\r\n {entry.role === 'error' && (\r\n <Text color=\"red\">✖ Error: {entry.content}</Text>\r\n )}\r\n {(entry.role === 'user' || entry.role === 'assistant' || entry.role === 'system') && (\r\n <Text wrap=\"wrap\">{entry.content}</Text>\r\n )}\r\n </Box>\r\n ))}\r\n\r\n {streaming && (\r\n <Box flexDirection=\"column\">\r\n <Box>\r\n <Text color=\"magenta\" bold>\r\n Dominus{' '}\r\n </Text>\r\n <Text dimColor>(typing...)</Text>\r\n </Box>\r\n <Text wrap=\"wrap\">{streaming}</Text>\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import { execSync } from 'node:child_process';\r\nimport { tmpdir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { readFileSync, unlinkSync, existsSync } from 'node:fs';\r\nimport { randomBytes } from 'node:crypto';\r\n\r\nexport interface ClipboardImage {\r\n base64: string;\r\n mimeType: 'image/png';\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nconst PS_SCRIPT = `\r\nAdd-Type -AssemblyName System.Windows.Forms\r\n$img = [System.Windows.Forms.Clipboard]::GetImage()\r\nif ($img -eq $null) { exit 1 }\r\n$path = $args[0]\r\n$img.Save($path, [System.Drawing.Imaging.ImageFormat]::Png)\r\n$img.Dispose()\r\nWrite-Host \"$($img.Width)x$($img.Height)\"\r\n`;\r\n\r\nexport function getClipboardImage(): ClipboardImage | null {\r\n if (process.platform !== 'win32') {\r\n return getClipboardImageUnix();\r\n }\r\n\r\n const tmpPath = join(tmpdir(), `dominus-clip-${randomBytes(4).toString('hex')}.png`);\r\n\r\n try {\r\n execSync(\r\n `powershell -NoProfile -Command \"Add-Type -AssemblyName System.Windows.Forms; $img = [System.Windows.Forms.Clipboard]::GetImage(); if ($img -eq $null) { exit 1 }; $img.Save('${tmpPath.replace(/'/g, \"''\")}', [System.Drawing.Imaging.ImageFormat]::Png); $img.Dispose()\"`,\r\n { stdio: 'pipe', timeout: 5000 },\r\n );\r\n\r\n if (!existsSync(tmpPath)) return null;\r\n\r\n const buffer = readFileSync(tmpPath);\r\n unlinkSync(tmpPath);\r\n\r\n if (buffer.length < 100) return null;\r\n\r\n return {\r\n base64: buffer.toString('base64'),\r\n mimeType: 'image/png',\r\n };\r\n } catch {\r\n try { if (existsSync(tmpPath)) unlinkSync(tmpPath); } catch { /* ignore */ }\r\n return null;\r\n }\r\n}\r\n\r\nfunction getClipboardImageUnix(): ClipboardImage | null {\r\n const tmpPath = join(tmpdir(), `dominus-clip-${randomBytes(4).toString('hex')}.png`);\r\n\r\n try {\r\n if (process.platform === 'darwin') {\r\n execSync(`osascript -e 'set png to (the clipboard as «class PNGf»)' -e 'set f to open for access POSIX file \"${tmpPath}\" with write permission' -e 'write png to f' -e 'close access f'`, { stdio: 'pipe', timeout: 5000 });\r\n } else {\r\n execSync(`xclip -selection clipboard -t image/png -o > \"${tmpPath}\"`, { stdio: 'pipe', timeout: 5000 });\r\n }\r\n\r\n if (!existsSync(tmpPath)) return null;\r\n\r\n const buffer = readFileSync(tmpPath);\r\n unlinkSync(tmpPath);\r\n\r\n if (buffer.length < 100) return null;\r\n\r\n return {\r\n base64: buffer.toString('base64'),\r\n mimeType: 'image/png',\r\n };\r\n } catch {\r\n try { if (existsSync(tmpPath)) unlinkSync(tmpPath); } catch { /* ignore */ }\r\n return null;\r\n }\r\n}\r\n","import React, { useState, useMemo, useRef, useCallback, useEffect } from 'react';\r\nimport { Box, Text, useInput } from 'ink';\r\nimport TextInput from 'ink-text-input';\r\nimport { getClipboardImage } from '../../utils/clipboard.js';\r\n\r\ninterface CommandSuggestion {\r\n command: string;\r\n description: string;\r\n}\r\n\r\nconst COMMANDS: CommandSuggestion[] = [\r\n { command: '/help', description: 'Show help and available commands' },\r\n { command: '/model', description: 'Switch the AI model' },\r\n { command: '/models', description: 'List all available models from your provider' },\r\n { command: '/status', description: 'Show connection and config status' },\r\n { command: '/clear', description: 'Clear chat history' },\r\n { command: '/paste', description: 'Paste image from clipboard (or Alt+V)' },\r\n];\r\n\r\nexport interface ImageAttachment {\r\n base64: string;\r\n mimeType: 'image/png';\r\n}\r\n\r\ninterface InputBarProps {\r\n onSubmit: (text: string, image?: ImageAttachment) => void;\r\n onImagePaste?: (image: ImageAttachment) => void;\r\n isProcessing: boolean;\r\n placeholder?: string;\r\n imageAttached?: boolean;\r\n onClearImage?: () => void;\r\n}\r\n\r\nconst SuggestionBox: React.FC<{ suggestions: CommandSuggestion[]; selectedIdx: number }> = React.memo(\r\n ({ suggestions, selectedIdx }) => (\r\n <Box flexDirection=\"column\" paddingX={1} borderStyle=\"single\" borderColor=\"gray\">\r\n {suggestions.map((s, i) => (\r\n <Box key={s.command}>\r\n <Text color={i === selectedIdx ? 'cyan' : undefined} bold={i === selectedIdx}>\r\n {i === selectedIdx ? '❯ ' : ' '}\r\n </Text>\r\n <Text color={i === selectedIdx ? 'cyan' : 'white'} bold={i === selectedIdx}>\r\n {s.command.padEnd(16)}\r\n </Text>\r\n <Text dimColor>{s.description}</Text>\r\n </Box>\r\n ))}\r\n <Text dimColor> ↑↓ navigate · Tab complete · Enter select</Text>\r\n </Box>\r\n ),\r\n);\r\n\r\nexport const InputBar: React.FC<InputBarProps> = React.memo(({\r\n onSubmit,\r\n onImagePaste,\r\n isProcessing,\r\n placeholder = 'Ask Dominus anything, or /help for commands...',\r\n imageAttached,\r\n onClearImage,\r\n}) => {\r\n const [value, setValue] = useState('');\r\n const [selectedIdx, setSelectedIdx] = useState(0);\r\n const [pasteStatus, setPasteStatus] = useState<'none' | 'checking' | 'no_image'>('none');\r\n const valueRef = useRef(value);\r\n valueRef.current = value;\r\n\r\n const suggestions = useMemo(() => {\r\n if (!value.startsWith('/') || value.includes(' ')) return [];\r\n const query = value.toLowerCase();\r\n return COMMANDS.filter((c) => c.command.startsWith(query));\r\n }, [value]);\r\n\r\n const showSuggestions = suggestions.length > 0 && value.length > 0;\r\n\r\n const tryPasteImage = useCallback(() => {\r\n if (!onImagePaste) return false;\r\n setPasteStatus('checking');\r\n try {\r\n const img = getClipboardImage();\r\n if (img) {\r\n onImagePaste(img);\r\n setPasteStatus('none');\r\n return true;\r\n }\r\n } catch { /* ignore */ }\r\n setPasteStatus('no_image');\r\n setTimeout(() => setPasteStatus('none'), 2000);\r\n return false;\r\n }, [onImagePaste]);\r\n\r\n // Listen for raw stdin to catch Alt+V and Ctrl+V\r\n useEffect(() => {\r\n const handler = (data: Buffer) => {\r\n if (isProcessing) return;\r\n const str = data.toString();\r\n // Alt+V: ESC + v (0x1B 0x76)\r\n if (str === '\\x1bv' || str === '\\x1bV') {\r\n tryPasteImage();\r\n return;\r\n }\r\n // Ctrl+V: 0x16 (works if terminal doesn't intercept it)\r\n if (str === '\\x16') {\r\n tryPasteImage();\r\n return;\r\n }\r\n };\r\n process.stdin.on('data', handler);\r\n return () => { process.stdin.off('data', handler); };\r\n }, [isProcessing, tryPasteImage]);\r\n\r\n useInput((_input, key) => {\r\n if (isProcessing) return;\r\n\r\n if (!showSuggestions) return;\r\n\r\n if (key.upArrow) {\r\n setSelectedIdx((prev) => Math.max(0, prev - 1));\r\n } else if (key.downArrow) {\r\n setSelectedIdx((prev) => Math.min(suggestions.length - 1, prev + 1));\r\n } else if (key.tab) {\r\n const selected = suggestions[selectedIdx];\r\n if (selected) {\r\n setValue(selected.command + ' ');\r\n setSelectedIdx(0);\r\n }\r\n }\r\n });\r\n\r\n const handleChange = useCallback((v: string) => {\r\n setValue(v);\r\n setSelectedIdx(0);\r\n }, []);\r\n\r\n const handleSubmit = useCallback((text: string) => {\r\n if (isProcessing) return;\r\n\r\n // /paste command\r\n if (text.trim().toLowerCase() === '/paste') {\r\n tryPasteImage();\r\n setValue('');\r\n return;\r\n }\r\n\r\n const currentValue = valueRef.current;\r\n const currentSuggestions = COMMANDS.filter(\r\n (c) => currentValue.startsWith('/') && !currentValue.includes(' ') && c.command.startsWith(currentValue.toLowerCase()),\r\n );\r\n const hasSuggestions = currentSuggestions.length > 0 && currentValue.length > 0;\r\n\r\n if (hasSuggestions) {\r\n const cmd = currentSuggestions[0]?.command;\r\n if (cmd && currentValue !== cmd && !currentValue.includes(' ')) {\r\n const noArgCmds = ['/clear', '/help', '/status', '/models', '/paste'];\r\n setValue(cmd + (noArgCmds.includes(cmd) ? '' : ' '));\r\n setSelectedIdx(0);\r\n return;\r\n }\r\n }\r\n\r\n if (text.trim()) {\r\n onSubmit(text.trim());\r\n setValue('');\r\n setSelectedIdx(0);\r\n }\r\n }, [isProcessing, onSubmit, tryPasteImage]);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n {showSuggestions && (\r\n <SuggestionBox suggestions={suggestions} selectedIdx={selectedIdx} />\r\n )}\r\n\r\n {imageAttached && (\r\n <Box paddingX={1} gap={1}>\r\n <Text color=\"green\" bold>[image 1]</Text>\r\n <Text dimColor>pasted — send a message to use it</Text>\r\n </Box>\r\n )}\r\n\r\n {pasteStatus === 'checking' && (\r\n <Box paddingX={1}>\r\n <Text color=\"yellow\">Checking clipboard...</Text>\r\n </Box>\r\n )}\r\n\r\n {pasteStatus === 'no_image' && (\r\n <Box paddingX={1}>\r\n <Text color=\"red\">No image found in clipboard. Copy an image first (screenshot, snipping tool, etc.)</Text>\r\n </Box>\r\n )}\r\n\r\n <Box borderStyle=\"single\" borderColor={isProcessing ? 'yellow' : imageAttached ? 'green' : 'cyan'} paddingX={1}>\r\n <Text color={isProcessing ? 'yellow' : 'cyan'} bold>\r\n {isProcessing ? '⟳ ' : imageAttached ? '📎 ' : '❯ '}\r\n </Text>\r\n {isProcessing ? (\r\n <Text dimColor>Processing...</Text>\r\n ) : (\r\n <TextInput\r\n value={value}\r\n onChange={handleChange}\r\n onSubmit={handleSubmit}\r\n placeholder={imageAttached ? 'Describe what you want (image attached)...' : placeholder}\r\n />\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\nconst CLASS_ICONS: Record<string, string> = {\r\n Workspace: '🌍',\r\n ServerScriptService: '⚙️',\r\n ReplicatedStorage: '📦',\r\n ReplicatedFirst: '🚀',\r\n StarterGui: '🖥️',\r\n StarterPack: '🎒',\r\n StarterPlayer: '🧑',\r\n Players: '👥',\r\n Lighting: '💡',\r\n SoundService: '🔊',\r\n Script: '📜',\r\n LocalScript: '📱',\r\n ModuleScript: '📘',\r\n Part: '🧱',\r\n Model: '📐',\r\n Folder: '📁',\r\n RemoteEvent: '📡',\r\n RemoteFunction: '📡',\r\n BindableEvent: '🔗',\r\n};\r\n\r\nfunction getIcon(className: string): string {\r\n return CLASS_ICONS[className] ?? '◇';\r\n}\r\n\r\ninterface ExplorerPaneProps {\r\n tree: ExplorerNode[];\r\n selectedPath?: string;\r\n maxDepth?: number;\r\n}\r\n\r\nconst TreeNode: React.FC<{\r\n node: ExplorerNode;\r\n depth: number;\r\n maxDepth: number;\r\n selectedPath?: string;\r\n}> = ({ node, depth, maxDepth, selectedPath }) => {\r\n const indent = ' '.repeat(depth);\r\n const isSelected = node.path === selectedPath;\r\n const hasChildren = node.children && node.children.length > 0;\r\n const icon = getIcon(node.className);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text>\r\n <Text dimColor>{indent}</Text>\r\n <Text>{hasChildren ? '▾ ' : ' '}</Text>\r\n <Text>{icon} </Text>\r\n <Text bold={isSelected} color={isSelected ? 'cyan' : undefined}>\r\n {node.name}\r\n </Text>\r\n <Text dimColor> ({node.className})</Text>\r\n </Text>\r\n {hasChildren &&\r\n depth < maxDepth &&\r\n node.children!.map((child, i) => (\r\n <TreeNode\r\n key={`${child.path}-${i}`}\r\n node={child}\r\n depth={depth + 1}\r\n maxDepth={maxDepth}\r\n selectedPath={selectedPath}\r\n />\r\n ))}\r\n </Box>\r\n );\r\n};\r\n\r\nexport const ExplorerPane: React.FC<ExplorerPaneProps> = React.memo(({\r\n tree,\r\n selectedPath,\r\n maxDepth = 4,\r\n}) => {\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n borderStyle=\"single\"\r\n borderColor=\"gray\"\r\n paddingX={1}\r\n width={36}\r\n minWidth={30}\r\n >\r\n <Text bold dimColor>\r\n Explorer\r\n </Text>\r\n {tree.length === 0 ? (\r\n <Text dimColor italic>\r\n Connect Studio plugin...\r\n </Text>\r\n ) : (\r\n tree.map((node, i) => (\r\n <TreeNode\r\n key={`${node.path}-${i}`}\r\n node={node}\r\n depth={0}\r\n maxDepth={maxDepth}\r\n selectedPath={selectedPath}\r\n />\r\n ))\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport Spinner from 'ink-spinner';\r\nimport type { ToolResult } from '../../tools/types.js';\r\n\r\nexport interface ToolCallEntry {\r\n name: string;\r\n args: Record<string, unknown>;\r\n result?: ToolResult;\r\n status: 'running' | 'done' | 'error';\r\n}\r\n\r\ninterface ToolCallViewProps {\r\n calls: ToolCallEntry[];\r\n}\r\n\r\nfunction summarizeArgs(args: Record<string, unknown>): string {\r\n const parts: string[] = [];\r\n for (const [key, value] of Object.entries(args)) {\r\n const str = typeof value === 'string' ? value : JSON.stringify(value);\r\n parts.push(`${key}=${str.length > 40 ? str.slice(0, 40) + '...' : str}`);\r\n }\r\n return parts.join(', ');\r\n}\r\n\r\nexport const ToolCallView: React.FC<ToolCallViewProps> = React.memo(({ calls }) => {\r\n if (calls.length === 0) return null;\r\n\r\n return (\r\n <Box flexDirection=\"column\" paddingX={1}>\r\n {calls.map((call, i) => (\r\n <Box key={i} gap={1}>\r\n {call.status === 'running' && (\r\n <Text color=\"yellow\">\r\n <Spinner type=\"dots\" />\r\n </Text>\r\n )}\r\n {call.status === 'done' && <Text color=\"green\">✔</Text>}\r\n {call.status === 'error' && <Text color=\"red\">✖</Text>}\r\n <Text color=\"yellow\" bold>\r\n {call.name}\r\n </Text>\r\n <Text dimColor>({summarizeArgs(call.args)})</Text>\r\n {call.result && !call.result.success && (\r\n <Text color=\"red\"> — {call.result.error}</Text>\r\n )}\r\n </Box>\r\n ))}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box } from 'ink';\r\nimport { StatusBar } from './StatusBar.js';\r\nimport { OutputPane, type OutputEntry } from './OutputPane.js';\r\nimport { ChatPane, type ChatEntry } from './ChatPane.js';\r\nimport { InputBar, type ImageAttachment } from './InputBar.js';\r\nimport { ExplorerPane } from './Explorer.js';\r\nimport { ToolCallView, type ToolCallEntry } from './ToolCallView.js';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\ninterface LayoutProps {\r\n connected: boolean;\r\n placeName?: string;\r\n connectionCount?: number;\r\n model: string;\r\n chatEntries: ChatEntry[];\r\n outputEntries: OutputEntry[];\r\n explorerTree: ExplorerNode[];\r\n toolCalls: ToolCallEntry[];\r\n streaming?: string;\r\n isProcessing: boolean;\r\n onSubmit: (text: string, image?: ImageAttachment) => void;\r\n onImagePaste?: (image: ImageAttachment) => void;\r\n imageAttached?: boolean;\r\n onClearImage?: () => void;\r\n}\r\n\r\nexport const Layout: React.FC<LayoutProps> = React.memo(({\r\n connected,\r\n placeName,\r\n connectionCount,\r\n model,\r\n chatEntries,\r\n outputEntries,\r\n explorerTree,\r\n toolCalls,\r\n streaming,\r\n isProcessing,\r\n onSubmit,\r\n onImagePaste,\r\n imageAttached,\r\n onClearImage,\r\n}) => {\r\n return (\r\n <Box flexDirection=\"column\" width=\"100%\">\r\n <StatusBar connected={connected} placeName={placeName} connectionCount={connectionCount} model={model} />\r\n\r\n <Box flexGrow={1}>\r\n <ExplorerPane tree={explorerTree} />\r\n\r\n <Box flexDirection=\"column\" flexGrow={1}>\r\n <ChatPane entries={chatEntries} streaming={streaming} />\r\n {toolCalls.length > 0 && <ToolCallView calls={toolCalls} />}\r\n </Box>\r\n </Box>\r\n\r\n <OutputPane entries={outputEntries} maxLines={6} />\r\n <InputBar\r\n onSubmit={onSubmit}\r\n onImagePaste={onImagePaste}\r\n isProcessing={isProcessing}\r\n imageAttached={imageAttached}\r\n onClearImage={onClearImage}\r\n />\r\n </Box>\r\n );\r\n});\r\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { StudioBridge } from '../../transport/ws-server.js';\nimport type { ExplorerNode, OutputPayload, StudioConnectedPayload } from '../../transport/protocol.js';\nimport { StudioMsg } from '../../transport/protocol.js';\nimport type { OutputEntry } from '../components/OutputPane.js';\n\ninterface StudioState {\n connected: boolean;\n placeName?: string;\n placeId?: number;\n connectionCount: number;\n explorerTree: ExplorerNode[];\n outputLog: OutputEntry[];\n}\n\nexport function useStudio(server: StudioBridge) {\n const connInfo = server.getConnectionInfo();\n const connections = server.listConnections();\n const [state, setState] = useState<StudioState>({\n connected: server.isConnected(),\n placeName: connInfo?.placeName,\n placeId: connInfo?.placeId,\n connectionCount: connections.length,\n explorerTree: [],\n outputLog: [],\n });\n\n const stateRef = useRef(state);\n stateRef.current = state;\n\n useEffect(() => {\n // Sync initial state in case connection happened before mount\n if (server.isConnected() && !stateRef.current.connected) {\n const info = server.getConnectionInfo();\n const conns = server.listConnections();\n setState((prev) => ({\n ...prev,\n connected: true,\n placeName: info?.placeName,\n placeId: info?.placeId,\n connectionCount: conns.length,\n }));\n }\n\n const onConnected = (payload: StudioConnectedPayload) => {\n const conns = server.listConnections();\n const info = server.getConnectionInfo();\n setState((prev) => ({\n ...prev,\n connected: true,\n placeName: info?.placeName ?? payload.placeName ?? prev.placeName,\n placeId: info?.placeId ?? payload.placeId ?? prev.placeId,\n connectionCount: conns.length,\n }));\n };\n\n const onDisconnected = () => {\n const conns = server.listConnections();\n const info = server.getConnectionInfo();\n const stillConnected = conns.length > 0;\n setState((prev) => ({\n ...prev,\n connected: stillConnected,\n placeName: stillConnected ? info?.placeName : undefined,\n placeId: stillConnected ? info?.placeId : undefined,\n connectionCount: conns.length,\n }));\n };\n\n const onExplorer = (payload: { tree: ExplorerNode[] }) => {\n setState((prev) => ({ ...prev, explorerTree: payload.tree ?? [] }));\n };\n\n const onOutput = (payload: OutputPayload) => {\n setState((prev) => ({\n ...prev,\n outputLog: [\n ...prev.outputLog.slice(-200),\n {\n message: payload.message,\n level: payload.level,\n timestamp: payload.timestamp ?? Date.now(),\n source: payload.source,\n },\n ],\n }));\n };\n\n const onError = (payload: OutputPayload) => {\n setState((prev) => ({\n ...prev,\n outputLog: [\n ...prev.outputLog.slice(-200),\n {\n message: payload.message,\n level: 'error',\n timestamp: payload.timestamp ?? Date.now(),\n source: payload.source,\n },\n ],\n }));\n };\n\n server.on('studio:connected', onConnected);\n server.on('studio:disconnected', onDisconnected);\n server.on(StudioMsg.EXPLORER, onExplorer);\n server.on(StudioMsg.OUTPUT, onOutput);\n server.on(StudioMsg.ERROR, onError);\n\n return () => {\n server.off('studio:connected', onConnected);\n server.off('studio:disconnected', onDisconnected);\n server.off(StudioMsg.EXPLORER, onExplorer);\n server.off(StudioMsg.OUTPUT, onOutput);\n server.off(StudioMsg.ERROR, onError);\n };\n }, [server]);\n\n const clearOutput = useCallback(() => {\n setState((prev) => ({ ...prev, outputLog: [] }));\n }, []);\n\n return { ...state, clearOutput };\n}\n","import React, { useState, useCallback, useRef } from 'react';\nimport { Box } from 'ink';\nimport { Welcome } from './ui/components/Welcome.js';\nimport { Setup } from './ui/components/Setup.js';\nimport { Layout } from './ui/components/Layout.js';\nimport { InputBar, type ImageAttachment } from './ui/components/InputBar.js';\nimport { useStudio } from './ui/hooks/useStudio.js';\nimport type { StudioBridge } from './transport/ws-server.js';\nimport type { AgentLoop } from './agent/loop.js';\nimport type { ChatEntry } from './ui/components/ChatPane.js';\nimport type { ToolCallEntry } from './ui/components/ToolCallView.js';\nimport { loadConfig, setConfigValue, PROVIDERS, resolveProviderSettings, type AIProviderType } from './config/config.js';\n\ninterface AppProps {\n server: StudioBridge;\n agent: AgentLoop | null;\n version: string;\n}\n\nexport const App: React.FC<AppProps> = ({ server, agent: initialAgent, version }) => {\n const [showWelcome, setShowWelcome] = useState(true);\n const [chatEntries, setChatEntries] = useState<ChatEntry[]>([]);\n const [toolCalls, setToolCalls] = useState<ToolCallEntry[]>([]);\n const [streaming, setStreaming] = useState('');\n const [isProcessing, setIsProcessing] = useState(false);\n const [agent, setAgent] = useState(initialAgent);\n\n const studio = useStudio(server);\n const config = loadConfig();\n const hasApiKey = !!config.apiKey;\n const [needsSetup, setNeedsSetup] = useState(!hasApiKey);\n const [pendingImage, setPendingImage] = useState<ImageAttachment | null>(null);\n const pendingImageRef = useRef<ImageAttachment | null>(null);\n\n const handleImagePaste = useCallback((image: ImageAttachment) => {\n setPendingImage(image);\n pendingImageRef.current = image;\n }, []);\n\n const handleClearImage = useCallback(() => {\n setPendingImage(null);\n pendingImageRef.current = null;\n }, []);\n\n const handleSetupComplete = useCallback((provider: AIProviderType, apiKey: string) => {\n setConfigValue('provider', provider);\n setConfigValue('apiKey', apiKey);\n const providerInfo = PROVIDERS[provider];\n setConfigValue('apiBaseUrl', providerInfo.baseUrl);\n setConfigValue('model', providerInfo.defaultModel);\n setNeedsSetup(false);\n }, []);\n\n const addSystemMessage = useCallback((content: string) => {\n setChatEntries((prev) => [\n ...prev,\n { role: 'system' as const, content, timestamp: Date.now() },\n ]);\n }, []);\n\n const handleCommand = useCallback(\n (text: string): boolean => {\n const input = text.startsWith('/') ? text.slice(1) : text;\n const [cmd, ...args] = input.split(' ');\n const arg = args.join(' ');\n const lowerCmd = cmd.toLowerCase();\n\n const currentModel = agent?.getModel() ?? resolveProviderSettings(config).model;\n const providerName = PROVIDERS[config.provider]?.name ?? config.provider;\n const keyStatus = config.apiKey\n ? `${config.apiKey.slice(0, 6)}...${config.apiKey.slice(-4)}`\n : 'NOT SET';\n\n switch (lowerCmd) {\n case 'help':\n case 'h':\n case '?':\n addSystemMessage([\n '── Your Config ─────────────────────────────',\n ` Provider: ${providerName}`,\n ` Model: ${currentModel}`,\n ` API Key: ${keyStatus}`,\n ` Studio: ${studio.connected ? '● Connected' + (studio.placeName ? ` (${studio.placeName})` : '') : '○ Disconnected'}`,\n '',\n '── Commands ────────────────────────────────',\n ' /help Show this help',\n ' /model <name> Switch AI model',\n ' /models List available models',\n ' /status Connection status',\n ' /clear Clear chat history',\n '',\n '── Setup (run in your terminal) ────────────',\n ' dominus config set provider <name>',\n ' Providers: openai, anthropic, gemini, xai, openrouter',\n ' dominus config set apiKey <key>',\n ' dominus config list',\n ' dominus install-plugin',\n ' dominus mcp-install',\n '',\n 'Or just type a message to chat with Dominus!',\n ].join('\\n'));\n return true;\n\n case 'clear':\n agent?.clearHistory();\n setChatEntries([]);\n setToolCalls([]);\n return true;\n\n case 'model':\n if (arg && agent) {\n agent.setModel(arg);\n addSystemMessage(`Model switched to: ${arg}`);\n } else {\n addSystemMessage('Usage: /model <model-name>');\n }\n return true;\n\n case 'models': {\n if (!agent) {\n addSystemMessage('No API key configured — cannot fetch models.');\n return true;\n }\n addSystemMessage(`Fetching models from ${providerName}...`);\n agent.listModels().then((models) => {\n if (models.length === 0) {\n addSystemMessage('Could not fetch models. Check your API key.');\n return;\n }\n const lines = models.slice(0, 40).map((m) => ` ${m.id}`);\n addSystemMessage([\n `── ${providerName} Models (${models.length} total) ──`,\n ...lines,\n models.length > 40 ? ` ... and ${models.length - 40} more` : '',\n '',\n ` Current: ${currentModel}`,\n ' Switch with: /model <name>',\n ].join('\\n'));\n });\n return true;\n }\n\n case 'status':\n addSystemMessage([\n '── Status ──────────────────────────────────',\n ` Provider: ${providerName}`,\n ` Model: ${currentModel}`,\n ` API Key: ${keyStatus}`,\n ` Port: ${server.getPort()}`,\n ` Studio: ${studio.connected ? '● Connected' + (studio.placeName ? ` (${studio.placeName})` : '') : '○ Disconnected'}`,\n ].join('\\n'));\n return true;\n\n default:\n return false;\n }\n },\n [agent, studio, server, config, addSystemMessage],\n );\n\n const handleSubmit = useCallback(\n async (text: string) => {\n if (isProcessing) return;\n\n // Check for commands first (with or without /)\n // /paste is handled directly by InputBar, skip it here\n if (text.trim().toLowerCase() === '/paste' || text.trim().toLowerCase() === 'paste') return;\n\n const isCommand = text.startsWith('/') || ['help', 'h', '?', 'clear', 'model', 'models', 'status'].includes(text.split(' ')[0].toLowerCase());\n if (isCommand) {\n setShowWelcome(false);\n handleCommand(text);\n return;\n }\n\n // Dismiss welcome for regular messages\n setShowWelcome(false);\n\n if (!agent) {\n setChatEntries((prev) => [\n ...prev,\n { role: 'user', content: text, timestamp: Date.now() },\n {\n role: 'error',\n content: 'No API key configured. Set OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, or XAI_API_KEY — or run: dominus config set apiKey <key>',\n timestamp: Date.now(),\n },\n ]);\n return;\n }\n\n // Grab and clear any pending image\n const image = pendingImageRef.current;\n setPendingImage(null);\n pendingImageRef.current = null;\n\n setIsProcessing(true);\n setToolCalls([]);\n\n const displayText = image ? `${text}\\n[image 1]` : text;\n setChatEntries((prev) => [\n ...prev,\n { role: 'user', content: displayText, timestamp: Date.now() },\n ]);\n\n let fullText = '';\n\n try {\n for await (const event of agent.run(text, image ? { base64: image.base64, mimeType: image.mimeType } : undefined)) {\n switch (event.type) {\n case 'text':\n fullText += event.content;\n setStreaming(fullText);\n break;\n\n case 'tool_call':\n setToolCalls((prev) => [\n ...prev,\n { name: event.tool, args: event.args, status: 'running' },\n ]);\n break;\n\n case 'tool_result':\n setToolCalls((prev) =>\n prev.map((tc) =>\n tc.name === event.tool && tc.status === 'running'\n ? { ...tc, status: event.result.success ? 'done' : 'error', result: event.result }\n : tc,\n ),\n );\n break;\n\n case 'error':\n setChatEntries((prev) => [\n ...prev,\n { role: 'error', content: event.message, timestamp: Date.now() },\n ]);\n break;\n }\n }\n\n if (fullText) {\n setChatEntries((prev) => [\n ...prev,\n { role: 'assistant', content: fullText, timestamp: Date.now() },\n ]);\n }\n } catch (err) {\n setChatEntries((prev) => [\n ...prev,\n {\n role: 'error',\n content: err instanceof Error ? err.message : String(err),\n timestamp: Date.now(),\n },\n ]);\n } finally {\n setIsProcessing(false);\n setStreaming('');\n setToolCalls([]);\n }\n },\n [agent, isProcessing, handleCommand],\n );\n\n if (needsSetup) {\n return <Setup onComplete={handleSetupComplete} />;\n }\n\n if (showWelcome) {\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n <Welcome\n userName={config.userName}\n version={version}\n model={resolveProviderSettings(config).model}\n provider={PROVIDERS[config.provider]?.name ?? config.provider}\n port={server.getPort()}\n hasApiKey={hasApiKey}\n connected={studio.connected}\n cwd={process.cwd()}\n />\n <InputBar\n onSubmit={handleSubmit}\n onImagePaste={handleImagePaste}\n isProcessing={false}\n imageAttached={!!pendingImage}\n onClearImage={handleClearImage}\n placeholder={\n hasApiKey\n ? 'Type a message to begin, or Ctrl+V to paste an image...'\n : 'Set up your API key to get started, or type /help...'\n }\n />\n </Box>\n );\n }\n\n return (\n <Layout\n connected={studio.connected}\n placeName={studio.placeName}\n connectionCount={studio.connectionCount}\n model={agent?.getModel() ?? resolveProviderSettings(config).model}\n chatEntries={chatEntries}\n outputEntries={studio.outputLog}\n explorerTree={studio.explorerTree}\n toolCalls={toolCalls}\n streaming={streaming || undefined}\n isProcessing={isProcessing}\n onSubmit={handleSubmit}\n onImagePaste={handleImagePaste}\n imageAttached={!!pendingImage}\n onClearImage={handleClearImage}\n />\n );\n};\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { App } from './app.js';\nimport { DominusServer, type StudioBridge } from './transport/ws-server.js';\nimport { DominusClient, isPortInUse } from './transport/ws-client.js';\nimport { AgentLoop } from './agent/loop.js';\nimport { ToolRegistry, createDefaultRegistry } from './tools/registry.js';\nimport { initMemoryStore, closeMemoryStore } from './memory/store.js';\nimport {\n loadConfig,\n setConfigValue,\n getConfigValue,\n loadRules,\n saveRules,\n getDominusDir,\n detectProviderFromEnv,\n PROVIDERS,\n type DominusConfig,\n type AIProviderType,\n} from './config/config.js';\nimport { checkForUpdate, formatUpdateMessage, autoUpdate } from './utils/update-checker.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst VERSION = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf-8')).version;\n\nconst program = new Command();\n\nprogram\n .name('dominus')\n .description('AI-powered autonomous agent for Roblox Studio development')\n .version(VERSION);\n\n// Main start command (default)\nprogram\n .command('start', { isDefault: true })\n .description('Launch the Dominus TUI agent')\n .option('-p, --port <port>', 'WebSocket server port', '18088')\n .action(async (opts) => {\n const config = loadConfig();\n const port = parseInt(opts.port) || config.port;\n\n // Auto-detect API key from environment variables\n if (!config.apiKey) {\n const detected = detectProviderFromEnv();\n if (detected) {\n setConfigValue('provider', detected.provider);\n setConfigValue('apiKey', detected.apiKey);\n }\n }\n\n // Auto-detect user name\n if (config.userName === 'Developer') {\n const envUser = process.env.USER || process.env.USERNAME || 'Developer';\n const firstName = envUser.split(' ')[0];\n if (firstName && firstName !== 'Developer') {\n setConfigValue('userName', firstName);\n }\n }\n\n checkForUpdate(VERSION).then((info) => {\n if (info) process.stderr.write(formatUpdateMessage(info));\n }).catch(() => {});\n\n await launchApp(port);\n });\n\n// Config commands\nconst configCmd = program.command('config').description('Manage Dominus configuration');\n\nconfigCmd\n .command('set <key> <value>')\n .description('Set a config value')\n .action((key: string, value: string) => {\n const numericKeys = ['port', 'maxToolIterations', 'maxVerifyRetries', 'tokenBudget'];\n const booleanKeys = ['autoIndex', 'autoLearn'];\n const validProviders = ['openai', 'anthropic', 'gemini', 'xai', 'openrouter', 'custom'];\n\n let parsed: unknown = value;\n if (numericKeys.includes(key)) {\n parsed = parseInt(value);\n } else if (booleanKeys.includes(key)) {\n parsed = value === 'true';\n } else if (key === 'provider') {\n if (!validProviders.includes(value)) {\n console.log(` ✖ Invalid provider: ${value}`);\n console.log(` Valid providers: ${validProviders.join(', ')}`);\n return;\n }\n // When changing provider, also update model and base URL defaults\n const providerInfo = PROVIDERS[value as AIProviderType];\n setConfigValue('apiBaseUrl', providerInfo.baseUrl);\n setConfigValue('model', providerInfo.defaultModel);\n }\n\n setConfigValue(key as keyof DominusConfig, parsed as DominusConfig[keyof DominusConfig]);\n console.log(` ✔ Set ${key} = ${value}`);\n if (key === 'provider') {\n const p = PROVIDERS[value as AIProviderType];\n console.log(` → Base URL: ${p.baseUrl}`);\n console.log(` → Default model: ${p.defaultModel}`);\n }\n console.log(` Config stored at: ${getDominusDir()}/config.json`);\n });\n\nconfigCmd\n .command('get <key>')\n .description('Get a config value')\n .action((key: string) => {\n const value = getConfigValue(key as keyof DominusConfig);\n if (key.toLowerCase().includes('key') && typeof value === 'string') {\n console.log(` ${key} = ${value.slice(0, 8)}...${value.slice(-4)}`);\n } else {\n console.log(` ${key} = ${JSON.stringify(value)}`);\n }\n });\n\nconfigCmd\n .command('list')\n .description('List all config values')\n .action(() => {\n const config = loadConfig();\n console.log('');\n console.log(' Dominus Configuration:');\n console.log(' ─────────────────────');\n for (const [key, value] of Object.entries(config)) {\n const display =\n key.toLowerCase().includes('key') && typeof value === 'string' && value.length > 12\n ? `${value.slice(0, 8)}...${value.slice(-4)}`\n : JSON.stringify(value);\n console.log(` ${key}: ${display}`);\n }\n console.log('');\n console.log(` Config file: ${getDominusDir()}/config.json`);\n console.log('');\n });\n\n// Rules commands\nconst rulesCmd = program.command('rules').description('Manage agent rules (do/don\\'t)');\n\nrulesCmd\n .command('add-do <rule>')\n .description('Add a rule for things Dominus should do')\n .action((rule: string) => {\n const rules = loadRules();\n rules.do.push(rule);\n saveRules(rules);\n console.log(` ✔ Added DO rule: ${rule}`);\n });\n\nrulesCmd\n .command('add-dont <rule>')\n .description('Add a rule for things Dominus should NOT do')\n .action((rule: string) => {\n const rules = loadRules();\n rules.dont.push(rule);\n saveRules(rules);\n console.log(` ✔ Added DON'T rule: ${rule}`);\n });\n\nrulesCmd\n .command('list')\n .description('List all rules')\n .action(() => {\n const rules = loadRules();\n console.log('');\n console.log(' Dominus Rules:');\n if (rules.do.length) {\n console.log(' DO:');\n rules.do.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (rules.dont.length) {\n console.log(\" DON'T:\");\n rules.dont.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (rules.conventions.length) {\n console.log(' CONVENTIONS:');\n rules.conventions.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (!rules.do.length && !rules.dont.length && !rules.conventions.length) {\n console.log(' No rules configured yet.');\n console.log(' Use: dominus rules add-do \"Always use strict typing\"');\n console.log(' Use: dominus rules add-dont \"Never use deprecated APIs\"');\n }\n console.log('');\n });\n\n// Plugin install command\nprogram\n .command('update')\n .description('Auto-update Dominus to the latest version')\n .action(async () => {\n console.log(` Current version: ${VERSION}`);\n console.log(' Checking for updates...');\n\n const result = await autoUpdate(VERSION);\n if (result.from === result.to && result.success) {\n console.log(' Already on the latest version.');\n return;\n }\n if (result.success) {\n console.log(` ✔ Updated: ${result.from} → ${result.to}`);\n console.log(' Restart dominus to use the new version.');\n } else {\n console.error(` ✘ Update failed: ${result.error}`);\n }\n });\n\nprogram\n .command('install-plugin')\n .description('Build & install the Dominus plugin into Roblox Studio')\n .action(async () => {\n const { execSync } = await import('node:child_process');\n\n const packageRoot = path.resolve(import.meta.dirname ?? __dirname, '..');\n const pluginDir = path.join(packageRoot, 'plugin');\n const pluginProject = path.join(pluginDir, 'default.project.json');\n const studioPlugins = path.join(\n os.homedir(),\n 'AppData',\n 'Local',\n 'Roblox',\n 'Plugins',\n );\n const destFile = path.join(studioPlugins, 'Dominus.rbxm');\n\n if (!fs.existsSync(pluginProject)) {\n console.log(' ✖ Plugin source not found.');\n console.log(` Expected at: ${pluginDir}`);\n return;\n }\n\n if (!fs.existsSync(studioPlugins)) {\n fs.mkdirSync(studioPlugins, { recursive: true });\n }\n\n // Try building with Rojo\n let rojoAvailable = false;\n try {\n execSync('rojo --version', { stdio: 'pipe' });\n rojoAvailable = true;\n } catch {\n // Rojo not installed\n }\n\n if (rojoAvailable) {\n try {\n console.log(' Building plugin with Rojo...');\n execSync(`rojo build \"${pluginDir}\" -o \"${destFile}\"`, { stdio: 'pipe' });\n console.log(` ✔ Plugin built and installed to: ${destFile}`);\n console.log(' Restart Roblox Studio to load the plugin.');\n } catch (err) {\n console.log(` ✖ Rojo build failed: ${err instanceof Error ? err.message : err}`);\n }\n } else {\n // Fallback: build a simple .rbxmx (XML model) that Studio can load\n console.log(' Rojo not found — building plugin manually...');\n buildPluginXml(pluginDir, destFile.replace('.rbxm', '.rbxmx'));\n }\n });\n\n// MCP server command\nprogram\n .command('mcp')\n .description('Start the Dominus MCP server (for Cursor, Claude Desktop, etc.)')\n .option('-p, --port <port>', 'WebSocket server port for Studio connection', '18088')\n .action(async () => {\n const { startMcpServer } = await import('./mcp/server.js');\n await startMcpServer();\n });\n\n// MCP install — auto-write config into supported editors\ninterface McpTarget {\n name: string;\n configPath: string;\n keyPath: string[];\n}\n\nfunction getMcpTargets(): McpTarget[] {\n const home = os.homedir();\n const appData = process.env.APPDATA || path.join(home, 'AppData', 'Roaming');\n const localAppData = process.env.LOCALAPPDATA || path.join(home, 'AppData', 'Local');\n const cwd = process.cwd();\n\n return [\n {\n name: 'Cursor (project)',\n configPath: path.join(cwd, '.cursor', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Cursor (global)',\n configPath: path.join(home, '.cursor', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Claude Desktop',\n configPath: path.join(appData, 'Claude', 'claude_desktop_config.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Claude Code',\n configPath: path.join(home, '.claude.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Windsurf (project)',\n configPath: path.join(cwd, '.windsurf', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Windsurf (global)',\n configPath: path.join(home, '.codeium', 'windsurf', 'mcp_config.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'VS Code (project)',\n configPath: path.join(cwd, '.vscode', 'mcp.json'),\n keyPath: ['servers'],\n },\n {\n name: 'VS Code (global)',\n configPath: path.join(localAppData, 'Code', 'User', 'settings.json'),\n keyPath: ['mcp', 'servers'],\n },\n ];\n}\n\nconst dominusEntry = {\n command: 'dominus',\n args: ['mcp'],\n type: 'stdio',\n};\n\nfunction injectMcpConfig(target: McpTarget): { status: 'installed' | 'already' | 'created' } {\n let config: Record<string, unknown> = {};\n if (fs.existsSync(target.configPath)) {\n try {\n config = JSON.parse(fs.readFileSync(target.configPath, 'utf-8'));\n } catch {\n config = {};\n }\n }\n\n // Navigate to the nested key, creating objects along the way\n let obj = config as Record<string, unknown>;\n for (const key of target.keyPath) {\n if (!obj[key] || typeof obj[key] !== 'object') {\n obj[key] = {};\n }\n obj = obj[key] as Record<string, unknown>;\n }\n\n if (obj['dominus']) {\n return { status: 'already' };\n }\n\n obj['dominus'] = { ...dominusEntry };\n\n const dir = path.dirname(target.configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(target.configPath, JSON.stringify(config, null, 2), 'utf-8');\n\n return { status: fs.existsSync(target.configPath) ? 'installed' : 'created' };\n}\n\nprogram\n .command('mcp-install')\n .description('Auto-install Dominus MCP into Cursor, VS Code, Claude Desktop, Windsurf, etc.')\n .option('-a, --all', 'Install to all detected editors')\n .action(async (opts) => {\n const targets = getMcpTargets();\n\n console.log('');\n console.log(' Dominus MCP Auto-Installer');\n console.log(' ═════════════════════════');\n console.log('');\n\n if (opts.all) {\n for (const target of targets) {\n const result = injectMcpConfig(target);\n const icon = result.status === 'already' ? '●' : '✔';\n const msg = result.status === 'already' ? 'already configured' : 'installed';\n console.log(` ${icon} ${target.name}: ${msg}`);\n }\n console.log('');\n console.log(' Restart your editors to load the Dominus MCP server.');\n console.log('');\n return;\n }\n\n // Interactive: show which editors are detected\n const detected: { target: McpTarget; exists: boolean }[] = targets.map((t) => ({\n target: t,\n exists: fs.existsSync(path.dirname(t.configPath)),\n }));\n\n const toInstall = detected.filter((d) => d.exists);\n\n if (toInstall.length === 0) {\n console.log(' No supported editors detected.');\n console.log(' Run with --all to install configs anyway,');\n console.log(' or manually add to your editor\\'s MCP config:');\n console.log('');\n console.log(' {');\n console.log(' \"dominus\": {');\n console.log(' \"command\": \"dominus\",');\n console.log(' \"args\": [\"mcp\"]');\n console.log(' }');\n console.log(' }');\n console.log('');\n return;\n }\n\n console.log(' Detected editors:');\n console.log('');\n\n for (const { target } of toInstall) {\n const result = injectMcpConfig(target);\n const icon = result.status === 'already' ? '●' : '✔';\n const msg = result.status === 'already' ? 'already configured' : 'installed';\n console.log(` ${icon} ${target.name}: ${msg}`);\n console.log(` ${target.configPath}`);\n }\n\n const skipped = detected.filter((d) => !d.exists);\n if (skipped.length > 0) {\n console.log('');\n console.log(' Skipped (not detected):');\n for (const { target } of skipped) {\n console.log(` ○ ${target.name}`);\n }\n }\n\n console.log('');\n console.log(' Provides 14 Roblox Studio tools to your AI editor.');\n console.log(' Restart your editors to load the Dominus MCP server.');\n console.log('');\n });\n\n// MCP setup helper (print-only)\nprogram\n .command('mcp-setup')\n .description('Print MCP configuration for manual setup')\n .action(() => {\n console.log('');\n console.log(' Dominus MCP — Manual Setup');\n console.log(' ═════════════════════════');\n console.log('');\n console.log(' Tip: Run `dominus mcp-install` to auto-install instead!');\n console.log('');\n console.log(' Add this to your editor\\'s MCP config:');\n console.log('');\n console.log(' {');\n console.log(' \"dominus\": {');\n console.log(' \"command\": \"dominus\",');\n console.log(' \"args\": [\"mcp\"]');\n console.log(' }');\n console.log(' }');\n console.log('');\n console.log(' Config file locations:');\n console.log('');\n console.log(' Cursor (project) .cursor/mcp.json');\n console.log(' Cursor (global) ~/.cursor/mcp.json');\n console.log(' Claude Desktop %APPDATA%/Claude/claude_desktop_config.json');\n console.log(' Claude Code ~/.claude.json');\n console.log(' Windsurf (project) .windsurf/mcp.json');\n console.log(' Windsurf (global) ~/.codeium/windsurf/mcp_config.json');\n console.log(' VS Code (project) .vscode/mcp.json');\n console.log(' VS Code (global) %LOCALAPPDATA%/Code/User/settings.json');\n console.log('');\n console.log(' 14 tools: read_script, edit_script, run_code, get_explorer,');\n console.log(' get_properties, set_properties, insert_instance, delete_instance,');\n console.log(' get_selection, search_scripts, get_output, run_tests,');\n console.log(' recall_memory, remember');\n console.log('');\n });\n\nfunction buildPluginXml(pluginDir: string, destFile: string): void {\n const srcDir = path.join(pluginDir, 'src');\n if (!fs.existsSync(srcDir)) {\n console.log(` ✖ Plugin source directory not found: ${srcDir}`);\n return;\n }\n\n const files = fs.readdirSync(srcDir).filter((f) => f.endsWith('.lua'));\n const mainFile = files.find((f) => f === 'init.server.lua');\n const moduleFiles = files.filter((f) => f !== 'init.server.lua');\n\n if (!mainFile) {\n console.log(' ✖ init.server.lua not found in plugin source');\n return;\n }\n\n const escapeXml = (s: string) =>\n s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n\n const mainSource = fs.readFileSync(path.join(srcDir, mainFile), 'utf-8');\n\n let moduleItems = '';\n for (const mf of moduleFiles) {\n const modName = mf.replace('.lua', '');\n const modSource = fs.readFileSync(path.join(srcDir, mf), 'utf-8');\n moduleItems += `\n <Item class=\"ModuleScript\" referent=\"${modName}\">\n <Properties>\n <string name=\"Name\">${modName}</string>\n <ProtectedString name=\"Source\"><![CDATA[${modSource}]]></ProtectedString>\n </Properties>\n </Item>`;\n }\n\n const rbxmx = `<roblox version=\"4\">\n <Item class=\"Script\" referent=\"Dominus\">\n <Properties>\n <string name=\"Name\">Dominus</string>\n <ProtectedString name=\"Source\"><![CDATA[${mainSource}]]></ProtectedString>\n <token name=\"RunContext\">1</token>\n </Properties>${moduleItems}\n </Item>\n</roblox>`;\n\n fs.writeFileSync(destFile, rbxmx, 'utf-8');\n console.log(` ✔ Plugin installed to: ${destFile}`);\n console.log(' Restart Roblox Studio to load the plugin.');\n}\n\nasync function launchApp(port: number): Promise<void> {\n await initMemoryStore();\n\n let server: StudioBridge;\n\n const portTaken = await isPortInUse(port);\n if (portTaken) {\n // Another Dominus instance (MCP) already owns the port — connect as relay\n const client = new DominusClient(port);\n await client.connect();\n server = client;\n } else {\n const srv = new DominusServer(port);\n await srv.start();\n server = srv;\n }\n\n const config = loadConfig();\n let agent: AgentLoop | null = null;\n\n if (config.apiKey) {\n const tools = createDefaultRegistry();\n await new Promise((r) => setTimeout(r, 100));\n agent = new AgentLoop(server, tools);\n }\n\n const { waitUntilExit } = render(\n <App server={server} agent={agent} version={VERSION} />,\n );\n\n const cleanup = async () => {\n closeMemoryStore();\n await server.stop();\n };\n\n process.on('SIGINT', async () => {\n await cleanup();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n await cleanup();\n process.exit(0);\n });\n\n await waitUntilExit();\n await cleanup();\n}\n\nprogram.parse();\n","import OpenAI from 'openai';\nimport { type DominusConfig, resolveProviderSettings, PROVIDERS } from '../config/config.js';\nimport type { Tool, ToolCall } from '../tools/types.js';\n\nexport interface AIResponse {\n content: string | null;\n toolCalls: ToolCall[];\n finishReason: string;\n usage?: { promptTokens: number; completionTokens: number; totalTokens: number };\n}\n\nexport interface StreamChunk {\n type: 'text' | 'tool_call_start' | 'tool_call_delta' | 'tool_call_end' | 'done';\n content?: string;\n toolCall?: Partial<ToolCall>;\n}\n\nexport class AIProvider {\n private client: OpenAI;\n private model: string;\n private providerName: string;\n\n constructor(config: DominusConfig) {\n if (!config.apiKey) {\n throw new Error('API key not configured. Run: dominus config set apiKey <your-key>');\n }\n\n const { baseUrl, model } = resolveProviderSettings(config);\n this.providerName = PROVIDERS[config.provider]?.name ?? config.provider;\n\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: baseUrl,\n });\n this.model = model;\n }\n\n setModel(model: string): void {\n this.model = model;\n }\n\n getModel(): string {\n return this.model;\n }\n\n getProviderName(): string {\n return this.providerName;\n }\n\n async listModels(): Promise<{ id: string; owned_by?: string }[]> {\n try {\n const list = await this.client.models.list();\n const models: { id: string; owned_by?: string }[] = [];\n for await (const m of list) {\n models.push({ id: m.id, owned_by: m.owned_by });\n }\n models.sort((a, b) => a.id.localeCompare(b.id));\n return models;\n } catch {\n return [];\n }\n }\n\n async chat(\n messages: OpenAI.ChatCompletionMessageParam[],\n tools?: Tool[],\n ): Promise<AIResponse> {\n const openAITools = tools?.map(toolToOpenAI);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n tools: openAITools?.length ? openAITools : undefined,\n temperature: 0.3,\n });\n\n const choice = response.choices[0];\n if (!choice) throw new Error('No response from AI');\n\n const toolCalls: ToolCall[] = (choice.message.tool_calls ?? []).map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n }));\n\n return {\n content: choice.message.content,\n toolCalls,\n finishReason: choice.finish_reason ?? 'stop',\n usage: response.usage\n ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n };\n }\n\n async *streamChat(\n messages: OpenAI.ChatCompletionMessageParam[],\n tools?: Tool[],\n ): AsyncGenerator<StreamChunk> {\n const openAITools = tools?.map(toolToOpenAI);\n\n const stream = await this.client.chat.completions.create({\n model: this.model,\n messages,\n tools: openAITools?.length ? openAITools : undefined,\n temperature: 0.3,\n stream: true,\n });\n\n const toolCallBuffers = new Map<number, { id: string; name: string; args: string }>();\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n if (delta.content) {\n yield { type: 'text', content: delta.content };\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (!toolCallBuffers.has(tc.index)) {\n toolCallBuffers.set(tc.index, {\n id: tc.id ?? '',\n name: tc.function?.name ?? '',\n args: '',\n });\n if (tc.function?.name) {\n yield {\n type: 'tool_call_start',\n toolCall: { id: tc.id, name: tc.function.name },\n };\n }\n }\n\n const buffer = toolCallBuffers.get(tc.index)!;\n if (tc.id) buffer.id = tc.id;\n if (tc.function?.name) buffer.name = tc.function.name;\n if (tc.function?.arguments) {\n buffer.args += tc.function.arguments;\n yield {\n type: 'tool_call_delta',\n content: tc.function.arguments,\n toolCall: { id: buffer.id, name: buffer.name },\n };\n }\n }\n }\n\n if (chunk.choices[0]?.finish_reason === 'tool_calls') {\n for (const [, buffer] of toolCallBuffers) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(buffer.args);\n } catch {\n /* empty args */\n }\n yield {\n type: 'tool_call_end',\n toolCall: { id: buffer.id, name: buffer.name, arguments: args },\n };\n }\n toolCallBuffers.clear();\n }\n }\n\n yield { type: 'done' };\n }\n}\n\nfunction toolToOpenAI(tool: Tool): OpenAI.ChatCompletionTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters as unknown as Record<string, unknown>,\n },\n };\n}\n","import type { DominusRules } from '../config/config.js';\r\nimport type { Fact } from '../memory/types.js';\r\nimport { INTERNAL_MEMORY } from './internal-memory.js';\r\n\r\nexport function buildSystemPrompt(opts: {\r\n userName: string;\r\n connected: boolean;\r\n placeName?: string;\r\n placeId?: number;\r\n scriptIndex?: { path: string; summary?: string; className: string }[];\r\n facts?: Fact[];\r\n rules?: DominusRules;\r\n}): string {\r\n const parts: string[] = [];\r\n\r\n parts.push(`You are Dominus, an expert AI agent for Roblox Studio development.\r\nYou assist ${opts.userName} with building, debugging, and refactoring Roblox experiences.\r\n\r\nYou are deeply knowledgeable about:\r\n- Luau (Roblox's programming language): syntax, idioms, metatables, type annotations, coroutines\r\n- Roblox Engine API: all services (Players, Workspace, DataStoreService, ReplicatedStorage, etc.)\r\n- Roblox architecture patterns: client-server model, remotes, replication, DataStores\r\n- Common frameworks: Knit, ProfileService, Rodux, Roact, Fusion\r\n- Studio workflows: plugins, packages, team collaboration, testing\r\n- Performance: memory management, heartbeat optimization, streaming, LOD\r\n\r\nYou have direct access to Roblox Studio through tools. You can read/edit scripts, run code, browse the explorer tree, manage instances, and run tests -- all in real-time via WebSocket.\r\n\r\n## CRITICAL: NEVER use run_code for tasks that have a dedicated tool\r\nrun_code is a LAST RESORT. You have 30+ specialized tools — use them.\r\n- Reading properties → get_properties, get_descendants_properties\r\n- Inspecting selection → inspect_selection (ONE call returns paths + properties)\r\n- Inspecting an instance → inspect_instance (ONE call returns properties + children)\r\n- Converting UI to code → convert_ui_to_code (ONE call serializes + generates component)\r\n- Creating parts → create_part, build_multiple\r\n- Creating UI → create_ui\r\n- Modifying properties → set_properties, bulk_set_properties\r\n- Browsing the tree → get_explorer\r\n- Reading/editing scripts → read_script, edit_script\r\n- Serializing UI → serialize_ui\r\nOnly use run_code for: procedural generation, terrain algorithms, raycasting, physics queries, or other logic that no tool covers.\r\n\r\nWhen the user asks you to do something, you should:\r\n1. Use your tools to gather context (read scripts, check explorer, recall memory)\r\n2. Plan your approach for complex tasks\r\n3. Execute changes using the appropriate dedicated tools (NOT run_code unless truly necessary)\r\n4. Verify your changes worked (read back, check output for errors)\r\n5. Remember important facts for future sessions`);\r\n\r\n // Connection status\r\n if (opts.connected) {\r\n parts.push(`\\n## Current Session\r\n- Studio: CONNECTED${opts.placeName ? ` (${opts.placeName})` : ''}${opts.placeId ? ` [PlaceID: ${opts.placeId}]` : ''}\r\n- You can use all Studio tools.`);\r\n } else {\r\n parts.push(`\\n## Current Session\r\n- Studio: NOT CONNECTED\r\n- You cannot use Studio tools until the plugin connects.\r\n- You can still use memory tools and answer Roblox questions.`);\r\n }\r\n\r\n // Project index\r\n if (opts.scriptIndex?.length) {\r\n parts.push('\\n## Project Scripts');\r\n const lines = opts.scriptIndex.map(\r\n (s) => `- ${s.path} (${s.className})${s.summary ? `: ${s.summary}` : ''}`,\r\n );\r\n if (lines.length > 40) {\r\n parts.push(lines.slice(0, 40).join('\\n'));\r\n parts.push(`... and ${lines.length - 40} more scripts`);\r\n } else {\r\n parts.push(lines.join('\\n'));\r\n }\r\n }\r\n\r\n // Recalled facts\r\n if (opts.facts?.length) {\r\n parts.push('\\n## Remembered Context');\r\n for (const fact of opts.facts.slice(0, 20)) {\r\n parts.push(`- [${fact.category}] ${fact.content}`);\r\n }\r\n }\r\n\r\n // User rules\r\n if (opts.rules) {\r\n if (opts.rules.do.length > 0) {\r\n parts.push('\\n## Rules: DO');\r\n for (const rule of opts.rules.do) {\r\n parts.push(`- ${rule}`);\r\n }\r\n }\r\n if (opts.rules.dont.length > 0) {\r\n parts.push('\\n## Rules: DO NOT');\r\n for (const rule of opts.rules.dont) {\r\n parts.push(`- ${rule}`);\r\n }\r\n }\r\n if (opts.rules.conventions.length > 0) {\r\n parts.push('\\n## Coding Conventions');\r\n for (const conv of opts.rules.conventions) {\r\n parts.push(`- ${conv}`);\r\n }\r\n }\r\n if (opts.rules.context) {\r\n parts.push(`\\n## Project Context\\n${opts.rules.context}`);\r\n }\r\n }\r\n\r\n parts.push(`\\n## Tool Usage Guidelines\r\n- Always verify your work: after editing a script, read it back to confirm.\r\n- After running code, check the output for errors.\r\n- Use remember to store important facts you discover about the project.\r\n- Use recall_memory before complex tasks to check if you already know relevant context.\r\n- When searching scripts, be specific with your query terms.\r\n- For multi-step changes, explain your plan before executing.\r\n\r\n## Building & Construction\r\nWhen the user asks you to build or create objects (parts, trees, houses, terrain, etc.):\r\n\r\n**PREFER these builder tools over raw run_code:**\r\n- \\`create_part\\` — create a single part with position, size, color, material, shape in one call\r\n- \\`build_multiple\\` — create many parts in a single batch round-trip (FASTEST for complex builds)\r\n- \\`clone_instance\\` — duplicate an existing object, optionally offset/rename it\r\n- \\`group_instances\\` — organize parts into a Model or Folder\r\n- \\`set_properties\\` — adjust properties on existing instances (supports Vector3, Color3, enums, hex colors)\r\n\r\n**Why use builder tools instead of run_code?**\r\n- Tool calls are structured — the AI sends typed parameters, no string interpolation bugs\r\n- Properties are auto-coerced (hex → Color3, tables → Vector3, strings → Enum values)\r\n- \\`build_multiple\\` sends one batch of Luau to Studio, creating many parts in a single round-trip\r\n- Easier for the agent to plan, verify, and iterate\r\n\r\n**Building strategy:**\r\n1. For a single part: use \\`create_part\\`\r\n2. For multi-part objects (trees, buildings, vehicles): use \\`build_multiple\\` with \\`groupName\\`\r\n3. For repeating/duplicating: use \\`clone_instance\\` with offset\r\n4. For organizing: use \\`group_instances\\`\r\n5. Only fall back to \\`run_code\\` for complex logic (loops, raycasts, terrain generation algorithms)\r\n\r\n## GUI / UI Elements — CRITICAL\r\n**ALWAYS use \\`create_ui\\` for building UI.** It creates the entire UI tree in ONE call — no run_code, no get_class_info needed.\r\nDo NOT use run_code for UI creation. Do NOT call get_class_info before create_ui — it already handles all types natively.\r\n\r\n\\`create_ui\\` takes a declarative JSON tree and builds everything in a single Studio round-trip:\r\n\\`\\`\\`json\r\n{\r\n \"parent\": \"StarterGui\",\r\n \"tree\": {\r\n \"ClassName\": \"ScreenGui\", \"Name\": \"MyUI\", \"ResetOnSpawn\": false,\r\n \"Children\": [\r\n { \"ClassName\": \"Frame\", \"Size\": [1, 0, 1, 0], \"BackgroundColor3\": \"#F0E6FF\",\r\n \"Children\": [\r\n { \"ClassName\": \"UICorner\", \"CornerRadius\": [0, 12] },\r\n { \"ClassName\": \"TextLabel\", \"Text\": \"Hello!\", \"Size\": [0.5, 0, 0.1, 0],\r\n \"Position\": [0.25, 0, 0.45, 0], \"BackgroundTransparency\": 1,\r\n \"TextColor3\": \"#6C5CE7\", \"TextScaled\": true, \"Font\": \"GothamBold\" }\r\n ]\r\n }\r\n ]\r\n }\r\n}\r\n\\`\\`\\`\r\n\r\nGUI classes use DIFFERENT property types than 3D parts:\r\n\r\n**Key type differences:**\r\n- GUI Size/Position = \\`UDim2\\` (NOT Vector3). Format: \\`{XScale: 0.5, XOffset: 0, YScale: 0.5, YOffset: 0}\\` or \\`[xScale, xOffset, yScale, yOffset]\\`\r\n- GUI AnchorPoint = \\`Vector2\\` = \\`{x: 0.5, y: 0.5}\\`\r\n- BackgroundColor3 = \\`Color3\\` = \\`\"#FF0000\"\\` or \\`{R: 1, G: 0, B: 0}\\` or \\`\"rgb(255,0,0)\"\\`\r\n- Font = \\`Font\\` = \\`{Family: \"rbxasset://fonts/families/SourceSansPro.json\", Weight: \"Bold\"}\\`\r\n- BorderSizePixel = \\`number\\`\r\n- TextSize = \\`number\\`\r\n- Enum properties (e.g., TextXAlignment) = string name like \\`\"Center\"\\`, \\`\"Left\"\\`\r\n\r\n**Property coercion handles automatically:**\r\n- UDim2: tables, arrays, \"0.5, 0, 0.3, 0\" strings\r\n- UDim: {Scale, Offset} or number\r\n- Vector3, Vector2, Color3, BrickColor, CFrame, Rect, NumberRange\r\n- NumberSequence, ColorSequence (for gradients)\r\n- All enum properties from string names\r\n- Color3 from hex \"#RRGGBB\", \"rgb(r,g,b)\", or BrickColor name strings\r\n\r\n## Serializing & Converting Existing UI\r\nWhen the user asks to convert, export, recreate, or turn an existing UI into a React/Roact component:\r\n\r\n**Use \\`serialize_ui\\` — NOT \\`get_descendants_properties\\`.**\r\n\\`serialize_ui\\` returns a clean, minimal JSON tree with only non-default properties, values already in JSON-friendly formats (hex colors, UDim2 arrays, enum names), and a proper parent-child hierarchy. It's purpose-built for this exact workflow.\r\n\r\n\\`get_descendants_properties\\` returns a flat list with ALL properties (including read-only, defaults, deprecated) — it's much larger and harder to convert.\r\n\r\n### Roblox UI → Roact/React Conversion Workflow\r\n1. Call \\`serialize_ui\\` with the path (e.g. \\`StarterGui.MyScreenGui.MyFrame\\`)\r\n2. The result is a tree like:\r\n\\`\\`\\`json\r\n{\r\n \"ClassName\": \"Frame\", \"Name\": \"MyFrame\",\r\n \"Size\": [0.5, 0, 0.3, 0], \"BackgroundColor3\": \"#1a1a2e\",\r\n \"Children\": [\r\n { \"ClassName\": \"UICorner\", \"CornerRadius\": [0, 8] },\r\n { \"ClassName\": \"TextLabel\", \"Name\": \"Title\", \"Text\": \"Hello\",\r\n \"Size\": [1, 0, 0.2, 0], \"TextColor3\": \"#ffffff\", \"BackgroundTransparency\": 1 }\r\n ]\r\n}\r\n\\`\\`\\`\r\n3. Convert to Roact/React-lua using these mappings:\r\n - Each JSON node → \\`Roact.createElement(ClassName, props, children)\\` or \\`React.createElement\\`\r\n - \\`UDim2\\` arrays \\`[xS, xO, yS, yO]\\` → \\`UDim2.new(xS, xO, yS, yO)\\`\r\n - \\`Color3\\` hex \\`\"#RRGGBB\"\\` → \\`Color3.fromHex(\"#RRGGBB\")\\`\r\n - \\`Vector2\\` arrays \\`[x, y]\\` → \\`Vector2.new(x, y)\\`\r\n - \\`UDim\\` arrays \\`[s, o]\\` → \\`UDim.new(s, o)\\`\r\n - Enum strings \\`\"Center\"\\` → \\`Enum.TextXAlignment.Center\\` (resolve the full enum path)\r\n - \\`Children\\` array → child elements table\r\n - UI modifiers (UICorner, UIStroke, UIGradient, UIListLayout, UIPadding, UIScale) → children of the parent element\r\n\r\n### Example Roact output:\r\n\\`\\`\\`lua\r\nlocal function MyFrame()\r\n return Roact.createElement(\"Frame\", {\r\n Size = UDim2.new(0.5, 0, 0.3, 0),\r\n BackgroundColor3 = Color3.fromHex(\"#1a1a2e\"),\r\n }, {\r\n Corner = Roact.createElement(\"UICorner\", {\r\n CornerRadius = UDim.new(0, 8),\r\n }),\r\n Title = Roact.createElement(\"TextLabel\", {\r\n Size = UDim2.new(1, 0, 0.2, 0),\r\n Text = \"Hello\",\r\n TextColor3 = Color3.fromHex(\"#ffffff\"),\r\n BackgroundTransparency = 1,\r\n }),\r\n })\r\nend\r\n\\`\\`\\`\r\n\r\n### Key rules for conversion:\r\n- Use the instance \\`Name\\` as the dictionary key in the children table\r\n- UI modifiers (UICorner, UIStroke, etc.) are CHILDREN, not props\r\n- Keep the exact property values from serialize_ui — don't guess or approximate\r\n- For Fusion: \\`New \"Frame\" { Size = UDim2.new(...), [Children] = { ... } }\\`\r\n- Preserve ZIndex ordering when relevant\r\n- FontFace objects → \\`Font.new(\"rbxasset://fonts/families/...\", Enum.FontWeight.Bold)\\`\r\n\r\n## ReflectionService\r\nThe \\`get_class_info\\` tool queries Roblox's ReflectionService to return the complete API surface for any class:\r\n- All properties with their exact ValueType\r\n- All methods with parameter names and types\r\n- All events with parameter types\r\n- Superclass, creatability, serialization info\r\n\r\nUse it whenever you're unsure about property names or types. It's fast and cached.\r\n\r\n${INTERNAL_MEMORY}`);\r\n\r\n return parts.join('\\n');\r\n}\r\n","import type OpenAI from 'openai';\nimport { buildSystemPrompt } from './system-prompt.js';\nimport { recallFacts, getScriptIndex, getProjectSummaries } from '../memory/store.js';\nimport { loadConfig, loadRules } from '../config/config.js';\nimport { getContextWindow } from '../ai/models.js';\nimport type { StudioBridge } from '../transport/ws-server.js';\nimport type { ChatMessage } from '../memory/types.js';\n\nconst CHARS_PER_TOKEN = 4; // rough estimate\n\ninterface ContextBuildResult {\n messages: OpenAI.ChatCompletionMessageParam[];\n tokenEstimate: number;\n}\n\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\nexport function buildContext(opts: {\n userMessage: string;\n conversationHistory: OpenAI.ChatCompletionMessageParam[];\n server: StudioBridge;\n projectId: string;\n sessionId: string;\n}): ContextBuildResult {\n const config = loadConfig();\n const rules = loadRules();\n const contextWindow = getContextWindow(config.model);\n\n // Token budget allocation\n const systemBudget = Math.floor(contextWindow * 0.15);\n const memoryBudget = Math.floor(contextWindow * 0.15);\n const conversationBudget = Math.floor(contextWindow * 0.45);\n // 25% reserved for response + tool calls\n\n // Build system prompt\n const connInfo = opts.server.getConnectionInfo();\n const facts = recallFacts(opts.projectId, opts.userMessage, 15);\n const scriptIndex = getScriptIndex(opts.projectId);\n const summaries = getProjectSummaries(opts.projectId, 5);\n\n let systemPrompt = buildSystemPrompt({\n userName: config.userName,\n connected: opts.server.isConnected(),\n placeName: connInfo?.placeName,\n placeId: connInfo?.placeId,\n scriptIndex,\n facts,\n rules,\n });\n\n // Trim system prompt if over budget\n if (estimateTokens(systemPrompt) > systemBudget) {\n systemPrompt = systemPrompt.slice(0, systemBudget * CHARS_PER_TOKEN);\n }\n\n // Build conversation messages, trimming old ones if over budget\n const messages: OpenAI.ChatCompletionMessageParam[] = [\n { role: 'system', content: systemPrompt },\n ];\n\n // Add session summaries as context\n if (summaries.length > 0) {\n const summaryText = summaries\n .map((s) => s.summary)\n .join('\\n');\n if (estimateTokens(summaryText) <= memoryBudget) {\n messages.push({\n role: 'system',\n content: `Previous session summaries:\\n${summaryText}`,\n });\n }\n }\n\n // Add conversation history, newest first, respecting budget\n let historyTokens = 0;\n const historyMessages: OpenAI.ChatCompletionMessageParam[] = [];\n\n // Always include the current user message\n const currentMsg: OpenAI.ChatCompletionMessageParam = {\n role: 'user',\n content: opts.userMessage,\n };\n\n // Add historical messages from newest to oldest\n for (let i = opts.conversationHistory.length - 1; i >= 0; i--) {\n const msg = opts.conversationHistory[i];\n const content =\n typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);\n const tokens = estimateTokens(content);\n\n if (historyTokens + tokens > conversationBudget) break;\n historyTokens += tokens;\n historyMessages.unshift(msg);\n }\n\n messages.push(...historyMessages, currentMsg);\n\n const totalTokens = estimateTokens(\n messages.map((m) => (typeof m.content === 'string' ? m.content : '')).join(''),\n );\n\n return { messages, tokenEstimate: totalTokens };\n}\n\nexport function chatMessageToOpenAI(\n msg: ChatMessage,\n): OpenAI.ChatCompletionMessageParam | null {\n switch (msg.role) {\n case 'user':\n return { role: 'user', content: msg.content };\n case 'assistant':\n return { role: 'assistant', content: msg.content };\n case 'system':\n return { role: 'system', content: msg.content };\n case 'tool_result':\n return {\n role: 'tool' as const,\n content: msg.content,\n tool_call_id: msg.toolName ?? 'unknown',\n };\n default:\n return null;\n }\n}\n","import type { AIProviderType } from '../config/config.js';\n\nexport interface ModelInfo {\n id: string;\n name: string;\n contextWindow: number;\n supportsTools: boolean;\n provider: AIProviderType;\n}\n\nexport const POPULAR_MODELS: ModelInfo[] = [\n // --- OpenAI ---\n { id: 'gpt-5.3-codex', name: 'GPT-5.3 Codex', contextWindow: 256000, supportsTools: true, provider: 'openai' },\n { id: 'gpt-5.2', name: 'GPT-5.2', contextWindow: 256000, supportsTools: true, provider: 'openai' },\n { id: 'gpt-4o', name: 'GPT-4o', contextWindow: 128000, supportsTools: true, provider: 'openai' },\n { id: 'o3-mini', name: 'o3-mini', contextWindow: 200000, supportsTools: true, provider: 'openai' },\n\n // --- Anthropic ---\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6', contextWindow: 200000, supportsTools: true, provider: 'anthropic' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6', contextWindow: 200000, supportsTools: true, provider: 'anthropic' },\n\n // --- Google Gemini ---\n { id: 'gemini-3.1-pro', name: 'Gemini 3.1 Pro', contextWindow: 2097152, supportsTools: true, provider: 'gemini' },\n { id: 'gemini-2.0-flash', name: 'Gemini 2.0 Flash', contextWindow: 1048576, supportsTools: true, provider: 'gemini' },\n\n // --- xAI / Grok ---\n { id: 'grok-4.2', name: 'Grok 4.2', contextWindow: 256000, supportsTools: true, provider: 'xai' },\n { id: 'grok-3', name: 'Grok 3', contextWindow: 131072, supportsTools: true, provider: 'xai' },\n\n // --- OpenRouter (routes to any model) ---\n { id: 'anthropic/claude-opus-4-6', name: 'Claude Opus 4.6', contextWindow: 200000, supportsTools: true, provider: 'openrouter' },\n { id: 'anthropic/claude-sonnet-4-6', name: 'Claude Sonnet 4.6', contextWindow: 200000, supportsTools: true, provider: 'openrouter' },\n { id: 'openai/gpt-5.3-codex', name: 'GPT-5.3 Codex', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'openai/gpt-5.2', name: 'GPT-5.2', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'google/gemini-3.1-pro', name: 'Gemini 3.1 Pro', contextWindow: 2097152, supportsTools: true, provider: 'openrouter' },\n { id: 'x-ai/grok-4.2', name: 'Grok 4.2', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'deepseek/deepseek-v3.2', name: 'DeepSeek V3.2', contextWindow: 1000000, supportsTools: true, provider: 'openrouter' },\n];\n\nexport function getModelInfo(modelId: string): ModelInfo | undefined {\n return POPULAR_MODELS.find((m) => m.id === modelId);\n}\n\nexport function getModelsForProvider(provider: AIProviderType): ModelInfo[] {\n return POPULAR_MODELS.filter((m) => m.provider === provider);\n}\n\nexport function getContextWindow(modelId: string): number {\n return getModelInfo(modelId)?.contextWindow ?? 128000;\n}\n","import type OpenAI from 'openai';\nimport { nanoid } from 'nanoid';\nimport { AIProvider } from '../ai/provider.js';\nimport { buildContext } from './context-builder.js';\nimport { loadConfig } from '../config/config.js';\nimport { createConfigAccess } from '../config/config.js';\nimport { storeMessage } from '../memory/store.js';\nimport type { StudioBridge } from '../transport/ws-server.js';\nimport { ToolRegistry } from '../tools/registry.js';\nimport type { AgentEvent, ToolContext, ToolCall, ToolResult } from '../tools/types.js';\nimport type { WsMessage } from '../transport/protocol.js';\n\nexport class AgentLoop {\n private ai: AIProvider;\n private server: StudioBridge;\n private tools: ToolRegistry;\n private conversationHistory: OpenAI.ChatCompletionMessageParam[] = [];\n private projectId = 'current';\n private sessionId: string;\n private maxIterations: number;\n private maxRetries: number;\n\n constructor(server: StudioBridge, tools: ToolRegistry) {\n const config = loadConfig();\n this.ai = new AIProvider(config);\n this.server = server;\n this.tools = tools;\n this.sessionId = nanoid();\n this.maxIterations = config.maxToolIterations;\n this.maxRetries = config.maxVerifyRetries;\n }\n\n getSessionId(): string {\n return this.sessionId;\n }\n\n setModel(model: string): void {\n this.ai.setModel(model);\n }\n\n getModel(): string {\n return this.ai.getModel();\n }\n\n async listModels(): Promise<{ id: string; owned_by?: string }[]> {\n return this.ai.listModels();\n }\n\n setProjectId(projectId: string): void {\n this.projectId = projectId;\n }\n\n async *run(\n userMessage: string,\n imageAttachment?: { base64: string; mimeType: string },\n ): AsyncGenerator<AgentEvent> {\n storeMessage({\n sessionId: this.sessionId,\n role: 'user',\n content: userMessage + (imageAttachment ? ' [image attached]' : ''),\n createdAt: Date.now(),\n });\n\n const { messages } = buildContext({\n userMessage,\n conversationHistory: this.conversationHistory,\n server: this.server,\n projectId: this.projectId,\n sessionId: this.sessionId,\n });\n\n // If image attached, convert the last user message to multipart content\n if (imageAttachment) {\n const lastMsg = messages[messages.length - 1];\n if (lastMsg && lastMsg.role === 'user') {\n (lastMsg as any).content = [\n { type: 'text', text: typeof lastMsg.content === 'string' ? lastMsg.content : userMessage },\n {\n type: 'image_url',\n image_url: {\n url: `data:${imageAttachment.mimeType};base64,${imageAttachment.base64}`,\n detail: 'high',\n },\n },\n ];\n }\n }\n\n const toolCtx = this.createToolContext();\n const allTools = this.tools.getAll();\n let currentMessages = [...messages];\n let iteration = 0;\n\n while (iteration < this.maxIterations) {\n iteration++;\n\n try {\n const response = await this.ai.chat(currentMessages, allTools);\n\n // Handle text response\n if (response.content) {\n yield { type: 'text', content: response.content };\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'assistant',\n content: response.content,\n createdAt: Date.now(),\n });\n\n this.conversationHistory.push({ role: 'assistant', content: response.content });\n }\n\n // No tool calls -- we're done\n if (response.toolCalls.length === 0) {\n break;\n }\n\n // Execute tool calls\n const toolResults: { call: ToolCall; result: ToolResult }[] = [];\n\n for (const call of response.toolCalls) {\n yield { type: 'tool_call', tool: call.name, args: call.arguments };\n\n const result = await this.tools.execute(call, toolCtx);\n toolResults.push({ call, result });\n\n yield { type: 'tool_result', tool: call.name, result };\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'tool_call',\n content: JSON.stringify({ name: call.name, args: call.arguments }),\n toolName: call.name,\n createdAt: Date.now(),\n });\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'tool_result',\n content: JSON.stringify(result),\n toolName: call.name,\n createdAt: Date.now(),\n });\n }\n\n // Add assistant message with tool calls to conversation\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: 'assistant',\n content: response.content ?? null,\n tool_calls: response.toolCalls.map((tc) => ({\n id: tc.id,\n type: 'function' as const,\n function: { name: tc.name, arguments: JSON.stringify(tc.arguments) },\n })),\n };\n currentMessages.push(assistantMsg);\n\n // Add tool results to messages\n for (const { call, result } of toolResults) {\n currentMessages.push({\n role: 'tool',\n content: JSON.stringify(result),\n tool_call_id: call.id,\n });\n }\n\n this.conversationHistory.push(assistantMsg);\n for (const { call, result } of toolResults) {\n this.conversationHistory.push({\n role: 'tool' as const,\n content: JSON.stringify(result),\n tool_call_id: call.id,\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n yield { type: 'error', message };\n break;\n }\n }\n\n yield { type: 'done' };\n }\n\n async *streamRun(\n userMessage: string,\n imageAttachment?: { base64: string; mimeType: string },\n ): AsyncGenerator<AgentEvent> {\n for await (const event of this.run(userMessage, imageAttachment)) {\n yield event;\n }\n }\n\n private createToolContext(): ToolContext {\n return {\n sendToStudio: <T = unknown>(type: string, payload: unknown, timeoutMs?: number): Promise<WsMessage<T>> => {\n return this.server.sendRequest<T>(type, payload, timeoutMs);\n },\n isStudioConnected: () => this.server.isConnected(),\n memory: {\n recall: (query: string, projectId: string, limit?: number) => {\n const { recallFacts } = require('../memory/store.js');\n const facts = recallFacts(projectId || this.projectId, query, limit);\n return facts.map((f: { content: string }) => f.content);\n },\n learn: (projectId: string, facts: { content: string; category: string }[]) => {\n const { storeFact } = require('../memory/store.js');\n const now = Date.now();\n for (const f of facts) {\n storeFact({\n projectId: projectId || this.projectId,\n content: f.content,\n category: f.category as any,\n source: 'agent',\n relevance: 1.0,\n createdAt: now,\n accessedAt: now,\n });\n }\n },\n getScriptIndex: (projectId: string) => {\n const { getScriptIndex } = require('../memory/store.js');\n return getScriptIndex(projectId || this.projectId);\n },\n },\n config: createConfigAccess(),\n };\n }\n\n clearHistory(): void {\n this.conversationHistory = [];\n this.sessionId = nanoid();\n }\n}\n","import type { Tool, ToolCall, ToolResult, ToolContext } from './types.js';\r\n\r\nexport class ToolRegistry {\r\n private tools = new Map<string, Tool>();\r\n\r\n register(tool: Tool): void {\r\n if (this.tools.has(tool.name)) {\r\n throw new Error(`Tool already registered: ${tool.name}`);\r\n }\r\n this.tools.set(tool.name, tool);\r\n }\r\n\r\n get(name: string): Tool | undefined {\r\n return this.tools.get(name);\r\n }\r\n\r\n getAll(): Tool[] {\r\n return Array.from(this.tools.values());\r\n }\r\n\r\n getSchemas(): Tool[] {\r\n return this.getAll();\r\n }\r\n\r\n async execute(call: ToolCall, ctx: ToolContext): Promise<ToolResult> {\r\n const tool = this.tools.get(call.name);\r\n if (!tool) {\r\n return { success: false, error: `Unknown tool: ${call.name}` };\r\n }\r\n\r\n try {\r\n return await tool.execute(call.arguments, ctx);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n return { success: false, error: message };\r\n }\r\n }\r\n\r\n listNames(): string[] {\r\n return Array.from(this.tools.keys());\r\n }\r\n}\r\n\r\nexport function createDefaultRegistry(): ToolRegistry {\r\n const registry = new ToolRegistry();\r\n\r\n // Dynamic imports to avoid circular deps\r\n const toolModules = [\r\n import('./studio/read-script.js'),\r\n import('./studio/edit-script.js'),\r\n import('./studio/run-code.js'),\r\n import('./studio/get-explorer.js'),\r\n import('./studio/get-properties.js'),\r\n import('./studio/get-descendants-properties.js'),\r\n import('./studio/set-properties.js'),\r\n import('./studio/insert-instance.js'),\r\n import('./studio/delete-instance.js'),\r\n import('./studio/get-output.js'),\r\n import('./studio/get-selection.js'),\r\n import('./studio/search-scripts.js'),\r\n import('./studio/run-tests.js'),\r\n import('./studio/get-class-info.js'),\r\n import('./studio/create-ui.js'),\r\n import('./studio/execute-run-test.js'),\r\n import('./studio/execute-play-test.js'),\r\n import('./studio/create-part.js'),\r\n import('./studio/clone-instance.js'),\r\n import('./studio/group-instances.js'),\r\n import('./studio/build-multiple.js'),\r\n import('./studio/serialize-ui.js'),\r\n import('./studio/move-instance.js'),\r\n import('./studio/bulk-set-properties.js'),\r\n import('./studio/find-replace-scripts.js'),\r\n import('./memory/recall.js'),\r\n import('./memory/remember.js'),\r\n import('./cloud/upload-asset.js'),\r\n ];\r\n\r\n // Register all tools asynchronously, return immediately\r\n // Tools will be available by the time the agent loop starts\r\n void Promise.all(\r\n toolModules.map(async (mod) => {\r\n const m = await mod;\r\n if (m.tool) registry.register(m.tool);\r\n }),\r\n );\r\n\r\n // Register undo/redo (dual-export module)\r\n void import('./studio/undo-redo.js').then((m) => {\r\n registry.register(m.undoTool);\r\n registry.register(m.redoTool);\r\n });\r\n\r\n return registry;\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\nimport https from 'node:https';\r\nimport { execSync } from 'node:child_process';\r\n\r\nconst CACHE_DIR = path.join(os.homedir(), '.dominus');\r\nconst CACHE_FILE = path.join(CACHE_DIR, 'update-check.json');\r\nconst CHECK_INTERVAL_MS = 4 * 60 * 60 * 1000; // 4 hours\r\nconst NPM_PACKAGE = 'dominus-cli';\r\n\r\ninterface UpdateCache {\r\n lastCheck: number;\r\n latestVersion: string | null;\r\n}\r\n\r\nfunction readCache(): UpdateCache {\r\n try {\r\n if (fs.existsSync(CACHE_FILE)) {\r\n return JSON.parse(fs.readFileSync(CACHE_FILE, 'utf-8'));\r\n }\r\n } catch {}\r\n return { lastCheck: 0, latestVersion: null };\r\n}\r\n\r\nfunction writeCache(cache: UpdateCache): void {\r\n try {\r\n if (!fs.existsSync(CACHE_DIR)) fs.mkdirSync(CACHE_DIR, { recursive: true });\r\n fs.writeFileSync(CACHE_FILE, JSON.stringify(cache), 'utf-8');\r\n } catch {}\r\n}\r\n\r\nfunction fetchLatestVersion(): Promise<string | null> {\r\n return new Promise((resolve) => {\r\n const req = https.get(\r\n `https://registry.npmjs.org/${NPM_PACKAGE}/latest`,\r\n { headers: { Accept: 'application/json' }, timeout: 5000 },\r\n (res) => {\r\n if (res.statusCode !== 200) { resolve(null); res.resume(); return; }\r\n let body = '';\r\n res.on('data', (c) => (body += c));\r\n res.on('end', () => {\r\n try { resolve(JSON.parse(body).version ?? null); }\r\n catch { resolve(null); }\r\n });\r\n },\r\n );\r\n req.on('error', () => resolve(null));\r\n req.on('timeout', () => { req.destroy(); resolve(null); });\r\n });\r\n}\r\n\r\nfunction compareVersions(current: string, latest: string): number {\r\n const a = current.split('.').map(Number);\r\n const b = latest.split('.').map(Number);\r\n for (let i = 0; i < 3; i++) {\r\n if ((b[i] ?? 0) > (a[i] ?? 0)) return 1;\r\n if ((b[i] ?? 0) < (a[i] ?? 0)) return -1;\r\n }\r\n return 0;\r\n}\r\n\r\nexport interface UpdateInfo {\r\n updateAvailable: boolean;\r\n currentVersion: string;\r\n latestVersion: string;\r\n}\r\n\r\n/**\r\n * Non-blocking update check. Fires off a network request in the background\r\n * and returns immediately if the cache is fresh. Never throws.\r\n */\r\nexport async function checkForUpdate(currentVersion: string): Promise<UpdateInfo | null> {\r\n try {\r\n const cache = readCache();\r\n const now = Date.now();\r\n\r\n if (now - cache.lastCheck < CHECK_INTERVAL_MS && cache.latestVersion) {\r\n if (compareVersions(currentVersion, cache.latestVersion) > 0) {\r\n return { updateAvailable: true, currentVersion, latestVersion: cache.latestVersion };\r\n }\r\n return null;\r\n }\r\n\r\n const latest = await fetchLatestVersion();\r\n writeCache({ lastCheck: now, latestVersion: latest });\r\n\r\n if (latest && compareVersions(currentVersion, latest) > 0) {\r\n return { updateAvailable: true, currentVersion, latestVersion: latest };\r\n }\r\n } catch {}\r\n return null;\r\n}\r\n\r\nexport function formatUpdateMessage(info: UpdateInfo): string {\r\n const line1 = `Update available: ${info.currentVersion} → ${info.latestVersion}`;\r\n const line2 = `Run: npm i -g ${NPM_PACKAGE}`;\r\n const width = Math.max(line1.length, line2.length) + 4;\r\n const pad = (s: string) => ` │ ${s}${' '.repeat(width - s.length - 4)} │`;\r\n return [\r\n '',\r\n ` ╭${'─'.repeat(width)}╮`,\r\n pad(line1),\r\n pad(line2),\r\n ` ╰${'─'.repeat(width)}╯`,\r\n '',\r\n ].join('\\n');\r\n}\r\n\r\n/**\r\n * Auto-update: detects the package manager used to install dominus-cli\r\n * and runs the appropriate update command. Returns true if the update succeeded.\r\n */\r\nexport async function autoUpdate(currentVersion: string): Promise<{ success: boolean; from: string; to: string; error?: string }> {\r\n const info = await checkForUpdate(currentVersion);\r\n if (!info?.updateAvailable) {\r\n return { success: true, from: currentVersion, to: currentVersion };\r\n }\r\n\r\n // Detect which package manager installed us\r\n const managers = [\r\n { name: 'pnpm', check: 'pnpm list -g dominus-cli', cmd: 'pnpm add -g dominus-cli@latest' },\r\n { name: 'npm', check: 'npm list -g dominus-cli', cmd: 'npm install -g dominus-cli@latest' },\r\n { name: 'yarn', check: 'yarn global list --pattern dominus-cli', cmd: 'yarn global add dominus-cli@latest' },\r\n ];\r\n\r\n let installCmd: string | null = null;\r\n for (const mgr of managers) {\r\n try {\r\n const out = execSync(mgr.check, { stdio: 'pipe', timeout: 10000 }).toString();\r\n if (out.includes('dominus-cli')) {\r\n installCmd = mgr.cmd;\r\n break;\r\n }\r\n } catch {}\r\n }\r\n\r\n // Check if we're a linked install (dev workflow)\r\n if (!installCmd) {\r\n try {\r\n const out = execSync('pnpm list -g dominus-cli', { stdio: 'pipe', timeout: 10000 }).toString();\r\n if (out.includes('link:')) {\r\n // Linked install — pull + rebuild\r\n const pkgPath = path.resolve(__dirname, '..');\r\n if (fs.existsSync(path.join(pkgPath, '.git'))) {\r\n try {\r\n execSync('git pull', { cwd: pkgPath, stdio: 'pipe', timeout: 30000 });\r\n execSync('pnpm install', { cwd: pkgPath, stdio: 'pipe', timeout: 60000 });\r\n execSync('pnpm build', { cwd: pkgPath, stdio: 'pipe', timeout: 60000 });\r\n execSync('pnpm build:plugin', { cwd: pkgPath, stdio: 'pipe', timeout: 30000 });\r\n return { success: true, from: currentVersion, to: info.latestVersion };\r\n } catch (err) {\r\n return { success: false, from: currentVersion, to: info.latestVersion, error: `Git pull/rebuild failed: ${err}` };\r\n }\r\n }\r\n return { success: false, from: currentVersion, to: info.latestVersion, error: 'Linked install without git — run \"pnpm build\" manually in the repo' };\r\n }\r\n } catch {}\r\n }\r\n\r\n if (!installCmd) {\r\n installCmd = `npm install -g ${NPM_PACKAGE}@latest`;\r\n }\r\n\r\n try {\r\n execSync(installCmd, { stdio: 'pipe', timeout: 120000 });\r\n // Clear the update cache so next run shows the new version\r\n writeCache({ lastCheck: 0, latestVersion: null });\r\n return { success: true, from: currentVersion, to: info.latestVersion };\r\n } catch (err) {\r\n return { success: false, from: currentVersion, to: info.latestVersion, error: `Update command failed: ${err}` };\r\n }\r\n}\r\n\r\n// Needed for linked install detection\r\nconst __dirname = path.dirname(new URL(import.meta.url).pathname.replace(/^\\/([A-Z]:)/, '$1'));\r\n"]}
|