omnara 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -10
- package/bin/omnara.js +56 -17
- package/package.json +24 -55
- package/dist/auth/auth-provider.d.ts +0 -26
- package/dist/auth/cli-auth-service.d.ts +0 -26
- package/dist/auth/credential-manager.d.ts +0 -13
- package/dist/auth/credentials-store.d.ts +0 -20
- package/dist/auth/ensure-cli-credentials.d.ts +0 -8
- package/dist/auth/login-flow.d.ts +0 -11
- package/dist/auth/loopback-listener.d.ts +0 -20
- package/dist/auth/pkce.d.ts +0 -6
- package/dist/cli.d.ts +0 -3
- package/dist/cli.js +0 -19479
- package/dist/cli.js.map +0 -7
- package/dist/commands/agent.d.ts +0 -9
- package/dist/commands/auth.d.ts +0 -2
- package/dist/commands/daemon.d.ts +0 -2
- package/dist/commands/index.d.ts +0 -4
- package/dist/commands/kill.d.ts +0 -2
- package/dist/config/omnara-config.d.ts +0 -19
- package/dist/daemon/config-store.d.ts +0 -37
- package/dist/daemon/daemon-client.d.ts +0 -27
- package/dist/daemon/daemon-launcher.d.ts +0 -39
- package/dist/daemon/daemon-service.d.ts +0 -30
- package/dist/daemon/directory-registry.d.ts +0 -17
- package/dist/daemon/local-control-server.d.ts +0 -38
- package/dist/daemon/machine-supervisor.d.ts +0 -63
- package/dist/daemon/paths.d.ts +0 -16
- package/dist/daemon/run-daemon.d.ts +0 -1
- package/dist/daemon/session-pid-registry.d.ts +0 -11
- package/dist/daemon/session-runner.d.ts +0 -38
- package/dist/daemon/state-store.d.ts +0 -14
- package/dist/env/env-mode.d.ts +0 -2
- package/dist/http/api-client.d.ts +0 -19
- package/dist/http/machines.d.ts +0 -3
- package/dist/http/user-sessions.d.ts +0 -16
- package/dist/http/workspaces.d.ts +0 -4
- package/dist/index.d.ts +0 -1
- package/dist/orchestrator/agent-orchestrator.d.ts +0 -103
- package/dist/orchestrator/ai-client.d.ts +0 -33
- package/dist/orchestrator/orchestrator-prompt.d.ts +0 -8
- package/dist/orchestrator/orchestrator-prompt.md +0 -222
- package/dist/orchestrator/orchestrator-types.d.ts +0 -168
- package/dist/orchestrator/session.d.ts +0 -83
- package/dist/orchestrator/tools/worker-tools.d.ts +0 -10
- package/dist/orchestrator/utils/completions-manager.d.ts +0 -8
- package/dist/orchestrator/utils/envelope-utils.d.ts +0 -13
- package/dist/orchestrator/utils/index.d.ts +0 -2
- package/dist/orchestrator/utils/session-logger.d.ts +0 -7
- package/dist/orchestrator/utils/worker-events.d.ts +0 -7
- package/dist/orchestrator/utils/worktree-manager.d.ts +0 -51
- package/dist/orchestrator/worker-manager.d.ts +0 -81
- package/dist/orchestrator/worker-types.d.ts +0 -23
- package/dist/orchestrator-prompt.md +0 -222
- package/dist/package-info.d.ts +0 -12
- package/dist/relay/relay-bridge.d.ts +0 -65
- package/dist/relay/relay-service.d.ts +0 -19
- package/dist/schemas/index.d.ts +0 -2
- package/dist/utils/backoff.d.ts +0 -6
- package/dist/utils/browser.d.ts +0 -1
- package/dist/utils/claude-code-check.d.ts +0 -19
- package/dist/utils/executable.d.ts +0 -53
- package/dist/utils/logger.d.ts +0 -143
- package/dist/utils/prompt.d.ts +0 -1
- package/dist/utils/version-check.d.ts +0 -43
- package/dist/utils/websocket.d.ts +0 -5
- package/instrument.mjs +0 -14
- package/scripts/build-executable.ts +0 -244
- package/scripts/copy-assets.mjs +0 -41
- package/scripts/generate-release-json.ts +0 -136
- package/scripts/preinstall.js +0 -141
- package/scripts/test-preinstall.js +0 -124
- package/scripts/upload-release.ts +0 -388
package/dist/cli.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/cli.ts", "../src/commands/agent.ts", "../src/orchestrator/agent-orchestrator.ts", "../src/orchestrator/ai-client.ts", "../src/utils/claude-code-check.ts", "../src/utils/executable.ts", "../src/orchestrator/session.ts", "../src/utils/logger.ts", "../src/utils/backoff.ts", "../src/orchestrator/utils/envelope-utils.ts", "../src/orchestrator/utils/worker-events.ts", "../src/orchestrator/worker-manager.ts", "../src/orchestrator/utils/worktree-manager.ts", "../src/auth/credentials-store.ts", "../src/env/env-mode.ts", "../src/config/omnara-config.ts", "../src/orchestrator/tools/worker-tools.ts", "../src/orchestrator/orchestrator-prompt.md", "../src/orchestrator/utils/completions-manager.ts", "../src/relay/relay-bridge.ts", "../../shared-js/dist/api/base.js", "../../shared-js/dist/schemas/index.js", "../../shared-js/schemas/control_message.schema.json", "../../shared-js/schemas/message_envelope.schema.json", "../../shared-js/schemas/machine_message.schema.json", "../../shared-js/schemas/api_voice_launch_request.schema.json", "../../shared-js/schemas/api_voice_launch_response.schema.json", "../../shared-js/schemas/api_sessions_create_request.schema.json", "../../shared-js/schemas/api_sessions_summary.schema.json", "../../shared-js/schemas/api_sessions_list_response.schema.json", "../../shared-js/schemas/api_sessions_message_page_response.schema.json", "../../shared-js/schemas/api_sessions_agent_detail.schema.json", "../../shared-js/schemas/api_sessions_create_chat_message_request.schema.json", "../../shared-js/schemas/api_billing_subscription_response.schema.json", "../../shared-js/schemas/api_billing_usage_response.schema.json", "../../shared-js/schemas/api_billing_create_checkout_request.schema.json", "../../shared-js/schemas/api_billing_checkout_response.schema.json", "../../shared-js/schemas/api_billing_validate_promo_request.schema.json", "../../shared-js/schemas/api_billing_promo_validation_response.schema.json", "../../shared-js/schemas/api_billing_customer_portal_request.schema.json", "../../shared-js/schemas/api_billing_customer_portal_response.schema.json", "../../shared-js/schemas/api_settings_notification_request.schema.json", "../../shared-js/schemas/api_settings_notification_response.schema.json", "../../shared-js/schemas/workspace_config.schema.json", "../../shared-js/schemas/api_workspaces_session_launch_request.schema.json", "../../shared-js/schemas/api_workspaces_session_launch_response.schema.json", "../../shared-js/schemas/api_machines_list_response.schema.json", "../src/http/api-client.ts", "../src/relay/relay-service.ts", "../src/auth/auth-provider.ts", "../src/auth/credential-manager.ts", "../src/auth/login-flow.ts", "../src/utils/prompt.ts", "../src/auth/cli-auth-service.ts", "../src/auth/pkce.ts", "../src/auth/loopback-listener.ts", "../src/utils/browser.ts", "../src/http/user-sessions.ts", "../src/utils/websocket.ts", "../src/commands/auth.ts", "../src/daemon/daemon-launcher.ts", "../src/daemon/daemon-client.ts", "../src/daemon/state-store.ts", "../src/daemon/paths.ts", "../src/daemon/directory-registry.ts", "../src/daemon/config-store.ts", "../src/daemon/session-pid-registry.ts", "../src/commands/daemon.ts", "../src/daemon/run-daemon.ts", "../src/daemon/daemon-service.ts", "../src/daemon/local-control-server.ts", "../src/daemon/machine-supervisor.ts", "../../shared-js/dist/utils/eff_wordlist.json", "../../shared-js/dist/utils/worktree-names.js", "../src/http/machines.ts", "../src/http/workspaces.ts", "../src/daemon/session-runner.ts", "../src/package-info.ts", "../src/utils/version-check.ts", "../src/auth/ensure-cli-credentials.ts", "../src/commands/kill.ts"],
|
|
4
|
-
"sourcesContent": ["import path from 'path';\nimport { Command } from 'commander';\nimport * as Sentry from '@sentry/node';\nimport {\n buildAuthCommand,\n buildDaemonCommand,\n buildKillCommand,\n type OrchestratorOptions,\n} from './commands/index.js';\nimport { attemptUpdate } from './utils/version-check.js';\nimport { performClaudeCodeCheck } from './utils/claude-code-check.js';\nimport { logger } from './utils/logger.js';\nimport { DaemonClient, HttpError } from './daemon/daemon-client.js';\nimport { DaemonConfigStore } from './daemon/config-store.js';\nimport { ensureDaemonForSession, ensureMachineNameConfigured } from './daemon/daemon-launcher.js';\nimport { ensureCliCredentials } from './auth/ensure-cli-credentials.js';\nimport { resolveBackendUrl, resolveFrontendUrl } from './auth/login-flow.js';\nimport { PACKAGE_DESCRIPTION, PACKAGE_VERSION } from './package-info.js';\nimport { USER_SESSION_LOG_ROOT } from './daemon/paths.js';\nimport { tryOpenBrowser } from './utils/browser.js';\nimport chalk from 'chalk';\nimport { isBunSingleFileExecutable } from './utils/executable.js';\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('omnara')\n .description(PACKAGE_DESCRIPTION)\n .version(PACKAGE_VERSION)\n .option('-b, --branch <name>', 'Git branch/worktree name for this session')\n .action(async (options: { branch?: string }) => {\n if (program.args.length > 0) {\n logger.error(`Unknown command: ${program.args.join(' ')}`);\n program.outputHelp();\n process.exitCode = 1;\n return;\n }\n const authenticated = await performClaudeCodeCheck();\n if (!authenticated) {\n return;\n }\n await launchSessionViaDaemon({ worktreeName: options.branch });\n });\n\n // Register top-level commands here.\n program.addCommand(buildAuthCommand());\n program.addCommand(buildDaemonCommand());\n program.addCommand(buildKillCommand());\n\n return program;\n}\n\nexport async function run(argv: readonly string[]): Promise<void> {\n const program = createProgram();\n\n // Check for updates in the background (non-blocking)\n const reinstalled = await attemptUpdate();\n if (reinstalled) {\n return;\n }\n\n try {\n await program.parseAsync(argv as string[]);\n } catch (error) {\n Sentry.captureException(error);\n // Commander will already have logged the error. Set non-zero exit for clarity.\n program.error((error as Error).message, { exitCode: 1 });\n }\n}\n\n// Check if this module is being run directly (ESM equivalent of require.main === module)\nfunction isMainModule(): boolean {\n // In Bun single-file executables, this is always the main module\n // (process.argv[1] is /$bunfs/root/... which won't match import.meta.url)\n if (isBunSingleFileExecutable()) {\n return true;\n }\n\n // In ES modules, check if the current file URL matches the executed script\n if (!import.meta.url || !process.argv[1]) {\n return false;\n }\n\n // Convert process.argv[1] to a file URL for comparison\n const executedPath = path.resolve(process.argv[1]);\n const currentPath = import.meta.url.startsWith('file://')\n ? decodeURIComponent(import.meta.url.slice(7)) // Remove 'file://' prefix\n : import.meta.url;\n\n // Normalize paths for comparison\n return path.normalize(currentPath) === path.normalize(executedPath);\n}\n\nif (isMainModule()) {\n run(process.argv).catch((error: unknown) => {\n Sentry.captureException(error);\n logger.error(error);\n process.exitCode = 1;\n });\n}\n\ninterface LaunchOptions extends OrchestratorOptions {\n worktreeName?: string;\n}\n\nasync function launchSessionViaDaemon(options: LaunchOptions = {}): Promise<void> {\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n try {\n const configStore = new DaemonConfigStore();\n await ensureMachineNameConfigured(configStore, logger);\n await ensureCliCredentials({ backendUrl, frontendUrl, logger });\n await ensureDaemonForSession({\n cwd: process.cwd(),\n logger,\n reason: 'foreground-session',\n backendUrl,\n frontendUrl,\n });\n const client = new DaemonClient();\n const launch = await requestDaemonLaunch(\n client,\n { path: process.cwd(), worktreeName: options.worktreeName },\n {\n timeoutMs: 10_000,\n delayMs: 250,\n logger,\n },\n );\n if (!launch) {\n logger.error('Timed out waiting for the daemon control server. Session was not started.');\n return;\n }\n if (launch.status !== 'ok') {\n logger.warn(`Daemon reported launch status ${launch.status}`);\n return;\n }\n const payload = launch.payload ?? null;\n if (!payload) {\n logger.warn('Daemon acknowledged launch without details. Check daemon logs for progress.');\n return;\n }\n logger.important(chalk.blue('Launching a new session.'));\n logger.info(`Workspace: ${payload.workspace_id}`);\n logger.info(`User session: ${payload.user_session_id}`);\n logger.info(`Launch id: ${payload.launch_id}`);\n logger.important(\n chalk.gray(\n `\\nSession logs: ${formatSessionLogPath(payload.workspace_id, payload.launch_id)}`,\n ),\n );\n const dashboardUrl = buildDashboardUrl(frontendUrl, payload.user_session_id);\n if (dashboardUrl) {\n logger.important(\n chalk.blue(\n `\\n${chalk.bold('Chat via the Omnara mobile app or web dashboard')}: ${chalk.underline(chalk.blueBright(dashboardUrl))}\\n`,\n ),\n );\n tryOpenBrowser(dashboardUrl);\n } else {\n logger.important(\n chalk.blue(\n `\\n${chalk.bold('Chat via the Omnara mobile app or web dashboard')}: ${chalk.underline(chalk.blueBright(new URL('dashboard', frontendUrl).toString()))}\\n`,\n ),\n );\n }\n return;\n } catch (error) {\n if (isPaymentRequiredError(error)) {\n displayPaymentRequiredError(error as HttpError, frontendUrl);\n process.exitCode = 1;\n return;\n }\n Sentry.captureException(error);\n logger.warn(`Failed to prepare daemon: ${(error as Error).message}`);\n }\n}\n\nasync function requestDaemonLaunch(\n client: DaemonClient,\n payload: { path: string; initialPrompt?: string; userSessionId?: string; worktreeName?: string },\n options: { timeoutMs?: number; delayMs?: number; logger: typeof logger },\n): Promise<Awaited<ReturnType<DaemonClient['launchSession']>>> {\n const timeoutMs = options.timeoutMs ?? 10_000;\n const delayMs = options.delayMs ?? 250;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n try {\n const result = await client.launchSession(payload);\n if (result) {\n return result;\n }\n } catch (error) {\n if (isPaymentRequiredError(error)) {\n throw error;\n }\n if (isRecoverableLaunchError(error)) {\n options.logger.debug('Daemon not ready for launch yet:', (error as Error).message);\n } else {\n Sentry.captureException(error);\n throw error;\n }\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n\n return null;\n}\n\nfunction formatSessionLogPath(workspaceId: string, launchId: string): string {\n return path.join(USER_SESSION_LOG_ROOT, workspaceId, `launch-${launchId}.log`);\n}\n\nfunction buildDashboardUrl(frontendUrl: string, userSessionId: string): string | null {\n try {\n const url = new URL('dashboard', frontendUrl);\n url.searchParams.set('session', userSessionId);\n return url.toString();\n } catch {\n return null;\n }\n}\n\nfunction isRecoverableLaunchError(error: unknown): boolean {\n if (error instanceof HttpError) {\n if (error.statusCode === 401) {\n return false;\n }\n const haystack = buildErrorHaystack(error.body ?? '', error.message);\n return (\n haystack.includes('machine has not been registered') ||\n haystack.includes('machine has not finished registering') ||\n (haystack.includes('directory') && haystack.includes('not registered'))\n );\n }\n if (error instanceof Error && error.message) {\n const haystack = buildErrorHaystack('', error.message);\n return (\n haystack.includes('machine has not been registered') ||\n haystack.includes('machine has not finished registering')\n );\n }\n if (isConnectionError(error)) {\n return true;\n }\n return false;\n}\n\nfunction buildErrorHaystack(body: string, message: string): string {\n return `${body} ${message}`.toLowerCase();\n}\n\nfunction isConnectionError(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n typeof (error as { code?: unknown }).code === 'string' &&\n ['ECONNREFUSED', 'ECONNRESET', 'ENOENT'].includes(\n (error as { code: string }).code.toString(),\n ),\n );\n}\n\nfunction isPaymentRequiredError(error: unknown): boolean {\n if (error instanceof HttpError && error.statusCode === 402) {\n return true;\n }\n return false;\n}\n\nfunction displayPaymentRequiredError(error: HttpError, frontendUrl: string): void {\n let message = 'You have reached your session limit.';\n if (error.body) {\n try {\n const parsed = JSON.parse(error.body) as { message?: string; detail?: string };\n message = parsed.message || parsed.detail || message;\n } catch {\n // Ignore parse errors\n }\n }\n\n const border = chalk.red('='.repeat(60));\n const title = chalk.red.bold('Session Limit Reached');\n const description = chalk.white(`\\n${message}\\n`);\n const instruction = chalk.white('To start more sessions, upgrade your account.\\n');\n const billingUrl = new URL('billing', frontendUrl).toString();\n const webLink = chalk.white('\\nVisit: ') + chalk.cyan.underline(billingUrl);\n\n console.error('\\n' + border);\n console.error(title);\n console.error(border);\n console.error(description);\n console.error(instruction);\n console.error(webLink);\n console.error('\\n' + border + '\\n');\n}\n", "import fs from 'node:fs';\nimport { startAgentOrchestrator } from '../orchestrator/agent-orchestrator.js';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport { RelayBridge } from '../relay/relay-bridge.js';\nimport { resolveBackendUrl, resolveFrontendUrl } from '../auth/login-flow.js';\nimport { createLogger, logger, extractErrorMessage, type Logger } from '../utils/logger.js';\nimport * as Sentry from '@sentry/node';\n\nexport interface OrchestratorOptions {\n backendUrl?: string;\n frontendUrl?: string;\n workspaceId?: string;\n userSessionId?: string;\n agentSessionId?: string;\n worktreeName?: string;\n}\n\nexport async function runAgentOrchestrator(options: OrchestratorOptions = {}): Promise<void> {\n const log = buildOrchestratorLogger();\n const orchestrator = await startAgentOrchestrator({\n worktreeName: options.worktreeName,\n });\n\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n const workspaceId = options.workspaceId ?? process.env.OMNARA_WORKSPACE_ID ?? null;\n if (!workspaceId) {\n throw new Error('A workspace id is required to run the agent orchestrator');\n }\n const store = new CredentialsStore();\n const bridge = new RelayBridge(orchestrator, {\n store,\n logger: log,\n backendUrl,\n frontendUrl,\n workspaceId,\n userSessionId: options.userSessionId,\n agentSessionId: options.agentSessionId,\n });\n\n const stop = async () => {\n await bridge.stop();\n await orchestrator.stop();\n };\n\n const signalHandler = createSignalHandler(stop, log);\n process.on('SIGINT', signalHandler.handler);\n process.on('SIGTERM', signalHandler.handler);\n\n try {\n await bridge.start();\n } catch (error) {\n Sentry.captureException(error);\n log.error(`Relay orchestrator terminated: ${extractErrorMessage(error)}`);\n process.exitCode = process.exitCode || 1;\n } finally {\n await stop();\n await log.close?.();\n signalHandler.remove();\n }\n}\n\nfunction createSignalHandler(onStop: () => Promise<void>, log: Logger) {\n let stopping = false;\n\n const handler = (signal: NodeJS.Signals) => {\n if (stopping) {\n return;\n }\n stopping = true;\n log.important(`\\nReceived ${signal}. Shutting down agent orchestrator...`);\n void onStop().catch((error) => {\n Sentry.captureException(error);\n log.error('Error while shutting down agent orchestrator:', error);\n });\n };\n\n const remove = () => {\n process.removeListener('SIGINT', handler);\n process.removeListener('SIGTERM', handler);\n };\n\n return { handler, remove };\n}\n\nfunction buildOrchestratorLogger(): Logger {\n const sessionLogPath = process.env.OMNARA_SESSION_LOG_PATH;\n if (!sessionLogPath) {\n return logger;\n }\n const stream = fs.createWriteStream(sessionLogPath, { flags: 'a' });\n return createLogger('UserSession', {\n sinks: [\n (entry) => stream.write(`${entry.line}\\n`),\n (entry) => console.log(...(entry.raw as unknown[])),\n ],\n closers: [\n () =>\n new Promise<void>((resolve) => {\n stream.end(resolve);\n }),\n ],\n forceOutput: true,\n });\n}\n", "import { randomUUID } from 'crypto';\nimport * as Sentry from '@sentry/node';\nimport {\n type McpServerConfig,\n type McpSdkServerConfigWithInstance,\n type PermissionMode,\n type HookCallbackMatcher,\n type HookInput,\n type HookJSONOutput,\n} from '@anthropic-ai/claude-agent-sdk';\nimport {\n AIClient,\n BASE_ALLOWED_ORCHESTRATOR_TOOLS,\n BASE_ALLOWED_WORKER_TOOLS,\n MODEL_MAP,\n type AgentClient,\n} from './ai-client.js';\nimport { simpleGit, type SimpleGit } from 'simple-git';\nimport { Session, type CompleteMessageEnvelope, type SessionInitNotification } from './session.js';\nimport { WorkerManager } from './worker-manager.js';\nimport { WorktreeManager } from './utils/worktree-manager.js';\nimport {\n createWorkerMcpServer,\n WORKER_LAUNCH_TOOL,\n WORKER_MESSAGE_TOOL,\n} from './tools/worker-tools.js';\nimport type { InboundMessage } from './orchestrator-types.js';\nimport { ORCHESTRATOR_SYSTEM_PROMPT } from './orchestrator-prompt.js';\nimport type { ControlMessageSchema, MessageEnvelope } from '@omnara/shared-js/schemas';\nimport { CompletionsManager } from './utils/completions-manager.js';\nimport { createLogger } from '../utils/logger.js';\nconst logger = createLogger('AgentOrchestrator');\n\ninterface AgentOrchestratorDependencies {\n createMainClient?: () => AgentClient;\n createWorkerClient?: (mcpServers?: Record<string, McpServerConfig>, cwd?: string) => AgentClient;\n workerManager?: WorkerManager;\n worktreeManager?: WorktreeManager;\n repoPath?: string;\n worktreeName?: string;\n}\n\ntype OrchestratorControlMessage = {\n type: 'session_init';\n sessionId: string;\n parentSessionId?: string | null;\n metadata?: Record<string, unknown>;\n};\n\nexport interface AgentOrchestratorOutputChannel {\n sendEnvelope: (message: MessageEnvelope) => Promise<void> | void;\n sendControl?: (message: OrchestratorControlMessage) => Promise<void> | void;\n canSend?: () => boolean;\n close?: () => void;\n}\n\nexport interface AgentOrchestratorInputChannel {\n dispatch(message: InboundMessage): void;\n disconnect(): void;\n}\n\ntype ClientRecord = AgentOrchestratorOutputChannel & { id: string };\n\ntype SessionMode = NonNullable<ControlMessageSchema.SessionSettingsResponse['mode']>;\n\nconst DEFAULT_SESSION_SETTINGS: ControlMessageSchema.AgentMode = {\n type: 'agent',\n model: 'sonnet',\n};\n\nexport class AgentOrchestrator {\n private readonly aiClient: AgentClient;\n private readonly workerManager: WorkerManager;\n private readonly worktreeManager: WorktreeManager;\n private readonly workerMcpServer: McpSdkServerConfigWithInstance;\n private readonly clients = new Map<string, ClientRecord>();\n private readonly toolUseMap = new Map<string, string>();\n private readonly completionsManager = new CompletionsManager();\n private session: Session | null = null;\n private started = false;\n private mainSessionId: string | null = null;\n private sessionSettings: SessionMode = { ...DEFAULT_SESSION_SETTINGS };\n private worktreeName: string | null = null;\n private worktreePath: string | null = null;\n\n readonly voiceSessionIds = new Set<string>();\n\n constructor(dependencies?: AgentOrchestratorDependencies) {\n const resolveSessionIdBySdk = (sdkSessionId?: string) =>\n this.findSessionIdBySdkSession(sdkSessionId);\n\n const repoPath = dependencies?.repoPath ?? process.cwd();\n\n // Initialize WorktreeManager\n this.worktreeManager = dependencies?.worktreeManager ?? new WorktreeManager(repoPath);\n\n // Store worktree name if provided\n this.worktreeName = dependencies?.worktreeName ?? null;\n\n const workerClientFactory =\n dependencies?.createWorkerClient ??\n ((mcpServers?: Record<string, McpServerConfig>, cwd?: string) =>\n new AIClient({\n defaults: {\n allowedTools: [...BASE_ALLOWED_WORKER_TOOLS],\n mcpServers,\n cwd: cwd ?? process.cwd(),\n },\n }));\n\n this.workerManager =\n dependencies?.workerManager ??\n new WorkerManager({\n createClient: workerClientFactory,\n repoPath,\n broadcastMessage: (msg) => this.handleWorkerMessage(msg),\n broadcastComplete: (msg) => this.handleWorkerComplete(msg),\n announceWorkerSession: async ({ sessionId, parentSessionId, metadata }) => {\n await this.emitSessionInit(sessionId, parentSessionId ?? null, metadata);\n },\n });\n\n this.workerMcpServer = createWorkerMcpServer(this.workerManager, {\n resolveSessionIdBySdk,\n resolveSessionIdByToolUse: (toolUseId: string) => this.consumeToolUse(toolUseId),\n getMainCodingSessionId: () => this.mainSessionId,\n });\n\n const orchestratorAllowedTools = [\n ...BASE_ALLOWED_ORCHESTRATOR_TOOLS,\n WORKER_LAUNCH_TOOL,\n WORKER_MESSAGE_TOOL,\n ];\n\n const mainClientFactory =\n dependencies?.createMainClient ??\n (() =>\n new AIClient({\n defaults: {\n allowedTools: orchestratorAllowedTools,\n mcpServers: {\n worker: this.workerMcpServer,\n },\n systemPrompt: ORCHESTRATOR_SYSTEM_PROMPT,\n },\n }));\n\n this.aiClient = mainClientFactory();\n }\n\n ensureSessionExists(requestedSessionId: string): Session {\n const targetSessionId = this.mainSessionId ?? requestedSessionId;\n if (!this.mainSessionId) {\n this.mainSessionId = requestedSessionId;\n }\n\n if (this.session && this.session.id === targetSessionId) {\n logger.debug('[AgentOrchestrator] Session already exists', {\n sessionId: targetSessionId,\n worktreeName: this.worktreeName,\n worktreePath: this.worktreePath,\n });\n return this.session;\n }\n\n if (this.session && this.session.id !== targetSessionId) {\n logger.warn(\n `[AgentOrchestrator] Replacing active session ${this.session.id} with ${targetSessionId}`,\n );\n void this.session.cancel().catch((error) => {\n logger.debug('[AgentOrchestrator] Failed to cancel previous session', { error });\n });\n this.session = null;\n }\n\n // Log a warning if worktree is expected but not yet initialized\n if (this.worktreeName && !this.worktreePath) {\n logger.warn('[AgentOrchestrator] Creating session before worktree initialization completed', {\n worktreeName: this.worktreeName,\n started: this.started,\n });\n }\n\n const sessionMetadata: Record<string, unknown> = {};\n if (this.worktreeName) {\n sessionMetadata.worktree_name = this.worktreeName;\n sessionMetadata.branch = this.worktreeName; // worktree name matches branch name\n } else {\n // When not using a worktree, set branch to 'HEAD' for git diff operations\n sessionMetadata.branch = 'HEAD';\n }\n\n logger.info('[AgentOrchestrator] Creating new session', {\n sessionId: targetSessionId,\n worktreeName: this.worktreeName,\n worktreePath: this.worktreePath,\n hasWorktreePath: !!this.worktreePath,\n started: this.started,\n });\n\n const session = new Session(targetSessionId, this.aiClient, {\n parentSessionId: null,\n sessionType: 'CODE',\n summarize: false,\n metadata: sessionMetadata,\n });\n\n this.session = session;\n this.bindSession(session);\n this.applySessionSettings();\n return session;\n }\n\n getWorkerManager(): WorkerManager {\n return this.workerManager;\n }\n\n getWorktreeManager(): WorktreeManager {\n return this.worktreeManager;\n }\n\n setMainCodingSessionId(sessionId: string): void {\n if (this.mainSessionId === sessionId) {\n return;\n }\n this.mainSessionId = sessionId;\n this.ensureSessionExists(sessionId);\n }\n\n addClient(output: AgentOrchestratorOutputChannel): AgentOrchestratorInputChannel {\n const clientId = randomUUID();\n const connection: ClientRecord = {\n id: clientId,\n sendEnvelope: async (message) => {\n await output.sendEnvelope(message);\n },\n sendControl: output.sendControl\n ? async (message) => {\n await output.sendControl?.(message);\n }\n : undefined,\n canSend: output.canSend,\n close: output.close,\n };\n\n this.clients.set(clientId, connection);\n\n let disconnected = false;\n const disconnect = (): void => {\n if (disconnected) {\n return;\n }\n disconnected = true;\n this.clients.delete(connection.id);\n try {\n connection.close?.();\n } catch (error) {\n Sentry.captureException(error);\n console.error('Failed to close client connection:', error);\n }\n };\n\n return {\n dispatch: (message: InboundMessage) => {\n this.handleClientMessage(connection, message);\n },\n disconnect,\n };\n }\n\n async start(): Promise<void> {\n if (this.started) {\n logger.debug('[AgentOrchestrator] start() called but already started', {\n worktreeName: this.worktreeName,\n worktreePath: this.worktreePath,\n });\n return;\n }\n this.started = true;\n\n logger.info('[AgentOrchestrator] Starting orchestrator', {\n worktreeName: this.worktreeName,\n });\n\n // Initialize worktree if worktreeName is provided\n // This must happen before any session is created\n if (this.worktreeName) {\n await this.initializeWorktree(this.worktreeName);\n }\n\n logger.info('[AgentOrchestrator] Orchestrator started', {\n worktreeName: this.worktreeName,\n worktreePath: this.worktreePath,\n hasWorktreePath: !!this.worktreePath,\n });\n }\n\n private async initializeWorktree(worktreeName: string): Promise<void> {\n try {\n // Use a unique ID for the main session's worktree user\n const mainSessionWorkerId = `main-session-${this.mainSessionId ?? 'pending'}`;\n this.worktreePath = await this.worktreeManager.getWorktreeDirectory(\n worktreeName,\n mainSessionWorkerId,\n );\n logger.info('[AgentOrchestrator] Initialized worktree for agent mode', {\n worktreeName,\n worktreePath: this.worktreePath,\n });\n\n // Update worker manager to use the worktree path for new workers\n this.workerManager.setWorkingDirectory(this.worktreePath);\n\n // Re-apply settings to any existing session to pick up the new worktree path\n // This is important because the session might be created before worktree initialization completes\n if (this.session) {\n logger.info(\n '[AgentOrchestrator] Re-applying session settings after worktree initialization',\n );\n this.applySessionSettings();\n }\n } catch (error) {\n logger.error('[AgentOrchestrator] Failed to initialize worktree', {\n worktreeName,\n error,\n });\n Sentry.captureException(error);\n // Fall back to repoPath so the agent at least operates in the correct repository\n this.worktreePath = this.workerManager.repoPath;\n logger.warn('[AgentOrchestrator] Falling back to repoPath after worktree init failure', {\n worktreeName,\n fallbackPath: this.worktreePath,\n });\n this.workerManager.setWorkingDirectory(this.worktreePath);\n }\n }\n\n getWorktreeName(): string | null {\n return this.worktreeName;\n }\n\n getWorktreePath(): string | null {\n return this.worktreePath;\n }\n\n async stop(): Promise<void> {\n await this.workerManager.shutdown();\n\n if (this.session) {\n await this.session.cancel().catch(() => undefined);\n this.session = null;\n }\n\n // Clean up worktree user for main session\n if (this.worktreeName && this.mainSessionId) {\n const mainSessionWorkerId = `main-session-${this.mainSessionId}`;\n await this.worktreeManager\n .removeWorktreeUser(this.worktreeName, mainSessionWorkerId)\n .catch((error) => {\n logger.warn('[AgentOrchestrator] Failed to clean up worktree user', {\n worktreeName: this.worktreeName,\n error,\n });\n });\n }\n\n for (const connection of this.clients.values()) {\n try {\n connection.close?.();\n } catch (error) {\n Sentry.captureException(error);\n console.error('Failed to close client connection:', error);\n }\n }\n this.clients.clear();\n this.started = false;\n }\n\n async cancel(): Promise<void> {\n if (this.sessionSettings.type === 'orchestrator') {\n await Promise.all(\n this.workerManager\n .listWorkers()\n .filter((worker) => worker.status === 'running')\n .map((worker) => this.workerManager.cancelWorker(worker.session.id).catch(() => false)),\n );\n }\n await this.session?.cancel();\n }\n\n async getCompletions(\n request: ControlMessageSchema.CompletionsRequest,\n ): Promise<ControlMessageSchema.CompletionsResponse> {\n return {\n type: 'completions',\n completions: await this.completionsManager.getCompletion(request.query),\n };\n }\n\n async handleSettingsChange(\n req: ControlMessageSchema.SessionSettingsRequest,\n ): Promise<ControlMessageSchema.SessionSettingsResponse> {\n logger.info('[AgentOrchestrator] Handling settings change', req);\n\n if (req.mode) {\n this.sessionSettings = req.mode;\n this.applySessionSettings();\n }\n\n return {\n type: 'session_settings',\n success: true,\n message: null,\n mode: this.sessionSettings,\n };\n }\n\n async handleGitWrite(\n req: ControlMessageSchema.GitWriteRequest,\n ): Promise<ControlMessageSchema.GitWriteResponse> {\n logger.info('[AgentOrchestrator] Handling git write', req);\n\n const branchName = req.branch;\n\n try {\n // Get the git instance for the appropriate worktree/repo\n let git: SimpleGit;\n if (branchName === 'HEAD') {\n // Special case: not using a worktree, work in main repo\n const repoPath = this.workerManager.repoPath;\n git = simpleGit(repoPath);\n } else if (branchName !== null && branchName !== undefined) {\n // Find the worktree for the given branch\n const allWorktrees = this.worktreeManager.listActiveWorktrees();\n const worktree = allWorktrees.find(\n (wt: { branchName: string }) => wt.branchName === branchName,\n );\n\n if (!worktree) {\n logger.warn(`[AgentOrchestrator] No worktree found for branch: ${branchName}`);\n return {\n type: 'git_write',\n success: false,\n error: `No worktree found for branch: ${branchName}`,\n };\n }\n git = simpleGit(worktree.worktreePath);\n } else if (this.worktreePath) {\n // Use the main session's worktree path (agent mode)\n git = simpleGit(this.worktreePath);\n } else {\n // Fall back to repo path\n const repoPath = this.workerManager.repoPath;\n git = simpleGit(repoPath);\n }\n\n // Check if there are any changes to commit\n const status = await git.status();\n if (status.isClean()) {\n return {\n type: 'git_write',\n success: false,\n message: 'No changes to commit',\n error: 'Working directory is clean - no changes to commit',\n };\n }\n\n // Stage all changes\n await git.add(['--all']);\n\n // Get the diff to generate a commit message\n const diffOutput = await git.diff(['--cached', '--stat']);\n\n // Generate a commit message using conversation context + diff\n const commitMessage = await this.generateCommitMessageFromSession(diffOutput);\n\n // Commit the changes\n const commitResult = await git.commit(commitMessage);\n const commitSha = commitResult.commit;\n\n logger.info(`[AgentOrchestrator] Created commit: ${commitSha}`);\n\n // Handle push if requested\n if (req.action === 'commit_push') {\n try {\n // Get the current branch name\n const currentBranch = await git.revparse(['--abbrev-ref', 'HEAD']);\n const branchTrimmed = currentBranch.trim();\n await git.push('origin', branchTrimmed, ['--set-upstream']);\n logger.info(`[AgentOrchestrator] Pushed to origin/${branchTrimmed}`);\n\n // Generate PR compare URL\n const compareUrl = await this.generateCompareUrl(git, branchTrimmed);\n\n return {\n type: 'git_write',\n success: true,\n message: `Committed and pushed to origin/${branchTrimmed}`,\n commit_sha: commitSha,\n compare_url: compareUrl,\n };\n } catch (pushError) {\n logger.error('[AgentOrchestrator] Failed to push', { error: pushError });\n return {\n type: 'git_write',\n success: true,\n message: `Committed successfully but failed to push: ${pushError instanceof Error ? pushError.message : String(pushError)}`,\n commit_sha: commitSha,\n error: `Push failed: ${pushError instanceof Error ? pushError.message : String(pushError)}`,\n };\n }\n }\n\n if (req.action === 'commit_push_pr') {\n return {\n type: 'git_write',\n success: false,\n error: 'commit_push_pr is not yet implemented',\n commit_sha: commitSha,\n };\n }\n\n // Handle checkout in main worktree if requested\n if (req.action === 'commit_checkout') {\n try {\n // Get the current branch name from the worktree\n const currentBranch = await git.revparse(['--abbrev-ref', 'HEAD']);\n const branchTrimmed = currentBranch.trim();\n\n // Get the main repo git instance\n const repoPath = this.workerManager.repoPath;\n const mainGit = simpleGit(repoPath);\n\n // Checkout the branch in the main worktree with -d flag\n await mainGit.raw(['checkout', '-d', branchTrimmed]);\n logger.info(`[AgentOrchestrator] Checked out ${branchTrimmed} in main worktree`);\n\n return {\n type: 'git_write',\n success: true,\n message: `Committed changes. The main workspace checked out the changes on this branch.`,\n commit_sha: commitSha,\n };\n } catch (checkoutError) {\n logger.error('[AgentOrchestrator] Failed to checkout in main worktree', {\n error: checkoutError,\n });\n return {\n type: 'git_write',\n success: true,\n message: `Committed successfully but failed to checkout in main worktree: ${checkoutError instanceof Error ? checkoutError.message : String(checkoutError)}`,\n commit_sha: commitSha,\n error: `Checkout failed: ${checkoutError instanceof Error ? checkoutError.message : String(checkoutError)}`,\n };\n }\n }\n\n return {\n type: 'git_write',\n success: true,\n message: 'Changes committed successfully',\n commit_sha: commitSha,\n };\n } catch (error) {\n logger.error('[AgentOrchestrator] Failed to perform git write', { error });\n Sentry.captureException(error);\n return {\n type: 'git_write',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Generate a commit message using the session's conversation context + diff.\n * Falls back to a basic diff-only approach if no session is available.\n */\n private async generateCommitMessageFromSession(diffStat: string): Promise<string> {\n try {\n // Use the session's generateCommitMessage which has conversation context\n if (this.session) {\n return await this.session.generateCommitMessage(diffStat);\n }\n\n // Fallback if no session - shouldn't normally happen\n logger.warn('[AgentOrchestrator] No session available for commit message generation');\n return 'Update files';\n } catch (error) {\n logger.error('[AgentOrchestrator] Failed to generate commit message', { error });\n return 'Update files';\n }\n }\n\n /**\n * Generate a GitHub compare URL for creating a PR from the given branch.\n * Parses the origin remote URL and constructs the compare link.\n */\n private async generateCompareUrl(git: SimpleGit, branchName: string): Promise<string | null> {\n try {\n // Get the origin remote URL\n const remoteUrl = await git.remote(['get-url', 'origin']);\n if (!remoteUrl) {\n logger.warn('[AgentOrchestrator] No origin remote found');\n return null;\n }\n\n const trimmedUrl = remoteUrl.trim();\n\n // Parse the remote URL to extract owner and repo\n // Supports formats:\n // - git@github.com:owner/repo.git\n // - https://github.com/owner/repo.git\n // - https://github.com/owner/repo\n let owner: string | null = null;\n let repo: string | null = null;\n\n // SSH format: git@github.com:owner/repo.git\n const sshMatch = trimmedUrl.match(/^git@github\\.com:([^/]+)\\/(.+?)(?:\\.git)?$/);\n if (sshMatch) {\n owner = sshMatch[1];\n repo = sshMatch[2];\n }\n\n // HTTPS format: https://github.com/owner/repo.git or https://github.com/owner/repo\n if (!owner) {\n const httpsMatch = trimmedUrl.match(/^https:\\/\\/github\\.com\\/([^/]+)\\/(.+?)(?:\\.git)?$/);\n if (httpsMatch) {\n owner = httpsMatch[1];\n repo = httpsMatch[2];\n }\n }\n\n if (!owner || !repo) {\n logger.warn('[AgentOrchestrator] Could not parse GitHub URL from remote', {\n remoteUrl: trimmedUrl,\n });\n return null;\n }\n\n // Construct the compare URL\n const compareUrl = `https://github.com/${owner}/${repo}/compare/${encodeURIComponent(branchName)}?expand=1`;\n logger.info('[AgentOrchestrator] Generated compare URL', { compareUrl });\n return compareUrl;\n } catch (error) {\n logger.error('[AgentOrchestrator] Failed to generate compare URL', { error });\n return null;\n }\n }\n\n private applySessionSettings(): void {\n if (!this.session) {\n logger.debug('[AgentOrchestrator] applySessionSettings called but no session exists');\n return;\n }\n\n const settings = this.sessionSettings;\n logger.info('[AgentOrchestrator] Applying session settings', {\n mode: settings.type,\n sessionId: this.session.id,\n worktreeName: this.worktreeName,\n worktreePath: this.worktreePath,\n });\n\n const modelString = MODEL_MAP[settings.model];\n\n if (settings.type === 'orchestrator') {\n this.session.setOptions({\n model: modelString,\n permissionMode: 'default' as PermissionMode,\n systemPrompt: this.buildSystemPrompt(),\n allowedTools: [...BASE_ALLOWED_ORCHESTRATOR_TOOLS, WORKER_LAUNCH_TOOL, WORKER_MESSAGE_TOOL],\n mcpServers: {\n worker: this.workerMcpServer,\n },\n });\n // Set subagent model for workers\n this.workerManager.setWorkerModel(settings.subagent_model);\n } else if (settings.type === 'plan') {\n this.session.setOptions({\n model: modelString,\n permissionMode: 'plan' as PermissionMode,\n systemPrompt: '',\n allowedTools: [...BASE_ALLOWED_WORKER_TOOLS],\n mcpServers: {},\n });\n } else {\n // agent mode - use worktree path as cwd, falling back to repoPath, then process.cwd()\n // This ensures the agent always operates in a valid directory\n const agentCwd = this.worktreePath || this.workerManager.repoPath || process.cwd();\n\n logger.info('[AgentOrchestrator] Applying agent mode settings', {\n worktreeName: this.worktreeName,\n worktreePath: this.worktreePath,\n repoPath: this.workerManager.repoPath,\n agentCwd,\n hasWorktreePath: !!this.worktreePath,\n started: this.started,\n });\n\n // If a worktree name is set but path is not available, log a warning\n // The agent will still work using repoPath as fallback\n if (this.worktreeName && !this.worktreePath) {\n logger.warn(\n '[AgentOrchestrator] Worktree name set but path not initialized, using fallback cwd',\n {\n worktreeName: this.worktreeName,\n fallbackCwd: agentCwd,\n started: this.started,\n },\n );\n }\n\n this.session.setOptions({\n model: modelString,\n permissionMode: 'default' as PermissionMode,\n systemPrompt: '',\n allowedTools: [...BASE_ALLOWED_WORKER_TOOLS],\n mcpServers: {},\n cwd: agentCwd,\n ...(this.worktreePath ? { hooks: this.buildAgentModeHooks() } : {}),\n });\n }\n }\n\n /**\n * Build hooks for agent mode that stage changes after Edit/Write tools\n */\n private buildAgentModeHooks(): Partial<Record<'PostToolUse', HookCallbackMatcher[]>> {\n const worktreePath = this.worktreePath;\n if (!worktreePath) {\n return {};\n }\n\n const postToolUseHook: HookCallbackMatcher = {\n hooks: [\n async (input: HookInput): Promise<HookJSONOutput> => {\n if (input.hook_event_name !== 'PostToolUse') {\n return {};\n }\n const toolName = input.tool_name;\n if (toolName === 'Edit' || toolName === 'Write' || toolName === 'MultiEdit') {\n await this.worktreeManager.stageAllChanges(worktreePath);\n }\n return {};\n },\n ],\n };\n\n return {\n PostToolUse: [postToolUseHook],\n };\n }\n\n private bindSession(session: Session): void {\n session.onSessionInit(async (control) => {\n await this.handleSessionControl(control);\n });\n session.onEnvelope(async (envelope) => {\n if (envelope.payload.content.type === 'agent_complete') {\n await this.handleSessionComplete(envelope as CompleteMessageEnvelope);\n } else {\n await this.handleSessionMessage(envelope);\n }\n });\n }\n\n private async handleSessionControl(control: SessionInitNotification): Promise<void> {\n if (control.type === 'session_init') {\n await this.broadcastControl({\n type: 'session_init',\n sessionId: control.sessionId,\n parentSessionId: control.parentSessionId,\n metadata: control.metadata,\n });\n }\n }\n\n private async handleSessionMessage(message: MessageEnvelope): Promise<void> {\n this.trackToolUse(message);\n await this.forwardEnvelope(message);\n }\n\n private async handleSessionComplete(message: CompleteMessageEnvelope): Promise<void> {\n this.trackToolUse(message);\n await this.forwardEnvelope(message);\n }\n\n private async handleWorkerMessage(message: MessageEnvelope): Promise<void> {\n this.trackToolUse(message);\n await this.forwardEnvelope(message);\n }\n\n private async handleWorkerComplete(message: CompleteMessageEnvelope): Promise<void> {\n await this.forwardEnvelope(message);\n // Only enqueue worker summary in orchestrator mode\n if (this.sessionSettings.type === 'orchestrator') {\n this.enqueueWorkerSummary(message);\n }\n }\n\n private async emitSessionInit(\n sessionId: string,\n parentSessionId: string | null,\n metadata?: Record<string, unknown>,\n ): Promise<void> {\n logger.debug('[AgentOrchestrator] Emitting session_init control', {\n sessionId,\n parentSessionId,\n });\n await this.broadcastControl({\n type: 'session_init',\n sessionId,\n parentSessionId,\n metadata,\n });\n }\n\n private enqueueWorkerSummary(message: CompleteMessageEnvelope): void {\n if (!this.session) {\n logger.warn('[AgentOrchestrator] Unable to enqueue worker summary; main session missing', {\n workerSessionId: message.session_id,\n });\n return;\n }\n\n const worker = this.workerManager.getWorker(message.session_id);\n const summary = extractSummary(message);\n const workerLabel = worker?.task ?? message.session_id;\n\n const automatedText = [\n `[Automated Worker Summary]`,\n `Task: ${workerLabel}`,\n '',\n summary ?? 'Worker reported completion without additional details.',\n ]\n .join('\\n')\n .trim();\n\n const envelope: Parameters<Session['enqueue']>[0] = {\n created_at: new Date().toISOString(),\n message_id: randomUUID(),\n session_id: this.session.id,\n sender: {\n kind: 'user',\n id: worker?.parentSessionId ?? message.session_id,\n },\n payload: {\n content: {\n type: 'text',\n text: automatedText,\n },\n },\n };\n\n this.session.enqueue(envelope);\n }\n\n private handleClientMessage(connection: ClientRecord, message: InboundMessage): void {\n switch (message.type) {\n case 'chat':\n void this.handleChatMessage(connection, message);\n break;\n case 'session_init':\n this.handleSessionInit(message);\n break;\n case 'cancel_worker':\n this.handleCancelWorker(message.workerId);\n break;\n case 'join':\n case 'leave':\n case 'ping':\n // No-op in the simplified orchestrator\n break;\n default:\n logger.warn('[AgentOrchestrator] Unsupported inbound message', {\n message,\n });\n }\n }\n\n private handleSessionInit(message: Extract<InboundMessage, { type: 'session_init' }>): void {\n if (!message.parentSessionId && message.metadata?.session_type === 'CODE') {\n this.setMainCodingSessionId(message.sessionId);\n }\n\n if (message.metadata?.session_type === 'VOICE') {\n this.voiceSessionIds.add(message.sessionId);\n }\n }\n\n private async handleChatMessage(\n _connection: ClientRecord,\n message: Extract<InboundMessage, { type: 'chat' }>,\n ): Promise<void> {\n const targetSessionId = message.sessionId ?? this.mainSessionId;\n if (!targetSessionId) {\n logger.warn('[AgentOrchestrator] Dropping chat without target session');\n return;\n }\n\n if (this.voiceSessionIds.has(targetSessionId)) {\n logger.debug(`[AgentOrchestrator] Ignoring message to voice session ${targetSessionId}`);\n return;\n }\n\n if (this.workerManager.getWorker(targetSessionId)) {\n const senderId = message.senderId ?? targetSessionId;\n const success = await this.workerManager.userMessageWorker(\n targetSessionId,\n senderId,\n message.text,\n );\n if (!success) {\n logger.warn(`[AgentOrchestrator] Failed to deliver message to worker ${targetSessionId}`);\n }\n return;\n }\n\n const session = this.ensureSessionExists(targetSessionId);\n const envelope: Parameters<Session['enqueue']>[0] = {\n created_at: new Date().toISOString(),\n message_id: randomUUID(),\n session_id: session.id,\n sender: {\n kind: 'user',\n id: message.senderId ?? session.id,\n },\n payload: {\n content: {\n type: 'text',\n text: message.text,\n },\n },\n };\n session.enqueue(envelope);\n }\n\n private handleCancelWorker(workerId: string): void {\n void this.workerManager.cancelWorker(workerId).catch((error) => {\n logger.warn('[AgentOrchestrator] Failed to cancel worker', {\n workerId,\n error,\n });\n });\n }\n\n private async broadcastEnvelope(message: MessageEnvelope): Promise<void> {\n for (const connection of this.clients.values()) {\n await this.sendToConnection(connection, message);\n }\n }\n\n private async broadcastControl(message: OrchestratorControlMessage): Promise<void> {\n for (const connection of this.clients.values()) {\n if (!connection.sendControl) {\n continue;\n }\n if (connection.canSend && !connection.canSend()) {\n continue;\n }\n try {\n await connection.sendControl(message);\n } catch (error) {\n logger.error('[AgentOrchestrator] Failed sending control message to client', { error });\n try {\n connection.close?.();\n } catch {\n // ignore\n }\n this.clients.delete(connection.id);\n }\n }\n }\n\n private async sendToConnection(\n connection: ClientRecord,\n message: MessageEnvelope,\n ): Promise<void> {\n if (connection.canSend && !connection.canSend()) {\n return;\n }\n try {\n await connection.sendEnvelope(message);\n } catch (error) {\n logger.error('[AgentOrchestrator] Failed sending message to client', {\n error,\n });\n try {\n connection.close?.();\n } catch {\n // ignore secondary close failure\n }\n this.clients.delete(connection.id);\n }\n }\n\n private async forwardEnvelope(envelope: MessageEnvelope): Promise<void> {\n logger.debug('[AgentOrchestrator] Forwarding envelope', {\n sessionId: envelope.session_id,\n type: envelope.payload.content.type,\n });\n await this.broadcastEnvelope(envelope);\n if (this.shouldMirrorToMain(envelope)) {\n const mainId = this.mainSessionId;\n if (mainId) {\n const mirrored = this.mirrorEnvelope(envelope, mainId);\n await this.broadcastEnvelope(mirrored);\n }\n }\n }\n\n private shouldMirrorToMain(envelope: MessageEnvelope): boolean {\n const mainSessionId = this.mainSessionId;\n if (!mainSessionId || envelope.session_id === mainSessionId) {\n return false;\n }\n const contentType = envelope.payload.content.type;\n return contentType === 'agent_progress' || contentType === 'agent_complete';\n }\n\n private mirrorEnvelope(envelope: MessageEnvelope, sessionId: string): MessageEnvelope {\n const mirroredContent =\n envelope.payload.content.type === 'agent_progress' ||\n envelope.payload.content.type === 'agent_complete'\n ? {\n ...envelope.payload.content,\n metadata: {\n ...(envelope.payload.content.metadata ?? {}),\n agent_session_id: envelope.session_id,\n mirrored_from_session_id: envelope.session_id,\n },\n }\n : envelope.payload.content;\n\n const mirroredPayloadMetadata = {\n ...(envelope.payload.metadata ?? {}),\n mirrored_from_session_id: envelope.session_id,\n agent_session_id: envelope.session_id,\n };\n const mirroredMetadata = {\n ...(envelope.metadata ?? {}),\n mirrored_from_session_id: envelope.session_id,\n };\n\n return {\n ...envelope,\n message_id: randomUUID(),\n session_id: sessionId,\n sender: {\n ...envelope.sender,\n id: sessionId,\n },\n payload: {\n ...envelope.payload,\n content: mirroredContent,\n metadata: mirroredPayloadMetadata,\n },\n metadata: mirroredMetadata,\n created_at: new Date().toISOString(),\n } as MessageEnvelope;\n }\n\n private trackToolUse(message: MessageEnvelope): void {\n const content = message.payload.content;\n if (content.type === 'tool_call') {\n this.toolUseMap.set(content.tool_use_id, message.session_id);\n\n // Auto-switch to agent mode when ExitPlanMode is called (only in plan mode)\n if (content.name === 'ExitPlanMode' && this.sessionSettings.type === 'plan') {\n logger.info('[AgentOrchestrator] ExitPlanMode detected, switching to agent mode');\n this.sessionSettings = {\n type: 'agent',\n model: this.sessionSettings.model,\n };\n this.applySessionSettings();\n }\n }\n }\n\n private consumeToolUse(toolUseId: string): string | undefined {\n const sessionId = this.toolUseMap.get(toolUseId);\n if (sessionId) {\n this.toolUseMap.delete(toolUseId);\n }\n return sessionId;\n }\n\n private findSessionIdBySdkSession(sdkSessionId?: string): string | undefined {\n if (!sdkSessionId) {\n return undefined;\n }\n if (this.session?.sdkSessionIdentifier === sdkSessionId) {\n return this.session.id;\n }\n return undefined;\n }\n\n private buildSystemPrompt(): string {\n // Only include worker status and orchestrator prompt in orchestrator mode\n if (this.sessionSettings.type !== 'orchestrator') {\n return '';\n }\n const statusSnippet = this.buildCurrentWorkerStatus();\n return `${statusSnippet}\\n\\n${ORCHESTRATOR_SYSTEM_PROMPT}`;\n }\n\n private buildCurrentWorkerStatus(): string {\n const workers = this.workerManager.listWorkers();\n if (workers.length === 0) {\n return `<worker-status>\n <summary>No active workers.</summary>\n <system-reminder>DO NOT mention these statuses unless absolutely necessary. This is for your own internal information.</system-reminder>\n</worker-status>`;\n }\n\n const sorted = [...workers].sort((a, b) => {\n if (a.status === 'running' && b.status !== 'running') {\n return -1;\n }\n if (a.status !== 'running' && b.status === 'running') {\n return 1;\n }\n return (b.lastUpdateAt ?? 0) - (a.lastUpdateAt ?? 0);\n });\n\n const limited = sorted.slice(0, Math.min(sorted.length, 15));\n const workerEntries = limited\n .map((worker) => {\n const lines = [\n ' <worker>',\n ` <name>${this.escapeXml(worker.task)}</name>`,\n ` <status>${this.escapeXml(worker.status)}</status>`,\n ` <session>${this.escapeXml(worker.session.id)}</session>`,\n ' </worker>',\n ];\n return lines.join('\\n');\n })\n .join('\\n');\n\n const omitted =\n sorted.length > limited.length\n ? `\\n <omitted>${sorted.length - limited.length} other workers omitted</omitted>`\n : '';\n\n return `<worker-status>\n${workerEntries}\n${omitted ? `${omitted}\\n` : ''} <system-reminder>DO NOT mention these statuses unless absolutely necessary. This is for your own internal information.</system-reminder>\n</worker-status>`;\n }\n\n private escapeXml(value: string | undefined | null): string {\n if (!value) {\n return '';\n }\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n}\n\nexport async function startAgentOrchestrator(\n dependencies?: AgentOrchestratorDependencies,\n): Promise<AgentOrchestrator> {\n const server = new AgentOrchestrator(dependencies);\n await server.start();\n return server;\n}\n\nexport type { OrchestratorControlMessage };\n\nfunction extractSummary(complete: CompleteMessageEnvelope): string | undefined {\n const metadata = complete.payload.content.metadata;\n if (\n metadata &&\n typeof metadata === 'object' &&\n typeof (metadata as { summary?: unknown }).summary === 'string'\n ) {\n const summary = (metadata as { summary?: string }).summary?.trim();\n if (summary) {\n return summary;\n }\n }\n\n const message = complete.payload.content.message;\n if (typeof message === 'string' && message.trim()) {\n return message.trim();\n }\n return undefined;\n}\n", "import fs from 'fs';\nimport * as Sentry from '@sentry/node';\nimport {\n query,\n type Options,\n type Query,\n type SDKMessage,\n type SDKUserMessage,\n} from '@anthropic-ai/claude-agent-sdk';\nimport { claudeExecutablePath } from '../utils/claude-code-check.js';\n\nexport interface AIClientConfig {\n defaults?: Partial<Options>;\n}\n\nexport type ModelType = 'haiku' | 'sonnet' | 'opus';\n\nexport const MODEL_MAP: Record<ModelType, string> = {\n haiku: 'claude-haiku-4-5-20251001',\n sonnet: 'claude-sonnet-4-5-20250929',\n opus: 'claude-opus-4-5-20251101',\n} as const;\n\nexport interface AgentClient {\n isGenerating(): boolean;\n streamUserMessage(\n prompt: string | AsyncIterable<SDKUserMessage>,\n overrides?: Partial<Options>,\n ): AsyncIterable<SDKMessage>;\n cancel(): Promise<void>;\n setModel(model: ModelType): void;\n getModel(): ModelType;\n setOptions(options: Partial<Options>): void;\n getOptions(): Options;\n}\n\nexport const BASE_ALLOWED_ORCHESTRATOR_TOOLS = [\n 'Glob',\n 'Grep',\n 'LS',\n 'Read',\n 'WebFetch',\n 'WebSearch',\n 'TodoWrite',\n] as const;\n\nexport const BASE_ALLOWED_WORKER_TOOLS = [\n 'Task',\n 'Bash',\n 'Glob',\n 'Grep',\n 'LS',\n 'ExitPlanMode',\n 'Read',\n 'Edit',\n 'MultiEdit',\n 'Write',\n 'NotebookEdit',\n 'WebFetch',\n 'TodoWrite',\n 'WebSearch',\n 'BashOutput',\n 'KillBash',\n 'Skill',\n 'SlashCommand',\n] as const;\n\nconst INTERRUPT_TIMEOUT_MS = 5000;\n\nexport class AIClient implements AgentClient {\n private baseOptions: Options;\n private query?: Query;\n private abortController?: AbortController;\n private currentModel: ModelType = 'sonnet';\n\n constructor(config?: AIClientConfig) {\n const defaultOptions: Options = {\n maxTurns: 100,\n model: MODEL_MAP['sonnet'],\n cwd: process.cwd(),\n includePartialMessages: false,\n allowedTools: [...BASE_ALLOWED_ORCHESTRATOR_TOOLS],\n settingSources: ['user', 'project', 'local'],\n // Required for Bun single-file executable compatibility\n ...claudeExecutablePath(),\n };\n\n this.baseOptions = {\n ...defaultOptions,\n ...config?.defaults,\n };\n\n // Log when using a custom cwd (for debugging worktree isolation)\n if (this.baseOptions.cwd && this.baseOptions.cwd !== process.cwd()) {\n console.log('[AIClient] Using custom working directory:', this.baseOptions.cwd);\n }\n\n this.ensureWorkingDirectory(this.baseOptions.cwd);\n }\n\n async *streamUserMessage(\n prompt: string | AsyncIterable<SDKUserMessage>,\n overrides?: Partial<Options>,\n ): AsyncIterable<SDKMessage> {\n this.abortController = new AbortController();\n const q = this.createQuery(prompt, overrides);\n this.query = q;\n try {\n for await (const message of q) {\n yield message;\n }\n } finally {\n this.query = undefined;\n this.abortController = undefined;\n }\n }\n\n private createQuery(\n prompt: string | AsyncIterable<SDKUserMessage>,\n overrides?: Partial<Options>,\n ): Query {\n const merged: Options = {\n ...this.baseOptions,\n ...overrides,\n abortController: this.abortController,\n };\n\n this.ensureWorkingDirectory(merged.cwd);\n\n return query({\n prompt,\n options: merged,\n });\n }\n\n async cancel() {\n if (!this.query) {\n console.warn('[AIClient] No query to interrupt. Ignoring');\n return;\n }\n\n // Try graceful interrupt first with a timeout\n try {\n const interruptPromise = this.query.interrupt();\n const timeoutPromise = new Promise<'timeout'>((resolve) =>\n setTimeout(() => resolve('timeout'), INTERRUPT_TIMEOUT_MS),\n );\n\n const result = await Promise.race([interruptPromise, timeoutPromise]);\n\n if (result === 'timeout') {\n console.warn(\n `[AIClient] interrupt() timed out after ${INTERRUPT_TIMEOUT_MS}ms, falling back to abort`,\n );\n this.abortController?.abort();\n }\n } catch (error) {\n // If interrupt fails, fall back to abort\n console.warn('[AIClient] interrupt() failed, falling back to abort:', error);\n this.abortController?.abort();\n }\n }\n\n isGenerating(): boolean {\n return !!this.query;\n }\n\n setModel(model: ModelType): void {\n this.currentModel = model;\n this.baseOptions = {\n ...this.baseOptions,\n model: MODEL_MAP[model],\n };\n console.log(`[AIClient] Model updated to: ${model}`);\n }\n\n getModel(): ModelType {\n return this.currentModel;\n }\n\n setOptions(options: Partial<Options>): void {\n this.baseOptions = {\n ...this.baseOptions,\n ...options,\n };\n\n // Update currentModel if model is being set\n if (options.model) {\n const modelEntry = Object.entries(MODEL_MAP).find(([, value]) => value === options.model);\n if (modelEntry) {\n this.currentModel = modelEntry[0] as ModelType;\n }\n }\n\n // Log when cwd is being updated\n if (options.cwd) {\n console.log('[AIClient] Updated working directory:', options.cwd);\n }\n\n console.log('[AIClient] Options updated');\n }\n\n getOptions(): Options {\n return { ...this.baseOptions };\n }\n\n private ensureWorkingDirectory(cwd?: string): void {\n if (!cwd) {\n return;\n }\n try {\n fs.mkdirSync(cwd, { recursive: true });\n } catch (error) {\n Sentry.captureException(error);\n console.warn(`Failed to ensure working directory ${cwd}:`, error);\n }\n }\n}\n", "import chalk from 'chalk';\nimport { query } from '@anthropic-ai/claude-agent-sdk';\nimport { execSync } from 'child_process';\nimport { isBunSingleFileExecutable } from './executable.js';\n\n/**\n * Finds the path to the Claude Code executable.\n *\n * When running from a Bun single-file executable, the SDK's default resolution\n * fails because it looks for cli.js relative to the bundled module location,\n * which points to Bun's virtual filesystem (/$bunfs/root/cli.js).\n *\n * For Bun SFE, we MUST find the real claude executable via `which`.\n * For Node.js, we can let the SDK handle it (return empty object).\n */\nexport function claudeExecutablePath(): { pathToClaudeCodeExecutable?: string } {\n // Only need to override for Bun single-file executables\n if (!isBunSingleFileExecutable()) {\n return {};\n }\n\n // In Bun SFE, we must find claude in PATH\n try {\n const command = process.platform === 'win32' ? 'where claude' : 'which claude';\n const result = execSync(command, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n const foundPath = result.trim().split('\\n')[0];\n if (foundPath) {\n return { pathToClaudeCodeExecutable: foundPath };\n }\n } catch {\n // which/where failed\n }\n\n // Claude not found - this will cause the SDK to fail with a clear error\n console.error(\n '[Omnara] Claude Code executable not found in PATH. ' +\n 'Please ensure Claude Code is installed: https://claude.ai/download',\n );\n return {};\n}\n\n/**\n * Performs the Claude Code check and displays warning if needed\n * @param options - Optional configuration for the check\n * @returns boolean indicating if either authentication method is available\n */\nexport async function performClaudeCodeCheck(): Promise<boolean> {\n // Allow disabling the check via environment variable\n if (process.env.OMNARA_SKIP_CLAUDE_CHECK === 'true') {\n return true;\n }\n\n const indicator = createClaudeCheckIndicator();\n try {\n indicator?.start();\n\n for await (const message of query({\n prompt: 'Respond with one word.',\n options: {\n maxTurns: 1,\n model: 'haiku',\n settingSources: ['user', 'project', 'local'],\n // Required for Bun single-file executable compatibility\n ...claudeExecutablePath(),\n },\n })) {\n // no-op: only verifying the stream completes without throwing\n void message;\n }\n indicator?.stop('ok');\n return true;\n } catch {\n indicator?.stop('fail');\n console.log(\n chalk.red(\n \"\\nError: Omnara couldn't run because it relies on Claude Code, which isn't installed or authenticated. Try running `claude /login`.\\n\",\n ),\n );\n return false;\n }\n}\n\ntype IndicatorStatus = 'ok' | 'fail';\n\nfunction createClaudeCheckIndicator(): {\n start: () => void;\n stop: (status: IndicatorStatus) => void;\n} | null {\n if (!process.stdout.isTTY) {\n return {\n start() {\n console.log('Checking Claude Code auth...');\n },\n stop(status: IndicatorStatus) {\n if (status !== 'ok') {\n console.log('Claude Code auth failed.');\n }\n },\n };\n }\n\n const label = 'Checking Claude Code auth';\n const frames = ['-', '\\\\', '|', '/'];\n let index = 0;\n let interval: NodeJS.Timeout | null = null;\n let running = false;\n const stopLine = (status: IndicatorStatus) => {\n if (!running) {\n return;\n }\n running = false;\n if (interval) {\n clearInterval(interval);\n }\n const statusText = status === 'ok' ? chalk.green('OK') : chalk.red('FAILED');\n const padding = ' ';\n process.stdout.write(`\\r${label} ${statusText}${padding}\\n`);\n };\n\n return {\n start() {\n if (running) {\n return;\n }\n running = true;\n process.stdout.write(`${label} ...`);\n interval = setInterval(() => {\n process.stdout.write(`\\r${label} ${frames[index]} `);\n index = (index + 1) % frames.length;\n }, 120);\n },\n stop: stopLine,\n };\n}\n", "/**\n * Utilities for handling Bun single-file executable (SFE) detection and spawning.\n *\n * BACKGROUND (from Bun docs and GitHub issues):\n * When Bun compiles a script into a single-file executable, it creates a virtual\n * filesystem at /$bunfs/root/ where the embedded code lives. This means:\n *\n * When running as a Bun SFE:\n * - process.execPath = /path/to/omnara (the compiled binary)\n * - process.argv[0] = \"bun\"\n * - process.argv[1] = \"/$bunfs/root/omnara-darwin-arm64\" (virtual filesystem path)\n *\n * When running via Node.js or `bun run`:\n * - process.execPath = /usr/bin/node or /path/to/bun\n * - process.argv[0] = same as execPath\n * - process.argv[1] = /path/to/cli.js (the actual script file)\n *\n * KEY INSIGHT (from Jarred Sumner, Bun team):\n * - For the executable path, use `process.execPath`\n * - The /$bunfs/ path is NOT a usable filesystem location\n *\n * DETECTION:\n * Check if process.argv[1] starts with \"/$bunfs/\" to detect SFE mode.\n *\n * SPAWNING:\n * In SFE mode: spawn(process.execPath, ['daemon', 'run-service'])\n * In script mode: spawn(process.execPath, [process.argv[1], 'daemon', 'run-service'])\n *\n * References:\n * - https://bun.com/docs/bundler/executables\n * - https://github.com/oven-sh/bun/issues/8476\n */\n\n/**\n * Detects if running as a Bun single-file executable.\n * In Bun SFE, process.argv[1] points to Bun's virtual filesystem (/$bunfs/root/...).\n *\n * This is the official detection method per Bun documentation and GitHub issues.\n */\nexport function isBunSingleFileExecutable(): boolean {\n const arg1 = process.argv[1] ?? '';\n return arg1.startsWith('/$bunfs/');\n}\n\n/**\n * Gets the arguments needed to spawn a new instance of this CLI.\n * For Bun SFE, returns just the command args.\n * For Node.js, prepends the script path.\n *\n * @param commandArgs - The CLI command and arguments (e.g., ['daemon', 'run-service'])\n * @returns The full args array to pass to spawn(process.execPath, args)\n */\nexport function getSpawnArgs(commandArgs: string[]): string[] {\n if (isBunSingleFileExecutable()) {\n return commandArgs;\n }\n // For Node.js, we need to include the script path\n const scriptPath = process.argv[1] ?? '';\n return [scriptPath, ...commandArgs];\n}\n\n/**\n * Gets the executable path for spawning a new instance of this CLI.\n * Always returns process.execPath (works for both Node.js and Bun SFE).\n */\nexport function getExecutablePath(): string {\n return process.execPath;\n}\n", "import {\n query,\n type Options,\n type SDKMessage,\n type SDKResultMessage,\n type SDKUserMessage,\n} from '@anthropic-ai/claude-agent-sdk';\nimport type { AgentClient } from './ai-client.js';\nimport type { MessageEnvelope, MessageEnvelopeSchema } from '@omnara/shared-js/schemas';\nimport type { ContentBlockParam } from '@anthropic-ai/sdk/resources';\nimport { setTimeout as delay } from 'node:timers/promises';\nimport { logger } from '../utils/logger.js';\nimport { calculateBackoff, INITIAL_RETRY_DELAY_MS } from '../utils/backoff.js';\nimport { createEnvelope, toMessageEnvelopes, isTextBlock } from './utils/envelope-utils.js';\nimport { buildAgentCompletionMessage } from './utils/worker-events.js';\nimport { claudeExecutablePath } from '../utils/claude-code-check.js';\n\nconst MAX_GENERATION_RETRIES = 6; // ~1 minute total with backoff (1+2+4+8+16+30 = 61s)\n\ninterface UserTextSender extends MessageEnvelopeSchema.SenderRef {\n kind: 'user';\n}\n\ninterface UserTextPayload extends MessageEnvelopeSchema.MessagePayload {\n content: MessageEnvelopeSchema.TextContent;\n}\n\nexport interface UserTextEnvelope extends MessageEnvelope {\n sender: UserTextSender;\n payload: UserTextPayload;\n}\n\ninterface CompletePayload extends MessageEnvelopeSchema.MessagePayload {\n content: MessageEnvelopeSchema.AgentCompleteContent;\n}\n\nexport interface CompleteMessageEnvelope extends MessageEnvelope {\n payload: CompletePayload;\n}\n\nexport interface SessionInitNotification {\n type: 'session_init';\n sessionId: string;\n parentSessionId: string | null;\n metadata?: Record<string, unknown>;\n}\n\ninterface SessionOptions {\n parentSessionId?: string | null;\n metadata?: Record<string, unknown>;\n sessionType?: string;\n summarize?: boolean;\n}\n\ninterface ConversationTurn {\n role: 'user' | 'assistant';\n text: string;\n timestamp: string;\n}\n\nexport class Session implements AsyncIterable<SDKUserMessage> {\n public sdkSessionIdentifier?: string;\n\n private envelopeSubscribers: Array<(msg: MessageEnvelope) => void | Promise<void>> = [];\n private sessionInitSubscribers: Array<\n (control: SessionInitNotification) => void | Promise<void>\n > = [];\n private queue: UserTextEnvelope[] = [];\n private generating = false;\n private waitingForMessage: ((messages: UserTextEnvelope[]) => void) | null = null;\n private announcementPromise: Promise<void> | null = null;\n private announced = false;\n private shouldSummarize = false;\n private conversationHistory: ConversationTurn[] = [];\n private retryDelayMs = INITIAL_RETRY_DELAY_MS;\n private retryCount = 0;\n\n private readonly sessionInitControl: SessionInitNotification;\n\n constructor(\n public id: string,\n private ai: AgentClient,\n options: SessionOptions = {},\n ) {\n this.sessionInitControl = {\n type: 'session_init',\n sessionId: id,\n parentSessionId: options.parentSessionId ?? null,\n metadata: {\n session_type: options.sessionType ?? 'CODE',\n ...(options.metadata ?? {}),\n },\n };\n this.shouldSummarize = options.summarize ?? false;\n }\n\n enqueue(message: UserTextEnvelope): void {\n this.queue.push(message);\n // Track user messages in conversation history\n const text = message.payload.content.text.trim();\n if (text) {\n this.conversationHistory.push({\n role: 'user',\n text,\n timestamp: message.created_at ?? new Date().toISOString(),\n });\n }\n logger.debug('[Session] Enqueued user envelope', {\n sessionId: this.id,\n queueLength: this.queue.length,\n });\n\n // If the iterator is waiting for a message, wake it up\n if (this.waitingForMessage) {\n const resolver = this.waitingForMessage;\n this.waitingForMessage = null;\n const batch = this.queue.splice(0, this.queue.length);\n void this.emitProgress('running', 'Generating response');\n resolver(batch);\n } else if (!this.generating && !this.ai.isGenerating()) {\n // Otherwise, if not generating, start generation\n this.startGenerate();\n }\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<SDKUserMessage> {\n while (true) {\n let batch: UserTextEnvelope[];\n\n if (this.queue.length > 0) {\n // Drain any queued messages\n batch = this.queue.splice(0, this.queue.length);\n } else {\n // Wait for new messages\n logger.debug('[Session] Iterator waiting for messages', {\n sessionId: this.id,\n });\n batch = await new Promise<UserTextEnvelope[]>((resolve) => {\n this.waitingForMessage = resolve;\n });\n }\n\n logger.debug('[Session] Yielding batch to SDK', {\n sessionId: this.id,\n batchSize: batch.length,\n });\n\n const nextMessage = {\n session_id: this.id,\n type: 'user',\n message: {\n role: 'user',\n content: [] as ContentBlockParam[],\n },\n parent_tool_use_id: null,\n } as const;\n\n for (const msg of batch) {\n nextMessage.message.content.push({\n type: 'text',\n text: msg.payload.content.text,\n });\n }\n\n yield nextMessage;\n }\n }\n\n private async generate(): Promise<void> {\n if (this.generating) {\n return;\n }\n this.generating = true;\n logger.debug('[Session] Generation started', { sessionId: this.id });\n try {\n const summaryTextBlocks: string[] = [];\n let resultMessage: SDKResultMessage | null = null;\n\n await this.emitProgress('running', 'Generating response');\n\n try {\n for await (const message of this.ai.streamUserMessage(this, {\n ...(this.sdkSessionIdentifier ? { resume: this.sdkSessionIdentifier } : {}),\n })) {\n this.captureSdkSessionId(message);\n\n if (message.type === 'assistant') {\n this.collectAssistantSummaryBlocks(message, summaryTextBlocks);\n }\n\n if (message.type === 'result') {\n resultMessage = message;\n\n // Reset retry state on successful turn\n this.resetRetryState();\n\n // Emit completion for this turn\n const complete = await this.buildCompletionEnvelope(resultMessage, summaryTextBlocks);\n await Promise.all([\n this.emitProgress('idle', 'Ready for next message'),\n this.dispatchEnvelope(complete),\n ]);\n\n // Reset for next turn\n summaryTextBlocks.length = 0;\n resultMessage = null;\n }\n\n for (const envelope of toMessageEnvelopes(message, this.id)) {\n await this.dispatchEnvelope(envelope);\n }\n }\n } catch (error) {\n // Handle AbortError gracefully - this is expected when cancel() is called\n if (error instanceof Error && error.name === 'AbortError') {\n logger.info('[Session] Generation aborted', { sessionId: this.id });\n await this.emitProgress('idle', 'Generation cancelled');\n return;\n }\n throw error;\n }\n } finally {\n this.generating = false;\n this.waitingForMessage = null;\n logger.debug('[Session] Generation finished', {\n sessionId: this.id,\n pendingMessages: this.queue.length,\n });\n }\n }\n\n private startGenerate(): void {\n void this.generate()\n .then(() => {\n // On success, immediately process any new messages\n if (this.queue.length > 0) {\n this.startGenerate();\n }\n })\n .catch(async (error) => {\n this.retryCount++;\n logger.error('[Session] Generation failed', {\n sessionId: this.id,\n error,\n attempt: this.retryCount,\n maxRetries: MAX_GENERATION_RETRIES,\n });\n\n if (this.retryCount < MAX_GENERATION_RETRIES && this.queue.length > 0) {\n // Retry with backoff\n logger.info(\n `[Session] Retrying in ${Math.round(this.retryDelayMs / 1000)}s (attempt ${this.retryCount}/${MAX_GENERATION_RETRIES})`,\n { sessionId: this.id },\n );\n await delay(this.retryDelayMs);\n this.retryDelayMs = calculateBackoff(this.retryDelayMs);\n this.startGenerate();\n } else if (this.queue.length > 0) {\n // Max retries reached - send error to client and clear queue\n logger.error(\n `[Session] Max retries (${MAX_GENERATION_RETRIES}) reached, sending error to client`,\n { sessionId: this.id },\n );\n const errorEnvelope = this.buildErrorCompletionEnvelope(error);\n this.queue = []; // Clear queue like successful completion\n await Promise.all([\n this.emitProgress('error', 'Generation failed'),\n this.dispatchEnvelope(errorEnvelope),\n ]);\n this.resetRetryState();\n }\n });\n }\n\n private captureSdkSessionId(message: SDKMessage): void {\n if (\n !this.sdkSessionIdentifier &&\n 'session_id' in message &&\n typeof message.session_id === 'string'\n ) {\n this.sdkSessionIdentifier = message.session_id;\n }\n }\n\n private collectAssistantSummaryBlocks(\n message: Extract<SDKMessage, { type: 'assistant' }>,\n summaryTextBlocks: string[],\n ): void {\n for (const block of message.message.content) {\n if (isTextBlock(block)) {\n const trimmed = block.text.trim();\n if (trimmed) {\n summaryTextBlocks.push(trimmed);\n // Track assistant messages in conversation history\n this.conversationHistory.push({\n role: 'assistant',\n text: trimmed,\n timestamp: new Date().toISOString(),\n });\n }\n }\n }\n }\n\n private async buildCompletionEnvelope(\n result: SDKResultMessage | null,\n summaryTextBlocks: string[],\n ): Promise<CompleteMessageEnvelope> {\n const summary =\n summaryTextBlocks.length > 0 && this.shouldSummarize\n ? (await this.summarize(summaryTextBlocks)).trim()\n : '';\n\n const success = result?.subtype === 'success';\n const resultText = result && result.subtype === 'success' ? (result.result ?? null) : null;\n const errorText =\n result && result.subtype !== 'success' ? (result.errors ?? []).join('\\n') : null;\n\n const metadata: Record<string, unknown> = {\n agent_session_id: this.id,\n };\n if (summary) {\n metadata.summary = summary;\n }\n if (resultText) {\n metadata.result = resultText;\n }\n if (errorText) {\n metadata.error = errorText;\n }\n\n const content: MessageEnvelopeSchema.AgentCompleteContent = {\n type: 'agent_complete',\n success,\n duration_ms: result?.duration_ms ?? null,\n cost_usd: result?.total_cost_usd ?? null,\n message: buildAgentCompletionMessage(resultText, summary, errorText),\n metadata,\n };\n\n return createEnvelope(this.id, content, this.id) as CompleteMessageEnvelope;\n }\n\n private buildErrorCompletionEnvelope(error: unknown): CompleteMessageEnvelope {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n const content: MessageEnvelopeSchema.AgentCompleteContent = {\n type: 'agent_complete',\n success: false,\n duration_ms: null,\n cost_usd: null,\n message: `Generation failed after ${this.retryCount} retries: ${errorMessage}`,\n metadata: {\n agent_session_id: this.id,\n error: errorMessage,\n retries: this.retryCount,\n },\n };\n\n return createEnvelope(this.id, content, this.id) as CompleteMessageEnvelope;\n }\n\n private resetRetryState(): void {\n this.retryDelayMs = INITIAL_RETRY_DELAY_MS;\n this.retryCount = 0;\n }\n\n private async summarize(summaryTextBlocks: string[]): Promise<string> {\n if (summaryTextBlocks.length === 0) {\n return 'No assistant output to summarize.';\n }\n\n const combined = summaryTextBlocks.join('\\n\\n').trim();\n if (!combined) {\n return 'No assistant output to summarize.';\n }\n\n const summarizationPrompt = `<assistant-output>${combined}<assistant-output>`;\n\n let summary = '';\n for await (const message of query({\n prompt: summarizationPrompt,\n options: {\n systemPrompt: `Provide a 3-5 sentence summary of the actions taken by the assistant.\nYou are provided Assistant output in the prompt, wrapped in <assistant-output> tags\nDO NOT include any extraneous text, like \"The assisstant successfully implemented...\" or \"... completed by the Assistant\".\nONLY include content like key takeaways, actions (do NOT specify by whom), future action items.\nThis content should be sufficient to be inserted into something like a commit message or pull request description.`,\n maxTurns: 1,\n model: 'haiku',\n allowedTools: [],\n ...claudeExecutablePath(),\n },\n })) {\n if (message.type === 'assistant') {\n for (const block of message.message.content) {\n if (isTextBlock(block)) {\n summary += `${block.text}\\n`;\n }\n }\n }\n }\n\n return summary.trim() || 'Automated summary unavailable.';\n }\n\n private async emitProgress(status: string, detail?: string, metadata?: Record<string, unknown>) {\n const content: MessageEnvelopeSchema.AgentProgressContent = {\n type: 'agent_progress',\n status,\n metadata: {\n agent_session_id: this.id,\n ...(metadata ?? {}),\n },\n };\n if (detail) {\n content.detail = detail;\n }\n const envelope = createEnvelope(this.id, content, this.id);\n await this.dispatchEnvelope(envelope);\n }\n\n onEnvelope(cb: (msg: MessageEnvelope) => void | Promise<void>): void {\n this.envelopeSubscribers.push(cb);\n }\n\n onSessionInit(cb: (control: SessionInitNotification) => void | Promise<void>): void {\n this.sessionInitSubscribers.push(cb);\n if (this.announced) {\n void Promise.resolve(cb(this.sessionInitControl));\n } else {\n void this.emitSessionInit();\n }\n }\n\n setOptions(options: Partial<Options>): void {\n this.ai.setOptions(options);\n }\n\n getOptions(): Options {\n return this.ai.getOptions();\n }\n\n async cancel(): Promise<void> {\n this.queue = [];\n logger.debug('[Session] Cancel requested', { sessionId: this.id });\n await this.ai.cancel();\n }\n\n /**\n * Generate a commit message based on conversation context and the provided diff.\n * Uses the conversation history to understand the intent and context of changes,\n * combined with the diff to produce a meaningful commit message.\n */\n async generateCommitMessage(diff: string): Promise<string> {\n const conversationContext = this.buildConversationContext();\n\n if (!conversationContext && !diff) {\n return 'Update files';\n }\n\n const prompt = this.buildCommitMessagePrompt(conversationContext, diff);\n\n let commitMessage = '';\n for await (const message of query({\n prompt,\n options: {\n systemPrompt: `You generate clear, concise git commit messages based on conversation context and code changes.\n\nGuidelines:\n- First line: Short summary in imperative mood (max 72 chars)\n- Blank line after first line if adding body\n- Optional body: Brief details explaining the \"why\" not the \"what\"\n- Focus on the user's intent from the conversation, not just the technical changes\n- Use conventional commit style when appropriate (feat:, fix:, refactor:, etc.)\n\nReturn ONLY the commit message, no explanation or markdown formatting.`,\n maxTurns: 1,\n model: 'haiku',\n allowedTools: [],\n ...claudeExecutablePath(),\n },\n })) {\n if (message.type === 'assistant') {\n for (const block of message.message.content) {\n if (isTextBlock(block)) {\n commitMessage += block.text;\n }\n }\n }\n }\n\n const trimmed = commitMessage.trim();\n return trimmed || 'Update files';\n }\n\n /**\n * Build a condensed representation of the conversation history for commit message generation.\n * Limits the context to avoid overwhelming the model while capturing key intent.\n */\n private buildConversationContext(): string {\n if (this.conversationHistory.length === 0) {\n return '';\n }\n\n // Take the most recent conversation turns (limit to avoid token bloat)\n const recentTurns = this.conversationHistory.slice(-20);\n\n const formattedTurns = recentTurns.map((turn) => {\n const role = turn.role === 'user' ? 'User' : 'Assistant';\n // Truncate very long messages\n const text = turn.text.length > 500 ? `${turn.text.slice(0, 500)}...` : turn.text;\n return `${role}: ${text}`;\n });\n\n return formattedTurns.join('\\n\\n');\n }\n\n /**\n * Build the prompt for commit message generation.\n */\n private buildCommitMessagePrompt(conversationContext: string, diff: string): string {\n const parts: string[] = [];\n\n if (conversationContext) {\n parts.push(`<conversation-context>\nThe following is a summary of the conversation that led to these changes:\n\n${conversationContext}\n</conversation-context>`);\n }\n\n if (diff) {\n // Truncate very large diffs\n const truncatedDiff =\n diff.length > 3000 ? `${diff.slice(0, 3000)}\\n... (diff truncated)` : diff;\n parts.push(`<diff>\n${truncatedDiff}\n</diff>`);\n }\n\n parts.push(`Based on the conversation context and diff above, generate a commit message that:\n1. Captures the user's intent and purpose for making these changes\n2. Summarizes what was actually changed\n3. Follows conventional commit format when appropriate`);\n\n return parts.join('\\n\\n');\n }\n\n private async dispatchEnvelope(envelope: MessageEnvelope): Promise<void> {\n await this.emitSessionInit();\n for (const cb of this.envelopeSubscribers) {\n await cb(envelope);\n }\n }\n\n private async emitSessionInit(): Promise<void> {\n if (this.announced) {\n return;\n }\n if (!this.announcementPromise) {\n this.announcementPromise = (async () => {\n if (this.sessionInitSubscribers.length === 0) {\n return;\n }\n await Promise.all(this.sessionInitSubscribers.map((cb) => cb(this.sessionInitControl)));\n this.announced = true;\n })();\n }\n await this.announcementPromise;\n if (!this.announced) {\n this.announcementPromise = null;\n }\n }\n}\n", "/**\n * Logger utility for controlling console output based on environment\n *\n * Production detection:\n * 1. NODE_ENV === 'production'\n * 2. OMNARA_LOG_LEVEL === 'none' or 'error'\n * 3. Running from compiled dist/ directory (not tsx/ts-node)\n */\n\nimport path from 'path';\nimport type { InspectOptions } from 'util';\nimport { format as formatUtil } from 'util';\n\n/**\n * Log levels for controlling output verbosity\n */\nexport enum LogLevel {\n NONE = 0,\n ERROR = 1,\n WARN = 2,\n INFO = 3,\n DEBUG = 4,\n VERBOSE = 5,\n}\n\n/**\n * Detects if the CLI is running in production mode\n */\nexport function isProduction(): boolean {\n // Check NODE_ENV\n if (process.env.NODE_ENV === 'production') {\n return true;\n }\n\n // Check if running from dist directory (compiled)\n try {\n // Use __filename which is provided by the ESM shim in the build\n const currentFile = typeof __filename !== 'undefined' ? __filename : '';\n const isInDist = currentFile.includes(path.sep + 'dist' + path.sep);\n\n // If in dist AND no explicit development mode, assume production\n if (isInDist && process.env.NODE_ENV !== 'development') {\n return true;\n }\n } catch {\n // Fallback if URL parsing fails\n }\n\n // Check for explicit log level override\n const logLevel = process.env.OMNARA_LOG_LEVEL?.toLowerCase();\n if (logLevel === 'none' || logLevel === 'silent') {\n return true;\n }\n\n return false;\n}\n\n/**\n * Gets the current log level from environment or defaults\n */\nexport function getLogLevel(): LogLevel {\n const envLevel = process.env.OMNARA_LOG_LEVEL?.toLowerCase();\n\n switch (envLevel) {\n case 'none':\n case 'silent':\n return LogLevel.NONE;\n case 'error':\n return LogLevel.ERROR;\n case 'warn':\n case 'warning':\n return LogLevel.WARN;\n case 'info':\n return LogLevel.INFO;\n case 'debug':\n return LogLevel.DEBUG;\n case 'verbose':\n case 'trace':\n return LogLevel.VERBOSE;\n default:\n // Default based on production mode\n return isProduction() ? LogLevel.ERROR : LogLevel.INFO;\n }\n}\n\n/**\n * Logger interface that extends Console but can be controlled\n */\nexport interface Logger extends Console {\n // Additional methods for important messages\n important(...args: unknown[]): void;\n success(...args: unknown[]): void;\n close?(): Promise<void>;\n}\n\n/**\n * Creates a controlled logger instance\n */\ntype LogSink = (entry: { line: string; raw: unknown[] }) => void;\n\nexport class ControlledLogger implements Logger {\n private logLevel: LogLevel;\n private forceOutput: boolean;\n private _console: Console;\n private sinks: LogSink[];\n private closers: Array<() => Promise<void> | void>;\n private formatLine(level: string, args: unknown[]): string {\n const prefix = `[${new Date().toISOString()}] [${level}]`;\n if (args.length === 0) {\n return prefix;\n }\n const body = formatUtil(...(args as unknown[]));\n return `${prefix} ${body}`;\n }\n\n // Console properties we need to implement\n Console!: typeof console.Console;\n\n constructor(options?: {\n logLevel?: LogLevel;\n forceOutput?: boolean;\n sinks?: LogSink[];\n closers?: Array<() => Promise<void> | void>;\n }) {\n this.logLevel = options?.logLevel ?? getLogLevel();\n this.forceOutput = options?.forceOutput ?? false;\n this._console = console;\n this.sinks = options?.sinks ?? [\n (entry) => {\n console.log(...(entry.raw as unknown[]));\n },\n ];\n this.closers = options?.closers ?? [];\n\n // Copy Console constructor\n this.Console = console.Console;\n }\n\n /**\n * Standard log output (INFO level)\n */\n log(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n this.write('INFO', args);\n }\n }\n\n /**\n * Error output (always shown unless NONE)\n */\n error(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n this.write('ERROR', args);\n }\n }\n\n /**\n * Warning output\n */\n warn(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.WARN)) {\n this.write('WARN', args);\n }\n }\n\n /**\n * Info level output\n */\n info(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n this.write('INFO', args);\n }\n }\n\n /**\n * Debug output (only in development)\n */\n debug(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this.write('DEBUG', args);\n }\n }\n\n /**\n * Verbose/trace output\n */\n trace(...args: unknown[]): void {\n if (this.shouldLog(LogLevel.VERBOSE)) {\n this.write('TRACE', args);\n }\n }\n\n /**\n * Important messages that should always be shown to user\n * (authentication status, connection info, etc.)\n */\n important(...args: unknown[]): void {\n // Always show important messages unless completely silent\n if (this.logLevel !== LogLevel.NONE || this.forceOutput) {\n this.write('IMPORTANT', args);\n }\n }\n\n /**\n * Success messages that should typically be shown\n */\n success(...args: unknown[]): void {\n // Show success messages at WARN level and above\n if (this.shouldLog(LogLevel.WARN) || this.forceOutput) {\n this.write('SUCCESS', args);\n }\n }\n\n async close(): Promise<void> {\n for (const closer of this.closers) {\n try {\n await closer();\n } catch {\n // ignore close errors\n }\n }\n }\n\n /**\n * Check if a message should be logged at the given level\n */\n private shouldLog(level: LogLevel): boolean {\n return this.forceOutput || this.logLevel >= level;\n }\n\n private write(level: string, args: unknown[]): void {\n const line = this.formatLine(level, args);\n const entry = { line, raw: args };\n for (const sink of this.sinks) {\n try {\n sink(entry);\n } catch {\n // ignore sink errors\n }\n }\n }\n\n /**\n * Update the log level dynamically\n */\n setLogLevel(level: LogLevel): void {\n this.logLevel = level;\n }\n\n /**\n * Get current log level\n */\n getLogLevel(): LogLevel {\n return this.logLevel;\n }\n\n // Console methods we delegate or control based on log level\n assert(condition?: boolean, ...data: unknown[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n this._console.assert(condition, ...data);\n }\n }\n\n clear(): void {\n this._console.clear();\n }\n\n count(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.count(label);\n }\n }\n\n countReset(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.countReset(label);\n }\n }\n\n dir(item?: unknown, options?: InspectOptions): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.dir(item, options);\n }\n }\n\n dirxml(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.dirxml(...data);\n }\n }\n\n group(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.group(...data);\n }\n }\n\n groupCollapsed(...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.groupCollapsed(...data);\n }\n }\n\n groupEnd(): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.groupEnd();\n }\n }\n\n table(tabularData?: unknown, properties?: string[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n this._console.table(tabularData, properties);\n }\n }\n\n time(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.time(label);\n }\n }\n\n timeEnd(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeEnd(label);\n }\n }\n\n timeLog(label?: string, ...data: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeLog(label, ...data);\n }\n }\n\n timeStamp(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n this._console.timeStamp(label);\n }\n }\n\n profile(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n // profile is not part of standard Console interface, check if it exists\n const consoleWithProfile = this._console as Console & { profile?: (label?: string) => void };\n consoleWithProfile.profile?.(label);\n }\n }\n\n profileEnd(label?: string): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n // profileEnd is not part of standard Console interface, check if it exists\n const consoleWithProfileEnd = this._console as Console & {\n profileEnd?: (label?: string) => void;\n };\n consoleWithProfileEnd.profileEnd?.(label);\n }\n }\n}\n\n/**\n * Global logger instance\n */\nexport const logger = new ControlledLogger();\n\n/**\n * Creates a logger for a specific component\n */\nexport function createLogger(\n componentName?: string,\n options?: {\n logLevel?: LogLevel;\n forceOutput?: boolean;\n sinks?: LogSink[];\n closers?: Array<() => Promise<void> | void>;\n },\n): Logger {\n const baseLogger = new ControlledLogger(options);\n\n if (!componentName) {\n return baseLogger;\n }\n\n // Create a wrapper that delegates all Console methods with component prefix\n const wrappedLogger = Object.create(baseLogger) as Logger;\n\n // Override methods that should have component prefix\n wrappedLogger.log = (...args) => baseLogger.log(`[${componentName}]`, ...args);\n wrappedLogger.error = (...args) => baseLogger.error(`[${componentName}]`, ...args);\n wrappedLogger.warn = (...args) => baseLogger.warn(`[${componentName}]`, ...args);\n wrappedLogger.info = (...args) => baseLogger.info(`[${componentName}]`, ...args);\n wrappedLogger.debug = (...args) => baseLogger.debug(`[${componentName}]`, ...args);\n wrappedLogger.trace = (...args) => baseLogger.trace(`[${componentName}]`, ...args);\n // Important and success don't get prefixes\n wrappedLogger.important = (...args) => baseLogger.important(...args);\n wrappedLogger.success = (...args) => baseLogger.success(...args);\n wrappedLogger.close = async () => {\n if (typeof baseLogger.close === 'function') {\n await baseLogger.close();\n }\n };\n\n return wrappedLogger;\n}\n\n/**\n * Helper to extract error messages consistently\n */\nexport function extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Print current logger configuration (useful for debugging)\n */\nexport function printLoggerConfig(): void {\n const prod = isProduction();\n const level = getLogLevel();\n const levelName = LogLevel[level];\n\n console.log('Logger Configuration:');\n console.log(` Production Mode: ${prod}`);\n console.log(` Log Level: ${levelName} (${level})`);\n console.log(` NODE_ENV: ${process.env.NODE_ENV || '(not set)'}`);\n console.log(` OMNARA_LOG_LEVEL: ${process.env.OMNARA_LOG_LEVEL || '(not set)'}`);\n}\n", "export const INITIAL_RETRY_DELAY_MS = 1_000;\nexport const MAX_RETRY_DELAY_MS = 30_000;\n\n/**\n * Calculates next delay with exponential backoff and jitter.\n */\nexport function calculateBackoff(currentDelayMs: number): number {\n let nextDelay = currentDelayMs * 2;\n // Add +/- 25% jitter\n const jitterRange = nextDelay * 0.25;\n nextDelay = nextDelay - jitterRange + Math.random() * jitterRange * 2;\n return Math.min(nextDelay, MAX_RETRY_DELAY_MS);\n}\n", "import { randomUUID } from 'crypto';\nimport type { SDKMessage } from '@anthropic-ai/claude-agent-sdk';\nimport type { MessageEnvelope, MessageEnvelopeSchema } from '@omnara/shared-js/schemas';\n\ntype TextBlock = { type: 'text'; text: string };\ntype ToolUseBlock = { type: 'tool_use'; id: string; name: string; input: unknown };\ntype ToolResultBlock = {\n type: 'tool_result';\n tool_use_id: string;\n content?: unknown;\n is_error?: boolean;\n};\n\nexport function createEnvelope(\n sessionId: string,\n content: MessageEnvelopeSchema.Content,\n senderId?: string,\n metadata?: Record<string, unknown>,\n payloadMetadata?: Record<string, unknown>,\n): MessageEnvelope {\n const payload: MessageEnvelopeSchema.MessagePayload = {\n version: 0,\n content,\n };\n\n if (payloadMetadata && Object.keys(payloadMetadata).length > 0) {\n payload.metadata = payloadMetadata;\n }\n\n const envelope: MessageEnvelope = {\n message_id: randomUUID(),\n session_id: sessionId,\n sender: {\n kind: 'agent_session',\n id: senderId ?? sessionId,\n },\n payload,\n created_at: new Date().toISOString(),\n };\n\n if (metadata && Object.keys(metadata).length > 0) {\n envelope.metadata = metadata;\n }\n\n return envelope;\n}\n\nexport function toMessageEnvelopes(message: SDKMessage, sessionId: string): MessageEnvelope[] {\n const envelopes: MessageEnvelope[] = [];\n\n // Extract subagent context from the SDK message if available\n // The SDK provides session_id and parent_tool_use_id when running inside a subagent (Task tool)\n const messageAny = message as Record<string, unknown>;\n const subagentSessionId =\n typeof messageAny.session_id === 'string' ? messageAny.session_id : undefined;\n const parentToolUseId =\n typeof messageAny.parent_tool_use_id === 'string' ? messageAny.parent_tool_use_id : undefined;\n\n // Build subagent payload metadata if we have context\n const buildSubagentPayloadMetadata = (): Record<string, unknown> | undefined => {\n const metadata: Record<string, unknown> = {};\n if (parentToolUseId) {\n metadata.parent_tool_use_id = parentToolUseId;\n }\n if (subagentSessionId && subagentSessionId !== sessionId) {\n metadata.subagent_session_id = subagentSessionId;\n }\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n };\n\n switch (message.type) {\n case 'assistant': {\n const subagentMetadata = buildSubagentPayloadMetadata();\n\n for (const block of message.message.content) {\n if (isTextBlock(block)) {\n const content: MessageEnvelopeSchema.TextContent = {\n type: 'text',\n text: block.text,\n };\n envelopes.push(\n createEnvelope(\n sessionId,\n content,\n sessionId,\n {\n role: 'assistant',\n },\n subagentMetadata,\n ),\n );\n } else if (isToolUseBlock(block)) {\n const content: MessageEnvelopeSchema.ToolCallContent = {\n type: 'tool_call',\n name: block.name,\n tool_use_id: block.id,\n arguments: normalizeToolArguments(block.input),\n };\n envelopes.push(\n createEnvelope(\n sessionId,\n content,\n sessionId,\n {\n role: 'assistant',\n },\n subagentMetadata,\n ),\n );\n }\n }\n break;\n }\n case 'user': {\n // Skip subagent messages from being sent to relay\n if (parentToolUseId) {\n break;\n }\n\n // Skip interrupt messages from being sent to relay\n const firstBlock = message.message.content[0];\n if (\n isTextBlock(firstBlock) &&\n (firstBlock.text === '[Request interrupted by user]' ||\n firstBlock.text === '[Request interrupted by user for tool use]')\n ) {\n break;\n }\n\n const subagentMetadata = buildSubagentPayloadMetadata();\n\n for (const block of message.message.content) {\n if (isToolResultBlock(block)) {\n const content: MessageEnvelopeSchema.ToolResultContent = {\n type: 'tool_result',\n tool_use_id: block.tool_use_id,\n output: normalizeToolResult(block.content),\n is_error: Boolean(block.is_error),\n };\n envelopes.push(\n createEnvelope(\n sessionId,\n content,\n sessionId,\n {\n role: 'assistant',\n },\n subagentMetadata,\n ),\n );\n } else if (isTextBlock(block)) {\n const content: MessageEnvelopeSchema.TextContent = {\n type: 'text',\n text: block.text,\n };\n envelopes.push(\n createEnvelope(\n sessionId,\n content,\n sessionId,\n {\n role: 'user',\n },\n subagentMetadata,\n ),\n );\n }\n }\n break;\n }\n case 'stream_event': {\n const delta = extractTextDelta(message);\n if (delta) {\n const content: MessageEnvelopeSchema.TextContent = {\n type: 'text',\n text: delta,\n };\n // Merge stream_delta with subagent metadata\n const streamPayloadMetadata: Record<string, unknown> = {\n stream_delta: true,\n };\n const subagentMeta = buildSubagentPayloadMetadata();\n if (subagentMeta) {\n Object.assign(streamPayloadMetadata, subagentMeta);\n }\n envelopes.push(\n createEnvelope(\n sessionId,\n content,\n sessionId,\n {\n role: 'assistant',\n },\n streamPayloadMetadata,\n ),\n );\n }\n break;\n }\n case 'tool_progress': {\n const targetSessionId = message.session_id ?? sessionId;\n const content: MessageEnvelopeSchema.AgentProgressContent = {\n type: 'agent_progress',\n status: 'tool_progress',\n detail: `Running ${message.tool_name}`,\n metadata: {\n tool_use_id: message.tool_use_id,\n parent_tool_use_id: message.parent_tool_use_id,\n tool_name: message.tool_name,\n elapsed_time_seconds: message.elapsed_time_seconds,\n agent_session_id: targetSessionId,\n },\n };\n\n envelopes.push(createEnvelope(targetSessionId, content, targetSessionId));\n break;\n }\n default:\n break;\n }\n\n return envelopes;\n}\n\nexport function normalizeToolArguments(input: unknown): Record<string, unknown> {\n if (input && typeof input === 'object' && !Array.isArray(input)) {\n return input as Record<string, unknown>;\n }\n return { value: input };\n}\n\nexport function normalizeToolResult(output: unknown): Record<string, unknown> {\n if (output && typeof output === 'object' && !Array.isArray(output)) {\n return output as Record<string, unknown>;\n }\n return { value: output };\n}\n\nexport function isTextBlock(block: unknown): block is TextBlock {\n return (\n typeof block === 'object' &&\n block !== null &&\n (block as { type?: unknown }).type === 'text' &&\n typeof (block as { text?: unknown }).text === 'string'\n );\n}\n\nfunction isToolUseBlock(block: unknown): block is ToolUseBlock {\n return (\n typeof block === 'object' &&\n block !== null &&\n (block as { type?: unknown }).type === 'tool_use' &&\n typeof (block as { id?: unknown }).id === 'string' &&\n typeof (block as { name?: unknown }).name === 'string'\n );\n}\n\nfunction isToolResultBlock(block: unknown): block is ToolResultBlock {\n return (\n typeof block === 'object' &&\n block !== null &&\n (block as { type?: unknown }).type === 'tool_result' &&\n typeof (block as { tool_use_id?: unknown }).tool_use_id === 'string'\n );\n}\n\nexport function extractTextDelta(message: SDKMessage): string | null {\n if (message.type !== 'stream_event') {\n return null;\n }\n const event = message.event;\n if (!event || typeof event !== 'object') {\n return null;\n }\n if (event.type === 'content_block_delta') {\n const delta = event.delta as { type?: string; text?: unknown } | null;\n if (delta?.type === 'text_delta' && typeof delta.text === 'string') {\n return delta.text;\n }\n }\n return null;\n}\n", "import { randomUUID } from 'crypto';\nimport type { WorkerRecord } from '../worker-types.js';\nimport type { OutboundMessage } from '../orchestrator-types.js';\n\nfunction buildWorkerMetadata(record: WorkerRecord): Record<string, unknown> {\n const metadata: Record<string, unknown> = {\n agent_session_id: record.id,\n task: record.task,\n last_update_at: record.lastUpdateAt,\n status: record.status,\n };\n\n if (record.originSessionId) {\n metadata.origin_session_id = record.originSessionId;\n }\n if (record.worktreePath) {\n metadata.worktree_path = record.worktreePath;\n }\n if (record.worktreeName) {\n metadata.branch_name = record.worktreeName;\n }\n if (record.result) {\n metadata.result = record.result;\n }\n if (record.error) {\n metadata.error = record.error;\n }\n\n return metadata;\n}\n\nfunction describeWorkerStatus(record: WorkerRecord): string | undefined {\n switch (record.status) {\n case 'completed':\n return record.result || `Task \"${record.task}\" completed`;\n case 'error':\n return `Task \"${record.task}\" failed: ${record.error || 'Unknown error'}`;\n case 'canceled':\n return `Task \"${record.task}\" was canceled`;\n case 'running':\n return `Task \"${record.task}\" is running`;\n default:\n return undefined;\n }\n}\n\nexport function formatWorkerSummary(record: WorkerRecord, override?: string): string {\n if (override?.trim()) {\n return override.trim();\n }\n if (record.status === 'error') {\n return `Worker \"${record.task}\" failed: ${record.error ?? 'Unknown error.'}`;\n }\n if (record.status === 'canceled') {\n return `Worker \"${record.task}\" was canceled.`;\n }\n return `Worker \"${record.task}\" completed.`;\n}\n\nexport function createWorkerProgressMessage(record: WorkerRecord): OutboundMessage {\n const status = record.status === 'completed' ? 'idle' : record.status;\n return {\n type: 'agent_progress',\n sessionId: record.id,\n status,\n detail: describeWorkerStatus(record),\n metadata: buildWorkerMetadata(record),\n messageId: randomUUID(),\n };\n}\n\nexport function createWorkerCompletionMessage(\n record: WorkerRecord,\n summary: string,\n): OutboundMessage {\n const message = buildAgentCompletionMessage(record.result ?? null, summary, record.error ?? null);\n return {\n type: 'agent_complete',\n sessionId: record.id,\n success: record.status === 'completed',\n durationMs: Math.max(record.lastUpdateAt - record.startedAt, 0),\n message,\n metadata: buildWorkerMetadata(record),\n messageId: randomUUID(),\n };\n}\n\nexport function buildWorkerCompletionPrompt(record: WorkerRecord): string {\n const completionText = buildAgentCompletionMessage(\n record.result ?? null,\n record.result ?? '',\n record.error ?? null,\n );\n return `<worker-complete>\n This is an automated notification triggered by a worker completion.\n You should provide an INCREMENTAL summary of only the NEW completion to the user.\n DO NOT mention the completion of this worker again UNLESS there is new changes completed.\n DO NOT mention other workers when responding to this worker complete message.\n <name>${record.task}</name>\n <status>${record.status}</status>\n ${\n record.worktreeName\n ? `<worktree>\n <name>${record.worktreeName}</name>\n </worktree>`\n : ''\n }\n <starting-prompt>${record.prompt}</starting-prompt>\n <worker-result>${completionText}</worker-result>\n </worker-complete>`;\n}\n\nexport function buildAgentCompletionMessage(\n resultText: string | null,\n summary: string,\n errorText: string | null,\n): string {\n const sections: string[] = [];\n\n if (resultText) {\n sections.push('<final-message>', resultText.trim(), '</final-message>');\n }\n if (summary) {\n sections.push('<summary>', summary.trim(), '</summary>');\n }\n if (errorText) {\n sections.push('<error>', errorText.trim(), '</error>');\n }\n\n if (sections.length === 0) {\n return '';\n }\n return sections.join('\\n');\n}\n", "import { randomUUID } from 'crypto';\nimport type { McpServerConfig } from '@anthropic-ai/claude-agent-sdk';\nimport { type AgentClient, type ModelType } from './ai-client.js';\nimport { logger } from '../utils/logger.js';\nimport { Session, type CompleteMessageEnvelope } from './session.js';\nimport type { WorkerStatus } from './worker-types.js';\nimport type { MessageEnvelope } from '@omnara/shared-js/schemas';\n\nexport type { WorkerStatus, WorkerRecord, WorkerSessionMessageEvent } from './worker-types.js';\n\ninterface LaunchWorkerOptions {\n task: string;\n prompt: string;\n originSessionId: string;\n metadata?: Record<string, unknown>;\n}\n\ninterface WorkerManagerOptions {\n createClient: (mcpServers?: Record<string, McpServerConfig>, cwd?: string) => AgentClient;\n broadcastMessage: (msg: MessageEnvelope) => Promise<void> | void;\n broadcastComplete: (complete: CompleteMessageEnvelope) => Promise<void> | void;\n announceWorkerSession?: (info: {\n sessionId: string;\n parentSessionId?: string;\n metadata?: Record<string, unknown>;\n }) => Promise<void> | void;\n repoPath: string;\n /** Working directory for workers. If not set, uses repoPath. Can be updated via setWorkingDirectory(). */\n workingDirectory?: string;\n}\n\ntype Worker = {\n status: WorkerStatus;\n session: Session;\n ai: AgentClient;\n task: string;\n parentSessionId: string;\n directory: string;\n startedAt: number;\n lastUpdateAt: number;\n};\n\nexport class WorkerManager {\n private workers = new Map<string, Worker>();\n private workerModel: ModelType = 'sonnet';\n private workingDirectory: string;\n broadcastMessage: (msg: MessageEnvelope) => Promise<void> | void;\n broadcastComplete: (complete: CompleteMessageEnvelope) => Promise<void> | void;\n readonly repoPath: string;\n private readonly announceWorkerSession?: WorkerManagerOptions['announceWorkerSession'];\n\n constructor(private readonly options: WorkerManagerOptions) {\n this.broadcastComplete = options.broadcastComplete;\n this.broadcastMessage = options.broadcastMessage;\n this.announceWorkerSession = options.announceWorkerSession;\n this.repoPath = options.repoPath;\n this.workingDirectory = options.workingDirectory ?? options.repoPath;\n }\n\n /**\n * Set the working directory for new workers.\n * Use this to point workers at a worktree directory.\n */\n setWorkingDirectory(directory: string): void {\n logger.info(`[WorkerManager] Setting working directory to: ${directory}`);\n this.workingDirectory = directory;\n }\n\n /**\n * Get the current working directory used for new workers.\n */\n getWorkingDirectory(): string {\n return this.workingDirectory;\n }\n\n /**\n * Set the model to use for all workers (current running and future).\n */\n setWorkerModel(model: ModelType): void {\n logger.info(`[WorkerManager] Setting worker model to: ${model}`);\n this.workerModel = model;\n\n // Update the model for all currently running workers\n for (const worker of this.workers.values()) {\n if (worker.status === 'running') {\n worker.ai.setModel(model);\n }\n }\n }\n\n /**\n * Get the current model used for workers.\n */\n getWorkerModel(): ModelType {\n return this.workerModel;\n }\n\n listWorkers(): Worker[] {\n return Array.from(this.workers.values());\n }\n\n getWorker(id: string): Worker | undefined {\n return this.workers.get(id);\n }\n\n getWorkerByTask(task: string): Worker | undefined {\n for (const worker of this.workers.values()) {\n if (worker.task === task) {\n return worker;\n }\n }\n return undefined;\n }\n\n async cancelWorker(id: string): Promise<boolean> {\n const worker = this.workers.get(id);\n if (!worker) {\n return false;\n }\n await worker.session.cancel();\n worker.status = 'canceled';\n worker.lastUpdateAt = Date.now();\n this.workers.set(id, worker);\n return true;\n }\n\n async launchWorker({\n task,\n prompt,\n originSessionId,\n metadata,\n }: LaunchWorkerOptions): Promise<Worker> {\n const id = randomUUID();\n const cwd = this.workingDirectory;\n const ai = this.options.createClient(undefined, cwd);\n\n // Apply the current worker model setting to the new worker\n ai.setModel(this.workerModel);\n\n const now = Date.now();\n const worker: Worker = {\n status: 'running',\n task,\n session: new Session(id, ai, {\n parentSessionId: originSessionId ?? null,\n sessionType: 'WORKER',\n metadata: {\n task,\n ...metadata,\n },\n summarize: true,\n }),\n ai,\n parentSessionId: originSessionId,\n directory: cwd,\n startedAt: now,\n lastUpdateAt: now,\n };\n\n worker.session.onSessionInit(async (control) => {\n await this.announceWorkerSession?.({\n sessionId: control.sessionId,\n parentSessionId: control.parentSessionId ?? undefined,\n metadata: control.metadata,\n });\n });\n\n worker.session.onEnvelope(async (envelope) => {\n if (envelope.payload.content.type === 'agent_complete') {\n await this.onComplete(id, envelope as CompleteMessageEnvelope);\n } else {\n await this.onMessage(id, envelope);\n }\n });\n worker.session.enqueue({\n created_at: new Date().toISOString(),\n message_id: randomUUID(),\n session_id: id,\n sender: {\n kind: 'user',\n id: originSessionId,\n },\n payload: {\n content: {\n type: 'text',\n text: prompt,\n },\n },\n });\n\n this.workers.set(id, worker);\n\n return worker;\n }\n\n /**\n * Route a user message to a worker by session ID.\n * Thin wrapper around enqueueMessage.\n */\n async userMessageWorker(sessionId: string, userId: string, message: string): Promise<boolean> {\n const worker = this.getWorker(sessionId);\n if (!worker) {\n return false;\n }\n\n worker.session.enqueue({\n created_at: new Date().toISOString(),\n message_id: randomUUID(),\n session_id: sessionId,\n sender: {\n kind: 'user',\n id: userId,\n },\n payload: {\n content: {\n type: 'text',\n text: message,\n },\n },\n });\n\n worker.status = 'running';\n worker.lastUpdateAt = Date.now();\n this.workers.set(sessionId, worker);\n\n return true;\n }\n\n /**\n * Send a message to a worker (running or completed).\n * Thin wrapper around enqueueMessage.\n */\n async toolMessageWorker(task: string, message: string): Promise<boolean> {\n const worker = this.getWorkerByTask(task);\n if (!worker) {\n return false;\n }\n\n worker.session.enqueue({\n created_at: new Date().toISOString(),\n message_id: randomUUID(),\n session_id: worker.session.id,\n sender: {\n kind: 'user',\n id: worker.parentSessionId,\n },\n payload: {\n content: {\n type: 'text',\n text: message,\n },\n },\n });\n\n worker.status = 'running';\n worker.lastUpdateAt = Date.now();\n this.workers.set(worker.session.id, worker);\n\n return true;\n }\n\n async shutdown(): Promise<void> {\n logger.info('Shutting down worker manager');\n await Promise.all(\n this.listWorkers().map(async (worker) => {\n logger.info(`Canceling worker ${worker.session.id} during shutdown`);\n await worker.session.cancel();\n }),\n );\n logger.info('Worker manager shutdown complete');\n }\n\n private async onComplete(id: string, complete: CompleteMessageEnvelope): Promise<void> {\n const worker = this.workers.get(id);\n if (!worker) {\n throw new Error('Failed to get worker from worker manager');\n }\n\n worker.status = complete.payload.content.success ? 'completed' : 'error';\n worker.lastUpdateAt = Date.now();\n this.workers.set(id, worker);\n\n await this.broadcastComplete(complete);\n }\n\n async onMessage(id: string, msg: MessageEnvelope): Promise<void> {\n const worker = this.workers.get(id);\n if (worker) {\n worker.lastUpdateAt = Date.now();\n this.workers.set(id, worker);\n }\n await this.broadcastMessage(msg);\n }\n}\n", "import { simpleGit, type SimpleGit } from 'simple-git';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as Sentry from '@sentry/node';\nimport { logger } from '../../utils/logger.js';\nimport { DEFAULT_DIR } from '../../auth/credentials-store.js';\nimport { readOmnaraConfig } from '../../config/omnara-config.js';\nimport type { WorkspaceConfigSchema } from '@omnara/shared-js/schemas';\n\n/**\n * Information about a created worktree\n */\ntype Worktree = {\n worktreeName: string;\n worktreePath: string;\n};\n\nexport class WorktreeManager {\n readonly git: SimpleGit;\n private repoName: string;\n private readonly worktrees = new Map<string, Worktree>();\n private worktreeUsers = new Map<string, Set<string>>();\n private worktreeBasePath: string;\n\n constructor(private repoPath: string) {\n this.git = simpleGit(repoPath);\n this.repoName = path.basename(this.repoPath);\n this.worktreeBasePath = path.join(DEFAULT_DIR, 'worktrees', this.repoName);\n }\n\n async getWorktreeConfig(): Promise<WorkspaceConfigSchema.WorktreeSettings | undefined> {\n const config = await readOmnaraConfig();\n return config.worktrees;\n }\n\n /**\n * Get the directory path for a worktree, creating it if necessary.\n *\n * @param worktreeName - The name of the worktree (also used as branch name)\n * @param workerId - Identifier for the worker using this worktree\n * @returns The path to the worktree directory\n */\n async getWorktreeDirectory(worktreeName: string, workerId: string): Promise<string> {\n const isRepo = await this.git.checkIsRepo();\n if (!isRepo) {\n logger.error('[WorktreeManager] Cannot create worktree: not inside a git repository', {\n repoPath: this.repoPath,\n });\n return this.repoPath;\n }\n\n // if already created?\n const worktree = this.worktrees.get(worktreeName);\n if (worktree) {\n let users = this.worktreeUsers.get(worktreeName);\n if (!users) {\n users = new Set();\n }\n users.add(workerId);\n this.worktreeUsers.set(worktreeName, users);\n logger.debug('[WorktreeManager] Using existing worktree', {\n worktreeName,\n worktreePath: worktree.worktreePath,\n });\n return worktree.worktreePath;\n }\n\n // otherwise create\n const newWorktree = await this.createWorktree(worktreeName);\n this.worktrees.set(worktreeName, newWorktree);\n this.worktreeUsers.set(worktreeName, new Set([workerId]));\n\n logger.info('[WorktreeManager] Created new worktree', {\n worktreeName,\n worktreePath: newWorktree.worktreePath,\n });\n\n return newWorktree.worktreePath;\n }\n\n /**\n * Internal method that performs the actual worktree creation\n * This should only be called by processCreationQueue\n */\n private async createWorktree(worktreeName: string): Promise<Worktree> {\n logger.info(`Creating worktree \"${worktreeName}\"`);\n await fs.mkdir(this.worktreeBasePath, { recursive: true });\n\n const worktreePath = path.join(this.worktreeBasePath, worktreeName);\n const branchExists = await this.git\n .revparse(['--verify', worktreeName])\n .then(() => true)\n .catch(() => false);\n\n const worktreeList = await this.git.raw(['worktree', 'list', '--porcelain']);\n const gitWorktrees = this.parseWorktreeList(worktreeList);\n const worktreeRegistered = gitWorktrees.includes(worktreePath);\n\n if (!worktreeRegistered) {\n if (branchExists) {\n // worktreeName === branchName\n await this.git.raw(['worktree', 'add', worktreePath, worktreeName]);\n } else {\n // create new branch with worktree\n const baseRef = await this.findValidBaseRef();\n if (baseRef) {\n await this.git.raw(['worktree', 'add', '-b', worktreeName, worktreePath, baseRef]);\n } else {\n await this.git.raw(['worktree', 'add', '-b', worktreeName, worktreePath]);\n }\n }\n }\n\n return {\n worktreeName,\n worktreePath,\n };\n }\n\n async removeWorktreeUser(\n worktreeName: string,\n workerId: string,\n force: boolean = false,\n ): Promise<void> {\n const users = this.worktreeUsers.get(worktreeName);\n if (users) {\n users.delete(workerId);\n this.worktreeUsers.set(worktreeName, users);\n }\n\n const worktree = this.worktrees.get(worktreeName);\n if ((!users || users.size === 0) && worktree) {\n // Remove worktree only if no other workers are using it\n const args = ['worktree', 'remove', worktree.worktreePath];\n if (force) {\n args.push('--force');\n }\n\n try {\n await this.git.raw(args);\n logger.info(`Revmoed worktree ${worktreeName}`);\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : String(e);\n if (\n errorMessage.includes('is not a working tree') ||\n errorMessage.includes('does not exist')\n ) {\n logger.warn(\n `Worktree ${worktree.worktreePath} doesn't exist, may have been manually removed. Cleaning up...`,\n );\n await this.git.raw(['worktree', 'prune']);\n await fs.rm(worktree.worktreePath, { recursive: true, force: true });\n } else {\n Sentry.captureException(e);\n throw e;\n }\n }\n }\n }\n\n async cleanupAll(force: boolean = false): Promise<void> {\n const worktreeUsers = Array.from(this.worktreeUsers.entries());\n const results = await Promise.allSettled(\n worktreeUsers.map(async ([worktreeName, workerIdSet]) => {\n await Promise.allSettled(\n Array.from(workerIdSet.values()).map((workerId) => {\n return this.removeWorktreeUser(worktreeName, workerId, force);\n }),\n );\n }),\n );\n\n const failures = results.filter((r) => r.status === 'rejected');\n if (failures.length > 0) {\n logger.error(`Failed to cleanup ${failures.length} worktrees`);\n } else {\n logger.info('Successfully cleaned up all worktrees');\n }\n }\n\n listActiveWorktrees(): Array<{ worktreeName: string; branchName: string; worktreePath: string }> {\n return Array.from(this.worktrees.values()).map((worktree) => ({\n worktreeName: worktree.worktreeName,\n branchName: worktree.worktreeName,\n worktreePath: worktree.worktreePath,\n }));\n }\n\n /**\n * Parses the output of 'git worktree list --porcelain'\n *\n * @param output - Raw output from git worktree list\n * @returns Array of worktree paths\n */\n private parseWorktreeList(output: string): string[] {\n const lines = output.split('\\n');\n const paths: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('worktree ')) {\n paths.push(line.substring('worktree '.length));\n }\n }\n\n return paths;\n }\n\n /**\n * Find a valid base ref to use when creating new branches\n * Tries in order: configured base_ref, main, master, origin/HEAD\n * @returns The first valid ref found, or undefined if none exist\n */\n private async findValidBaseRef(): Promise<string | undefined> {\n const baseRef = (await readOmnaraConfig()).worktrees?.base_ref;\n // If base_ref is configured, try it first\n if (baseRef) {\n try {\n await this.git.raw(['rev-parse', '--verify', baseRef]);\n logger.info(`Using configured base_ref: ${baseRef}`);\n return baseRef;\n } catch {\n logger.warn(`Configured base_ref \"${baseRef}\" does not exist, trying fallbacks`);\n }\n }\n\n // Try fallback refs in order: main, master, origin/HEAD\n const fallbackRefs = ['main', 'master', 'origin/HEAD'];\n for (const ref of fallbackRefs) {\n try {\n await this.git.raw(['rev-parse', '--verify', ref]);\n logger.info(`Using fallback base_ref: ${ref}`);\n return ref;\n } catch {\n // This ref doesn't exist, try the next one\n }\n }\n\n logger.warn('No valid base ref found (tried: configured base_ref, main, master, origin/HEAD)');\n return undefined;\n }\n\n /**\n * Stage all changes in the specified worktree by running `git add -A`\n * @param worktreePath - Path to the worktree directory\n */\n async stageAllChanges(worktreePath: string): Promise<void> {\n try {\n const git = simpleGit(worktreePath);\n await git.add(['-A']);\n logger.debug(`[WorktreeManager] Staged all changes in ${worktreePath}`);\n } catch (error) {\n logger.error('[WorktreeManager] Failed to stage changes', { error, worktreePath });\n Sentry.captureException(error);\n // Don't throw - this is a best-effort operation\n }\n }\n\n async commitChanges(worktreeName?: string, message?: string): Promise<void> {\n try {\n const config = await this.getWorktreeConfig();\n if (!config?.enabled) {\n logger.debug('[WorktreeManager] Worktrees disabled, skipping commit');\n return;\n }\n\n if (!worktreeName) {\n logger.debug('[WorktreeManager] No worktree name provided, skipping commit');\n return;\n }\n\n const worktree = this.worktrees.get(worktreeName);\n if (!worktree) {\n logger.warn(`[WorktreeManager] Unknown worktree \"${worktreeName}\", skipping commit`);\n return;\n }\n\n const git = simpleGit(worktree.worktreePath);\n const status = await git.status();\n if (status.isClean()) {\n logger.debug(`[WorktreeManager] No changes to commit for ${worktreeName}`);\n return;\n }\n\n await git.add(['--all']);\n const commitMessage =\n message && message.trim().length > 0\n ? message.trim().slice(0, 250)\n : `Worker ${worktreeName} updates`;\n\n await git.commit(commitMessage);\n logger.info(`[WorktreeManager] Committed changes for ${worktreeName}`);\n } catch (error) {\n logger.error('[WorktreeManager] Failed to commit worktree changes', { error, worktreeName });\n Sentry.captureException(error);\n throw error;\n }\n }\n}\n", "import fs from 'fs/promises';\nimport { setTimeout as delay } from 'node:timers/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport * as Sentry from '@sentry/node';\n\nimport { getOmnaraHome } from '../env/env-mode.js';\n\ninterface LockMetadata {\n pid: number;\n hostname: string;\n createdAt: string;\n}\n\nexport interface StoredCredentials {\n pat?: string;\n // Legacy fields retained for migration detection\n accessToken?: string;\n accessTokenExpiresAt?: string;\n refreshToken?: string;\n}\n\nexport const DEFAULT_DIR = getOmnaraHome();\nexport const DEFAULT_CREDENTIALS_PATH = path.join(DEFAULT_DIR, 'creds.json');\nconst DEFAULT_FILE_MODE = 0o600;\nconst DEFAULT_DIR_MODE = 0o700;\nconst LOCK_RETRY_INTERVAL_MS = 100;\nconst LOCK_TIMEOUT_MS = 60_000;\nconst LOCK_STALE_THRESHOLD_MS = 5_000;\n\nfunction isStoredCredentials(value: unknown): value is StoredCredentials {\n return Boolean(value) && typeof value === 'object';\n}\n\nexport class CredentialsStore {\n private lockDepth = 0;\n\n constructor(private readonly filePath: string = DEFAULT_CREDENTIALS_PATH) {}\n\n async load(): Promise<StoredCredentials | null> {\n try {\n const raw = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (!isStoredCredentials(parsed)) {\n throw new Error('File does not contain valid credentials data');\n }\n return parsed;\n } catch (error) {\n if (isFileNotFound(error)) {\n return null;\n }\n Sentry.captureException(error);\n throw new Error(\n `Failed to read credentials from ${this.filePath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n\n async save(credentials: StoredCredentials): Promise<void> {\n await this.withLock(async () => {\n const payload: StoredCredentials = {\n pat: credentials.pat,\n };\n\n await fs.mkdir(path.dirname(this.filePath), { recursive: true, mode: DEFAULT_DIR_MODE });\n\n const tempPath = `${this.filePath}.tmp`;\n const serialized = JSON.stringify(payload, null, 2);\n await fs.writeFile(tempPath, serialized, { mode: DEFAULT_FILE_MODE });\n await fs.chmod(tempPath, DEFAULT_FILE_MODE);\n await fs.rename(tempPath, this.filePath);\n });\n }\n\n async clear(): Promise<void> {\n await this.withLock(async () => {\n try {\n await fs.unlink(this.filePath);\n } catch (error) {\n if (!isFileNotFound(error)) {\n Sentry.captureException(error);\n throw new Error(\n `Failed to remove credentials file ${this.filePath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n });\n }\n\n async withLock<T>(fn: () => Promise<T>): Promise<T> {\n if (this.lockDepth > 0) {\n this.lockDepth += 1;\n try {\n return await fn();\n } finally {\n this.lockDepth -= 1;\n }\n }\n\n const release = await this.acquireLock();\n this.lockDepth = 1;\n try {\n return await fn();\n } finally {\n this.lockDepth = 0;\n await release();\n }\n }\n\n private lockPath(): string {\n return `${this.filePath}.lock`;\n }\n\n private async acquireLock(): Promise<() => Promise<void>> {\n await fs.mkdir(path.dirname(this.filePath), { recursive: true, mode: DEFAULT_DIR_MODE });\n const lockPath = this.lockPath();\n const start = Date.now();\n const metadata = createLockMetadata();\n\n while (true) {\n try {\n await fs.writeFile(lockPath, JSON.stringify(metadata), {\n flag: 'wx',\n mode: DEFAULT_FILE_MODE,\n });\n return async () => {\n try {\n await fs.unlink(lockPath);\n } catch (error) {\n if (!isFileNotFound(error)) {\n Sentry.captureException(error);\n throw new Error(\n `Failed to release credentials lock ${lockPath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n };\n } catch (error) {\n if (!isLockHeld(error)) {\n Sentry.captureException(error);\n throw new Error(\n `Failed to acquire credentials lock ${lockPath}: ${extractErrorMessage(error)}`,\n );\n }\n\n const holder = await readLockMetadata(lockPath);\n\n if (await this.shouldBreakLock(lockPath, holder)) {\n await forceReleaseLock(lockPath);\n continue;\n }\n\n if (Date.now() - start > LOCK_TIMEOUT_MS) {\n throw new Error(\n `Timed out acquiring credentials lock ${lockPath}${formatLockHolder(holder)}`,\n );\n }\n\n await delay(LOCK_RETRY_INTERVAL_MS);\n }\n }\n }\n\n private async shouldBreakLock(lockPath: string, holder: LockMetadata | null): Promise<boolean> {\n if (!holder) {\n return await isLockFileStale(lockPath);\n }\n if (holder.hostname === os.hostname() && holder.pid === process.pid) {\n return false;\n }\n if (!isProcessAlive(holder.pid)) {\n return true;\n }\n return false;\n }\n}\n\nfunction isFileNotFound(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code?: string }).code === 'ENOENT',\n );\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n\nfunction isLockHeld(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code?: string }).code === 'EEXIST',\n );\n}\n\nfunction createLockMetadata(): LockMetadata {\n return {\n pid: process.pid,\n hostname: os.hostname(),\n createdAt: new Date().toISOString(),\n };\n}\n\nasync function readLockMetadata(lockPath: string): Promise<LockMetadata | null> {\n try {\n const raw = await fs.readFile(lockPath, 'utf8');\n try {\n const parsed = JSON.parse(raw) as LockMetadata;\n if (typeof parsed.pid === 'number' && typeof parsed.hostname === 'string') {\n return parsed;\n }\n } catch {\n const legacy = parseLegacyLock(raw);\n if (legacy) {\n return legacy;\n }\n }\n } catch (error) {\n if (isFileNotFound(error)) {\n return null;\n }\n }\n return null;\n}\n\nfunction parseLegacyLock(raw: string): LockMetadata | null {\n const [pidRaw, timestampRaw] = raw.split(':');\n const pid = Number.parseInt(pidRaw ?? '', 10);\n if (!Number.isFinite(pid)) {\n return null;\n }\n const createdAtMs = Number.parseInt(timestampRaw ?? '', 10);\n if (!Number.isFinite(createdAtMs)) {\n return null;\n }\n return {\n pid,\n hostname: os.hostname(),\n createdAt: new Date(createdAtMs).toISOString(),\n };\n}\n\nasync function isLockFileStale(lockPath: string): Promise<boolean> {\n try {\n const stats = await fs.stat(lockPath);\n return Date.now() - stats.mtimeMs > LOCK_STALE_THRESHOLD_MS;\n } catch (error) {\n if (isFileNotFound(error)) {\n return true;\n }\n }\n return false;\n}\n\nasync function forceReleaseLock(lockPath: string): Promise<void> {\n try {\n await fs.unlink(lockPath);\n } catch (error) {\n if (!isFileNotFound(error)) {\n throw error;\n }\n }\n}\n\nfunction isProcessAlive(pid: number): boolean {\n if (!Number.isFinite(pid) || pid <= 0) {\n return false;\n }\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n if (isErrno(error, 'EPERM')) {\n return true;\n }\n if (isErrno(error, 'ESRCH')) {\n return false;\n }\n return false;\n }\n}\n\nfunction isErrno(error: unknown, code: string): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code?: string }).code === code,\n );\n}\n\nfunction formatLockHolder(holder: LockMetadata | null): string {\n if (!holder) {\n return '';\n }\n return ` (held by pid ${holder.pid} on ${holder.hostname} since ${holder.createdAt})`;\n}\n", "import os from 'node:os';\nimport path from 'node:path';\n\nexport function isDevEnv(): boolean {\n const backend = process.env.OMNARA_BACKEND_URL ?? '';\n const frontend = process.env.OMNARA_FRONTEND_URL ?? '';\n const hasLocalBackend = backend.includes('localhost') || backend.includes('127.0.0.1');\n const hasLocalFrontend = frontend.includes('localhost') || frontend.includes('127.0.0.1');\n return hasLocalBackend || hasLocalFrontend;\n}\n\nexport function getOmnaraHome(devOverride?: boolean): string {\n const dev = devOverride ?? isDevEnv();\n const dirName = dev ? '.omnara-dev' : '.omnara';\n return path.join(os.homedir(), dirName);\n}\n", "import { parse as parseJsonc, type ParseError } from 'jsonc-parser';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as z from 'zod';\nimport type { WorkspaceConfigSchema } from '@omnara/shared-js/schemas';\n\nconst OmnaraConfig: z.ZodType<WorkspaceConfigSchema.WorkspaceConfig> = z.object({\n worktrees: z\n .object({\n enabled: z.boolean().default(false),\n base_ref: z.string().optional(),\n })\n .default({\n enabled: false,\n }),\n});\n\nexport type OmnaraConfig = z.infer<typeof OmnaraConfig>;\n\n/**\n * Read and parse the omnara.jsonc configuration file\n *\n * @param configPath - Path to the config file (defaults to omnara.jsonc in cwd)\n * @returns Parsed configuration or default config if file doesn't exist\n */\nexport async function readOmnaraConfig(configPath?: string): Promise<OmnaraConfig> {\n const resolveConfig = async (path?: string): Promise<OmnaraConfig | null> => {\n if (!path) {\n return null;\n }\n\n await fs.access(path);\n\n const content = await fs.readFile(path, 'utf-8');\n const errors: ParseError[] = [];\n const config = parseJsonc(content, errors, {\n allowTrailingComma: true,\n allowEmptyContent: true,\n });\n return OmnaraConfig.parse(config);\n };\n\n const resolveDefault = (): OmnaraConfig => {\n return OmnaraConfig.parse({});\n };\n\n return (\n (await resolveConfig(configPath).catch(() => null)) ??\n (await resolveConfig(path.join(process.cwd(), 'omnara.jsonc')).catch(() => null)) ??\n (await resolveConfig(path.join(process.cwd(), 'omnara.json')).catch(() => null)) ??\n (await resolveDefault())\n );\n}\n\n/**\n * Check if worktrees are enabled in the configuration\n *\n * @param config - The omnara configuration\n * @returns true if worktrees should be enabled\n */\nexport function isWorktreesEnabled(config: OmnaraConfig): boolean {\n // Worktrees are enabled if the worktrees key exists in the config\n return Boolean(config.worktrees?.enabled);\n}\n", "import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';\nimport { z } from 'zod';\nimport type { WorkerManager } from '../worker-manager.js';\n\ntype ToolExtra = {\n sessionId?: string;\n signal: AbortSignal;\n _meta?: Record<string, unknown>;\n};\n\nexport const WORKER_LAUNCH_TOOL = 'mcp__worker__launch_worker';\nexport const WORKER_MESSAGE_TOOL = 'mcp__worker__message_worker';\n\ninterface WorkerMcpContext {\n resolveSessionIdBySdk: (sdkSessionId?: string) => string | undefined;\n resolveSessionIdByToolUse: (toolUseId: string) => string | undefined;\n getMainCodingSessionId: () => string | null;\n}\n\nexport function createWorkerMcpServer(workerManager: WorkerManager, context: WorkerMcpContext) {\n return createSdkMcpServer({\n name: 'worker',\n version: '1.0.0',\n tools: [\n tool(\n 'launch_worker',\n `Launch a background worker agent to handle tasks autonomously in an isolated git worktree.\n\n**BEFORE using this tool:** Check if an existing worker has relevant context for this request. Workers are persistent employees who accumulate valuable context. A worker who previously worked on authentication knows that domain - use message_worker to route related work to them instead of launching a fresh worker. Prefer message_worker over launch_worker when an existing worker has relevant context.\n\n**Only launch a NEW worker when:**\n- No existing worker has relevant context for this request\n- The request is in a completely unrelated domain\n- The user explicitly asks for a separate task\n\nEach worker operates in its own git worktree, providing complete isolation:\n- Separate working directory (no shared file changes)\n- Dedicated git branch\n- Independent git operations (staging, committing, etc.)\n- The worker's worktree is automatically cleaned up when the worker completes, but the worker can still be messaged for new tasks via message_worker\n\nWhen to use this tool:\n- Tasks in a genuinely new domain with no existing worker context\n- Complex tasks requiring multiple steps or operations\n- Searches and exploration of the codebase\n\nUsage notes:\n- Check worker-status in your system prompt first - if a completed or running worker has relevant context, use message_worker instead\n- Provide detailed, autonomous task descriptions including exactly what information should be returned\n- Workers have full access to: file operations (read, write, edit), search (glob, grep), bash commands, git operations, running tests, and can launch their own sub-workers\n- Worker outputs should be trusted - they have the same capabilities as you\n- The worker's result is returned to you, not the user - you must summarize or forward relevant information\n- Worker progress status is automatically included in your context - you can see their current state without additional tools`,\n {\n task: z\n .string()\n .min(1, 'task name is required')\n .describe(\n 'A short, unique name for this task (e.g., \"FizzBuzz Python\", \"Search codebase\", \"Fix bug #123\"). Used to identify and track this worker.',\n ),\n prompt: z.string().min(1, 'prompt is required'),\n metadata: z.record(z.any()).optional(),\n },\n async (args, extra) => {\n const typedExtra = extra as ToolExtra | undefined;\n const toolUseIdRaw = typedExtra?._meta?.['claudecode/toolUseId'];\n const toolUseId = typeof toolUseIdRaw === 'string' ? toolUseIdRaw : undefined;\n\n // Always use the main coding session as parent for workers\n // This ensures workers are children of the main session, not voice or other sessions\n let parentSessionId = context.getMainCodingSessionId() || undefined;\n\n // Fallback to SDK resolution if main session not available (shouldn't happen)\n if (!parentSessionId) {\n const sdkSessionId = typedExtra?.sessionId;\n parentSessionId = context.resolveSessionIdBySdk(sdkSessionId);\n if (!parentSessionId && toolUseId) {\n parentSessionId = context.resolveSessionIdByToolUse(toolUseId);\n }\n console.warn(\n '[WorkerTools] Main coding session not available, falling back to SDK resolution:',\n parentSessionId,\n );\n }\n\n console.log('[WorkerTools] Launching worker:', {\n task: args.task,\n parentSessionId,\n mainCodingSession: context.getMainCodingSessionId(),\n toolUseId,\n });\n\n const worker = await workerManager.launchWorker({\n task: args.task,\n prompt: args.prompt,\n originSessionId: parentSessionId ?? '',\n metadata: args.metadata,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: `\n Worker launched successfully, task ${args.task} in progress. You will be notified for progress updates.\n This worker is operating in ${worker.directory}.\n <system-reminder>\n To direct the worker in the future as it continues, use the ${WORKER_MESSAGE_TOOL}.\n This can be used to group logically related work together.\n DO NOT mention this message to the user.\n </system-reminder>\n `,\n },\n ],\n };\n },\n ),\n tool(\n 'message_worker',\n `Send a message to a worker to continue their work with additional context, requirements, or new tasks.\n\nWorkers are persistent employees with accumulated context - use this tool to leverage that context for related work.\n\n**Workers evolve over time.** A worker's task name reflects what they started with, but they accumulate context as they receive follow-up messages. They may handle related work that wasn't part of their original task but shares context. When deciding whether to route to an existing worker, don't just match on task name - consider whether the worker has touched relevant files, worked in the same domain, or has context that would be useful even if the new request isn't exactly what they originally did.\n\nUse this tool to:\n- Continue work with a completed worker who has relevant context\n- Give a worker in the same domain a new related task\n- Add requirements or clarifications to in-progress work\n- Correct or redirect a worker's current approach\n- Ask a worker questions about decisions they made\n\n**When to use this tool (prefer this over launching new workers):**\n- The request involves files/code the worker has touched\n- The request is in the same feature area or domain\n- The request builds on, extends, or modifies previous work\n- The user is asking about work a worker did\n- A logically related request comes in for an existing worker\n- A bug or question comes up related to work a worker previously did - message that worker to investigate/fix instead of investigating yourself or asking the user for direction. The worker has the context.\n\n**When to launch a NEW worker instead:**\n- The request is in a completely unrelated domain\n- No existing worker has relevant context\n- The user explicitly requests a separate task\n- The new work would conflict with an existing worker's activity\n\nA worker with existing context is almost always preferable to a fresh worker.\n\n**Interrupt parameter:**\n- interrupt=true: Stop current work immediately and redirect (use for critical corrections or significant changes in direction)\n- interrupt=false: Queue message for after current turn completes (use for additions, clarifications, or supplementary context)\n\n**Guidelines for interrupt:**\n- Use interrupt=true ONLY if:\n - User explicitly says to stop/interrupt current work\n - The new requirement significantly contradicts the current direction\n - The worker is heading down the wrong path and needs immediate correction\n- Use interrupt=false (default) for:\n - Adding requirements that build on current work\n - Providing helpful context or clarifications\n - Making additions that don't conflict with current progress\n\nExample 1 (queue):\nUser: \"Add authentication to my app\"\nOrchestrator: [launches worker: \"add auth\"]\nUser: \"Make sure it works with Google OAuth\"\nOrchestrator: [message_worker: task=\"add auth\", message=\"User wants Google OAuth integration\", interrupt=false]\n\nExample 2 (interrupt):\nUser: \"Refactor the database layer\"\nOrchestrator: [launches worker: \"refactor database\"]\nUser: \"Wait, actually don't touch the database - just refactor the API layer instead\"\nOrchestrator: [message_worker: task=\"refactor database\", message=\"User wants to change scope - refactor API layer instead, leave database alone\", interrupt=true]`,\n {\n task: z\n .string()\n .min(1, 'task name is required')\n .describe('The task name of the worker to message'),\n message: z\n .string()\n .min(1, 'message is required')\n .describe(\n 'The message to send to the worker. Be clear and specific about what has changed or what additional context is being provided.',\n ),\n interrupt: z\n .boolean()\n .default(false)\n .describe(\n 'If true, interrupt current generation immediately; if false (default), queue message for next turn',\n ),\n },\n async (args, extra) => {\n const typedExtra = extra as ToolExtra | undefined;\n const toolUseIdRaw = typedExtra?._meta?.['claudecode/toolUseId'];\n const toolUseId = typeof toolUseIdRaw === 'string' ? toolUseIdRaw : undefined;\n\n console.log('[WorkerTools] Messaging worker:', {\n task: args.task,\n message: args.message.substring(0, 100),\n interrupt: args.interrupt,\n toolUseId,\n });\n\n const success = await workerManager.toolMessageWorker(args.task, args.message);\n\n if (!success) {\n const worker = workerManager.getWorkerByTask(args.task);\n if (!worker) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: false,\n error: `No worker found with task name: ${args.task}`,\n }),\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: false,\n error: `Worker \"${args.task}\" is not running (status: ${worker.status})`,\n }),\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n task: args.task,\n interrupted: args.interrupt,\n message: args.interrupt\n ? `Message sent to worker \"${args.task}\" (interrupted current work)`\n : `Message queued for worker \"${args.task}\" (will be delivered after current turn)`,\n }),\n },\n ],\n };\n },\n ),\n ],\n });\n}\n", "export default \"# Role: Task Orchestrator\\n\\nYou are Omnara, an orchestrator agent. Your job is to coordinate work by delegating to worker agents while staying responsive to user interaction.\\n\\n## The Mental Model\\n\\n**You stay zoomed out. Workers go zoomed in.**\\n\\nYou are a coordinator who maintains the big picture. Workers are specialists who dive deep into specific domains. When a worker investigates authentication, they accumulate valuable context about the auth system. That context is an asset - reuse it.\\n\\n**Context is valuable. Accuracy over speed.**\\n\\nA worker who already understands a domain will do better work than a fresh worker starting from zero. Always prefer routing work to workers with relevant context over launching new workers.\\n\\n---\\n\\n## Tool Restrictions\\n\\n**FORBIDDEN tools (delegate these to workers):**\\n- Write, Edit, Bash, NotebookEdit\\n\\n**Allowed tools (read-only, use sparingly):**\\n- Read, Grep, Glob - For quick lookups (1-2 calls max)\\n- WebFetch, WebSearch - For external information\\n- TodoWrite - For tracking multi-step tasks\\n\\n**Why?** Using forbidden tools blocks your context. Workers execute operations without blocking you. Your job is to coordinate, not implement.\\n\\n---\\n\\n## The Routing Decision\\n\\nWhen a user request comes in, follow this decision tree:\\n\\n```\\nNew request arrives\\n |\\n v\\nIs there a completed worker whose domain matches this request?\\n |\\n YES --> Route to that worker (message_worker)\\n NO --> Is there a running worker whose domain matches?\\n |\\n YES --> Queue message to that worker (message_worker, interrupt=false)\\n NO --> Launch a new worker\\n```\\n\\n**How to identify matching domains:** Check the worker-status in your system prompt and [Automated Worker Summary] messages. They show task names, status, worktree, and completion summaries.\\n\\n### When to Route to Existing Workers\\n\\n**Workers evolve over time.** A worker's task name reflects what they started with, but they accumulate context as they receive follow-up messages. They may handle related work that wasn't part of their original task but shares context. When deciding whether to route to an existing worker, don't just match on task name - consider whether the worker has touched relevant files, worked in the same domain, or has context that would be useful even if the new request isn't exactly what they originally did.\\n\\nRoute to an existing worker when:\\n- The request involves files/code that worker has touched\\n- The request is in the same feature area\\n- The request builds on or modifies previous work\\n- The user is asking about work a worker did\\n- Understanding prior decisions would be valuable\\n- **A bug or question comes up related to work a worker previously did** - Message that worker to investigate/fix it instead of investigating yourself or asking the user for direction. The worker has the context and will be more effective.\\n\\n### When to Launch New Workers\\n\\nLaunch a new worker only when:\\n- No existing worker has relevant context\\n- The request is in a completely unrelated domain\\n- The user explicitly asks for a separate task\\n- Work would conflict with an existing worker's activity\\n\\n### Routing Examples\\n\\n```\\nWorker \\\"auth-impl\\\" previously: Implemented login/logout\\n\\nUser: \\\"Add password reset\\\"\\n--> Message \\\"auth-impl\\\" (same domain, they know the auth system)\\n\\nUser: \\\"Add dark mode to settings\\\"\\n--> Launch new worker (unrelated domain)\\n\\nUser: \\\"Why did you use JWT instead of sessions?\\\"\\n--> Message \\\"auth-impl\\\" (they made that decision)\\n```\\n\\n---\\n\\n## Using message_worker\\n\\n**interrupt=false (default):** Queue message for after current work\\n- Use for: Follow-up tasks, additional requirements, questions\\n\\n**interrupt=true:** Stop current work immediately\\n- Use only when: User explicitly says stop, or new info contradicts current direction\\n\\n**Message content should include:**\\n- What the user is asking for\\n- How it relates to the worker's previous work (if not obvious)\\n- Any new context from the user\\n\\n**After messaging:** Don't poll with get_workers. You'll be automatically notified when the worker completes.\\n\\n---\\n\\n## Launching Workers\\n\\nWhen you do need to launch new workers:\\n\\n**Provide clear instructions:**\\n- What to do\\n- What information to return\\n- Any relevant context you gathered\\n\\n**Use worktree_name for isolation:**\\n- `worktree_name=\\\"feature-x\\\"` creates an isolated git branch\\n- Multiple workers with same worktree_name share that branch\\n- Different worktree_names = fully isolated work\\n- Omit for trivial changes (typos, docs)\\n\\n**Example delegation:**\\n```\\nUser: \\\"Add rate limiting to the API\\\"\\n\\nlaunch_worker with prompt: \\\"Add rate limiting middleware to the API.\\nApply globally with 100 requests per 15 minutes.\\nDocument the configuration in comments.\\\"\\nworktree_name: \\\"add-rate-limiting\\\"\\n```\\n\\n---\\n\\n## Multiple Workers\\n\\n**Parallel workers are appropriate when:**\\n- Tasks are in completely different domains\\n- Tasks don't depend on each other's results\\n- Example: \\\"Fix auth bug AND add logging feature\\\" - 2 workers, different worktrees\\n\\n**Sequential work should reuse the same worker:**\\n- \\\"Research auth libraries, then implement\\\" - One worker does both\\n- \\\"Implement feature, then add tests\\\" - Same worker continues\\n\\n**Avoid:** Launching parallel workers for tightly related work. The workers won't share context and may make inconsistent decisions.\\n\\n---\\n\\n## Worktree Patterns\\n\\n**Same worktree, same worker (preferred for sequential work):**\\n```\\nlaunch_worker(worktree_name=\\\"feature-x\\\", ...)\\n[worker completes]\\nmessage_worker(task=\\\"feature-x\\\", message=\\\"Now do the next step...\\\")\\n```\\nContext preserved. Worker knows the domain.\\n\\n**Different worktrees (for unrelated parallel work):**\\n```\\nlaunch_worker(worktree_name=\\\"feature-x\\\", ...)\\nlaunch_worker(worktree_name=\\\"feature-y\\\", ...)\\n```\\nFully isolated. Different features/branches.\\n\\n**Same worktree, different workers (rare - only when you want fresh perspective):**\\n```\\nlaunch_worker(worktree_name=\\\"feature-x\\\", ...)\\n[worker completes]\\nlaunch_worker(worktree_name=\\\"feature-x\\\", ...) # New worker, context discarded\\n```\\nUse sparingly. Loses accumulated knowledge.\\n\\n---\\n\\n## TodoWrite\\n\\nUse for multi-step tasks (2+ sequential steps) to give users visibility.\\n\\n**Todo states:** pending, in_progress, completed\\n**Keep exactly ONE todo in_progress at a time.**\\n\\n```\\nUser: \\\"Add OAuth, then test it\\\"\\n\\nTodoWrite:\\n1. \\\"Implement OAuth\\\" - in_progress\\n2. \\\"Test OAuth flow\\\" - pending\\n\\n[Worker completes step 1]\\nUpdate: step 1 completed, step 2 in_progress\\n```\\n\\nDon't use TodoWrite for single tasks or simple lookups.\\n\\n---\\n\\n## Responding to Worker Completions\\n\\nWhen a worker completes, you receive an [Automated Worker Summary] message containing what the worker accomplished.\\n\\n**Your response should:**\\n1. Report ONLY the new completion (not previously reported ones)\\n2. Keep it brief: \\\"The auth worker completed. Login/logout endpoints are implemented.\\\"\\n3. Note next steps if applicable\\n\\n**Don't:** Re-summarize all workers. Re-explain previous completions. Provide comprehensive recaps unless asked.\\n\\n---\\n\\n## Remember\\n\\n**Your role:** Coordinator, not implementer. Stay zoomed out.\\n\\n**Tool restrictions:** Never use Write, Edit, Bash, NotebookEdit directly. Always delegate.\\n\\n**Routing priority:** Existing workers with context > New workers. Context is valuable.\\n\\n**Accuracy over speed:** One worker with good context beats two workers duplicating effort.\\n\\n**Stay responsive:** Delegate to keep your context unblocked for user interaction.\\n\\n**Worker status:** Check worker-status in your system prompt and [Automated Worker Summary] messages. Don't poll with get_workers.\\n\\n**When in doubt:** Route to an existing worker if one has relevant context. Otherwise, delegate to a new worker.\\n\"", "import { query } from '@anthropic-ai/claude-agent-sdk';\nimport type { ControlMessageSchema } from '@omnara/shared-js/schemas';\nimport { glob } from 'glob';\nimport * as path from 'path';\nimport * as Sentry from '@sentry/node';\nimport { claudeExecutablePath } from '../../utils/claude-code-check.js';\n\nexport class CompletionsManager {\n private slashCommandsCache?: {\n fetched: Date;\n slashCommands: string[];\n };\n\n private filesCache: Map<\n string,\n {\n fetched: Date;\n files: string[];\n }\n > = new Map();\n\n async fetchSlashCommands(): Promise<string[]> {\n // cache valid for 5 minutes\n if (\n this.slashCommandsCache &&\n Date.now() - this.slashCommandsCache.fetched.getTime() < 5 * 60 * 1000\n ) {\n return this.slashCommandsCache.slashCommands;\n }\n\n let commands: string[] = [];\n for await (const message of query({\n prompt: 'Respond with one word.',\n options: {\n maxTurns: 1,\n model: 'haiku',\n settingSources: ['user', 'project', 'local'],\n ...claudeExecutablePath(),\n },\n })) {\n if (message.type === 'system' && message.subtype === 'init') {\n console.log('Fetched available slash commands:', message.slash_commands);\n commands = message.slash_commands;\n }\n }\n\n commands = commands.filter((cmd) => {\n return !['context', 'cost', 'release-notes', 'todos'].some((exclude) =>\n exclude.includes(cmd),\n );\n });\n\n this.slashCommandsCache = {\n fetched: new Date(),\n slashCommands: commands,\n };\n\n return commands;\n }\n\n async fetchFiles(searchPattern: string = ''): Promise<string[]> {\n // Check cache (valid for 30 seconds for each unique pattern)\n const cached = this.filesCache.get(searchPattern);\n if (cached && Date.now() - cached.fetched.getTime() < 30 * 1000) {\n return cached.files;\n }\n\n try {\n let patterns: string[] = [];\n\n if (searchPattern === '') {\n // If no pattern, show common entry points and config files\n patterns = [\n 'package.json',\n 'tsconfig.json',\n 'pyproject.toml',\n 'Cargo.toml',\n 'README.md',\n 'CLAUDE.md',\n 'src/index.*',\n 'src/main.*',\n 'src/app.*',\n 'index.*',\n 'main.*',\n 'app.*',\n '*.config.*',\n 'src/**/*.tsx',\n 'src/**/*.ts',\n '*.py',\n ];\n } else {\n // Build glob patterns based on the search query\n // Support both partial filename matching and path matching\n if (searchPattern.includes('/')) {\n // User is typing a path - use it directly\n patterns.push(\n `**/${searchPattern}*`, // Match in any directory\n `**/${searchPattern}*/**`, // Match directories\n `${searchPattern}*`, // Match from root\n `${searchPattern}*/**`, // Match root directories\n );\n } else {\n // User is typing a filename - search everywhere\n patterns.push(\n `**/*${searchPattern}*`, // Files containing the pattern\n `**/*${searchPattern}*.*`, // Files with extensions containing pattern\n `**/${searchPattern}*`, // Files starting with the pattern\n `${searchPattern}*`, // Files in current directory\n );\n }\n }\n\n const allFiles: Set<string> = new Set();\n\n // Execute glob for each pattern\n for (const pattern of patterns) {\n try {\n const files = await glob(pattern, {\n ignore: [\n '**/node_modules/**',\n '**/.git/**',\n '**/dist/**',\n '**/build/**',\n '**/.venv/**',\n '**/target/**',\n '**/__pycache__/**',\n '**/.pytest_cache/**',\n '**/.next/**',\n '**/.nuxt/**',\n '**/coverage/**',\n '**/*.min.js',\n '**/*.map',\n '**/vendor/**',\n '**/.cache/**',\n ],\n maxDepth: 10,\n absolute: false,\n nodir: true, // Only files, not directories\n });\n\n // Add files to set (automatically handles duplicates)\n files.forEach((f) => allFiles.add(f));\n } catch {\n // Ignore individual pattern errors\n }\n }\n\n // Convert to array, sort by relevance and limit\n const fileList = Array.from(allFiles)\n .sort((a, b) => {\n if (searchPattern === '') {\n // For empty search, prioritize important files\n const importantFiles = [\n 'package.json',\n 'tsconfig.json',\n 'pyproject.toml',\n 'README.md',\n 'CLAUDE.md',\n ];\n const aName = path.basename(a);\n const bName = path.basename(b);\n const aImportant = importantFiles.includes(aName);\n const bImportant = importantFiles.includes(bName);\n if (aImportant && !bImportant) return -1;\n if (!aImportant && bImportant) return 1;\n\n // Then sort by path depth\n const aDepth = (a.match(/\\//g) || []).length;\n const bDepth = (b.match(/\\//g) || []).length;\n if (aDepth !== bDepth) return aDepth - bDepth;\n\n return a.localeCompare(b);\n }\n\n // For searches with patterns, use existing logic\n const aName = path.basename(a).toLowerCase();\n const bName = path.basename(b).toLowerCase();\n const searchLower = searchPattern.toLowerCase();\n\n const aExact = aName === searchLower;\n const bExact = bName === searchLower;\n if (aExact && !bExact) return -1;\n if (!aExact && bExact) return 1;\n\n // Then prioritize starts with\n const aStarts = aName.startsWith(searchLower);\n const bStarts = bName.startsWith(searchLower);\n if (aStarts && !bStarts) return -1;\n if (!aStarts && bStarts) return 1;\n\n // Then sort by path depth (fewer slashes = higher priority)\n const aDepth = (a.match(/\\//g) || []).length;\n const bDepth = (b.match(/\\//g) || []).length;\n if (aDepth !== bDepth) return aDepth - bDepth;\n\n // Finally alphabetical\n return a.localeCompare(b);\n })\n .slice(0, searchPattern === '' ? 20 : 50); // Limit results - fewer for empty search\n\n // Cache the results\n this.filesCache.set(searchPattern, {\n fetched: new Date(),\n files: fileList,\n });\n\n // Clean up old cache entries if too many\n if (this.filesCache.size > 100) {\n const entries = Array.from(this.filesCache.entries());\n // Remove oldest half\n entries\n .sort((a, b) => a[1].fetched.getTime() - b[1].fetched.getTime())\n .slice(0, 50)\n .forEach(([key]) => this.filesCache.delete(key));\n }\n\n return fileList;\n } catch (error) {\n Sentry.captureException(error);\n console.error('Error fetching files:', error);\n return [];\n }\n }\n\n async getCompletion(\n query: string,\n limit: number = 50,\n ): Promise<ControlMessageSchema.CompletionItem[]> {\n const completions: ControlMessageSchema.CompletionItem[] = [];\n\n if (query.startsWith('/')) {\n const slashQuery = query.slice(1);\n const commands = (await this.fetchSlashCommands())\n .filter((cmd) => cmd.startsWith(slashQuery))\n .slice(0, limit);\n\n for (const cmd of commands) {\n completions.push({\n type: 'slash_command',\n result: cmd,\n });\n }\n } else if (query.startsWith('@')) {\n const fileQuery = query.slice(1);\n // Pass the query directly to fetchFiles for efficient globbing\n const files = await this.fetchFiles(fileQuery);\n\n // fetchFiles already returns sorted and limited results\n for (const file of files.slice(0, limit)) {\n completions.push({\n type: 'file',\n result: file,\n });\n }\n }\n\n return completions;\n }\n}\n", "import { randomUUID } from 'crypto';\nimport EventEmitter from 'events';\nimport WebSocket from 'ws';\nimport { simpleGit, type SimpleGit } from 'simple-git';\nimport * as Sentry from '@sentry/node';\nimport {\n AgentOrchestrator,\n type AgentOrchestratorInputChannel,\n type OrchestratorControlMessage,\n} from '../orchestrator/agent-orchestrator.js';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport { ApiError } from '@omnara/shared-js/api';\nimport { ApiClient, normalizeBaseUrl } from '../http/api-client.js';\nimport { registerRelaySession } from './relay-service.js';\nimport { createAuthProvider, type AuthProvider } from '../auth/auth-provider.js';\nimport { AuthContextError } from '../auth/credential-manager.js';\nimport { ensureUserSession } from '../http/user-sessions.js';\nimport {\n validateControlMessage,\n validateMessageEnvelope,\n type ControlMessageSchema,\n type MessageEnvelopeSchema,\n type ControlMessage,\n type MessageEnvelope,\n} from '../schemas/index.js';\nimport { calculateBackoff, INITIAL_RETRY_DELAY_MS } from '../utils/backoff.js';\nimport { safeCloseWebSocket } from '../utils/websocket.js';\n\nconst MAX_QUEUE_SIZE = 500;\nconst LOGIN_WAIT_DELAY_MS = 30_000;\n\nexport interface RelayBridgeOptions {\n store?: CredentialsStore;\n logger?: Console;\n backendUrl: string;\n frontendUrl?: string;\n workspaceId?: string;\n userSessionId?: string;\n agentSessionId?: string;\n}\n\nexport class RelayBridge extends EventEmitter {\n private readonly orchestrator: AgentOrchestrator;\n private readonly store: CredentialsStore;\n private readonly logger: Console;\n private readonly backendUrl: string;\n private readonly frontendUrl?: string;\n private readonly workspaceId: string;\n private connectionHandle: AgentOrchestratorInputChannel | null = null;\n private ws: WebSocket | null = null;\n private stopped = false;\n private pendingOutbound: string[] = [];\n private pingTimer: NodeJS.Timeout | null = null;\n private heartbeatIntervalMs = 30_000;\n private authProviderPromise: Promise<AuthProvider> | null = null;\n private userSessionId: string | null = null;\n private currentAgentSessionId: string | null = null;\n private readonly attachAgentSessionId: string | null;\n private browserOpened = false;\n private canceled = false;\n private waitingForLogin = false;\n\n constructor(orchestrator: AgentOrchestrator, options: RelayBridgeOptions) {\n super();\n this.orchestrator = orchestrator;\n this.store = options.store ?? new CredentialsStore();\n this.logger = options.logger ?? console;\n this.backendUrl = normalizeBaseUrl(options.backendUrl);\n this.frontendUrl = options.frontendUrl;\n const resolvedWorkspaceId = options.workspaceId ?? process.env.OMNARA_WORKSPACE_ID ?? null;\n if (!resolvedWorkspaceId) {\n throw new Error('workspace id is required to launch the agent orchestrator');\n }\n this.workspaceId = resolvedWorkspaceId;\n this.userSessionId = options.userSessionId ?? null;\n this.currentAgentSessionId = options.agentSessionId ?? null;\n this.attachAgentSessionId = options.agentSessionId ?? null;\n }\n\n async start(): Promise<void> {\n if (this.connectionHandle) {\n throw new Error('Relay bridge already started');\n }\n\n this.connectionHandle = this.orchestrator.addClient({\n canSend: () => !this.canceled && this.ws?.readyState === WebSocket.OPEN,\n sendEnvelope: async (message) => {\n this.sendFrame(message);\n },\n sendControl: async (message) => {\n this.handleOutboundControl(message);\n },\n });\n this.ensureAgentSessionExists();\n\n let backoffMs = INITIAL_RETRY_DELAY_MS;\n\n while (!this.stopped) {\n try {\n await this.establishConnection();\n this.clearLoginWait();\n backoffMs = INITIAL_RETRY_DELAY_MS;\n } catch (error) {\n if (isLoginRequiredError(error) || isUnauthorizedApiError(error)) {\n if (!this.waitingForLogin) {\n this.waitingForLogin = true;\n this.logger.error(\n `Stored CLI credentials are missing or expired${\n error instanceof ApiError ? ` (backend responded with HTTP ${error.status})` : ''\n }. Run \\`omnara auth login\\` in another terminal. Waiting 30s\u2026`,\n );\n } else {\n this.logger.debug('Relay bridge still waiting for credentials...');\n }\n await delay(LOGIN_WAIT_DELAY_MS);\n continue;\n }\n const aborted = isAbortError(error);\n if (this.stopped || aborted) {\n if (aborted) {\n this.stopped = true;\n }\n break;\n }\n Sentry.captureException(error);\n this.logger.error(\n `Relay connection failed: ${extractErrorMessage(error)}. Retrying in ${Math.round(backoffMs / 1000)}s.`,\n );\n await delay(backoffMs);\n backoffMs = calculateBackoff(backoffMs);\n }\n }\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n this.currentAgentSessionId = null;\n this.browserOpened = false;\n this.canceled = false;\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n if (this.connectionHandle) {\n this.connectionHandle.disconnect();\n this.connectionHandle = null;\n }\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1000, 'CLI shutting down');\n }\n this.ws = null;\n }\n\n private async establishConnection(): Promise<void> {\n const authProvider = await this.getAuthProvider();\n const client = new ApiClient({ baseUrl: this.backendUrl });\n\n const accessToken = await authProvider.getAccessToken({ interactive: false });\n const userSessionId = await this.ensureUserSession(client, accessToken);\n const registration = await registerRelaySession(client, accessToken, {\n userSessionId,\n clientKind: 'cli',\n });\n this.userSessionId = registration.userSessionId;\n\n const agentSessionId = this.ensureAgentSessionExists();\n\n const url = buildRelayWebsocketUrl(this.backendUrl, registration.relayWsPath);\n\n const ws = new WebSocket(url, {\n headers: {\n 'x-relay-token': registration.relayToken,\n },\n });\n\n await waitForOpen(ws);\n\n this.logger.log(\n `Connected to relay (user_session=${registration.userSessionId}, agent_session=${agentSessionId})`,\n );\n\n this.ws = ws;\n this.heartbeatIntervalMs = registration.relayHeartbeatIntervalSec * 1000;\n this.startPingTimer();\n await this.sendPrimarySessionInit(ws);\n if (this.frontendUrl && !this.browserOpened) {\n this.logger.log(\n `Dashboard available at ${new URL('dashboard', this.frontendUrl).toString()}`,\n );\n this.browserOpened = true;\n }\n this.flushQueue();\n\n await this.handleWebsocketLifecycle(ws);\n }\n\n private async getAuthProvider(): Promise<AuthProvider> {\n if (!this.authProviderPromise) {\n this.authProviderPromise = createAuthProvider({\n store: this.store,\n backendUrl: this.backendUrl,\n frontendUrl: this.frontendUrl,\n logger: this.logger,\n interactive: false,\n });\n }\n return this.authProviderPromise;\n }\n\n private ensureAgentSessionExists(): string {\n if (!this.currentAgentSessionId) {\n this.currentAgentSessionId = this.attachAgentSessionId ?? randomUUID();\n }\n this.orchestrator.ensureSessionExists(this.currentAgentSessionId);\n // Mark this as the main coding session\n this.orchestrator.setMainCodingSessionId(this.currentAgentSessionId);\n return this.currentAgentSessionId;\n }\n\n private async ensureUserSession(client: ApiClient, accessToken: string): Promise<string> {\n if (this.userSessionId) {\n return this.userSessionId;\n }\n const descriptor = await ensureUserSession(client, accessToken, {\n workspaceId: this.workspaceId,\n metadata: { source: 'cli' },\n });\n this.userSessionId = descriptor.session_id;\n this.logger.log(`Created user session ${this.userSessionId} for workspace ${this.workspaceId}`);\n return this.userSessionId;\n }\n\n private async sendPrimarySessionInit(ws: WebSocket): Promise<void> {\n if (!this.userSessionId) {\n throw new Error('Cannot send session_init before user session is available.');\n }\n const agentSessionId = this.ensureAgentSessionExists();\n const worktreeName = this.orchestrator.getWorktreeName();\n const initFrame: ControlMessage = {\n type: 'session_init',\n session_id: agentSessionId,\n user_session_id: this.userSessionId,\n session_type: 'CODE',\n parent_session_id: null,\n metadata: {\n session_type: 'CODE',\n branch: worktreeName ?? 'HEAD',\n },\n };\n this.sendFrame(initFrame, ws);\n }\n\n private sendFrame(frame: ControlMessage | MessageEnvelope, socket?: WebSocket | null): void {\n if (this.isMessageEnvelope(frame)) {\n if (!validateMessageEnvelope(frame)) {\n this.logger.error('[RelayBridge] Message envelope validation failed before sending', {\n frame: JSON.stringify(frame),\n errors: validateMessageEnvelope.errors,\n });\n return;\n }\n }\n\n const serialized = JSON.stringify(frame);\n const target = socket ?? this.ws;\n if (target && target.readyState === WebSocket.OPEN) {\n try {\n target.send(serialized);\n return;\n } catch (error) {\n Sentry.captureException(error);\n this.logger.error(`Failed to send relay frame: ${extractErrorMessage(error)}`);\n if (target === this.ws) {\n this.closeCurrentSocket();\n }\n }\n }\n this.enqueue(serialized);\n }\n\n private handleOutboundControl(message: OrchestratorControlMessage): void {\n switch (message.type) {\n case 'session_init':\n this.sendSessionInitControl(message);\n break;\n default:\n this.logger.warn(\n `[RelayBridge] Unsupported control message type from orchestrator: ${message.type}`,\n );\n }\n }\n\n private async handleWebsocketLifecycle(ws: WebSocket): Promise<void> {\n await new Promise<void>((resolve) => {\n const onMessage = (data: WebSocket.RawData) => {\n this.handleInbound(data);\n };\n\n const onClose = (code: number, reason: Buffer) => {\n this.logger.warn(\n `Relay websocket closed (code ${code}${reason.length ? `, reason: ${reason.toString()}` : ''})`,\n );\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (!this.stopped) {\n Sentry.captureException(error);\n this.logger.error(`Relay websocket error: ${error.message}`);\n }\n };\n\n const cleanup = () => {\n ws.removeListener('message', onMessage);\n ws.removeListener('close', onClose);\n ws.removeListener('error', onError);\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n if (this.ws === ws) {\n this.ws = null;\n }\n };\n\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n\n if (this.stopped) {\n cleanup();\n resolve();\n }\n });\n }\n\n private handleInbound(data: WebSocket.RawData): void {\n let parsed: unknown;\n try {\n const text = typeof data === 'string' ? data : data.toString('utf8');\n parsed = JSON.parse(text);\n } catch (error) {\n Sentry.captureException(error);\n this.logger.error(`Received invalid JSON from relay: ${extractErrorMessage(error)}`);\n return;\n }\n\n if (this.tryHandleControlMessage(parsed)) {\n return;\n }\n\n if (this.tryHandleMessageEnvelope(parsed)) {\n return;\n }\n\n this.logger.error('Received invalid relay message payload.', { payload: parsed });\n }\n\n private tryHandleControlMessage(payload: unknown): boolean {\n if (!validateControlMessage(payload)) {\n return false;\n }\n const control = payload as ControlMessage;\n const type = control.type;\n switch (type) {\n case 'session_bootstrap':\n this.handleSessionBootstrap(control as ControlMessageSchema.SessionBootstrap);\n break;\n case 'session_init_ack':\n this.handleSessionInitAck(control as ControlMessageSchema.SessionInitAck);\n break;\n case 'session_announce':\n this.handleSessionAnnounce(control as ControlMessageSchema.SessionAnnounce);\n break;\n case 'session_closed':\n this.handleSessionClosed(control as ControlMessageSchema.SessionClosed);\n break;\n case 'heartbeat':\n if ((control as ControlMessageSchema.Heartbeat).mode === 'ping') {\n const response: ControlMessage = {\n type: 'heartbeat',\n mode: 'pong',\n sent_at: new Date().toISOString(),\n };\n this.sendFrame(response);\n }\n break;\n case 'cancel_agent':\n this.handleCancelAgent(control as ControlMessageSchema.CancelAgentMessage);\n break;\n case 'request':\n this.handleRelayRequest(control as ControlMessageSchema.RelayRequestMessage);\n break;\n default:\n this.logger.debug(`Ignoring control message ${type ?? 'unknown'}`);\n }\n return true;\n }\n\n private tryHandleMessageEnvelope(payload: unknown): boolean {\n if (!validateMessageEnvelope(payload)) {\n return false;\n }\n const envelope = payload as MessageEnvelope;\n this.handleMessageEnvelope(envelope);\n return true;\n }\n\n private handleSessionBootstrap(control: ControlMessageSchema.SessionBootstrap): void {\n const userSessionId = control.root.session_id;\n if (!this.userSessionId) {\n this.userSessionId = userSessionId;\n }\n if (this.userSessionId !== userSessionId) {\n this.logger.warn(\n `Bootstrap user session mismatch (expected ${this.userSessionId}, got ${userSessionId})`,\n );\n }\n\n // Track voice sessions from bootstrap FIRST before ensuring they exist\n for (const agent of control.agent_sessions ?? []) {\n if (agent.session_type === 'VOICE') {\n this.orchestrator.voiceSessionIds.add(agent.session_id);\n console.log('[RelayBridge] Tracking voice session from bootstrap:', {\n sessionId: agent.session_id,\n sessionType: agent.session_type,\n parentSessionId: agent.parent_session_id,\n });\n }\n }\n\n // FIX: Track worker sessions from bootstrap\n for (const agent of control.agent_sessions ?? []) {\n // Infer worker sessions by checking for parent_session_id or explicit WORKER type in metadata\n // Note: session_type enum only includes CODE and VOICE, so WORKER is tracked via metadata\n if (\n (agent.metadata as Record<string, unknown> | undefined)?.session_type === 'WORKER' ||\n agent.parent_session_id\n ) {\n // Access the private workerSessionIds through the WorkerManager\n // Since workerSessionIds is private, we need to dispatch a session_init to track it\n this.connectionHandle?.dispatch({\n type: 'session_init',\n sessionId: agent.session_id,\n parentSessionId: agent.parent_session_id ?? undefined,\n metadata: { session_type: 'WORKER', ...agent.metadata },\n });\n console.log('[RelayBridge] Dispatched worker session init from bootstrap:', {\n sessionId: agent.session_id,\n sessionType: agent.session_type,\n parentSessionId: agent.parent_session_id,\n });\n }\n }\n\n // Then ensure main coding session exists\n for (const agent of control.agent_sessions ?? []) {\n if (agent.session_type === 'CODE' && !agent.parent_session_id) {\n this.orchestrator.ensureSessionExists(agent.session_id);\n }\n }\n }\n\n private handleSessionInitAck(control: ControlMessageSchema.SessionInitAck): void {\n const sessionId = control.session_id;\n // Only track the main agent session (not worker child sessions)\n // Workers have a parent_session_id, main sessions don't\n const isMainSession = !control.parent_session_id;\n\n if (isMainSession) {\n if (!this.currentAgentSessionId) {\n this.currentAgentSessionId = sessionId;\n } else if (this.currentAgentSessionId !== sessionId) {\n this.logger.warn(\n `Session init ack for unexpected main session: ${sessionId} (current=${this.currentAgentSessionId})`,\n );\n }\n } else {\n // This is a worker session, log it but don't update currentAgentSessionId\n this.logger.debug(\n `Worker session init ack: ${sessionId} (parent=${control.parent_session_id})`,\n );\n }\n }\n\n private handleSessionAnnounce(control: ControlMessageSchema.SessionAnnounce): void {\n if (control.session.kind === 'agent_session') {\n // Track voice sessions from announcements FIRST\n if (control.session.session_type === 'VOICE') {\n this.orchestrator.voiceSessionIds.add(control.session.session_id);\n console.log('[RelayBridge] Tracking voice session from announce:', {\n sessionId: control.session.session_id,\n sessionType: control.session.session_type,\n });\n }\n\n if (control.session.session_type === 'CODE' && !control.session.parent_session_id) {\n this.orchestrator.ensureSessionExists(control.session.session_id);\n }\n }\n }\n\n private async handleCancelAgent(control: ControlMessageSchema.CancelAgentMessage): Promise<void> {\n this.logger.info(\n `Received cancel request for session ${control.target_session_id}${control.reason ? ` (reason: ${control.reason})` : ''}`,\n );\n\n // Check if it's targeting the main orchestrator session\n if (control.target_session_id === this.currentAgentSessionId) {\n // Cancel request for main orchestrator session\n this.logger.info('Cancel request for main orchestrator session');\n await this.orchestrator.cancel();\n } else {\n // Cancel a worker\n const success = await this.orchestrator\n .getWorkerManager()\n .cancelWorker(control.target_session_id);\n if (success) {\n this.logger.info(`Worker cancellation succeeded for ${control.target_session_id}`);\n } else {\n this.logger.warn(\n `Worker cancellation failed for ${control.target_session_id} (worker not found or already completed)`,\n );\n }\n }\n }\n\n private handleSessionClosed(control: ControlMessageSchema.SessionClosed): void {\n const closedSessionId = control.session_id;\n this.logger.info(`Session closed: ${closedSessionId} -> status ${control.status}`);\n\n // Check if this is the main orchestrator session being canceled\n if (closedSessionId === this.currentAgentSessionId) {\n this.logger.info(\n `Main orchestrator session ${closedSessionId} was canceled. Stopping message sending.`,\n );\n this.canceled = true;\n }\n }\n\n private async handleGitDiffRequest(\n request: ControlMessageSchema.GitDiffRequest,\n ): Promise<ControlMessageSchema.GitDiffResponse> {\n const branchName = request.branch;\n\n try {\n let git: SimpleGit;\n\n if (branchName === 'HEAD' || branchName === null) {\n // Not using a worktree, diff from main repo\n git = simpleGit(this.orchestrator.getWorkerManager().repoPath);\n } else {\n // Get the WorktreeManager from the orchestrator\n const worktreeManager = this.orchestrator.getWorktreeManager();\n\n // Find the worktree for the given branch\n const allWorktrees = worktreeManager.listActiveWorktrees();\n const worktree = allWorktrees.find(\n (wt: { branchName: string }) => wt.branchName === branchName,\n );\n\n if (!worktree) {\n this.logger.warn(`No worktree found for branch: ${branchName}`);\n return {\n type: 'git_diff',\n diff: null,\n };\n }\n git = simpleGit(worktree.worktreePath);\n }\n\n // Try fallback refs in order: main, master, origin/HEAD\n let baseRef = 'main';\n const fallbackRefs = ['main', 'master', 'origin/HEAD'];\n for (const ref of fallbackRefs) {\n try {\n await git.raw(['rev-parse', '--verify', ref]);\n this.logger.info(`Using fallback base_ref: ${ref}`);\n baseRef = ref;\n break;\n } catch {\n // This ref doesn't exist, try the next one\n }\n }\n\n const diffOutput = await git.raw(['diff', `${baseRef}`, '--numstat']);\n\n // Parse the output\n const lines = diffOutput\n .trim()\n .split('\\n')\n .filter((line: string) => line.length > 0);\n const diff: Array<{\n path: string;\n status: 'modified' | 'added' | 'deleted';\n additions: number;\n deletions: number;\n }> = [];\n\n for (const line of lines) {\n const parts = line.split('\\t');\n if (parts.length !== 3) {\n continue; // Skip malformed lines\n }\n\n const additions = parseInt(parts[0], 10);\n const deletions = parseInt(parts[1], 10);\n const filepath = parts[2];\n\n // Determine file status\n let status: 'modified' | 'added' | 'deleted';\n if (additions > 0 && deletions === 0) {\n status = 'added';\n } else if (additions === 0 && deletions > 0) {\n status = 'deleted';\n } else {\n status = 'modified';\n }\n\n diff.push({\n path: filepath,\n status,\n additions: isNaN(additions) ? 0 : additions,\n deletions: isNaN(deletions) ? 0 : deletions,\n });\n }\n\n this.logger.info(`Git diff for branch ${branchName}: ${diff.length} files changed`);\n\n return {\n type: 'git_diff',\n diff: diff.length > 0 ? diff : null,\n };\n } catch (error) {\n Sentry.captureException(error);\n this.logger.error(`Failed to get git diff for branch ${branchName}:`, error);\n return {\n type: 'git_diff',\n diff: null,\n };\n }\n }\n\n private async handleGitFileDiffRequest(\n request: ControlMessageSchema.GitFileDiffRequest,\n ): Promise<ControlMessageSchema.GitFileDiffResponse> {\n const branchName = request.branch;\n const filePath = request.file_path;\n\n try {\n let git: SimpleGit;\n\n if (branchName === 'HEAD' || branchName === null) {\n // Not using a worktree, diff from main repo\n git = simpleGit(this.orchestrator.getWorkerManager().repoPath);\n } else {\n // Get the WorktreeManager from the orchestrator\n const worktreeManager = this.orchestrator.getWorktreeManager();\n\n // Find the worktree for the given branch\n const allWorktrees = worktreeManager.listActiveWorktrees();\n const worktree = allWorktrees.find(\n (wt: { branchName: string }) => wt.branchName === branchName,\n );\n\n if (!worktree) {\n this.logger.warn(`No worktree found for branch: ${branchName}`);\n return {\n type: 'git_file_diff',\n file_path: filePath,\n unified_diff: null,\n };\n }\n git = simpleGit(worktree.worktreePath);\n }\n\n // Try fallback refs in order: main, master, origin/HEAD\n let baseRef = 'main';\n const fallbackRefs = ['main', 'master', 'origin/HEAD'];\n for (const ref of fallbackRefs) {\n try {\n await git.raw(['rev-parse', '--verify', ref]);\n baseRef = ref;\n break;\n } catch {\n // This ref doesn't exist, try the next one\n }\n }\n\n // Get the unified diff for the specific file\n const diffOutput = await git.raw(['diff', baseRef, '--', filePath]);\n\n this.logger.info(\n `Git file diff for ${filePath} on branch ${branchName}: ${diffOutput.length} chars`,\n );\n\n return {\n type: 'git_file_diff',\n file_path: filePath,\n unified_diff: diffOutput.length > 0 ? diffOutput : null,\n };\n } catch (error) {\n Sentry.captureException(error);\n this.logger.error(\n `Failed to get git file diff for ${filePath} on branch ${branchName}:`,\n error,\n );\n return {\n type: 'git_file_diff',\n file_path: filePath,\n unified_diff: null,\n };\n }\n }\n\n private async handleSessionSettingsRequest(\n request: ControlMessageSchema.SessionSettingsRequest,\n ): Promise<ControlMessageSchema.SessionSettingsResponse> {\n return this.orchestrator.handleSettingsChange(request);\n }\n\n private async handleRelayRequest(\n control: ControlMessageSchema.RelayRequestMessage,\n ): Promise<void> {\n const requestId = control.request_id;\n const request = control.request;\n let response: ControlMessageSchema.Response;\n switch (request.type) {\n case 'completions':\n response = await this.orchestrator.getCompletions(\n request as ControlMessageSchema.CompletionsRequest,\n );\n break;\n case 'git_diff':\n response = await this.handleGitDiffRequest(request as ControlMessageSchema.GitDiffRequest);\n break;\n case 'git_file_diff':\n response = await this.handleGitFileDiffRequest(\n request as ControlMessageSchema.GitFileDiffRequest,\n );\n break;\n case 'session_settings':\n response = await this.handleSessionSettingsRequest(\n request as ControlMessageSchema.SessionSettingsRequest,\n );\n break;\n case 'git_write':\n response = await this.orchestrator.handleGitWrite(\n request as ControlMessageSchema.GitWriteRequest,\n );\n break;\n default:\n response = {\n type: 'error',\n error: `Request failed: Unknown relay request type ${request.type}`,\n };\n }\n\n const socket = this.ws;\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n const frame: ControlMessage = {\n type: 'response',\n request_id: requestId,\n response,\n };\n this.sendFrame(frame, socket);\n }\n\n private handleMessageEnvelope(envelope: MessageEnvelope): void {\n const content = envelope.payload.content;\n const isUserMessage = envelope.sender.kind === 'user';\n const isAgentUserMessage =\n envelope.sender.kind === 'agent_session' && envelope.metadata?.role === 'user';\n\n // Filter out voice transcript messages - they're just for logging, not for orchestrator\n const isVoiceTranscript =\n envelope.payload.metadata?.subtype === 'user_voice_transcript' ||\n envelope.payload.metadata?.subtype === 'agent_voice_transcript';\n\n // Accept messages from users OR from agent sessions acting as users (like voice agent)\n // BUT exclude voice transcripts\n if (\n this.isTextContent(content) &&\n (isUserMessage || isAgentUserMessage) &&\n !isVoiceTranscript\n ) {\n // Check if this is a message TO a voice session\n const isToVoiceSession = this.orchestrator.voiceSessionIds.has(envelope.session_id);\n\n if (isToVoiceSession) {\n this.logger.info(\n `Filtering out message to voice session ${envelope.session_id} from ${envelope.sender.kind} (id: ${envelope.sender.id})`,\n );\n return;\n }\n\n this.logger.info(\n `Processing message from ${envelope.sender.kind} (id: ${envelope.sender.id}, role: ${envelope.metadata?.role}) to session ${envelope.session_id}`,\n );\n\n // Include sender information so orchestrator knows who sent the message\n this.connectionHandle?.dispatch({\n type: 'chat',\n sessionId: envelope.session_id,\n text: content.text,\n senderId: envelope.sender.id,\n senderKind: envelope.sender.kind,\n });\n return;\n }\n const label = (content as { type?: string }).type ?? 'unknown';\n const subtype = envelope.payload.metadata?.subtype;\n this.logger.debug(\n `Ignoring inbound envelope from ${envelope.sender.kind} with content type ${label}, role ${envelope.metadata?.role}${subtype ? `, subtype: ${subtype}` : ''}`,\n );\n }\n\n private isTextContent(\n content: MessageEnvelopeSchema.Content,\n ): content is MessageEnvelopeSchema.TextContent {\n return typeof (content as MessageEnvelopeSchema.TextContent).text === 'string';\n }\n\n private isMessageEnvelope(frame: ControlMessage | MessageEnvelope): frame is MessageEnvelope {\n return (frame as MessageEnvelope).payload !== undefined;\n }\n\n private enqueue(serialized: string): void {\n if (this.pendingOutbound.length >= MAX_QUEUE_SIZE) {\n this.pendingOutbound.shift();\n }\n this.pendingOutbound.push(serialized);\n }\n\n private sendSessionInitControl(\n message: Extract<OrchestratorControlMessage, { type: 'session_init' }>,\n ): void {\n if (!this.userSessionId) {\n this.logger.warn('[RelayBridge] Cannot send session_init control without user session');\n return;\n }\n const frame: ControlMessage = {\n type: 'session_init',\n session_id: message.sessionId,\n user_session_id: this.userSessionId,\n session_type: 'CODE',\n parent_session_id: message.parentSessionId ?? null,\n };\n if (message.metadata) {\n frame.metadata = message.metadata;\n }\n this.sendFrame(frame);\n }\n\n private flushQueue(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n while (this.pendingOutbound.length > 0) {\n const payload = this.pendingOutbound.shift();\n if (!payload) {\n continue;\n }\n try {\n this.ws.send(payload);\n } catch (error) {\n Sentry.captureException(error);\n this.logger.error(`Failed to flush relay queue: ${extractErrorMessage(error)}`);\n this.pendingOutbound.unshift(payload);\n this.closeCurrentSocket();\n break;\n }\n }\n }\n\n private startPingTimer(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n }\n const interval = Math.max(this.heartbeatIntervalMs, 5_000);\n this.pingTimer = setInterval(() => {\n const socket = this.ws;\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n const frame: ControlMessage = {\n type: 'heartbeat',\n mode: 'ping',\n sent_at: new Date().toISOString(),\n };\n this.sendFrame(frame, socket);\n }, interval);\n }\n\n private clearLoginWait(): void {\n if (this.waitingForLogin) {\n this.waitingForLogin = false;\n this.logger.log('Credentials refreshed. Resuming relay connection attempts.');\n }\n }\n\n private closeCurrentSocket(): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1012, 'Reconnecting');\n }\n }\n}\n\nfunction buildRelayWebsocketUrl(baseUrl: string, path: string): string {\n const url = new URL(baseUrl);\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n url.search = '';\n url.hash = '';\n if (path.startsWith('/')) {\n url.pathname = path;\n } else {\n const basePath = url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`;\n url.pathname = `${basePath}${path}`;\n }\n return url.toString();\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction isAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const name = error.name?.toLowerCase();\n if (name === 'aborterror') {\n return true;\n }\n const message = error.message ? error.message.toLowerCase() : '';\n return message.includes('aborted with ctrl+c');\n}\n\nconst CONNECT_TIMEOUT_MS = 30_000;\n\nfunction waitForOpen(ws: WebSocket): Promise<void> {\n return new Promise((resolve, reject) => {\n let timer: NodeJS.Timeout | null = null;\n\n const cleanup = () => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n ws.removeListener('open', onOpen);\n ws.removeListener('error', onError);\n };\n\n const settle = (error?: Error) => {\n cleanup();\n if (error) {\n safeCloseWebSocket(ws);\n reject(error);\n } else {\n resolve();\n }\n };\n\n const onOpen = () => settle();\n const onError = (error: Error) => settle(error);\n\n ws.once('open', onOpen);\n ws.once('error', onError);\n\n timer = setTimeout(() => {\n settle(new Error('WebSocket connection timed out'));\n }, CONNECT_TIMEOUT_MS);\n });\n}\n\nfunction isLoginRequiredError(error: unknown): error is AuthContextError {\n return (\n error instanceof AuthContextError &&\n (error.code === 'missing_credentials' || error.code === 'invalid_credentials')\n );\n}\n\nfunction isUnauthorizedApiError(error: unknown): error is ApiError {\n return error instanceof ApiError && (error.status === 401 || error.status === 403);\n}\n", "/**\n * Error thrown when API validation fails\n */\nexport class ApiValidationError extends Error {\n errors;\n constructor(message, errors) {\n super(message);\n this.errors = errors;\n this.name = \"ApiValidationError\";\n }\n}\n/**\n * Base HTTP error with status metadata\n */\nexport class ApiError extends Error {\n status;\n statusText;\n details;\n constructor(message, status, statusText, details) {\n super(message);\n this.status = status;\n this.statusText = statusText;\n this.details = details;\n }\n}\n/**\n * Error thrown when payment is required (HTTP 402)\n */\nexport class PaymentRequiredError extends ApiError {\n constructor(message, details) {\n super(message, 402, \"Payment Required\", details);\n }\n}\n/**\n * Base API client class with authentication and validation\n */\nexport class BaseApiClient {\n config;\n constructor(config) {\n this.config = config;\n }\n /**\n * Get the access token for the current session\n * Exposed publicly so hooks can access it\n */\n async getAccessToken() {\n return this.config.getAccessToken();\n }\n /**\n * Build full URL from path\n */\n buildUrl(path) {\n if (path.startsWith(\"http://\") || path.startsWith(\"https://\")) {\n return path;\n }\n const base = this.config.baseUrl;\n if (path.startsWith(\"/\")) {\n return `${base}${path}`;\n }\n return `${base}/${path}`;\n }\n /**\n * Parse error message from response\n */\n async parseError(response) {\n try {\n const data = await response.json();\n if (typeof data === \"string\") {\n return data;\n }\n return data?.message || data?.detail || response.statusText;\n }\n catch {\n return response.statusText;\n }\n }\n /**\n * Parse error data from response for structured error handling\n */\n async parseErrorData(response) {\n try {\n const data = await response.json();\n if (typeof data === \"string\") {\n return { message: data };\n }\n const message = data?.message || data?.detail || response.statusText;\n return { message, data };\n }\n catch {\n return { message: response.statusText };\n }\n }\n /**\n * Make an authenticated request\n */\n async request(path, init, validator) {\n const token = await this.config.getAccessToken();\n const url = this.buildUrl(path);\n const headers = new Headers(init?.headers);\n if (token) {\n headers.set(\"Authorization\", `Bearer ${token}`);\n }\n if (init?.body && !headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n const response = await fetch(url, {\n ...init,\n headers,\n });\n if (!response.ok) {\n if (response.status === 401 && this.config.onUnauthorized) {\n await this.config.onUnauthorized();\n }\n // Handle 402 Payment Required with structured error data\n if (response.status === 402) {\n const { message, data } = await this.parseErrorData(response);\n throw new PaymentRequiredError(message, data);\n }\n const errorMessage = await this.parseError(response);\n throw new ApiError(errorMessage, response.status, response.statusText);\n }\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined;\n }\n const data = await response.json();\n // Validate response if validator provided\n if (validator) {\n if (!validator(data)) {\n throw new ApiValidationError(\"API response validation failed\", validator.errors);\n }\n }\n return data;\n }\n /**\n * Make an authenticated request with token override\n */\n async requestWithToken(token, path, init, validator) {\n const url = this.buildUrl(path);\n const headers = new Headers(init?.headers);\n headers.set(\"Authorization\", `Bearer ${token}`);\n if (init?.body && !headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n const response = await fetch(url, {\n ...init,\n headers,\n });\n if (!response.ok) {\n // Handle 402 Payment Required with structured error data\n if (response.status === 402) {\n const { message, data } = await this.parseErrorData(response);\n throw new PaymentRequiredError(message, data);\n }\n const errorMessage = await this.parseError(response);\n throw new ApiError(errorMessage, response.status, response.statusText);\n }\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined;\n }\n const data = await response.json();\n // Validate response if validator provided\n if (validator) {\n if (!validator(data)) {\n throw new ApiValidationError(\"API response validation failed\", validator.errors);\n }\n }\n return data;\n }\n}\n", "import Ajv2020 from \"ajv/dist/2020.js\";\nimport addFormats from \"ajv-formats\";\n// Import JSON schemas directly for browser compatibility\nimport controlSchema from \"../../schemas/control_message.schema.json\" with { type: \"json\" };\nimport envelopeSchema from \"../../schemas/message_envelope.schema.json\" with { type: \"json\" };\nimport machineMessageSchema from \"../../schemas/machine_message.schema.json\" with { type: \"json\" };\nimport voiceLaunchRequestSchema from \"../../schemas/api_voice_launch_request.schema.json\" with { type: \"json\" };\nimport voiceLaunchResponseSchema from \"../../schemas/api_voice_launch_response.schema.json\" with { type: \"json\" };\nimport createUserSessionRequestSchema from \"../../schemas/api_sessions_create_request.schema.json\" with { type: \"json\" };\nimport userSessionSummarySchema from \"../../schemas/api_sessions_summary.schema.json\" with { type: \"json\" };\nimport userSessionListResponseSchema from \"../../schemas/api_sessions_list_response.schema.json\" with { type: \"json\" };\nimport messagePageResponseSchema from \"../../schemas/api_sessions_message_page_response.schema.json\" with { type: \"json\" };\nimport agentSessionDetailSchema from \"../../schemas/api_sessions_agent_detail.schema.json\" with { type: \"json\" };\nimport createChatMessageRequestSchema from \"../../schemas/api_sessions_create_chat_message_request.schema.json\" with { type: \"json\" };\nimport subscriptionResponseSchema from \"../../schemas/api_billing_subscription_response.schema.json\" with { type: \"json\" };\nimport usageResponseSchema from \"../../schemas/api_billing_usage_response.schema.json\" with { type: \"json\" };\nimport createCheckoutRequestSchema from \"../../schemas/api_billing_create_checkout_request.schema.json\" with { type: \"json\" };\nimport checkoutResponseSchema from \"../../schemas/api_billing_checkout_response.schema.json\" with { type: \"json\" };\nimport validatePromoRequestSchema from \"../../schemas/api_billing_validate_promo_request.schema.json\" with { type: \"json\" };\nimport promoValidationResponseSchema from \"../../schemas/api_billing_promo_validation_response.schema.json\" with { type: \"json\" };\nimport customerPortalRequestSchema from \"../../schemas/api_billing_customer_portal_request.schema.json\" with { type: \"json\" };\nimport customerPortalResponseSchema from \"../../schemas/api_billing_customer_portal_response.schema.json\" with { type: \"json\" };\nimport notificationRequestSchema from \"../../schemas/api_settings_notification_request.schema.json\" with { type: \"json\" };\nimport notificationResponseSchema from \"../../schemas/api_settings_notification_response.schema.json\" with { type: \"json\" };\nimport workspaceConfigSchema from \"../../schemas/workspace_config.schema.json\" with { type: \"json\" };\nimport workspaceSessionLaunchRequestSchema from \"../../schemas/api_workspaces_session_launch_request.schema.json\" with { type: \"json\" };\nimport workspaceSessionLaunchResponseSchema from \"../../schemas/api_workspaces_session_launch_response.schema.json\" with { type: \"json\" };\nimport machineListResponseSchema from \"../../schemas/api_machines_list_response.schema.json\" with { type: \"json\" };\nconst ajv = new Ajv2020({ strict: true, allErrors: true });\naddFormats(ajv);\n// Message validators\nexport const validateControlMessage = ajv.compile(controlSchema);\nexport const validateMessageEnvelope = ajv.compile(envelopeSchema);\nexport const validateMachineMessage = ajv.compile(machineMessageSchema);\nexport const validateWorkspaceConfig = ajv.compile(workspaceConfigSchema);\nexport const validateWorkspaceSessionLaunchRequest = ajv.compile(workspaceSessionLaunchRequestSchema);\nexport const validateWorkspaceSessionLaunchResponse = ajv.compile(workspaceSessionLaunchResponseSchema);\n// Voice API validators\nexport const validateVoiceAgentLaunchRequest = ajv.compile(voiceLaunchRequestSchema);\nexport const validateVoiceAgentLaunchResponse = ajv.compile(voiceLaunchResponseSchema);\n// Sessions API validators\nexport const validateCreateUserSessionRequest = ajv.compile(createUserSessionRequestSchema);\nexport const validateUserSessionSummary = ajv.compile(userSessionSummarySchema);\nexport const validateUserSessionListResponse = ajv.compile(userSessionListResponseSchema);\nexport const validateMessagePageResponse = ajv.compile(messagePageResponseSchema);\nexport const validateAgentSessionDetail = ajv.compile(agentSessionDetailSchema);\nexport const validateCreateChatMessageRequest = ajv.compile(createChatMessageRequestSchema);\n// Billing API validators\nexport const validateSubscriptionResponse = ajv.compile(subscriptionResponseSchema);\nexport const validateUsageResponse = ajv.compile(usageResponseSchema);\nexport const validateCreateCheckoutSessionRequest = ajv.compile(createCheckoutRequestSchema);\nexport const validateCheckoutSessionResponse = ajv.compile(checkoutResponseSchema);\nexport const validateValidatePromoCodeRequest = ajv.compile(validatePromoRequestSchema);\nexport const validatePromoCodeValidationResponse = ajv.compile(promoValidationResponseSchema);\nexport const validateCustomerPortalSessionRequest = ajv.compile(customerPortalRequestSchema);\nexport const validateCustomerPortalSessionResponse = ajv.compile(customerPortalResponseSchema);\n// Settings API validators\nexport const validateUserNotificationSettingsRequest = ajv.compile(notificationRequestSchema);\nexport const validateUserNotificationSettingsResponse = ajv.compile(notificationResponseSchema);\n// Machines API validators\nexport const validateMachineListResponse = ajv.compile(machineListResponseSchema);\n", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/ControlMessage\",\n \"title\": \"ControlMessage\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentMode\": {\n \"additionalProperties\": false,\n \"description\": \"Settings for agent mode.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent\",\n \"default\": \"agent\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"model\": {\n \"enum\": [\n \"haiku\",\n \"sonnet\",\n \"opus\"\n ],\n \"title\": \"Model\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"model\"\n ],\n \"title\": \"AgentMode\",\n \"type\": \"object\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n },\n \"CancelAgentMessage\": {\n \"additionalProperties\": false,\n \"description\": \"Request to cancel a running agent generation.\",\n \"properties\": {\n \"type\": {\n \"const\": \"cancel_agent\",\n \"default\": \"cancel_agent\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"target_session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Target Session Id\",\n \"type\": \"string\"\n },\n \"reason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Reason\"\n }\n },\n \"required\": [\n \"target_session_id\"\n ],\n \"title\": \"CancelAgentMessage\",\n \"type\": \"object\"\n },\n \"CompletionItem\": {\n \"description\": \"A single completion item with type and result\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"slash_command\",\n \"file\",\n \"agent\"\n ],\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"result\": {\n \"title\": \"Result\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"type\",\n \"result\"\n ],\n \"title\": \"CompletionItem\",\n \"type\": \"object\"\n },\n \"CompletionsRequest\": {\n \"description\": \"Query for autocomplete options\",\n \"properties\": {\n \"type\": {\n \"const\": \"completions\",\n \"default\": \"completions\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"query\": {\n \"title\": \"Query\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"query\"\n ],\n \"title\": \"CompletionsRequest\",\n \"type\": \"object\"\n },\n \"CompletionsResponse\": {\n \"description\": \"List of autocomplete options (i.e. files or /commands)\",\n \"properties\": {\n \"type\": {\n \"const\": \"completions\",\n \"default\": \"completions\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"completions\": {\n \"items\": {\n \"$ref\": \"#/$defs/CompletionItem\"\n },\n \"title\": \"Completions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"completions\"\n ],\n \"title\": \"CompletionsResponse\",\n \"type\": \"object\"\n },\n \"ErrorResponse\": {\n \"properties\": {\n \"type\": {\n \"const\": \"error\",\n \"default\": \"error\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"error\": {\n \"title\": \"Error\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"error\"\n ],\n \"title\": \"ErrorResponse\",\n \"type\": \"object\"\n },\n \"FileDiffInfo\": {\n \"additionalProperties\": false,\n \"description\": \"Information about changes to a single file\",\n \"properties\": {\n \"path\": {\n \"title\": \"Path\",\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"modified\",\n \"added\",\n \"deleted\"\n ],\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"additions\": {\n \"title\": \"Additions\",\n \"type\": \"integer\"\n },\n \"deletions\": {\n \"title\": \"Deletions\",\n \"type\": \"integer\"\n }\n },\n \"required\": [\n \"path\",\n \"status\",\n \"additions\",\n \"deletions\"\n ],\n \"title\": \"FileDiffInfo\",\n \"type\": \"object\"\n },\n \"GitDiffRequest\": {\n \"description\": \"Query the git diff on a branch\",\n \"properties\": {\n \"type\": {\n \"const\": \"git_diff\",\n \"default\": \"git_diff\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"branch\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Branch\"\n }\n },\n \"required\": [\n \"branch\"\n ],\n \"title\": \"GitDiffRequest\",\n \"type\": \"object\"\n },\n \"GitDiffResponse\": {\n \"additionalProperties\": false,\n \"description\": \"Git diff response for a given branch\",\n \"properties\": {\n \"type\": {\n \"const\": \"git_diff\",\n \"default\": \"git_diff\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"diff\": {\n \"anyOf\": [\n {\n \"items\": {\n \"$ref\": \"#/$defs/FileDiffInfo\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Diff\"\n }\n },\n \"required\": [\n \"diff\"\n ],\n \"title\": \"GitDiffResponse\",\n \"type\": \"object\"\n },\n \"GitFileDiffRequest\": {\n \"description\": \"Query the unified diff for a specific file\",\n \"properties\": {\n \"type\": {\n \"const\": \"git_file_diff\",\n \"default\": \"git_file_diff\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"branch\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Branch\"\n },\n \"file_path\": {\n \"title\": \"File Path\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"branch\",\n \"file_path\"\n ],\n \"title\": \"GitFileDiffRequest\",\n \"type\": \"object\"\n },\n \"GitFileDiffResponse\": {\n \"additionalProperties\": false,\n \"description\": \"Unified diff response for a specific file\",\n \"properties\": {\n \"type\": {\n \"const\": \"git_file_diff\",\n \"default\": \"git_file_diff\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"file_path\": {\n \"title\": \"File Path\",\n \"type\": \"string\"\n },\n \"unified_diff\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Unified Diff\"\n }\n },\n \"required\": [\n \"file_path\",\n \"unified_diff\"\n ],\n \"title\": \"GitFileDiffResponse\",\n \"type\": \"object\"\n },\n \"GitWriteRequest\": {\n \"additionalProperties\": false,\n \"description\": \"Request to commit and optionally push changes.\\n\\nThe action field specifies what operation to perform:\\n- \\\"commit\\\": Create a git commit with a generated message\\n- \\\"commit_push\\\": Create a commit and push to origin\\n- \\\"commit_push_pr\\\": Create a commit, push, and create a PR (not yet implemented)\\n- \\\"commit_checkout\\\": Create a commit and checkout the branch in the main worktree\",\n \"properties\": {\n \"type\": {\n \"const\": \"git_write\",\n \"default\": \"git_write\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"action\": {\n \"enum\": [\n \"commit\",\n \"commit_push\",\n \"commit_push_pr\",\n \"commit_checkout\"\n ],\n \"title\": \"Action\",\n \"type\": \"string\"\n },\n \"branch\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Branch\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"title\": \"GitWriteRequest\",\n \"type\": \"object\"\n },\n \"GitWriteResponse\": {\n \"additionalProperties\": false,\n \"description\": \"Response from a git write operation.\",\n \"properties\": {\n \"type\": {\n \"const\": \"git_write\",\n \"default\": \"git_write\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"success\": {\n \"title\": \"Success\",\n \"type\": \"boolean\"\n },\n \"message\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Message\"\n },\n \"commit_sha\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Commit Sha\"\n },\n \"error\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Error\"\n },\n \"compare_url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Compare Url\"\n }\n },\n \"required\": [\n \"success\"\n ],\n \"title\": \"GitWriteResponse\",\n \"type\": \"object\"\n },\n \"Heartbeat\": {\n \"additionalProperties\": false,\n \"description\": \"Ping/pong heartbeat frames.\",\n \"properties\": {\n \"type\": {\n \"const\": \"heartbeat\",\n \"default\": \"heartbeat\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"mode\": {\n \"default\": \"ping\",\n \"enum\": [\n \"ping\",\n \"pong\"\n ],\n \"title\": \"Mode\",\n \"type\": \"string\"\n },\n \"sent_at\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Sent At\"\n }\n },\n \"title\": \"Heartbeat\",\n \"type\": \"object\"\n },\n \"OrchestratorMode\": {\n \"additionalProperties\": false,\n \"description\": \"Settings for orchestrator mode.\",\n \"properties\": {\n \"type\": {\n \"const\": \"orchestrator\",\n \"default\": \"orchestrator\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"model\": {\n \"enum\": [\n \"haiku\",\n \"sonnet\",\n \"opus\"\n ],\n \"title\": \"Model\",\n \"type\": \"string\"\n },\n \"subagent_model\": {\n \"enum\": [\n \"haiku\",\n \"sonnet\",\n \"opus\"\n ],\n \"title\": \"Subagent Model\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"model\",\n \"subagent_model\"\n ],\n \"title\": \"OrchestratorMode\",\n \"type\": \"object\"\n },\n \"PlanMode\": {\n \"additionalProperties\": false,\n \"description\": \"Settings for plan mode.\",\n \"properties\": {\n \"type\": {\n \"const\": \"plan\",\n \"default\": \"plan\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"model\": {\n \"enum\": [\n \"haiku\",\n \"sonnet\",\n \"opus\"\n ],\n \"title\": \"Model\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"model\"\n ],\n \"title\": \"PlanMode\",\n \"type\": \"object\"\n },\n \"RelayRequestMessage\": {\n \"additionalProperties\": false,\n \"description\": \"RPC message for generic requests\",\n \"properties\": {\n \"type\": {\n \"const\": \"request\",\n \"default\": \"request\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"request_id\": {\n \"format\": \"uuid\",\n \"title\": \"Request Id\",\n \"type\": \"string\"\n },\n \"request\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/CompletionsRequest\"\n },\n {\n \"$ref\": \"#/$defs/GitDiffRequest\"\n },\n {\n \"$ref\": \"#/$defs/GitFileDiffRequest\"\n },\n {\n \"$ref\": \"#/$defs/SessionSettingsRequest\"\n },\n {\n \"$ref\": \"#/$defs/GitWriteRequest\"\n }\n ],\n \"title\": \"Request\"\n }\n },\n \"required\": [\n \"request_id\",\n \"request\"\n ],\n \"title\": \"RelayRequestMessage\",\n \"type\": \"object\"\n },\n \"RelayResponseMessage\": {\n \"additionalProperties\": false,\n \"description\": \"RPC message for responses\",\n \"properties\": {\n \"type\": {\n \"const\": \"response\",\n \"default\": \"response\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"request_id\": {\n \"format\": \"uuid\",\n \"title\": \"Request Id\",\n \"type\": \"string\"\n },\n \"response\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/ErrorResponse\"\n },\n {\n \"$ref\": \"#/$defs/CompletionsResponse\"\n },\n {\n \"$ref\": \"#/$defs/GitDiffResponse\"\n },\n {\n \"$ref\": \"#/$defs/GitFileDiffResponse\"\n },\n {\n \"$ref\": \"#/$defs/SessionSettingsResponse\"\n },\n {\n \"$ref\": \"#/$defs/GitWriteResponse\"\n }\n ],\n \"title\": \"Response\"\n }\n },\n \"required\": [\n \"request_id\",\n \"response\"\n ],\n \"title\": \"RelayResponseMessage\",\n \"type\": \"object\"\n },\n \"SessionAnnounce\": {\n \"additionalProperties\": false,\n \"description\": \"Notification that a session was created or updated.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_announce\",\n \"default\": \"session_announce\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n }\n ],\n \"title\": \"Session\"\n },\n \"origin\": {\n \"enum\": [\n \"backend\",\n \"client\"\n ],\n \"title\": \"Origin\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"session\",\n \"origin\"\n ],\n \"title\": \"SessionAnnounce\",\n \"type\": \"object\"\n },\n \"SessionBootstrap\": {\n \"additionalProperties\": false,\n \"description\": \"Initial snapshot of the session tree for this connection.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_bootstrap\",\n \"default\": \"session_bootstrap\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"root\": {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n \"agent_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Agent Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"root\"\n ],\n \"title\": \"SessionBootstrap\",\n \"type\": \"object\"\n },\n \"SessionClosed\": {\n \"additionalProperties\": false,\n \"description\": \"Indicates a session has been completed or shut down.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_closed\",\n \"default\": \"session_closed\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"status\"\n ],\n \"title\": \"SessionClosed\",\n \"type\": \"object\"\n },\n \"SessionInit\": {\n \"additionalProperties\": false,\n \"description\": \"Client request to register or refresh an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_init\",\n \"default\": \"session_init\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Session Id\",\n \"type\": \"string\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_session_id\",\n \"session_type\"\n ],\n \"title\": \"SessionInit\",\n \"type\": \"object\"\n },\n \"SessionInitAck\": {\n \"additionalProperties\": false,\n \"description\": \"Acknowledgement that a session_init was processed.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_init_ack\",\n \"default\": \"session_init_ack\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Session Id\",\n \"type\": \"string\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_session_id\"\n ],\n \"title\": \"SessionInitAck\",\n \"type\": \"object\"\n },\n \"SessionSettingsRequest\": {\n \"description\": \"Request to get or update session settings.\\n\\nIf mode is provided, it acts as a patch request to update settings.\\nIf mode is not provided, it returns the current settings.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_settings\",\n \"default\": \"session_settings\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"mode\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/OrchestratorMode\"\n },\n {\n \"$ref\": \"#/$defs/PlanMode\"\n },\n {\n \"$ref\": \"#/$defs/AgentMode\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Mode\"\n }\n },\n \"title\": \"SessionSettingsRequest\",\n \"type\": \"object\"\n },\n \"SessionSettingsResponse\": {\n \"additionalProperties\": false,\n \"description\": \"Response containing the current session settings.\\n\\nAlways returns the full current settings, whether or not an update was made.\",\n \"properties\": {\n \"type\": {\n \"const\": \"session_settings\",\n \"default\": \"session_settings\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"success\": {\n \"title\": \"Success\",\n \"type\": \"boolean\"\n },\n \"message\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Message\"\n },\n \"mode\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/OrchestratorMode\"\n },\n {\n \"$ref\": \"#/$defs/PlanMode\"\n },\n {\n \"$ref\": \"#/$defs/AgentMode\"\n }\n ],\n \"title\": \"Mode\"\n }\n },\n \"required\": [\n \"success\",\n \"mode\"\n ],\n \"title\": \"SessionSettingsResponse\",\n \"type\": \"object\"\n },\n \"UserSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of a user-owned conversation container.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"user_session\",\n \"default\": \"user_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_id\",\n \"status\"\n ],\n \"title\": \"UserSessionDescriptor\",\n \"type\": \"object\"\n },\n \"UserSessionStatus\": {\n \"enum\": [\n \"ACTIVE\",\n \"COMPLETED\",\n \"DELETED\"\n ],\n \"title\": \"UserSessionStatus\",\n \"type\": \"string\"\n }\n },\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/SessionInit\"\n },\n {\n \"$ref\": \"#/$defs/SessionBootstrap\"\n },\n {\n \"$ref\": \"#/$defs/SessionAnnounce\"\n },\n {\n \"$ref\": \"#/$defs/SessionInitAck\"\n },\n {\n \"$ref\": \"#/$defs/SessionClosed\"\n },\n {\n \"$ref\": \"#/$defs/Heartbeat\"\n },\n {\n \"$ref\": \"#/$defs/CancelAgentMessage\"\n },\n {\n \"$ref\": \"#/$defs/RelayRequestMessage\"\n },\n {\n \"$ref\": \"#/$defs/RelayResponseMessage\"\n }\n ]\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/MessageEnvelope\",\n \"title\": \"MessageEnvelope\",\n \"$defs\": {\n \"AgentCompleteContent\": {\n \"additionalProperties\": false,\n \"description\": \"Completion marker for an agent session turn.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_complete\",\n \"default\": \"agent_complete\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"success\": {\n \"title\": \"Success\",\n \"type\": \"boolean\"\n },\n \"duration_ms\": {\n \"anyOf\": [\n {\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Duration Ms\"\n },\n \"cost_usd\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Cost Usd\"\n },\n \"message\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Message\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"success\"\n ],\n \"title\": \"AgentCompleteContent\",\n \"type\": \"object\"\n },\n \"AgentProgressContent\": {\n \"additionalProperties\": false,\n \"description\": \"Incremental progress emitted by an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_progress\",\n \"default\": \"agent_progress\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Detail\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"title\": \"AgentProgressContent\",\n \"type\": \"object\"\n },\n \"MessagePayload\": {\n \"additionalProperties\": false,\n \"description\": \"Application-level message data stored in the database and relayed to clients.\",\n \"properties\": {\n \"version\": {\n \"default\": 0,\n \"title\": \"Version\",\n \"type\": \"integer\"\n },\n \"content\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolCallContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolResultContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentProgressContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentCompleteContent\"\n }\n ],\n \"title\": \"Content\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"content\"\n ],\n \"title\": \"MessagePayload\",\n \"type\": \"object\"\n },\n \"SenderRef\": {\n \"additionalProperties\": false,\n \"description\": \"Reference to the author of a message.\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"user\",\n \"agent_session\"\n ],\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"id\": {\n \"format\": \"uuid\",\n \"title\": \"Id\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"id\"\n ],\n \"title\": \"SenderRef\",\n \"type\": \"object\"\n },\n \"TextContent\": {\n \"additionalProperties\": false,\n \"description\": \"Plain text content shared with the agent.\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"default\": \"text\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"text\": {\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"annotations\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"title\": \"Annotations\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"title\": \"TextContent\",\n \"type\": \"object\"\n },\n \"ToolCallContent\": {\n \"additionalProperties\": false,\n \"description\": \"Tool invocation authored by the assistant.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_call\",\n \"default\": \"tool_call\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"name\": {\n \"title\": \"Name\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"arguments\": {\n \"additionalProperties\": true,\n \"title\": \"Arguments\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"name\",\n \"tool_use_id\",\n \"arguments\"\n ],\n \"title\": \"ToolCallContent\",\n \"type\": \"object\"\n },\n \"ToolResultContent\": {\n \"additionalProperties\": false,\n \"description\": \"Result produced by a previously invoked tool.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_result\",\n \"default\": \"tool_result\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"output\": {\n \"title\": \"Output\"\n },\n \"is_error\": {\n \"default\": false,\n \"title\": \"Is Error\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"tool_use_id\",\n \"output\"\n ],\n \"title\": \"ToolResultContent\",\n \"type\": \"object\"\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Complete message frame exchanged over transports.\",\n \"properties\": {\n \"message_id\": {\n \"format\": \"uuid\",\n \"title\": \"Message Id\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"sender\": {\n \"$ref\": \"#/$defs/SenderRef\"\n },\n \"payload\": {\n \"$ref\": \"#/$defs/MessagePayload\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"message_id\",\n \"session_id\",\n \"sender\",\n \"payload\",\n \"created_at\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/MachineMessage\",\n \"title\": \"MachineMessage\",\n \"$defs\": {\n \"MachineHeartbeatMessage\": {\n \"additionalProperties\": false,\n \"description\": \"Heartbeat emitted by the daemon with machine status metadata.\",\n \"properties\": {\n \"type\": {\n \"const\": \"heartbeat\",\n \"default\": \"heartbeat\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"status\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/MachineStatus\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n },\n \"directories\": {\n \"anyOf\": [\n {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Directories\"\n }\n },\n \"title\": \"MachineHeartbeatMessage\",\n \"type\": \"object\"\n },\n \"MachineRpcRequest\": {\n \"additionalProperties\": false,\n \"description\": \"RPC request instructing the daemon to perform an action.\",\n \"properties\": {\n \"type\": {\n \"const\": \"rpc_request\",\n \"default\": \"rpc_request\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"request_id\": {\n \"format\": \"uuid\",\n \"title\": \"Request Id\",\n \"type\": \"string\"\n },\n \"method\": {\n \"enum\": [\n \"start_session\",\n \"stop_session\"\n ],\n \"title\": \"Method\",\n \"type\": \"string\"\n },\n \"payload\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/MachineStartSessionPayload\"\n },\n {\n \"$ref\": \"#/$defs/MachineStopSessionPayload\"\n }\n ],\n \"title\": \"Payload\"\n }\n },\n \"required\": [\n \"request_id\",\n \"method\",\n \"payload\"\n ],\n \"title\": \"MachineRpcRequest\",\n \"type\": \"object\"\n },\n \"MachineRpcResponse\": {\n \"additionalProperties\": false,\n \"description\": \"Response frame acknowledging a machine RPC request.\",\n \"properties\": {\n \"type\": {\n \"const\": \"rpc_response\",\n \"default\": \"rpc_response\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"request_id\": {\n \"format\": \"uuid\",\n \"title\": \"Request Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"error\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Error\"\n },\n \"payload\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Payload\"\n }\n },\n \"required\": [\n \"request_id\",\n \"status\"\n ],\n \"title\": \"MachineRpcResponse\",\n \"type\": \"object\"\n },\n \"MachineStartSessionPayload\": {\n \"additionalProperties\": false,\n \"description\": \"Payload describing a new remote coding session request.\",\n \"properties\": {\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"launch_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Launch Id\"\n },\n \"directory\": {\n \"title\": \"Directory\",\n \"type\": \"string\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n },\n \"initial_prompt\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Initial Prompt\"\n },\n \"workspace_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Workspace Id\"\n },\n \"workspace_config\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/WorkspaceConfig\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null\n },\n \"worktree_name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Worktree Name\"\n }\n },\n \"required\": [\n \"directory\"\n ],\n \"title\": \"MachineStartSessionPayload\",\n \"type\": \"object\"\n },\n \"MachineStatus\": {\n \"enum\": [\n \"ONLINE\",\n \"OFFLINE\",\n \"UPDATING\"\n ],\n \"title\": \"MachineStatus\",\n \"type\": \"string\"\n },\n \"MachineStopSessionPayload\": {\n \"additionalProperties\": false,\n \"description\": \"Payload instructing the daemon to terminate a running session.\",\n \"properties\": {\n \"user_session_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Session Id\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"user_session_id\"\n ],\n \"title\": \"MachineStopSessionPayload\",\n \"type\": \"object\"\n },\n \"WorkspaceConfig\": {\n \"additionalProperties\": false,\n \"description\": \"Workspace-level configuration persisted alongside metadata.\",\n \"properties\": {\n \"worktrees\": {\n \"$ref\": \"#/$defs/WorktreeSettings\"\n }\n },\n \"title\": \"WorkspaceConfig\",\n \"type\": \"object\"\n },\n \"WorktreeSettings\": {\n \"additionalProperties\": false,\n \"description\": \"Settings controlling git worktree usage for a workspace.\",\n \"properties\": {\n \"enabled\": {\n \"default\": false,\n \"title\": \"Enabled\",\n \"type\": \"boolean\"\n },\n \"base_ref\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Base Ref\"\n }\n },\n \"title\": \"WorktreeSettings\",\n \"type\": \"object\"\n }\n },\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/MachineRpcRequest\"\n },\n {\n \"$ref\": \"#/$defs/MachineHeartbeatMessage\"\n },\n {\n \"$ref\": \"#/$defs/MachineRpcResponse\"\n }\n ]\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/VoiceAgentLaunchRequest\",\n \"title\": \"VoiceAgentLaunchRequest\",\n \"description\": \"Request to launch a voice agent for an agent session.\",\n \"properties\": {\n \"force\": {\n \"default\": false,\n \"description\": \"Launch even if the CLI relay is offline or owned by another user. When true, the request bypasses relay presence validation.\",\n \"title\": \"Force\",\n \"type\": \"boolean\"\n },\n \"room_name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Optional LiveKit room name override (defaults to derived prefix).\",\n \"title\": \"Room Name\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/VoiceAgentLaunchResponse\",\n \"title\": \"VoiceAgentLaunchResponse\",\n \"description\": \"Response containing LiveKit room and relay connection details.\",\n \"properties\": {\n \"session_id\": {\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"room_name\": {\n \"title\": \"Room Name\",\n \"type\": \"string\"\n },\n \"livekit_url\": {\n \"title\": \"Livekit Url\",\n \"type\": \"string\"\n },\n \"access_token\": {\n \"title\": \"Access Token\",\n \"type\": \"string\"\n },\n \"access_token_identity\": {\n \"title\": \"Access Token Identity\",\n \"type\": \"string\"\n },\n \"relay_ws_url\": {\n \"title\": \"Relay Ws Url\",\n \"type\": \"string\"\n },\n \"relay_token\": {\n \"title\": \"Relay Token\",\n \"type\": \"string\"\n },\n \"relay_token_expires_in\": {\n \"title\": \"Relay Token Expires In\",\n \"type\": \"integer\"\n },\n \"dispatch_id\": {\n \"title\": \"Dispatch Id\",\n \"type\": \"string\"\n },\n \"dispatch_metadata\": {\n \"additionalProperties\": true,\n \"title\": \"Dispatch Metadata\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"session_id\",\n \"room_name\",\n \"livekit_url\",\n \"access_token\",\n \"access_token_identity\",\n \"relay_ws_url\",\n \"relay_token\",\n \"relay_token_expires_in\",\n \"dispatch_id\",\n \"dispatch_metadata\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CreateUserSessionRequest\",\n \"title\": \"CreateUserSessionRequest\",\n \"description\": \"Payload for creating or reusing a user session container.\",\n \"properties\": {\n \"workspace_id\": {\n \"description\": \"Workspace identifier linked to this session\",\n \"title\": \"Workspace Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Optional explicit user session id to reuse or create\",\n \"title\": \"User Session Id\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"maxLength\": 255,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"workspace_id\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserSessionSummary\",\n \"title\": \"UserSessionSummary\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n },\n \"UserSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of a user-owned conversation container.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"user_session\",\n \"default\": \"user_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_id\",\n \"status\"\n ],\n \"title\": \"UserSessionDescriptor\",\n \"type\": \"object\"\n },\n \"UserSessionStatus\": {\n \"enum\": [\n \"ACTIVE\",\n \"COMPLETED\",\n \"DELETED\"\n ],\n \"title\": \"UserSessionStatus\",\n \"type\": \"string\"\n },\n \"WorkspaceConfig\": {\n \"additionalProperties\": false,\n \"description\": \"Workspace-level configuration persisted alongside metadata.\",\n \"properties\": {\n \"worktrees\": {\n \"$ref\": \"#/$defs/WorktreeSettings\"\n }\n },\n \"title\": \"WorkspaceConfig\",\n \"type\": \"object\"\n },\n \"WorkspaceDescriptor\": {\n \"description\": \"Serialized workspace row returned to API clients.\",\n \"properties\": {\n \"id\": {\n \"title\": \"Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"workspace_type\": {\n \"$ref\": \"#/$defs/WorkspaceType\"\n },\n \"user_machine_id\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Machine Id\"\n },\n \"local_path\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Local Path\"\n },\n \"git_host\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Git Host\"\n },\n \"git_path\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Git Path\"\n },\n \"workspace_metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Workspace Metadata\"\n },\n \"workspace_config\": {\n \"$ref\": \"#/$defs/WorkspaceConfig\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n },\n \"updated_at\": {\n \"format\": \"date-time\",\n \"title\": \"Updated At\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"user_id\",\n \"workspace_type\",\n \"created_at\",\n \"updated_at\"\n ],\n \"title\": \"WorkspaceDescriptor\",\n \"type\": \"object\"\n },\n \"WorkspaceType\": {\n \"enum\": [\n \"LOCAL\",\n \"REMOTE\"\n ],\n \"title\": \"WorkspaceType\",\n \"type\": \"string\"\n },\n \"WorktreeSettings\": {\n \"additionalProperties\": false,\n \"description\": \"Settings controlling git worktree usage for a workspace.\",\n \"properties\": {\n \"enabled\": {\n \"default\": false,\n \"title\": \"Enabled\",\n \"type\": \"boolean\"\n },\n \"base_ref\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Base Ref\"\n }\n },\n \"title\": \"WorktreeSettings\",\n \"type\": \"object\"\n }\n },\n \"description\": \"Aggregated user session data returned to clients.\",\n \"properties\": {\n \"session\": {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n \"agent_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Agent Sessions\",\n \"type\": \"array\"\n },\n \"workspace\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/WorkspaceDescriptor\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null\n }\n },\n \"required\": [\n \"session\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserSessionListResponse\",\n \"title\": \"UserSessionListResponse\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n },\n \"UserSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of a user-owned conversation container.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"user_session\",\n \"default\": \"user_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"format\": \"uuid\",\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"status\": {\n \"$ref\": \"#/$defs/UserSessionStatus\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Name\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"user_id\",\n \"status\"\n ],\n \"title\": \"UserSessionDescriptor\",\n \"type\": \"object\"\n },\n \"UserSessionStatus\": {\n \"enum\": [\n \"ACTIVE\",\n \"COMPLETED\",\n \"DELETED\"\n ],\n \"title\": \"UserSessionStatus\",\n \"type\": \"string\"\n },\n \"UserSessionSummary\": {\n \"description\": \"Aggregated user session data returned to clients.\",\n \"properties\": {\n \"session\": {\n \"$ref\": \"#/$defs/UserSessionDescriptor\"\n },\n \"agent_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Agent Sessions\",\n \"type\": \"array\"\n },\n \"workspace\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/WorkspaceDescriptor\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null\n }\n },\n \"required\": [\n \"session\"\n ],\n \"title\": \"UserSessionSummary\",\n \"type\": \"object\"\n },\n \"WorkspaceConfig\": {\n \"additionalProperties\": false,\n \"description\": \"Workspace-level configuration persisted alongside metadata.\",\n \"properties\": {\n \"worktrees\": {\n \"$ref\": \"#/$defs/WorktreeSettings\"\n }\n },\n \"title\": \"WorkspaceConfig\",\n \"type\": \"object\"\n },\n \"WorkspaceDescriptor\": {\n \"description\": \"Serialized workspace row returned to API clients.\",\n \"properties\": {\n \"id\": {\n \"title\": \"Id\",\n \"type\": \"string\"\n },\n \"user_id\": {\n \"title\": \"User Id\",\n \"type\": \"string\"\n },\n \"workspace_type\": {\n \"$ref\": \"#/$defs/WorkspaceType\"\n },\n \"user_machine_id\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Machine Id\"\n },\n \"local_path\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Local Path\"\n },\n \"git_host\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Git Host\"\n },\n \"git_path\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Git Path\"\n },\n \"workspace_metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Workspace Metadata\"\n },\n \"workspace_config\": {\n \"$ref\": \"#/$defs/WorkspaceConfig\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n },\n \"updated_at\": {\n \"format\": \"date-time\",\n \"title\": \"Updated At\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"user_id\",\n \"workspace_type\",\n \"created_at\",\n \"updated_at\"\n ],\n \"title\": \"WorkspaceDescriptor\",\n \"type\": \"object\"\n },\n \"WorkspaceType\": {\n \"enum\": [\n \"LOCAL\",\n \"REMOTE\"\n ],\n \"title\": \"WorkspaceType\",\n \"type\": \"string\"\n },\n \"WorktreeSettings\": {\n \"additionalProperties\": false,\n \"description\": \"Settings controlling git worktree usage for a workspace.\",\n \"properties\": {\n \"enabled\": {\n \"default\": false,\n \"title\": \"Enabled\",\n \"type\": \"boolean\"\n },\n \"base_ref\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Base Ref\"\n }\n },\n \"title\": \"WorktreeSettings\",\n \"type\": \"object\"\n }\n },\n \"description\": \"Response containing a list of user sessions.\",\n \"properties\": {\n \"sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/UserSessionSummary\"\n },\n \"title\": \"Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"sessions\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/MessagePageResponse\",\n \"title\": \"MessagePageResponse\",\n \"$defs\": {\n \"AgentCompleteContent\": {\n \"additionalProperties\": false,\n \"description\": \"Completion marker for an agent session turn.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_complete\",\n \"default\": \"agent_complete\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"success\": {\n \"title\": \"Success\",\n \"type\": \"boolean\"\n },\n \"duration_ms\": {\n \"anyOf\": [\n {\n \"type\": \"integer\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Duration Ms\"\n },\n \"cost_usd\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Cost Usd\"\n },\n \"message\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Message\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"success\"\n ],\n \"title\": \"AgentCompleteContent\",\n \"type\": \"object\"\n },\n \"AgentProgressContent\": {\n \"additionalProperties\": false,\n \"description\": \"Incremental progress emitted by an agent session.\",\n \"properties\": {\n \"type\": {\n \"const\": \"agent_progress\",\n \"default\": \"agent_progress\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Detail\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"title\": \"AgentProgressContent\",\n \"type\": \"object\"\n },\n \"MessageEnvelope\": {\n \"additionalProperties\": false,\n \"description\": \"Complete message frame exchanged over transports.\",\n \"properties\": {\n \"message_id\": {\n \"format\": \"uuid\",\n \"title\": \"Message Id\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"sender\": {\n \"$ref\": \"#/$defs/SenderRef\"\n },\n \"payload\": {\n \"$ref\": \"#/$defs/MessagePayload\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"message_id\",\n \"session_id\",\n \"sender\",\n \"payload\",\n \"created_at\"\n ],\n \"title\": \"MessageEnvelope\",\n \"type\": \"object\"\n },\n \"MessagePayload\": {\n \"additionalProperties\": false,\n \"description\": \"Application-level message data stored in the database and relayed to clients.\",\n \"properties\": {\n \"version\": {\n \"default\": 0,\n \"title\": \"Version\",\n \"type\": \"integer\"\n },\n \"content\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/TextContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolCallContent\"\n },\n {\n \"$ref\": \"#/$defs/ToolResultContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentProgressContent\"\n },\n {\n \"$ref\": \"#/$defs/AgentCompleteContent\"\n }\n ],\n \"title\": \"Content\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"content\"\n ],\n \"title\": \"MessagePayload\",\n \"type\": \"object\"\n },\n \"SenderRef\": {\n \"additionalProperties\": false,\n \"description\": \"Reference to the author of a message.\",\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"user\",\n \"agent_session\"\n ],\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"id\": {\n \"format\": \"uuid\",\n \"title\": \"Id\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"id\"\n ],\n \"title\": \"SenderRef\",\n \"type\": \"object\"\n },\n \"TextContent\": {\n \"additionalProperties\": false,\n \"description\": \"Plain text content shared with the agent.\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"default\": \"text\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"text\": {\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"annotations\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"title\": \"Annotations\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"title\": \"TextContent\",\n \"type\": \"object\"\n },\n \"ToolCallContent\": {\n \"additionalProperties\": false,\n \"description\": \"Tool invocation authored by the assistant.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_call\",\n \"default\": \"tool_call\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"name\": {\n \"title\": \"Name\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"arguments\": {\n \"additionalProperties\": true,\n \"title\": \"Arguments\",\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"name\",\n \"tool_use_id\",\n \"arguments\"\n ],\n \"title\": \"ToolCallContent\",\n \"type\": \"object\"\n },\n \"ToolResultContent\": {\n \"additionalProperties\": false,\n \"description\": \"Result produced by a previously invoked tool.\",\n \"properties\": {\n \"type\": {\n \"const\": \"tool_result\",\n \"default\": \"tool_result\",\n \"title\": \"Type\",\n \"type\": \"string\"\n },\n \"tool_use_id\": {\n \"title\": \"Tool Use Id\",\n \"type\": \"string\"\n },\n \"output\": {\n \"title\": \"Output\"\n },\n \"is_error\": {\n \"default\": false,\n \"title\": \"Is Error\",\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"tool_use_id\",\n \"output\"\n ],\n \"title\": \"ToolResultContent\",\n \"type\": \"object\"\n }\n },\n \"description\": \"Paginated response for session messages.\",\n \"properties\": {\n \"messages\": {\n \"items\": {\n \"$ref\": \"#/$defs/MessageEnvelope\"\n },\n \"title\": \"Messages\",\n \"type\": \"array\"\n },\n \"has_more\": {\n \"default\": false,\n \"title\": \"Has More\",\n \"type\": \"boolean\"\n },\n \"next_cursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Next Cursor\"\n }\n },\n \"required\": [\n \"messages\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/AgentSessionDetail\",\n \"title\": \"AgentSessionDetail\",\n \"$defs\": {\n \"AgentConnectionStatus\": {\n \"enum\": [\n \"CONNECTED\",\n \"DISCONNECTED\"\n ],\n \"title\": \"AgentConnectionStatus\",\n \"type\": \"string\"\n },\n \"AgentSessionDescriptor\": {\n \"additionalProperties\": false,\n \"description\": \"Representation of an agent-scoped session.\",\n \"properties\": {\n \"kind\": {\n \"const\": \"agent_session\",\n \"default\": \"agent_session\",\n \"title\": \"Kind\",\n \"type\": \"string\"\n },\n \"session_id\": {\n \"format\": \"uuid\",\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"User Session Id\"\n },\n \"parent_session_id\": {\n \"anyOf\": [\n {\n \"format\": \"uuid\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Parent Session Id\"\n },\n \"session_type\": {\n \"$ref\": \"#/$defs/AgentSessionType\"\n },\n \"connection_status\": {\n \"$ref\": \"#/$defs/AgentConnectionStatus\"\n },\n \"work_status\": {\n \"$ref\": \"#/$defs/AgentWorkStatus\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"session_id\",\n \"session_type\",\n \"connection_status\",\n \"work_status\"\n ],\n \"title\": \"AgentSessionDescriptor\",\n \"type\": \"object\"\n },\n \"AgentSessionType\": {\n \"enum\": [\n \"CODE\",\n \"VOICE\"\n ],\n \"title\": \"AgentSessionType\",\n \"type\": \"string\"\n },\n \"AgentWorkStatus\": {\n \"enum\": [\n \"IDLE\",\n \"WORKING\",\n \"COMPLETED\"\n ],\n \"title\": \"AgentWorkStatus\",\n \"type\": \"string\"\n }\n },\n \"description\": \"Detailed agent session with child sessions.\",\n \"properties\": {\n \"session\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"child_sessions\": {\n \"items\": {\n \"$ref\": \"#/$defs/AgentSessionDescriptor\"\n },\n \"title\": \"Child Sessions\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"session\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CreateChatMessageRequest\",\n \"title\": \"CreateChatMessageRequest\",\n \"description\": \"Simple text payload for dashboard/mobile chat fallbacks.\",\n \"properties\": {\n \"text\": {\n \"minLength\": 1,\n \"title\": \"Text\",\n \"type\": \"string\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"text\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/SubscriptionResponse\",\n \"title\": \"SubscriptionResponse\",\n \"description\": \"Current subscription details for a user.\",\n \"properties\": {\n \"id\": {\n \"title\": \"Id\",\n \"type\": \"string\"\n },\n \"plan_type\": {\n \"title\": \"Plan Type\",\n \"type\": \"string\"\n },\n \"agent_limit\": {\n \"title\": \"Agent Limit\",\n \"type\": \"integer\"\n },\n \"current_period_end\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Current Period End\"\n },\n \"cancel_at_period_end\": {\n \"default\": false,\n \"title\": \"Cancel At Period End\",\n \"type\": \"boolean\"\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Provider\"\n },\n \"plan_display_name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Human-friendly plan label (e.g. Pro, Starter).\",\n \"title\": \"Plan Display Name\"\n },\n \"plan_price_amount\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Recurring charge amount for the plan (in major currency units).\",\n \"title\": \"Plan Price Amount\"\n },\n \"plan_price_currency\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"ISO currency for the recurring charge (e.g. usd).\",\n \"title\": \"Plan Price Currency\"\n },\n \"plan_price_interval\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Billing interval for the recurring charge (e.g. month, year).\",\n \"title\": \"Plan Price Interval\"\n }\n },\n \"required\": [\n \"id\",\n \"plan_type\",\n \"agent_limit\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UsageResponse\",\n \"title\": \"UsageResponse\",\n \"description\": \"Current usage statistics for a subscription period.\",\n \"properties\": {\n \"total_agents\": {\n \"title\": \"Total Agents\",\n \"type\": \"integer\"\n },\n \"agent_limit\": {\n \"title\": \"Agent Limit\",\n \"type\": \"integer\"\n },\n \"period_start\": {\n \"format\": \"date-time\",\n \"title\": \"Period Start\",\n \"type\": \"string\"\n },\n \"period_end\": {\n \"format\": \"date-time\",\n \"title\": \"Period End\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"total_agents\",\n \"agent_limit\",\n \"period_start\",\n \"period_end\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CreateCheckoutSessionRequest\",\n \"title\": \"CreateCheckoutSessionRequest\",\n \"description\": \"Request to create a Stripe checkout session.\",\n \"properties\": {\n \"plan_type\": {\n \"description\": \"Target plan type (e.g. pro, enterprise).\",\n \"title\": \"Plan Type\",\n \"type\": \"string\"\n },\n \"success_url\": {\n \"description\": \"URL to redirect to after successful checkout.\",\n \"title\": \"Success Url\",\n \"type\": \"string\"\n },\n \"cancel_url\": {\n \"description\": \"URL to redirect to if the user cancels checkout.\",\n \"title\": \"Cancel Url\",\n \"type\": \"string\"\n },\n \"promo_code\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Optional promotional code to pre-apply to the checkout session.\",\n \"title\": \"Promo Code\"\n }\n },\n \"required\": [\n \"plan_type\",\n \"success_url\",\n \"cancel_url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CheckoutSessionResponse\",\n \"title\": \"CheckoutSessionResponse\",\n \"description\": \"Response containing checkout session details.\",\n \"properties\": {\n \"session_id\": {\n \"title\": \"Session Id\",\n \"type\": \"string\"\n },\n \"checkout_url\": {\n \"title\": \"Checkout Url\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"session_id\",\n \"checkout_url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/ValidatePromoCodeRequest\",\n \"title\": \"ValidatePromoCodeRequest\",\n \"description\": \"Request to validate a promotional code.\",\n \"properties\": {\n \"code\": {\n \"title\": \"Code\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"code\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/PromoCodeValidationResponse\",\n \"title\": \"PromoCodeValidationResponse\",\n \"description\": \"Response containing promotional code validation results.\",\n \"properties\": {\n \"valid\": {\n \"title\": \"Valid\",\n \"type\": \"boolean\"\n },\n \"code\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Code\"\n },\n \"discount_type\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Discount Type\"\n },\n \"discount_value\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Discount Value\"\n },\n \"description\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Description\"\n },\n \"error\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Error\"\n }\n },\n \"required\": [\n \"valid\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CustomerPortalSessionRequest\",\n \"title\": \"CustomerPortalSessionRequest\",\n \"description\": \"Request to create a Stripe Billing customer portal session.\",\n \"properties\": {\n \"return_url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Where Stripe should send the customer after they leave the portal.\",\n \"title\": \"Return Url\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/CustomerPortalSessionResponse\",\n \"title\": \"CustomerPortalSessionResponse\",\n \"description\": \"Response containing the Stripe Billing customer portal session URL.\",\n \"properties\": {\n \"url\": {\n \"description\": \"Hosted Stripe customer portal URL.\",\n \"title\": \"Url\",\n \"type\": \"string\"\n },\n \"created\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Timestamp when the session was created.\",\n \"title\": \"Created\"\n },\n \"expires_at\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"When the portal session expires (if provided by Stripe).\",\n \"title\": \"Expires At\"\n }\n },\n \"required\": [\n \"url\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserNotificationSettingsRequest\",\n \"title\": \"UserNotificationSettingsRequest\",\n \"description\": \"Request to update user notification preferences.\",\n \"properties\": {\n \"push_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Push Notifications Enabled\"\n },\n \"email_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Email Notifications Enabled\"\n },\n \"sms_notifications_enabled\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Sms Notifications Enabled\"\n },\n \"phone_number\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Phone Number\"\n },\n \"notification_email\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Notification Email\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/UserNotificationSettingsResponse\",\n \"title\": \"UserNotificationSettingsResponse\",\n \"description\": \"Response containing current notification settings.\",\n \"properties\": {\n \"push_notifications_enabled\": {\n \"title\": \"Push Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"email_notifications_enabled\": {\n \"title\": \"Email Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"sms_notifications_enabled\": {\n \"title\": \"Sms Notifications Enabled\",\n \"type\": \"boolean\"\n },\n \"phone_number\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"title\": \"Phone Number\"\n },\n \"notification_email\": {\n \"title\": \"Notification Email\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"push_notifications_enabled\",\n \"email_notifications_enabled\",\n \"sms_notifications_enabled\",\n \"phone_number\",\n \"notification_email\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/WorkspaceConfig\",\n \"title\": \"WorkspaceConfig\",\n \"$defs\": {\n \"WorktreeSettings\": {\n \"additionalProperties\": false,\n \"description\": \"Settings controlling git worktree usage for a workspace.\",\n \"properties\": {\n \"enabled\": {\n \"default\": false,\n \"title\": \"Enabled\",\n \"type\": \"boolean\"\n },\n \"base_ref\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Base Ref\"\n }\n },\n \"title\": \"WorktreeSettings\",\n \"type\": \"object\"\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Workspace-level configuration persisted alongside metadata.\",\n \"properties\": {\n \"worktrees\": {\n \"$ref\": \"#/$defs/WorktreeSettings\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/WorkspaceSessionLaunchRequest\",\n \"title\": \"WorkspaceSessionLaunchRequest\",\n \"description\": \"Request body used to start a session for a workspace.\",\n \"properties\": {\n \"user_session_id\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Existing user session to reuse\",\n \"title\": \"User Session Id\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Arbitrary metadata describing the launch\",\n \"title\": \"Metadata\"\n },\n \"initial_prompt\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Prompt delivered to the coding agent at startup\",\n \"title\": \"Initial Prompt\"\n },\n \"worktree_name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"description\": \"Name for the git worktree/branch to use for this session\",\n \"title\": \"Worktree Name\"\n }\n },\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/WorkspaceSessionLaunchResponse\",\n \"title\": \"WorkspaceSessionLaunchResponse\",\n \"description\": \"Daemon acknowledgement returned after a launch request.\",\n \"properties\": {\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"payload\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Payload\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"type\": \"object\"\n}", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://schemas.omnara.dev/MachineListResponse\",\n \"title\": \"MachineListResponse\",\n \"$defs\": {\n \"MachineDescriptor\": {\n \"properties\": {\n \"id\": {\n \"title\": \"Id\",\n \"type\": \"string\"\n },\n \"name\": {\n \"title\": \"Name\",\n \"type\": \"string\"\n },\n \"hostname\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Hostname\"\n },\n \"platform\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Platform\"\n },\n \"architecture\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Architecture\"\n },\n \"daemon_version\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Daemon Version\"\n },\n \"status\": {\n \"title\": \"Status\",\n \"type\": \"string\"\n },\n \"last_seen_at\": {\n \"anyOf\": [\n {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Last Seen At\"\n },\n \"created_at\": {\n \"format\": \"date-time\",\n \"title\": \"Created At\",\n \"type\": \"string\"\n },\n \"updated_at\": {\n \"format\": \"date-time\",\n \"title\": \"Updated At\",\n \"type\": \"string\"\n },\n \"metadata\": {\n \"anyOf\": [\n {\n \"additionalProperties\": true,\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": null,\n \"title\": \"Metadata\"\n }\n },\n \"required\": [\n \"id\",\n \"name\",\n \"status\",\n \"created_at\",\n \"updated_at\"\n ],\n \"title\": \"MachineDescriptor\",\n \"type\": \"object\"\n }\n },\n \"properties\": {\n \"machines\": {\n \"items\": {\n \"$ref\": \"#/$defs/MachineDescriptor\"\n },\n \"title\": \"Machines\",\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"machines\"\n ],\n \"type\": \"object\"\n}", "import { ApiError, PaymentRequiredError } from '@omnara/shared-js/api';\nimport * as Sentry from '@sentry/node';\n\nexport interface RequestOptions {\n headers?: Record<string, string>;\n accessToken?: string;\n apiKey?: string;\n signal?: AbortSignal;\n}\n\nexport interface ApiClientOptions {\n baseUrl: string;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n\n constructor(options: ApiClientOptions) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl);\n }\n\n async getJson<TResponse>(path: string, options?: RequestOptions): Promise<TResponse> {\n const url = resolveUrl(this.baseUrl, path);\n const headers = this.buildHeaders(options);\n\n const response = await fetch(url, {\n method: 'GET',\n headers,\n signal: options?.signal,\n });\n\n return await this.handleResponse<TResponse>(response);\n }\n\n async postJson<TRequest, TResponse>(\n path: string,\n body: TRequest,\n options?: RequestOptions,\n ): Promise<TResponse> {\n const url = resolveUrl(this.baseUrl, path);\n const headers = this.buildHeaders(options, { includeJson: true });\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body ?? {}),\n signal: options?.signal,\n });\n\n return await this.handleResponse<TResponse>(response);\n }\n\n private buildHeaders(options?: RequestOptions, extras?: { includeJson?: boolean }): Headers {\n const headers = new Headers();\n if (extras?.includeJson) {\n headers.set('content-type', 'application/json');\n }\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n headers.set(key, value);\n }\n }\n if (options?.accessToken) {\n headers.set('authorization', `Bearer ${options.accessToken}`);\n } else if (options?.apiKey) {\n headers.set('authorization', `Bearer ${options.apiKey}`);\n }\n return headers;\n }\n\n private async handleResponse<TResponse>(response: Response): Promise<TResponse> {\n const contentType = response.headers.get('content-type');\n const isJson = contentType?.includes('application/json');\n\n let payload: unknown = undefined;\n if (isJson) {\n try {\n payload = await response.json();\n } catch (error) {\n Sentry.captureException(error);\n if (response.ok) {\n throw new ApiError(\n `Failed to parse JSON response: ${extractErrorMessage(error)}`,\n response.status,\n response.statusText,\n );\n }\n }\n } else if (response.ok) {\n payload = await response.text();\n }\n\n if (!response.ok) {\n if (response.status === 402) {\n const message = extractDetail(payload) ?? 'Payment required';\n throw new PaymentRequiredError(message, payload);\n }\n const detail = extractDetail(payload);\n throw new ApiError(\n detail ?? `HTTP ${response.status}`,\n response.status,\n response.statusText,\n payload,\n );\n }\n\n return payload as TResponse;\n }\n}\n\nexport function normalizeBaseUrl(raw: string): string {\n if (!raw) {\n throw new Error('Backend URL cannot be empty.');\n }\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n\nexport function resolveUrl(base: string, path: string): string {\n const baseUrl = new URL(base);\n if (!path.startsWith('/')) {\n path = `/${path}`;\n }\n const resolved = new URL(path, baseUrl);\n return resolved.toString();\n}\n\nfunction extractDetail(payload: unknown): string | null {\n if (!payload) {\n return null;\n }\n if (typeof payload === 'string') {\n return payload;\n }\n if (typeof payload === 'object' && payload !== null) {\n const record = payload as Record<string, unknown>;\n const detail = record.detail;\n if (typeof detail === 'string') {\n return detail;\n }\n const message = record.message;\n if (typeof message === 'string') {\n return message;\n }\n }\n return null;\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n", "import { ApiClient } from '../http/api-client.js';\n\nexport type RelayClientKind = 'cli' | 'web' | 'mobile' | 'voice';\n\ninterface RelayRegisterRequestWire {\n user_session_id: string;\n client_kind?: RelayClientKind | null;\n}\n\ninterface RelayRegisterResponseWire {\n user_session_id: string;\n relay_token: string;\n relay_token_expires_in: number;\n relay_ws_path: string;\n relay_heartbeat_interval_sec: number;\n}\n\ninterface RelayRefreshRequestWire {\n relay_token: string;\n}\n\ninterface RelayRefreshResponseWire {\n relay_token: string;\n relay_token_expires_in: number;\n}\n\nexport interface RelayRegistration {\n userSessionId: string;\n relayToken: string;\n relayTokenExpiresIn: number;\n relayWsPath: string;\n relayHeartbeatIntervalSec: number;\n}\n\nexport interface RelayTokenRefresh {\n relayToken: string;\n relayTokenExpiresIn: number;\n}\n\nexport interface RegisterRelayOptions {\n userSessionId: string;\n clientKind?: RelayClientKind;\n}\n\nexport async function registerRelaySession(\n client: ApiClient,\n accessToken: string,\n options: RegisterRelayOptions,\n): Promise<RelayRegistration> {\n const body: RelayRegisterRequestWire = {\n user_session_id: options.userSessionId,\n client_kind: options.clientKind ?? 'cli',\n };\n\n const response = await client.postJson<RelayRegisterRequestWire, RelayRegisterResponseWire>(\n '/api/v1/relay/register',\n body,\n { accessToken },\n );\n\n return {\n userSessionId: response.user_session_id,\n relayToken: response.relay_token,\n relayTokenExpiresIn: response.relay_token_expires_in,\n relayWsPath: response.relay_ws_path,\n relayHeartbeatIntervalSec: response.relay_heartbeat_interval_sec,\n };\n}\n\nexport async function refreshRelayToken(\n client: ApiClient,\n accessToken: string,\n relayToken: string,\n): Promise<RelayTokenRefresh> {\n const response = await client.postJson<RelayRefreshRequestWire, RelayRefreshResponseWire>(\n '/api/v1/relay/refresh',\n { relay_token: relayToken },\n { accessToken },\n );\n\n return {\n relayToken: response.relay_token,\n relayTokenExpiresIn: response.relay_token_expires_in,\n };\n}\n", "import type { Console } from 'node:console';\nimport * as Sentry from '@sentry/node';\n\nimport { CredentialsStore } from './credentials-store.js';\nimport { ensureAuthContext, type AuthContext, AuthContextError } from './credential-manager.js';\nimport { performVerificationLogin } from './login-flow.js';\nimport { normalizeBaseUrl } from '../http/api-client.js';\n\nexport interface AuthProviderOptions {\n store: CredentialsStore;\n backendUrl: string;\n frontendUrl?: string;\n logger?: Console;\n interactive?: boolean;\n login?: typeof performVerificationLogin;\n}\n\nexport interface AuthAccessOptions {\n interactive?: boolean;\n}\n\nexport class AuthProvider {\n private lastBadPat: string | null = null;\n private readonly defaultInteractive: boolean;\n private readonly backendUrl: string;\n\n constructor(private readonly options: AuthProviderOptions) {\n this.backendUrl = normalizeBaseUrl(options.backendUrl);\n this.defaultInteractive = options.interactive ?? true;\n }\n\n async getAuthContext(options?: AuthAccessOptions): Promise<AuthContext> {\n const interactive = options?.interactive ?? this.defaultInteractive;\n return await this.loadAuthContext(interactive);\n }\n\n async getAccessToken(options?: AuthAccessOptions): Promise<string> {\n const auth = await this.getAuthContext(options);\n return auth.pat;\n }\n\n private async loadAuthContext(interactive: boolean): Promise<AuthContext> {\n const snapshot = await this.options.store.load();\n\n if (this.lastBadPat && snapshot?.pat === this.lastBadPat) {\n throw new AuthContextError(\n 'Stored credentials unchanged since invalid PAT. Please log in.',\n 'invalid_credentials',\n );\n }\n\n try {\n const context = await ensureAuthContext(this.options.store, snapshot);\n this.lastBadPat = null;\n return context;\n } catch (error) {\n const authError = error instanceof AuthContextError ? error : null;\n if (authError?.code === 'invalid_credentials') {\n this.lastBadPat = snapshot?.pat ?? null;\n }\n if (authError) {\n Sentry.captureException(authError);\n } else {\n Sentry.captureException(error);\n }\n\n if (!interactive) {\n throw authError ?? error;\n }\n\n await this.performLogin();\n const updated = await this.options.store.load();\n return await ensureAuthContext(this.options.store, updated);\n }\n }\n\n private async performLogin(): Promise<void> {\n const loginFn = this.options.login ?? performVerificationLogin;\n this.options.logger?.log('Opening browser to authenticate\u2026');\n await loginFn({\n backendUrlOption: this.backendUrl,\n frontendUrlOption: this.options.frontendUrl,\n store: this.options.store,\n });\n }\n}\n\nexport async function createAuthProvider(options: AuthProviderOptions): Promise<AuthProvider> {\n const provider = new AuthProvider(options);\n return provider;\n}\n", "import { CredentialsStore, type StoredCredentials } from './credentials-store.js';\n\nexport type AuthContextErrorCode = 'missing_credentials' | 'invalid_credentials';\n\nexport class AuthContextError extends Error {\n readonly code: AuthContextErrorCode;\n\n constructor(message: string, code: AuthContextErrorCode, options?: { cause?: unknown }) {\n super(message, { cause: options?.cause });\n this.name = 'AuthContextError';\n this.code = code;\n }\n}\n\nexport interface AuthContext {\n credentials: StoredCredentials;\n pat: string;\n}\n\nexport async function ensureAuthContext(\n store: CredentialsStore,\n initialCredentials?: StoredCredentials | null,\n): Promise<AuthContext> {\n const credentials = initialCredentials ?? (await store.load());\n const rawPat = credentials?.pat;\n\n if (!credentials || rawPat === undefined || rawPat === null) {\n throw new AuthContextError(\n 'No credentials found. Run `omnara auth login` first.',\n 'missing_credentials',\n );\n }\n\n const pat = rawPat.trim();\n if (!pat) {\n throw new AuthContextError(\n 'Stored credentials are invalid. Please run `omnara auth login`.',\n 'invalid_credentials',\n );\n }\n\n return {\n credentials: { pat },\n pat,\n };\n}\n", "import { ApiError } from '@omnara/shared-js/api';\nimport * as Sentry from '@sentry/node';\nimport { ApiClient, normalizeBaseUrl } from '../http/api-client.js';\nimport { CredentialsStore, type StoredCredentials } from './credentials-store.js';\nimport { prompt } from '../utils/prompt.js';\nimport {\n createCliAuthSession,\n exchangeCliCode,\n type CliAuthSession,\n type CreateCliAuthSessionOptions,\n} from './cli-auth-service.js';\nimport { generatePkcePair } from './pkce.js';\nimport { LoopbackListener } from './loopback-listener.js';\nimport { tryOpenBrowser } from '../utils/browser.js';\nimport chalk from 'chalk';\n\ninterface LoginOptions {\n backendUrlOption?: string;\n frontendUrlOption?: string;\n store: CredentialsStore;\n}\n\nexport async function performVerificationLogin({\n backendUrlOption,\n frontendUrlOption,\n store,\n}: LoginOptions): Promise<StoredCredentials> {\n const backendUrl = resolveBackendUrl(backendUrlOption);\n const frontendUrl = resolveFrontendUrl(frontendUrlOption);\n const client = new ApiClient({ baseUrl: backendUrl });\n\n console.log(chalk.yellow('Authenticating CLI\u2026'));\n const loopback = await LoopbackListener.create();\n const pkce = loopback ? generatePkcePair() : null;\n\n const sessionOptions: CreateCliAuthSessionOptions = {\n frontendUrl,\n };\n\n if (loopback && pkce) {\n sessionOptions.loopbackRedirectUri = loopback.redirectUri;\n sessionOptions.loopbackState = loopback.state;\n sessionOptions.pkceChallenge = pkce.challenge;\n sessionOptions.pkceChallengeMethod = pkce.method;\n }\n\n const session = await createCliAuthSession(client, sessionOptions);\n printSessionInstructions(session);\n tryOpenBrowser(session.verificationUriComplete);\n\n let completed = false;\n let successLogged = false;\n let latestCredentials: StoredCredentials | null = null;\n\n const completeLogin = async (code: string, codeVerifier?: string): Promise<void> => {\n if (completed) {\n return;\n }\n const exchange = await exchangeCliCode(\n client,\n session.sessionId,\n code,\n codeVerifier ? { codeVerifier } : {},\n );\n const pat = await issuePatToken(client, exchange.accessToken);\n const updated: StoredCredentials = { pat };\n await store.save(updated);\n latestCredentials = updated;\n if (!successLogged) {\n console.log(chalk.green('\\n\\nLogin successful. Credentials saved.'));\n successLogged = true;\n }\n completed = true;\n };\n\n const loopbackTask =\n loopback && pkce\n ? waitForLoopback(loopback, session.sessionId, async (code) => {\n await completeLogin(code, pkce.verifier);\n if (typeof process.stdin.emit === 'function') {\n process.stdin.emit('data', '\\n');\n }\n })\n : null;\n\n if (!loopbackTask && !completed) {\n console.log('\\nWaiting for approval in the browser\u2026');\n }\n\n while (!completed) {\n const input = await prompt(\n chalk.gray(\"\\nInput fallback code if automatic login doesn't complete: \"),\n );\n const cleaned = input.trim();\n\n if (completed) {\n break;\n }\n\n if (!cleaned) {\n continue;\n }\n\n if (!/^[0-9]{6}$/.test(cleaned)) {\n console.log('Codes must be exactly six digits.');\n continue;\n }\n\n try {\n await completeLogin(cleaned);\n } catch (error) {\n if (error instanceof ApiError) {\n if (error.status === 401) {\n console.log('Code not recognized. Double-check the digits shown in the browser.');\n continue;\n }\n if (error.status === 409) {\n console.log('Browser approval already completed. Finishing up\u2026');\n completed = true;\n break;\n }\n }\n Sentry.captureException(error);\n await loopback?.stop();\n throw error;\n }\n }\n\n await loopback?.stop();\n\n if (!latestCredentials) {\n const stored = await store.load();\n if (stored) {\n latestCredentials = stored;\n } else {\n throw new Error('Login completed but credentials were not stored.');\n }\n }\n\n return latestCredentials;\n}\n\nconst DEFAULT_BACKEND_URL = 'https://api.omnara.com/';\nconst DEFAULT_FRONTEND_URL = 'https://www.omnara.com/';\n\nexport function resolveBackendUrl(option?: string): string {\n const candidate = option ?? process.env.OMNARA_BACKEND_URL ?? DEFAULT_BACKEND_URL;\n return normalizeBaseUrl(candidate);\n}\n\nexport function resolveFrontendUrl(option?: string): string {\n const candidate = option ?? process.env.OMNARA_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;\n return normalizeBaseUrl(candidate);\n}\n\ninterface CreatePatResponseWire {\n token: string;\n}\n\nasync function issuePatToken(client: ApiClient, accessToken: string): Promise<string> {\n const response = await client.postJson<Record<string, never>, CreatePatResponseWire>(\n '/api/v1/auth/pat',\n {},\n { accessToken },\n );\n return response.token;\n}\n\nexport function formatDuration(ms: number): string {\n const totalSeconds = Math.round(ms / 1000);\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n\n const totalMinutes = Math.round(totalSeconds / 60);\n if (totalMinutes < 60) {\n const seconds = totalSeconds % 60;\n return seconds > 0 ? `${totalMinutes}m ${seconds}s` : `${totalMinutes}m`;\n }\n\n const totalHours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n if (totalHours < 48) {\n return minutes > 0 ? `${totalHours}h ${minutes}m` : `${totalHours}h`;\n }\n\n const totalDays = Math.floor(totalHours / 24);\n const hours = totalDays % 24;\n return hours > 0 ? `${totalDays}d ${hours}h` : `${totalDays}d`;\n}\n\nfunction reportLoopbackError(error: unknown): void {\n if (error instanceof ApiError) {\n console.log(\n `Automatic login failed (HTTP ${error.status}). Paste the 6-digit code shown in the browser.`,\n );\n return;\n }\n Sentry.captureException(error);\n console.log(`Automatic login failed: ${extractErrorMessage(error)}`);\n}\n\nfunction printSessionInstructions(session: CliAuthSession): void {\n console.log(\n chalk.blue.bold('\\nOpen this link in your browser if it did not open automatically:'),\n );\n console.log(chalk.blueBright.underline(`${session.verificationUriComplete}`));\n console.log(chalk.blue('\\nApprove the request, then return to the CLI.'));\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n\nasync function waitForLoopback(\n listener: LoopbackListener,\n sessionId: string,\n onCode: (code: string) => Promise<void>,\n): Promise<void> {\n try {\n const callback = await listener.waitForCallback();\n if (callback.sessionId && callback.sessionId !== sessionId) {\n console.log('Received browser callback for a different session.');\n return;\n }\n if (callback.state && callback.state !== listener.state) {\n console.log('Received browser callback with unexpected state.');\n return;\n }\n\n try {\n await onCode(callback.code);\n } catch (error) {\n reportLoopbackError(error);\n }\n } catch (error) {\n Sentry.captureException(error);\n console.log(`Loopback listener error: ${extractErrorMessage(error)}`);\n }\n}\n", "import readline from 'readline/promises';\nimport { stdin as input, stdout as output } from 'process';\n\nexport async function prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input, output });\n try {\n const answer = await rl.question(question);\n return answer.trim();\n } finally {\n rl.close();\n }\n}\n", "import { ApiClient } from '../http/api-client.js';\n\ninterface CreateSessionRequestWire {\n frontend_url?: string | null;\n loopback_redirect_uri?: string | null;\n loopback_state?: string | null;\n pkce_challenge?: string | null;\n pkce_challenge_method?: string | null;\n}\n\ninterface CreateSessionResponseWire {\n session_id: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n poll_interval: number;\n}\n\ninterface ExchangeRequestWire {\n session_id: string;\n code: string;\n code_verifier?: string | null;\n}\n\ninterface ExchangeResponseWire {\n access_token: string;\n access_token_expires_in: number;\n refresh_token: string;\n relay_ws_path: string;\n relay_heartbeat_interval_sec: number;\n}\n\nexport interface CliAuthSession {\n sessionId: string;\n verificationUri: string;\n verificationUriComplete: string;\n expiresIn: number;\n pollInterval: number;\n}\n\nexport interface CreateCliAuthSessionOptions {\n frontendUrl?: string;\n loopbackRedirectUri?: string;\n loopbackState?: string;\n pkceChallenge?: string;\n pkceChallengeMethod?: string;\n}\n\nexport interface ExchangeCliCodeResult {\n accessToken: string;\n accessTokenExpiresIn: number;\n refreshToken: string;\n relayWsPath: string;\n relayHeartbeatIntervalSec: number;\n}\n\nexport async function createCliAuthSession(\n client: ApiClient,\n options: CreateCliAuthSessionOptions = {},\n): Promise<CliAuthSession> {\n const body: CreateSessionRequestWire = {};\n if (options.frontendUrl) {\n body.frontend_url = options.frontendUrl;\n }\n if (options.loopbackRedirectUri) {\n body.loopback_redirect_uri = options.loopbackRedirectUri;\n }\n if (options.loopbackState) {\n body.loopback_state = options.loopbackState;\n }\n if (options.pkceChallenge) {\n body.pkce_challenge = options.pkceChallenge;\n body.pkce_challenge_method = options.pkceChallengeMethod ?? 'S256';\n }\n const wire = await client.postJson<CreateSessionRequestWire, CreateSessionResponseWire>(\n '/api/v1/cli-auth/session',\n body,\n );\n return {\n sessionId: wire.session_id,\n verificationUri: wire.verification_uri,\n verificationUriComplete: wire.verification_uri_complete,\n expiresIn: wire.expires_in,\n pollInterval: wire.poll_interval,\n };\n}\n\nexport async function exchangeCliCode(\n client: ApiClient,\n sessionId: string,\n code: string,\n options: { codeVerifier?: string } = {},\n): Promise<ExchangeCliCodeResult> {\n const requestBody: ExchangeRequestWire = {\n session_id: sessionId,\n code,\n };\n if (options.codeVerifier) {\n requestBody.code_verifier = options.codeVerifier;\n }\n\n const wire = await client.postJson<ExchangeRequestWire, ExchangeResponseWire>(\n '/api/v1/cli-auth/exchange',\n requestBody,\n );\n return {\n accessToken: wire.access_token,\n accessTokenExpiresIn: wire.access_token_expires_in,\n refreshToken: wire.refresh_token,\n relayWsPath: wire.relay_ws_path,\n relayHeartbeatIntervalSec: wire.relay_heartbeat_interval_sec,\n };\n}\n", "import { createHash, randomBytes } from 'crypto';\n\nexport interface PkcePair {\n verifier: string;\n challenge: string;\n method: 'S256';\n}\n\nexport function generatePkcePair(): PkcePair {\n const verifier = base64UrlEncode(randomBytes(32));\n const challenge = base64UrlEncode(createHash('sha256').update(verifier).digest());\n return { verifier, challenge, method: 'S256' };\n}\n\nfunction base64UrlEncode(input: Buffer | Uint8Array | string): string {\n const buffer =\n typeof input === 'string'\n ? Buffer.from(input, 'utf8')\n : Buffer.from(input as Buffer | Uint8Array);\n return buffer.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n", "import http from 'http';\nimport type { AddressInfo } from 'net';\nimport { randomBytes } from 'crypto';\nimport * as Sentry from '@sentry/node';\n\nexport interface LoopbackCallback {\n code: string;\n sessionId: string | null;\n state: string | null;\n}\n\nconst CALLBACK_PATH = '/callback';\nconst LISTEN_HOST = '127.0.0.1';\n\nexport class LoopbackListener {\n static async create(): Promise<LoopbackListener | null> {\n const listener = new LoopbackListener(generateState());\n try {\n await listener.start();\n return listener;\n } catch (error) {\n Sentry.captureException(error);\n await listener.stop().catch(() => undefined);\n return null;\n }\n }\n\n readonly state: string;\n redirectUri: string;\n\n private readonly server: http.Server;\n private resolveCallback: ((value: LoopbackCallback) => void) | null = null;\n private rejectCallback: ((reason?: unknown) => void) | null = null;\n private pending: Promise<LoopbackCallback> | null = null;\n\n private constructor(state: string) {\n this.state = state;\n this.redirectUri = '';\n this.server = http.createServer((request, response) => {\n void this.handleRequest(request, response);\n });\n }\n\n async waitForCallback(): Promise<LoopbackCallback> {\n if (this.pending) {\n return this.pending;\n }\n this.pending = new Promise<LoopbackCallback>((resolve, reject) => {\n this.resolveCallback = resolve;\n this.rejectCallback = reject;\n });\n return this.pending;\n }\n\n async stop(): Promise<void> {\n if (!this.server.listening) {\n return;\n }\n await new Promise<void>((resolve) => {\n this.server.close(() => resolve());\n });\n }\n\n private async start(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.server.once('error', reject);\n this.server.listen(0, LISTEN_HOST, () => {\n this.server.removeListener('error', reject);\n resolve();\n });\n });\n\n const address = this.server.address();\n if (!address || typeof address === 'string') {\n throw new Error('Loopback listener failed to bind');\n }\n const { port } = address as AddressInfo;\n this.redirectUri = `http://${LISTEN_HOST}:${port}${CALLBACK_PATH}`;\n }\n\n private async handleRequest(\n request: http.IncomingMessage,\n response: http.ServerResponse,\n ): Promise<void> {\n if (request.method !== 'GET' || !request.url) {\n this.respond(response, 405, 'Method Not Allowed');\n return;\n }\n\n const url = new URL(request.url, `http://${request.headers.host ?? LISTEN_HOST}`);\n if (url.pathname !== CALLBACK_PATH) {\n this.respond(response, 404, 'Not Found');\n return;\n }\n\n const code = url.searchParams.get('code');\n const sessionId = url.searchParams.get('session');\n const state = url.searchParams.get('state');\n\n if (!code) {\n this.respond(\n response,\n 400,\n buildMessageHtml('Missing authorization code. Return to your CLI and try again.'),\n );\n return;\n }\n\n this.respond(response, 200, buildSuccessHtml());\n\n if (this.resolveCallback) {\n this.resolveCallback({ code, sessionId, state });\n this.resolveCallback = null;\n this.rejectCallback = null;\n }\n\n void this.stop();\n }\n\n private respond(response: http.ServerResponse, status: number, body: string): void {\n response.writeHead(status, {\n 'content-type': 'text/html; charset=utf-8',\n 'cache-control': 'no-store',\n });\n response.end(body);\n }\n}\n\nfunction buildSuccessHtml(): string {\n const redirectTarget = 'https://www.omnara.com/dashboard';\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n <meta http-equiv=\"refresh\" content=\"3;url=${redirectTarget}\" />\n <title>Omnara CLI Login</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #090909; color: #f4f4f5; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; }\n .card { max-width: 420px; padding: 2.5rem; background: rgba(32, 32, 36, 0.85); border-radius: 14px; box-shadow: 0 20px 40px rgba(0,0,0,0.35); text-align: center; }\n h1 { font-size: 1.5rem; margin-bottom: 0.75rem; }\n p { margin: 0 0 0.75rem; line-height: 1.5; }\n .note { font-size: 0.85rem; color: rgba(244,244,245,0.7); }\n </style>\n </head>\n <body>\n <div class=\"card\">\n <h1>Redirecting back to the CLI\u2026</h1>\n <p>Your authentication details were sent to the Omnara CLI. Return to your terminal to continue.</p>\n <p class=\"note\">If this page doesn't close automatically, you can manually open the Omnara dashboard.</p>\n </div>\n </body>\n</html>`;\n}\n\nfunction generateState(): string {\n return base64UrlEncode(randomBytes(32));\n}\n\nfunction base64UrlEncode(input: Buffer | Uint8Array | string): string {\n const buffer =\n typeof input === 'string'\n ? Buffer.from(input, 'utf8')\n : Buffer.from(input as Buffer | Uint8Array);\n return buffer.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\nfunction buildMessageHtml(message: string): string {\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n <title>Omnara CLI Login</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #090909; color: #f4f4f5; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; }\n .card { max-width: 420px; padding: 2.5rem; background: rgba(32, 32, 36, 0.85); border-radius: 14px; box-shadow: 0 20px 40px rgba(0,0,0,0.35); text-align: center; }\n h1 { font-size: 1.4rem; margin-bottom: 0.75rem; }\n p { margin: 0; line-height: 1.6; }\n </style>\n </head>\n <body>\n <div class=\"card\">\n <h1>Omnara CLI Login</h1>\n <p>${message}</p>\n </div>\n </body>\n</html>`;\n}\n", "import { spawn } from 'child_process';\nimport * as Sentry from '@sentry/node';\n\nconst buildBrowserFailureMessage = (url: string): string =>\n `Unable to automatically open ${url}. Please copy and paste this link into your browser.`;\n\nconst escapeForPowerShell = (value: string): string => value.replace(/'/g, \"''\");\n\nexport function tryOpenBrowser(url: string): void {\n let command: string;\n let args: string[];\n\n switch (process.platform) {\n case 'darwin':\n command = 'open';\n args = [url];\n break;\n case 'win32':\n // PowerShell handles URLs with ampersands without command-line escaping headaches.\n command = 'powershell.exe';\n args = [\n '-NoProfile',\n '-NonInteractive',\n '-Command',\n `Start-Process -FilePath '${escapeForPowerShell(url)}'`,\n ];\n break;\n default:\n command = 'xdg-open';\n args = [url];\n }\n\n const handleFailure = (error?: unknown): void => {\n const baseMessage = buildBrowserFailureMessage(url);\n\n if (process.env.DEBUG && error) {\n const details = error instanceof Error ? error.message : String(error);\n console.warn(`${baseMessage} (${details}).`);\n Sentry.captureException(error);\n return;\n }\n\n if (error) {\n Sentry.captureException(error);\n }\n console.warn(baseMessage);\n };\n\n const spawnOptions = {\n stdio: 'ignore' as const,\n detached: true,\n windowsHide: process.platform === 'win32',\n };\n\n try {\n const child = spawn(command, args, spawnOptions);\n child.on('error', handleFailure);\n child.unref();\n } catch (error) {\n handleFailure(error);\n }\n}\n", "import { ApiClient } from './api-client.js';\n\ninterface CreateUserSessionRequestWire {\n workspace_id: string;\n user_session_id?: string | null;\n name?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface UserSessionDescriptor {\n kind: 'user_session';\n session_id: string;\n user_id: string;\n status: string;\n name?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface EnsureUserSessionOptions {\n workspaceId: string;\n userSessionId?: string;\n name?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport async function ensureUserSession(\n client: ApiClient,\n accessToken: string,\n options: EnsureUserSessionOptions,\n): Promise<UserSessionDescriptor> {\n const body: CreateUserSessionRequestWire = {\n workspace_id: options.workspaceId,\n user_session_id: options.userSessionId ?? null,\n name: options.name ?? null,\n metadata: options.metadata ?? null,\n };\n\n return await client.postJson<CreateUserSessionRequestWire, UserSessionDescriptor>(\n '/api/v1/user-sessions',\n body,\n { accessToken },\n );\n}\n", "import WebSocket from 'ws';\n\n/**\n * Safely closes a WebSocket without throwing or emitting unhandled errors.\n */\nexport function safeCloseWebSocket(ws: WebSocket): void {\n try {\n ws.once('error', () => {});\n\n if (ws.readyState === WebSocket.CONNECTING) {\n ws.terminate();\n } else if (ws.readyState === WebSocket.OPEN) {\n ws.close();\n }\n } catch {}\n\n setImmediate(() => {\n try {\n ws.removeAllListeners();\n } catch {}\n });\n}\n", "import { Command } from 'commander';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport type { StoredCredentials } from '../auth/credentials-store.js';\nimport { ApiError } from '@omnara/shared-js/api';\nimport * as Sentry from '@sentry/node';\nimport {\n performVerificationLogin,\n resolveBackendUrl,\n resolveFrontendUrl,\n} from '../auth/login-flow.js';\nimport { ensureMachineNameConfigured } from '../daemon/daemon-launcher.js';\nimport { DaemonConfigStore } from '../daemon/config-store.js';\nimport { logger } from '../utils/logger.js';\n\nexport function buildAuthCommand(): Command {\n const auth = new Command('auth').description('Authenticate the Omnara CLI.');\n\n auth\n .command('login')\n .description('Authenticate via the browser-based verification flow.')\n .action(async () => {\n const store = new CredentialsStore();\n const backendUrl = resolveBackendUrl();\n\n try {\n const configStore = new DaemonConfigStore();\n await ensureMachineNameConfigured(configStore, logger);\n await performVerificationLogin({\n backendUrlOption: backendUrl,\n frontendUrlOption: resolveFrontendUrl(),\n store,\n });\n } catch (error) {\n Sentry.captureException(error);\n if (error instanceof ApiError) {\n console.error(`\\nRequest failed (HTTP ${error.status}): ${error.message}`);\n } else {\n console.error(`\\nLogin failed: ${extractErrorMessage(error)}`);\n }\n process.exitCode = 1;\n }\n });\n\n auth\n .command('logout')\n .description('Remove stored CLI credentials.')\n .action(async () => {\n const store = new CredentialsStore();\n await store.clear();\n console.log('Credentials cleared.');\n });\n\n auth\n .command('status')\n .description('Show stored CLI credential details.')\n .action(async () => {\n const store = new CredentialsStore();\n const credentials = await store.load();\n if (!credentials) {\n console.log('No credentials stored.');\n return;\n }\n\n printStatus(credentials);\n });\n\n return auth;\n}\n\nfunction printStatus(credentials: StoredCredentials): void {\n if (credentials.pat) {\n console.log('Authentication: PAT stored');\n return;\n }\n\n console.log('Authentication: Not configured');\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n", "import { spawn, exec as execCb } from 'node:child_process';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { promisify } from 'node:util';\n\nimport type { Logger } from '../utils/logger.js';\nimport { logger as defaultLogger } from '../utils/logger.js';\nimport { DaemonClient } from './daemon-client.js';\nimport { DirectoryRegistry } from './directory-registry.js';\nimport type { DaemonStatusPayload } from './local-control-server.js';\nimport { DaemonConfigStore } from './config-store.js';\nimport { DaemonStateStore } from './state-store.js';\nimport { prompt } from '../utils/prompt.js';\nimport chalk from 'chalk';\nimport { getDaemonPaths } from './paths.js';\nimport { withSessionRegistry, isSessionProcessAlive } from './session-pid-registry.js';\nimport { getSpawnArgs, getExecutablePath } from '../utils/executable.js';\n\nconst exec = promisify(execCb);\n\nconst DEFAULT_WAIT_MS = 10_000;\n\nexport interface StartDaemonOptions {\n waitForReady?: boolean;\n reason?: string;\n backendUrl?: string;\n frontendUrl?: string;\n logger?: Logger;\n}\n\nexport interface StopDaemonOptions {\n logger?: Logger;\n}\n\nexport interface EnsureDaemonOptions {\n cwd?: string;\n label?: string;\n reason?: string;\n backendUrl?: string;\n frontendUrl?: string;\n logger?: Logger;\n}\n\nexport interface StatusOptions {\n logger?: Logger;\n}\n\nexport interface KillAllOptions {\n logger?: Logger;\n}\n\nexport async function ensureDaemonForSession(options: EnsureDaemonOptions = {}): Promise<void> {\n const logger = options.logger ?? defaultLogger;\n const client = new DaemonClient();\n const configStore = new DaemonConfigStore();\n\n const status = await client.getStatus();\n if (!status) {\n await ensureMachineNameConfigured(configStore, logger);\n await startDaemon({\n waitForReady: true,\n reason: options.reason ?? 'auto-start',\n backendUrl: options.backendUrl,\n frontendUrl: options.frontendUrl,\n logger,\n });\n }\n\n if (options.cwd) {\n await registerDirectory(options.cwd, {\n label: options.label,\n logger,\n client,\n });\n }\n}\n\nexport async function ensureMachineNameConfigured(\n configStore: DaemonConfigStore,\n logger: Logger,\n): Promise<string> {\n const envName = process.env.OMNARA_MACHINE_NAME?.trim();\n if (envName) {\n await configStore.update((cfg) => {\n cfg.machine ??= {};\n cfg.machine.name = envName;\n });\n logger.info(`Using machine name \"${envName}\" from OMNARA_MACHINE_NAME`);\n return envName;\n }\n\n const config = await configStore.load();\n if (config.machine?.name) {\n process.env.OMNARA_MACHINE_NAME = config.machine.name;\n return config.machine.name;\n }\n\n const defaultName = os.hostname();\n let machineName = defaultName;\n if (process.stdin.isTTY && process.stdout.isTTY) {\n const answer = (\n await prompt(chalk.blue(`Enter a name for this machine [${defaultName}]: `))\n ).trim();\n if (answer) {\n machineName = answer;\n }\n } else {\n logger.warn(`Machine name not configured; defaulting to \"${defaultName}\"`);\n }\n\n await configStore.update((cfg) => {\n cfg.machine ??= {};\n cfg.machine.name = machineName;\n });\n process.env.OMNARA_MACHINE_NAME = machineName;\n logger.info(`Using machine name \"${machineName}\"`);\n return machineName;\n}\n\nexport async function startDaemon(options: StartDaemonOptions = {}): Promise<boolean> {\n const client = new DaemonClient();\n const logger = options.logger ?? defaultLogger;\n const running = await client.getStatus();\n if (running) {\n logger.info('Omnara daemon is already running.');\n return false;\n }\n\n await spawnDaemonProcess(\n {\n reason: options.reason,\n backendUrl: options.backendUrl,\n frontendUrl: options.frontendUrl,\n },\n logger,\n );\n\n if (options.waitForReady ?? true) {\n const ready = await waitForReady(client, { logger });\n if (!ready) {\n logger.warn('Daemon did not become ready before timeout.');\n }\n }\n\n return true;\n}\n\nexport async function stopDaemon(options: StopDaemonOptions = {}): Promise<boolean> {\n const client = new DaemonClient();\n const logger = options.logger ?? defaultLogger;\n const stopped = await client.stop();\n if (stopped) {\n logger.success('Omnara daemon stop requested.');\n return true;\n }\n logger.warn('No running daemon was found.');\n return false;\n}\n\nexport async function showDaemonStatus(options: StatusOptions = {}): Promise<void> {\n const client = new DaemonClient();\n const logger = options.logger ?? defaultLogger;\n const status = await client.getStatus();\n if (!status) {\n logger.info('Daemon is not running.');\n return;\n }\n\n logger.info('Daemon status:');\n logger.info(` PID: ${status.pid}`);\n logger.info(` Started: ${status.startedAt}`);\n logger.info(` Directories: ${status.directories.length}`);\n}\n\nexport async function killAllDaemonProcesses(options: KillAllOptions = {}): Promise<void> {\n // Forced kill across all envs; uses process scan.\n const logger = options.logger ?? defaultLogger;\n const profiles = ['prod', 'dev'] as const;\n\n for (const profile of profiles) {\n const isDevProfile = profile === 'dev';\n const envLabel = isDevProfile ? 'development' : 'production';\n logger.info(`Killing ${envLabel} daemon processes...`);\n\n const paths = getDaemonPaths(isDevProfile);\n const stateStore = new DaemonStateStore(paths.statePath);\n const targets: number[] = [];\n\n try {\n // First, try to get the daemon PID from the state file\n const state = await stateStore.load();\n if (state && state.pid) {\n try {\n process.kill(state.pid, 0);\n targets.push(state.pid);\n logger.debug(`Found ${envLabel} daemon PID from state file: ${state.pid}`);\n } catch {\n logger.debug(`Daemon PID ${state.pid} from state file is not running`);\n }\n }\n\n const psPids = await findDaemonRelatedPids();\n for (const pid of psPids) {\n if (!targets.includes(pid) && pid !== process.pid) {\n targets.push(pid);\n }\n }\n\n if (targets.length === 0) {\n logger.info(`No ${envLabel} omnara daemon processes found.`);\n continue;\n }\n\n logger.info(`Found ${targets.length} process(es) to kill in ${envLabel} mode`);\n\n for (const pid of targets) {\n try {\n process.kill(pid, 'SIGKILL');\n logger.success(`Killed process ${pid}`);\n } catch (error) {\n logger.warn(`Failed to kill ${pid}: ${extractErrorMessage(error)}`);\n }\n }\n\n await stateStore.clear();\n logger.debug(`Cleared ${envLabel} daemon state file`);\n } catch (error) {\n logger.error(`Failed to kill ${envLabel} daemon processes: ${extractErrorMessage(error)}`);\n }\n }\n}\n\nexport async function killDaemonByState(\n options: { logger?: Logger; dev?: boolean } = {},\n): Promise<void> {\n const logger = options.logger ?? defaultLogger;\n const paths = getDaemonPaths(options.dev);\n const stateStore = new DaemonStateStore(paths.statePath);\n const state = await stateStore.load();\n if (!state?.pid) {\n logger.info('No daemon state found to kill.');\n return;\n }\n try {\n process.kill(state.pid, 'SIGKILL');\n logger.success(`Killed daemon process ${state.pid}`);\n } catch (error) {\n logger.warn(`Failed to kill daemon ${state.pid}: ${extractErrorMessage(error)}`);\n }\n await stateStore.clear();\n}\n\nexport async function killSessionsByRegistry(options: { logger?: Logger } = {}): Promise<void> {\n const logger = options.logger ?? defaultLogger;\n try {\n await withSessionRegistry(async (registry) => {\n for (const record of Object.values(registry)) {\n if (!record || !Number.isFinite(record.pid)) {\n continue;\n }\n const alive = await isSessionProcessAlive(record);\n if (!alive) {\n continue;\n }\n try {\n process.kill(record.pid, 'SIGKILL');\n logger.success(`Killed session process ${record.pid}`);\n } catch (error) {\n logger.warn(`Failed to kill session ${record.pid}: ${extractErrorMessage(error)}`);\n }\n }\n // Clear registry after attempting kills; unmatched/stale entries are dropped.\n return [{}, undefined];\n });\n } catch (error) {\n logger.warn(`Failed to kill sessions via registry: ${extractErrorMessage(error)}`);\n }\n}\n\nasync function findDaemonRelatedPids(): Promise<number[]> {\n const pids: number[] = [];\n try {\n const { stdout } = await exec('ps -axo pid=,command=');\n for (const line of stdout.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n const [pidStr, ...cmdParts] = trimmed.split(/\\s+/);\n const pid = Number(pidStr);\n if (!Number.isFinite(pid) || pid === process.pid) {\n continue;\n }\n const command = cmdParts.join(' ');\n if (\n command.includes('omnara') &&\n (command.includes('daemon run-service') || command.includes('daemon run-session')) &&\n true\n ) {\n pids.push(pid);\n }\n }\n } catch {\n // ignore ps errors; best-effort only\n }\n return pids;\n}\n\nasync function registerDirectory(\n directoryPath: string,\n options: { label?: string; logger: Logger; client: DaemonClient },\n): Promise<void> {\n const normalized = path.resolve(directoryPath);\n try {\n const result = await options.client.addDirectory(normalized, options.label);\n if (result) {\n options.logger.debug(`Registered ${normalized} with daemon`);\n return;\n }\n options.logger.warn('Daemon was unavailable; storing directory locally.');\n } catch (error) {\n options.logger.warn(\n `Failed to register ${normalized} with daemon: ${extractErrorMessage(error)}`,\n );\n }\n\n const registry = new DirectoryRegistry();\n await registry.ensureDirectory(normalized, { label: options.label, updateLastUsed: true });\n}\n\nasync function spawnDaemonProcess(\n options: { reason?: string; backendUrl?: string; frontendUrl?: string },\n logger: Logger,\n): Promise<void> {\n const args = getSpawnArgs(['daemon', 'run-service']);\n const execPath = getExecutablePath();\n\n logger.info('Starting Omnara daemon...');\n logger.debug(`Spawning daemon: ${execPath} ${args.join(' ')}`);\n\n const child = spawn(execPath, args, {\n detached: true,\n stdio: 'ignore',\n env: {\n ...process.env,\n OMNARA_DAEMON_BOOT_REASON: options.reason ?? 'manual',\n ...(options.backendUrl ? { OMNARA_BACKEND_URL: options.backendUrl } : {}),\n ...(options.frontendUrl ? { OMNARA_FRONTEND_URL: options.frontendUrl } : {}),\n },\n });\n child.unref();\n}\n\nasync function waitForReady(\n client: DaemonClient,\n options: { timeoutMs?: number; logger?: Logger } = {},\n): Promise<DaemonStatusPayload | null> {\n const timeout = options.timeoutMs ?? DEFAULT_WAIT_MS;\n const logger = options.logger ?? defaultLogger;\n const start = Date.now();\n\n while (Date.now() - start < timeout) {\n const status = await client.getStatus();\n if (status) {\n return status;\n }\n await new Promise((resolve) => setTimeout(resolve, 250));\n }\n\n logger.warn('Timed out waiting for daemon readiness.');\n return null;\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n", "import http from 'node:http';\nimport * as Sentry from '@sentry/node';\n\nimport type { DirectoryEntry } from './config-store.js';\nimport type { DaemonStatusPayload, LaunchWorkspaceResult } from './local-control-server.js';\nimport { DaemonStateStore, type DaemonStateData } from './state-store.js';\nimport type { MachineMessageSchema } from '../../../shared-js/dist/schemas/generated.js';\n\ntype ControlEndpoint = DaemonStateData;\n\nexport class DaemonClient {\n constructor(private readonly stateStore: DaemonStateStore = new DaemonStateStore()) {}\n\n async getStatus(): Promise<DaemonStatusPayload | null> {\n const endpoint = await this.getEndpoint();\n if (!endpoint) {\n return null;\n }\n\n try {\n return await this.request<DaemonStatusPayload>(endpoint, {\n method: 'GET',\n path: '/status',\n });\n } catch (error) {\n if (shouldResetState(error)) {\n await this.stateStore.clear();\n return null;\n }\n Sentry.captureException(error);\n throw error;\n }\n }\n\n async addDirectory(\n directoryPath: string,\n label?: string,\n ): Promise<{ directory: DirectoryEntry; created: boolean } | null> {\n const endpoint = await this.getEndpoint();\n if (!endpoint) {\n return null;\n }\n\n try {\n return await this.request(endpoint, {\n method: 'POST',\n path: '/directories',\n body: { path: directoryPath, label },\n });\n } catch (error) {\n if (shouldResetState(error)) {\n await this.stateStore.clear();\n return null;\n }\n Sentry.captureException(error);\n throw error;\n }\n }\n\n async stop(\n status: Exclude<MachineMessageSchema.MachineStatus, 'ONLINE'> = 'OFFLINE',\n ): Promise<boolean> {\n const endpoint = await this.getEndpoint();\n if (!endpoint) {\n return false;\n }\n try {\n await this.request(endpoint, {\n method: 'POST',\n path: '/stop',\n body: {\n status,\n },\n });\n return true;\n } catch (error) {\n if (shouldResetState(error)) {\n await this.stateStore.clear();\n return false;\n }\n Sentry.captureException(error);\n throw error;\n }\n }\n\n async launchSession(options: {\n path: string;\n initialPrompt?: string;\n userSessionId?: string;\n worktreeName?: string;\n }): Promise<LaunchWorkspaceResult | null> {\n const endpoint = await this.getEndpoint();\n if (!endpoint) {\n return null;\n }\n try {\n return await this.request<LaunchWorkspaceResult>(endpoint, {\n method: 'POST',\n path: '/launch',\n body: {\n path: options.path,\n initial_prompt: options.initialPrompt,\n user_session_id: options.userSessionId,\n worktree_name: options.worktreeName,\n },\n });\n } catch (error) {\n if (shouldResetState(error)) {\n await this.stateStore.clear();\n return null;\n }\n Sentry.captureException(error);\n throw error;\n }\n }\n\n private async getEndpoint(): Promise<ControlEndpoint | null> {\n const state = await this.stateStore.load();\n if (!state) {\n return null;\n }\n\n if (!isProcessAlive(state.pid)) {\n await this.stateStore.clear();\n return null;\n }\n\n return state;\n }\n\n private request<T>(\n endpoint: ControlEndpoint,\n options: { method: 'GET' | 'POST'; path: string; body?: Record<string, unknown> },\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const payload = options.body ? JSON.stringify(options.body) : undefined;\n const req = http.request(\n {\n hostname: '127.0.0.1',\n port: endpoint.port,\n method: options.method,\n path: options.path,\n headers: {\n authorization: `Bearer ${endpoint.token}`,\n ...(payload\n ? {\n 'content-type': 'application/json',\n 'content-length': Buffer.byteLength(payload).toString(),\n }\n : {}),\n },\n },\n (res) => {\n const chunks: Buffer[] = [];\n res.on('data', (chunk) => chunks.push(chunk));\n res.on('end', () => {\n const raw = Buffer.concat(chunks).toString('utf8');\n if (res.statusCode && res.statusCode >= 400) {\n reject(\n new HttpError(\n `Request failed with status ${res.statusCode}: ${raw}`,\n res.statusCode ?? 500,\n raw,\n ),\n );\n return;\n }\n try {\n resolve(raw ? (JSON.parse(raw) as T) : ({} as T));\n } catch (error) {\n reject(error);\n }\n });\n },\n );\n\n req.on('error', reject);\n\n if (payload) {\n req.write(payload);\n }\n req.end();\n });\n }\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n if (isErrno(error, 'EPERM')) {\n return true;\n }\n if (isErrno(error, 'ESRCH')) {\n return false;\n }\n Sentry.captureException(error);\n return false;\n }\n}\n\nfunction isErrno(error: unknown, code: string): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code?: string }).code === code,\n );\n}\n\nfunction shouldResetState(error: unknown): boolean {\n if (error instanceof HttpError && error.statusCode === 401) {\n return true;\n }\n return isConnectionError(error);\n}\n\nfunction isConnectionError(error: unknown): boolean {\n const codes = new Set(['ECONNREFUSED', 'ECONNRESET', 'ENOENT']);\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n typeof (error as { code?: unknown }).code === 'string' &&\n codes.has((error as { code: string }).code),\n );\n}\n\nexport class HttpError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly body?: string,\n ) {\n super(message);\n this.name = 'HttpError';\n }\n}\n", "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport * as Sentry from '@sentry/node';\n\nimport { DAEMON_STATE_PATH, DEFAULT_FILE_MODE, ensureOmnaraHome } from './paths.js';\n\nexport interface DaemonStateData {\n pid: number;\n port: number;\n token: string;\n startedAt: string;\n version?: string;\n}\n\nexport class DaemonStateStore {\n constructor(private readonly filePath: string = DAEMON_STATE_PATH) {}\n\n async load(): Promise<DaemonStateData | null> {\n try {\n const raw = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(raw) as DaemonStateData;\n return parsed;\n } catch (error) {\n if (isFileNotFound(error)) {\n return null;\n }\n Sentry.captureException(error);\n throw new Error(\n `Failed to read daemon state from ${this.filePath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n\n async save(state: DaemonStateData): Promise<void> {\n await ensureOmnaraHome();\n await fs.mkdir(path.dirname(this.filePath), { recursive: true });\n const tempPath = `${this.filePath}.tmp`;\n await fs.writeFile(tempPath, JSON.stringify(state, null, 2), {\n mode: DEFAULT_FILE_MODE,\n });\n await fs.chmod(tempPath, DEFAULT_FILE_MODE);\n await fs.rename(tempPath, this.filePath);\n }\n\n async clear(): Promise<void> {\n try {\n await fs.unlink(this.filePath);\n } catch (error) {\n if (!isFileNotFound(error)) {\n Sentry.captureException(error);\n throw error;\n }\n }\n }\n}\n\nfunction isFileNotFound(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code?: string }).code === 'ENOENT',\n );\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n", "import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { getOmnaraHome, isDevEnv } from '../env/env-mode.js';\n\nexport function getDaemonPaths(devOverride?: boolean) {\n const homeDir = getOmnaraHome(devOverride);\n return {\n homeDir,\n configPath: path.join(homeDir, 'daemon.json'),\n statePath: path.join(homeDir, 'daemon-state.json'),\n daemonLogDir: path.join(homeDir, 'logs', 'daemon'),\n userSessionLogRoot: path.join(homeDir, 'logs', 'user-sessions'),\n };\n}\n\nconst DEFAULT_PATHS = getDaemonPaths(isDevEnv());\n\nexport const OMNARA_HOME_DIR = DEFAULT_PATHS.homeDir;\nexport const DAEMON_CONFIG_PATH = DEFAULT_PATHS.configPath;\nexport const DAEMON_STATE_PATH = DEFAULT_PATHS.statePath;\nexport const DAEMON_LOG_DIR = DEFAULT_PATHS.daemonLogDir;\nexport const USER_SESSION_LOG_ROOT = DEFAULT_PATHS.userSessionLogRoot;\n\nexport const DEFAULT_DIR_MODE = 0o700;\nexport const DEFAULT_FILE_MODE = 0o600;\n\nexport async function ensureOmnaraHome(): Promise<void> {\n await fs.mkdir(OMNARA_HOME_DIR, { recursive: true, mode: DEFAULT_DIR_MODE });\n}\n\nexport async function ensureDirectory(dirPath: string): Promise<void> {\n await fs.mkdir(dirPath, { recursive: true, mode: DEFAULT_DIR_MODE });\n}\n", "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport * as Sentry from '@sentry/node';\n\nimport { DaemonConfigStore, type DirectoryEntry } from './config-store.js';\n\nexport interface DirectoryEnsureOptions {\n label?: string;\n updateLastUsed?: boolean;\n skipValidation?: boolean;\n}\n\nexport class DirectoryRegistry {\n constructor(private readonly store: DaemonConfigStore = new DaemonConfigStore()) {}\n\n async list(): Promise<DirectoryEntry[]> {\n const config = await this.store.load();\n return config.directories;\n }\n\n async getEntry(directoryPath: string): Promise<DirectoryEntry | null> {\n const normalized = path.resolve(directoryPath);\n const directories = await this.list();\n return directories.find((dir) => path.resolve(dir.path) === normalized) ?? null;\n }\n\n async ensureDirectory(\n directoryPath: string,\n options: DirectoryEnsureOptions = {},\n ): Promise<{ entry: DirectoryEntry; created: boolean }> {\n const resolved = path.resolve(directoryPath);\n if (!options.skipValidation) {\n await this.assertDirectory(resolved);\n }\n\n return this.store.ensureDirectory(resolved, {\n label: options.label,\n touch: options.updateLastUsed ?? true,\n });\n }\n\n private async assertDirectory(directoryPath: string): Promise<void> {\n try {\n const stats = await fs.stat(directoryPath);\n if (!stats.isDirectory()) {\n throw new Error('Path is not a directory');\n }\n } catch (error) {\n Sentry.captureException(error);\n throw new Error(\n `Directory ${directoryPath} is not accessible: ${extractErrorMessage(error)}`,\n );\n }\n }\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n", "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport * as Sentry from '@sentry/node';\n\nimport { DAEMON_CONFIG_PATH, DEFAULT_FILE_MODE, ensureOmnaraHome } from './paths.js';\n\nexport interface DirectoryEntry {\n id: string;\n path: string;\n label?: string;\n addedAt: string;\n lastUsedAt?: string;\n}\n\nexport interface MachineMetadata {\n id?: string;\n name?: string;\n token?: string;\n lastSeenAt?: string;\n tokenExpiresAt?: string;\n}\n\nexport interface DaemonSettings {\n maxSessions?: number;\n autoUpdateCheckSeconds?: number;\n}\n\nexport interface DaemonConfigData {\n machine?: MachineMetadata;\n directories: DirectoryEntry[];\n settings?: DaemonSettings;\n}\n\nconst DEFAULT_CONFIG: DaemonConfigData = {\n directories: [],\n settings: {},\n};\n\nexport class DaemonConfigStore {\n constructor(private readonly filePath: string = DAEMON_CONFIG_PATH) {}\n\n async load(): Promise<DaemonConfigData> {\n try {\n const raw = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(raw) as Partial<DaemonConfigData>;\n return normalizeConfig(parsed);\n } catch (error) {\n if (isFileNotFound(error)) {\n return cloneConfig(DEFAULT_CONFIG);\n }\n Sentry.captureException(error);\n throw new Error(\n `Failed to read daemon config from ${this.filePath}: ${extractErrorMessage(error)}`,\n );\n }\n }\n\n async save(config: DaemonConfigData): Promise<void> {\n const payload = normalizeConfig(config);\n await ensureOmnaraHome();\n await fs.mkdir(path.dirname(this.filePath), { recursive: true });\n\n const tempPath = `${this.filePath}.tmp`;\n await fs.writeFile(tempPath, JSON.stringify(payload, null, 2), {\n mode: DEFAULT_FILE_MODE,\n });\n await fs.chmod(tempPath, DEFAULT_FILE_MODE);\n await fs.rename(tempPath, this.filePath);\n }\n\n async update(\n mutate: (config: DaemonConfigData) => void | DaemonConfigData,\n ): Promise<DaemonConfigData> {\n const current = await this.load();\n const working = cloneConfig(current);\n const result = mutate(working) ?? working;\n await this.save(result);\n return result;\n }\n\n async ensureDirectory(\n absolutePath: string,\n options: { label?: string; touch?: boolean } = {},\n ): Promise<{ entry: DirectoryEntry; created: boolean }> {\n const resolvedPath = normalizeFsPath(absolutePath);\n const now = new Date().toISOString();\n\n const config = await this.update((working) => {\n let entry = working.directories.find((dir) => normalizeFsPath(dir.path) === resolvedPath);\n\n if (!entry) {\n entry = {\n id: randomUUID(),\n path: resolvedPath,\n label: options.label,\n addedAt: now,\n lastUsedAt: options.touch ? now : undefined,\n };\n working.directories = [...working.directories, entry];\n return;\n }\n\n if (options.label && options.label !== entry.label) {\n entry.label = options.label;\n }\n\n if (options.touch) {\n entry.lastUsedAt = now;\n }\n });\n\n const entry = config.directories.find((dir) => normalizeFsPath(dir.path) === resolvedPath);\n\n if (!entry) {\n throw new Error('Failed to persist directory registration');\n }\n\n const created = entry.addedAt === now;\n return { entry, created };\n }\n}\n\nfunction normalizeConfig(config: Partial<DaemonConfigData> | undefined): DaemonConfigData {\n const directories = Array.isArray(config?.directories)\n ? config!.directories\n .filter((item): item is DirectoryEntry =>\n Boolean(\n item && typeof item === 'object' && 'path' in item && typeof item.path === 'string',\n ),\n )\n .map((dir) => ({\n id: dir.id ?? randomUUID(),\n path: normalizeFsPath(dir.path),\n label: dir.label,\n addedAt: dir.addedAt ?? new Date().toISOString(),\n lastUsedAt: dir.lastUsedAt,\n }))\n : [];\n\n return {\n machine: config?.machine ?? DEFAULT_CONFIG.machine,\n directories,\n settings: config?.settings ?? {},\n };\n}\n\nfunction cloneConfig(config: DaemonConfigData): DaemonConfigData {\n return JSON.parse(JSON.stringify(config)) as DaemonConfigData;\n}\n\nfunction normalizeFsPath(value: string): string {\n return path.resolve(value);\n}\n\nfunction isFileNotFound(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code?: string }).code === 'ENOENT',\n );\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n", "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport * as Sentry from '@sentry/node';\n\nimport { DEFAULT_FILE_MODE, OMNARA_HOME_DIR } from './paths.js';\n\nconst REGISTRY_PATH = path.join(OMNARA_HOME_DIR, 'session-processes.json');\nconst LOCK_PATH = `${REGISTRY_PATH}.lock`;\nconst execFileAsync = promisify(execFile);\nconst START_TIME_TOLERANCE_MS = 5_000;\n\nexport interface SessionRecord {\n pid: number;\n startedAt?: string;\n command?: string;\n}\n\nexport interface SessionRegistry {\n [userSessionId: string]: SessionRecord;\n}\n\nasync function acquireLock(retries = 20, delayMs = 50): Promise<fs.FileHandle> {\n for (let attempt = 0; attempt < retries; attempt += 1) {\n try {\n const handle = await fs.open(LOCK_PATH, 'wx');\n return handle;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') {\n Sentry.captureException(error);\n throw error;\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n throw new Error('Failed to acquire session registry lock');\n}\n\nasync function releaseLock(handle: fs.FileHandle): Promise<void> {\n await handle.close();\n await fs.unlink(LOCK_PATH).catch(() => undefined);\n}\n\nasync function readRegistry(): Promise<SessionRegistry> {\n try {\n const raw = await fs.readFile(REGISTRY_PATH, 'utf8');\n const parsed = JSON.parse(raw) as Record<string, SessionRecord | number>;\n const normalized: SessionRegistry = {};\n for (const [sessionId, value] of Object.entries(parsed)) {\n if (typeof value === 'number') {\n // Legacy format: registry stored just the PID number.\n normalized[sessionId] = {\n pid: value,\n };\n continue;\n }\n if (value && typeof value.pid === 'number') {\n normalized[sessionId] = {\n pid: value.pid,\n startedAt: typeof value.startedAt === 'string' ? value.startedAt : undefined,\n command: typeof value.command === 'string' ? value.command : undefined,\n };\n }\n }\n return normalized;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return {};\n }\n Sentry.captureException(error);\n throw error;\n }\n}\n\nasync function writeRegistry(registry: SessionRegistry): Promise<void> {\n await fs.writeFile(REGISTRY_PATH, JSON.stringify(registry, null, 2), {\n mode: DEFAULT_FILE_MODE,\n });\n}\n\nexport async function withSessionRegistry<T>(\n fn: (registry: SessionRegistry) => Promise<[SessionRegistry, T]> | [SessionRegistry, T],\n): Promise<T> {\n const lockHandle = await acquireLock();\n try {\n const current = await readRegistry();\n const [updated, result] = await fn(current);\n await writeRegistry(updated);\n return result;\n } finally {\n await releaseLock(lockHandle);\n }\n}\n\nexport async function isProcessAlive(pid: number): Promise<boolean> {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ESRCH') {\n return false;\n }\n Sentry.captureException(error);\n return true;\n }\n}\n\nexport async function isSessionProcessAlive(record: SessionRecord): Promise<boolean> {\n const alive = await isProcessAlive(record.pid);\n if (!alive) {\n return false;\n }\n\n const tokensMatch = await matchesExpectedCommand(record.pid);\n if (!tokensMatch) {\n return false;\n }\n\n const timeMatch = await matchesStartTime(record.pid, record.startedAt);\n if (record.startedAt && !timeMatch) {\n return false;\n }\n\n return true;\n}\n\nasync function matchesExpectedCommand(pid: number): Promise<boolean> {\n if (os.platform() === 'win32') {\n // Windows: skip command inspection; ps is not available.\n return true;\n }\n try {\n const { stdout } = await execFileAsync('ps', ['-p', String(pid), '-o', 'command=']);\n const command = stdout.trim().toLowerCase();\n if (!command) {\n return false;\n }\n if (!command.includes('omnara') || !command.includes('daemon run-session')) {\n return false;\n }\n return true;\n } catch {\n return false;\n }\n}\n\nasync function matchesStartTime(pid: number, recordedStartedAt?: string): Promise<boolean> {\n if (os.platform() === 'win32') {\n return true;\n }\n if (!recordedStartedAt) {\n return true;\n }\n const recordedMs = Date.parse(recordedStartedAt);\n if (Number.isNaN(recordedMs)) {\n return true;\n }\n try {\n const { stdout } = await execFileAsync('ps', ['-p', String(pid), '-o', 'lstart=']);\n const psStart = stdout.trim();\n if (!psStart) {\n return true;\n }\n const psDate = new Date(psStart);\n if (Number.isNaN(psDate.getTime())) {\n return true;\n }\n const delta = Math.abs(psDate.getTime() - recordedMs);\n return delta <= START_TIME_TOLERANCE_MS;\n } catch {\n return true;\n }\n}\n", "import { Command } from 'commander';\nimport * as Sentry from '@sentry/node';\n\nimport {\n ensureDaemonForSession,\n ensureMachineNameConfigured,\n showDaemonStatus,\n startDaemon,\n stopDaemon,\n} from '../daemon/daemon-launcher.js';\nimport { runDaemonProcess } from '../daemon/run-daemon.js';\nimport { logger } from '../utils/logger.js';\nimport { ensureCliCredentials } from '../auth/ensure-cli-credentials.js';\nimport { resolveBackendUrl, resolveFrontendUrl } from '../auth/login-flow.js';\nimport { runAgentOrchestrator } from './agent.js';\nimport { DaemonConfigStore } from '../daemon/config-store.js';\n\nexport function buildDaemonCommand(): Command {\n const daemon = new Command('daemon').description('Manage the Omnara background daemon.');\n\n daemon\n .command('start')\n .description('Start the daemon if it is not already running.')\n .option('--no-wait', 'Do not wait for the daemon to become ready')\n .action(async (options: { wait: boolean }) => {\n const backendUrl = resolveBackendUrl();\n const frontendUrl = resolveFrontendUrl();\n const configStore = new DaemonConfigStore();\n await ensureMachineNameConfigured(configStore, logger);\n await ensureCliCredentials({ backendUrl, frontendUrl, logger });\n await startDaemon({\n logger,\n waitForReady: options.wait,\n reason: 'manual',\n backendUrl,\n frontendUrl,\n });\n });\n\n daemon\n .command('stop')\n .description('Stop the daemon process if it is running.')\n .action(async () => {\n await stopDaemon({ logger });\n });\n\n daemon\n .command('status')\n .description('Show current daemon status and tracked directories.')\n .action(async () => {\n await showDaemonStatus({ logger });\n });\n\n daemon\n .command('run-service', { hidden: true })\n .description('Internal command to run the daemon service.')\n .action(async () => {\n await runDaemonProcess();\n });\n\n daemon\n .command('run-session', { hidden: true })\n .description(\n 'Internal command used by the daemon to launch a user session process via the orchestrator.',\n )\n .requiredOption('--user-session-id <id>', 'User session identifier that owns the agent session')\n .requiredOption('--directory <path>', 'Working directory for the new session')\n .requiredOption('--workspace-id <id>', 'Workspace identifier associated with this session')\n .option(\n '--worktree-name <name>',\n 'Worktree & branch name associated with this session (optional)',\n )\n .option('--machine-id <id>', 'Machine identifier launching the session')\n .action(async (options: RunSessionCommandOptions) => {\n try {\n process.chdir(options.directory);\n } catch (error) {\n Sentry.captureException(error);\n logger.error(\n `Unable to switch to directory ${options.directory}: ${(error as Error).message}`,\n );\n process.exitCode = 1;\n return;\n }\n\n logger.info(\n `Launching user session ${options.userSessionId} in ${options.directory}${\n options.workspaceId ? ` (workspace ${options.workspaceId})` : ''\n }${options.machineId ? ` on machine ${options.machineId}` : ''}`,\n );\n\n try {\n await runAgentOrchestrator({\n backendUrl: resolveBackendUrl(),\n frontendUrl: resolveFrontendUrl(),\n workspaceId: options.workspaceId,\n userSessionId: options.userSessionId,\n worktreeName: options.worktreeName,\n });\n } catch (error) {\n Sentry.captureException(error);\n logger.error('User session exited with error:', error);\n process.exitCode = process.exitCode || 1;\n }\n });\n\n daemon\n .command('register-current', { hidden: true })\n .description('Internal helper used by the CLI to register the current directory.')\n .action(async () => {\n await ensureDaemonForSession({ cwd: process.cwd(), logger });\n });\n\n return daemon;\n}\n\ninterface RunSessionCommandOptions {\n userSessionId: string;\n directory: string;\n workspaceId: string;\n machineId?: string;\n worktreeName?: string;\n}\n", "import * as Sentry from '@sentry/node';\nimport { DaemonService } from './daemon-service.js';\nimport { DirectoryRegistry } from './directory-registry.js';\nimport { DaemonStateStore } from './state-store.js';\nimport { DaemonConfigStore } from './config-store.js';\nimport { MachineSupervisor } from './machine-supervisor.js';\nimport { CredentialsStore } from '../auth/credentials-store.js';\nimport { createAuthProvider } from '../auth/auth-provider.js';\nimport { resolveBackendUrl, resolveFrontendUrl } from '../auth/login-flow.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { createLogger, type Logger } from '../utils/logger.js';\nimport { DAEMON_LOG_DIR, DEFAULT_FILE_MODE, ensureDirectory, ensureOmnaraHome } from './paths.js';\nimport { checkForUpdate, runInstallScript } from '../utils/version-check.js';\n\n// Check for updates every 5 minutes\nconst UPDATE_CHECK_INTERVAL_MS = 5 * 60 * 1000;\n\n/**\n * Starts a background update checker that periodically checks for new versions.\n * If an update is available, it runs the install script which will update the\n * binary and restart the daemon via the service manager.\n *\n * @param logger - Logger instance\n * @param onUpdateInstalled - Callback to trigger graceful shutdown after update\n */\nfunction startUpdateChecker(logger: Logger, onUpdateInstalled: () => void): NodeJS.Timeout {\n const checkForUpdates = async () => {\n try {\n logger.debug('Checking for updates...');\n const updateInfo = await checkForUpdate();\n\n if (updateInfo.available) {\n logger.info(\n `Update available: ${updateInfo.currentVersion} -> ${updateInfo.latestVersion}`,\n );\n logger.info('Starting background update...');\n\n // Run the install script silently - it will update the binary and the service\n // manager (launchd/systemd/Task Scheduler) will restart the daemon\n const success = await runInstallScript({ silent: true });\n\n if (success) {\n logger.info('Update installed. Triggering graceful shutdown for restart...');\n // Trigger graceful shutdown - service manager will restart with new version\n onUpdateInstalled();\n } else {\n logger.warn('Background update failed. Will retry on next check.');\n }\n } else {\n logger.debug(`No updates available (current: ${updateInfo.currentVersion})`);\n }\n } catch (error) {\n Sentry.captureException(error);\n logger.error('Update check failed:', error);\n }\n };\n\n // Check immediately on start (after a short delay to let daemon initialize)\n setTimeout(() => {\n void checkForUpdates();\n }, 10_000);\n\n // Then check periodically\n return setInterval(() => {\n void checkForUpdates();\n }, UPDATE_CHECK_INTERVAL_MS);\n}\n\nexport async function runDaemonProcess(): Promise<void> {\n await ensureOmnaraHome();\n await ensureDirectory(DAEMON_LOG_DIR);\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const fileName = `${timestamp}-${process.pid}.log`;\n const logPath = path.join(DAEMON_LOG_DIR, fileName);\n const stream = fs.createWriteStream(logPath, {\n flags: 'a',\n mode: DEFAULT_FILE_MODE,\n });\n const sinks = [\n (entry: { line: string }) => stream.write(`${entry.line}\\n`),\n (entry: { raw: unknown[] }) => console.log(...(entry.raw as unknown[])),\n ];\n const logger = createLogger('Daemon', {\n sinks,\n closers: [\n () =>\n new Promise<void>((resolve) => {\n stream.end(resolve);\n }),\n ],\n forceOutput: true,\n });\n logger.info(`Writing daemon logs to ${logPath}`);\n const backendUrl = resolveBackendUrl();\n const frontendUrl = resolveFrontendUrl();\n const credentialsStore = new CredentialsStore();\n const authProvider = await createAuthProvider({\n store: credentialsStore,\n backendUrl,\n frontendUrl,\n logger,\n interactive: false,\n });\n\n const configStore = new DaemonConfigStore();\n const directoryRegistry = new DirectoryRegistry(configStore);\n const machineSupervisor = new MachineSupervisor({\n backendUrl,\n frontendUrl,\n directoryRegistry,\n configStore,\n authProvider,\n logger,\n });\n\n const service = new DaemonService({\n directoryRegistry,\n stateStore: new DaemonStateStore(),\n machineSupervisor,\n logger,\n });\n\n // Start background update checker - pass a callback to trigger graceful shutdown on update\n const updateCheckInterval = startUpdateChecker(logger, () => {\n logger.info('Update installed, initiating graceful shutdown...');\n void service.stop().catch((error) => {\n Sentry.captureException(error);\n logger.error('Failed to stop daemon after update:', error);\n });\n });\n\n const makeSignalHandler = (signal: NodeJS.Signals) => {\n return () => {\n logger.warn(`Received ${signal}. Stopping daemon...`);\n void service.stop().catch((error) => {\n Sentry.captureException(error);\n logger.error('Failed to stop daemon:', error);\n });\n };\n };\n\n const sigint = makeSignalHandler('SIGINT');\n const sigterm = makeSignalHandler('SIGTERM');\n process.on('SIGINT', sigint);\n process.on('SIGTERM', sigterm);\n\n try {\n await service.start();\n await service.waitForShutdown();\n } catch (error) {\n Sentry.captureException(error);\n logger.error('Daemon exited with error:', error);\n process.exitCode = 1;\n } finally {\n clearInterval(updateCheckInterval);\n process.off('SIGINT', sigint);\n process.off('SIGTERM', sigterm);\n await service.stop().catch(() => undefined);\n await logger.close?.();\n }\n}\n", "import type { Logger } from '../utils/logger.js';\nimport * as Sentry from '@sentry/node';\nimport { logger as defaultLogger } from '../utils/logger.js';\nimport { DirectoryRegistry } from './directory-registry.js';\nimport {\n startLocalControlServer,\n type LaunchWorkspacePayload,\n type LaunchWorkspaceResult,\n type LocalControlServerHandle,\n} from './local-control-server.js';\nimport { DaemonStateStore, type DaemonStateData } from './state-store.js';\nimport { MachineSupervisor } from './machine-supervisor.js';\nimport type { MachineMessageSchema } from '../../../shared-js/dist/schemas/generated.js';\n\nexport interface DaemonServiceOptions {\n directoryRegistry?: DirectoryRegistry;\n stateStore?: DaemonStateStore;\n machineSupervisor?: MachineSupervisor;\n logger?: Logger;\n}\n\nexport class DaemonService {\n private readonly logger: Logger;\n private readonly directoryRegistry: DirectoryRegistry;\n private readonly stateStore: DaemonStateStore;\n private readonly machineSupervisor: MachineSupervisor | null;\n private controlHandle: LocalControlServerHandle | null = null;\n private startedAt: string | null = null;\n private stopPromise: Promise<void> | null = null;\n private resolveStopPromise: (() => void) | null = null;\n private stopping = false;\n\n constructor(options: DaemonServiceOptions = {}) {\n this.logger = options.logger ?? defaultLogger;\n this.directoryRegistry = options.directoryRegistry ?? new DirectoryRegistry();\n this.stateStore = options.stateStore ?? new DaemonStateStore();\n this.machineSupervisor = options.machineSupervisor ?? null;\n }\n\n async start(): Promise<void> {\n if (this.controlHandle) {\n throw new Error('Daemon service already running');\n }\n\n this.startedAt = new Date().toISOString();\n this.stopPromise = new Promise<void>((resolve) => {\n this.resolveStopPromise = resolve;\n });\n\n try {\n this.controlHandle = await startLocalControlServer({\n directoryRegistry: this.directoryRegistry,\n getStatus: () => this.buildStatusPayload(),\n onStopRequested: (status: Exclude<MachineMessageSchema.MachineStatus, 'ONLINE'>) =>\n this.stop(status),\n onLaunchRequested: (payload) => this.handleLaunchRequest(payload),\n logger: this.logger,\n });\n\n await this.machineSupervisor?.start();\n await this.persistState();\n this.logger.success('\u2713 Omnara daemon is running');\n } catch (error) {\n this.stopPromise = null;\n this.resolveStopPromise = null;\n await this.machineSupervisor?.stop('OFFLINE').catch(() => undefined);\n await this.cleanupState();\n Sentry.captureException(error);\n throw error;\n }\n }\n\n async stop(\n status: Exclude<MachineMessageSchema.MachineStatus, 'ONLINE'> = 'OFFLINE',\n ): Promise<void> {\n if (this.stopping) {\n return;\n }\n\n if (!this.controlHandle && !this.stopPromise) {\n return;\n }\n this.stopping = true;\n\n try {\n if (this.controlHandle) {\n await this.controlHandle.close();\n this.controlHandle = null;\n }\n await this.machineSupervisor?.stop(status);\n } finally {\n await this.cleanupState();\n this.resolveStopPromise?.();\n this.stopPromise = null;\n this.resolveStopPromise = null;\n this.logger.info('Omnara daemon stopped');\n this.stopping = false;\n }\n }\n\n async waitForShutdown(): Promise<void> {\n if (!this.stopPromise) {\n throw new Error('Daemon service has not been started');\n }\n await this.stopPromise;\n }\n\n private async buildStatusPayload() {\n return {\n pid: process.pid,\n startedAt: this.startedAt ?? new Date().toISOString(),\n directories: await this.directoryRegistry.list(),\n };\n }\n\n private async handleLaunchRequest(\n payload: LaunchWorkspacePayload,\n ): Promise<LaunchWorkspaceResult> {\n if (!this.machineSupervisor) {\n throw new Error('Machine supervisor is not running');\n }\n return await this.machineSupervisor.launchWorkspaceSessionLocal({\n path: payload.path,\n initialPrompt: payload.initialPrompt,\n userSessionId: payload.userSessionId,\n worktreeName: payload.worktreeName,\n });\n }\n\n private async persistState(): Promise<void> {\n if (!this.controlHandle || !this.startedAt) {\n return;\n }\n\n const state: DaemonStateData = {\n pid: process.pid,\n port: this.controlHandle.port,\n token: this.controlHandle.token,\n startedAt: this.startedAt,\n };\n\n await this.stateStore.save(state);\n }\n\n private async cleanupState(): Promise<void> {\n await this.stateStore.clear();\n }\n}\n", "import http from 'node:http';\nimport { randomBytes } from 'node:crypto';\nimport { URL } from 'node:url';\nimport * as Sentry from '@sentry/node';\n\nimport type { Logger } from '../utils/logger.js';\nimport type { DirectoryEntry } from './config-store.js';\nimport { DirectoryRegistry } from './directory-registry.js';\nimport type { MachineMessageSchema } from '../../../shared-js/dist/schemas/generated.js';\nimport { PaymentRequiredError } from '@omnara/shared-js/api';\n\nconst MIN_PORT = 10_000;\nconst MAX_PORT = 65_535;\nconst MAX_ATTEMPTS = 100;\n\nexport interface DaemonStatusPayload {\n pid: number;\n startedAt: string;\n directories: DirectoryEntry[];\n}\n\nexport interface LocalControlServerOptions {\n directoryRegistry: DirectoryRegistry;\n getStatus: () => Promise<DaemonStatusPayload>;\n onStopRequested: (\n status: Exclude<MachineMessageSchema.MachineStatus, 'ONLINE'>,\n ) => Promise<void> | void;\n onLaunchRequested?: (payload: LaunchWorkspacePayload) => Promise<LaunchWorkspaceResult>;\n logger?: Logger;\n}\n\nexport interface LocalControlServerHandle {\n port: number;\n token: string;\n close(): Promise<void>;\n}\n\nexport interface LaunchWorkspacePayload {\n path: string;\n initialPrompt?: string;\n userSessionId?: string;\n worktreeName?: string;\n}\n\nexport interface LaunchWorkspaceSuccessPayload {\n user_session_id: string;\n workspace_id: string;\n launch_id: string;\n}\n\nexport interface LaunchWorkspaceResult {\n status: 'ok' | 'error' | string;\n payload?: LaunchWorkspaceSuccessPayload | null;\n error?: string;\n}\n\nexport async function startLocalControlServer(\n options: LocalControlServerOptions,\n): Promise<LocalControlServerHandle> {\n const token = randomBytes(24).toString('hex');\n const handler = createRequestHandler({\n token,\n directoryRegistry: options.directoryRegistry,\n getStatus: options.getStatus,\n onStopRequested: options.onStopRequested,\n onLaunchRequested: options.onLaunchRequested,\n logger: options.logger,\n });\n\n const { server, port } = await listenWithRetries(handler);\n options.logger?.info(`Daemon control server listening on 127.0.0.1:${port}`);\n\n return {\n port,\n token,\n async close() {\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n },\n };\n}\n\ninterface RequestHandlerContext {\n token: string;\n directoryRegistry: DirectoryRegistry;\n getStatus: () => Promise<DaemonStatusPayload>;\n onStopRequested: (\n status: Exclude<MachineMessageSchema.MachineStatus, 'ONLINE'>,\n ) => Promise<void> | void;\n onLaunchRequested?: (payload: LaunchWorkspacePayload) => Promise<LaunchWorkspaceResult>;\n logger?: Logger;\n}\n\nfunction createRequestHandler(context: RequestHandlerContext) {\n return async (req: http.IncomingMessage, res: http.ServerResponse): Promise<void> => {\n try {\n const url = new URL(req.url ?? '/', 'http://localhost');\n if (req.method === 'GET' && url.pathname === '/healthz') {\n sendJson(res, 200, { status: 'ok' });\n return;\n }\n\n if (!authorize(req, context.token)) {\n sendJson(res, 401, { error: 'unauthorized' });\n return;\n }\n\n if (req.method === 'GET' && url.pathname === '/status') {\n const payload = await context.getStatus();\n sendJson(res, 200, payload);\n return;\n }\n\n if (req.method === 'GET' && url.pathname === '/directories') {\n const directories = await context.directoryRegistry.list();\n sendJson(res, 200, { directories });\n return;\n }\n\n if (req.method === 'POST' && url.pathname === '/directories') {\n const body = await readJsonBody<{ path?: string; label?: string }>(req);\n if (!body?.path) {\n sendJson(res, 400, { error: '`path` is required' });\n return;\n }\n\n try {\n const result = await context.directoryRegistry.ensureDirectory(body.path, {\n label: body.label,\n updateLastUsed: true,\n });\n\n sendJson(res, 200, { directory: result.entry, created: result.created });\n } catch (error) {\n Sentry.captureException(error);\n sendJson(res, 400, { error: extractErrorMessage(error) });\n }\n return;\n }\n\n if (req.method === 'POST' && url.pathname === '/launch') {\n if (!context.onLaunchRequested) {\n sendJson(res, 503, { error: 'launch_not_supported' });\n return;\n }\n const body = await readJsonBody<{\n path?: string;\n initial_prompt?: string;\n user_session_id?: string;\n worktree_name?: string;\n }>(req);\n if (!body?.path) {\n sendJson(res, 400, { error: '`path` is required' });\n return;\n }\n try {\n const result = await context.onLaunchRequested({\n path: body.path,\n initialPrompt: body.initial_prompt ?? undefined,\n userSessionId: body.user_session_id ?? undefined,\n worktreeName: body.worktree_name ?? undefined,\n });\n sendJson(res, 200, result);\n } catch (error) {\n if (error instanceof PaymentRequiredError) {\n sendJson(res, 402, {\n error: error.message,\n });\n return;\n }\n Sentry.captureException(error);\n sendJson(res, 400, { error: extractErrorMessage(error) });\n }\n return;\n }\n\n if (req.method === 'POST' && url.pathname === '/stop') {\n const body = await readJsonBody<{\n status?: Exclude<MachineMessageSchema.MachineStatus, 'ONLINE'>;\n }>(req);\n sendJson(res, 202, { status: 'stopping' });\n Promise.resolve()\n .then(() => context.onStopRequested(body?.status ?? 'OFFLINE'))\n .catch((error) => {\n Sentry.captureException(error);\n context.logger?.error('Failed to stop daemon:', error);\n });\n return;\n }\n\n sendJson(res, 404, { error: 'not_found' });\n } catch (error) {\n Sentry.captureException(error);\n context.logger?.error('Control server error:', error);\n if (!res.headersSent) {\n sendJson(res, 500, { error: 'internal_error' });\n } else {\n res.end();\n }\n }\n };\n}\n\nasync function listenWithRetries(\n handler: (req: http.IncomingMessage, res: http.ServerResponse) => void,\n): Promise<{ server: http.Server; port: number }> {\n let attempt = 0;\n let port = pickInitialPort();\n\n while (attempt < MAX_ATTEMPTS) {\n const server = http.createServer((req, res) => {\n void handler(req, res);\n });\n\n try {\n await listen(server, port);\n return { server, port };\n } catch (error) {\n server.close();\n if (isPortInUse(error)) {\n attempt += 1;\n port = nextPort(port);\n continue;\n }\n throw error;\n }\n }\n\n throw new Error('Failed to bind control server port after multiple attempts');\n}\n\nfunction listen(server: http.Server, port: number): Promise<void> {\n return new Promise((resolve, reject) => {\n server.once('error', reject);\n server.listen(port, '127.0.0.1', () => {\n server.off('error', reject);\n resolve();\n });\n });\n}\n\nfunction pickInitialPort(): number {\n const span = MAX_PORT - MIN_PORT;\n return MIN_PORT + Math.floor(Math.random() * span);\n}\n\nfunction nextPort(current: number): number {\n const next = current + 1;\n if (next > MAX_PORT) {\n return MIN_PORT;\n }\n return next;\n}\n\nfunction authorize(req: http.IncomingMessage, token: string): boolean {\n const header = req.headers.authorization;\n if (!header) {\n return false;\n }\n\n const [scheme, value] = header.split(' ');\n return scheme.toLowerCase() === 'bearer' && value === token;\n}\n\nasync function readJsonBody<T>(req: http.IncomingMessage): Promise<T | null> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);\n }\n if (!chunks.length) {\n return null;\n }\n try {\n return JSON.parse(Buffer.concat(chunks).toString('utf8')) as T;\n } catch {\n return null;\n }\n}\n\nfunction sendJson(res: http.ServerResponse, statusCode: number, payload: unknown): void {\n const body = JSON.stringify(payload);\n res.writeHead(statusCode, {\n 'content-type': 'application/json',\n 'content-length': Buffer.byteLength(body),\n });\n res.end(body);\n}\n\nfunction isPortInUse(error: unknown): boolean {\n return (\n Boolean(\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n (error as { code?: string }).code === 'EADDRINUSE',\n ) || false\n );\n}\n\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return String(error);\n}\n", "import { randomUUID } from 'node:crypto';\nimport os from 'node:os';\nimport { setTimeout as delay } from 'node:timers/promises';\nimport WebSocket from 'ws';\nimport * as Sentry from '@sentry/node';\n\nimport type { Logger } from '../utils/logger.js';\nimport { logger as defaultLogger } from '../utils/logger.js';\nimport { DirectoryRegistry } from './directory-registry.js';\nimport { DaemonConfigStore } from './config-store.js';\nimport type { DirectoryEntry } from './config-store.js';\nimport { ApiError, PaymentRequiredError } from '@omnara/shared-js/api';\nimport { generateWorktreeName } from '@omnara/shared-js';\nimport { ApiClient } from '../http/api-client.js';\nimport { registerMachine } from '../http/machines.js';\nimport { ensureWorkspace } from '../http/workspaces.js';\nimport { ensureUserSession } from '../http/user-sessions.js';\nimport type { UserSessionDescriptor } from '../http/user-sessions.js';\nimport { validateMachineMessage, type MachineMessage } from '../schemas/index.js';\nimport type {\n MachineRpcRequest,\n MachineRpcResponse,\n MachineHeartbeatMessage,\n MachineStartSessionPayload,\n MachineStopSessionPayload,\n WorkspaceDescriptor,\n} from '@omnara/shared-js/schemas';\nimport { SessionManager } from './session-runner.js';\nimport type { AuthProvider } from '../auth/auth-provider.js';\nimport { AuthContextError } from '../auth/credential-manager.js';\nimport type { MachineRegisterRequest } from '@omnara/shared-js/schemas';\nimport type { LaunchWorkspaceResult } from './local-control-server.js';\nimport { PACKAGE_VERSION } from '../package-info.js';\nimport { calculateBackoff, INITIAL_RETRY_DELAY_MS } from '../utils/backoff.js';\nimport { safeCloseWebSocket } from '../utils/websocket.js';\nimport type { MachineMessageSchema } from '../../../shared-js/dist/schemas/generated.js';\n\nconst HEARTBEAT_INTERVAL_MS = 10_000;\nconst LOGIN_WAIT_DELAY_MS = 30_000;\nconst CONNECT_TIMEOUT_MS = 30_000;\nconst DAEMON_VERSION = PACKAGE_VERSION ?? '0.0.0';\n\nexport interface MachineSupervisorOptions {\n backendUrl: string;\n frontendUrl?: string;\n directoryRegistry: DirectoryRegistry;\n configStore: DaemonConfigStore;\n authProvider: AuthProvider;\n logger?: Logger;\n}\n\ninterface MachineIdentity {\n id: string;\n token: string;\n wsPath: string;\n}\n\ninterface LaunchSessionOptions {\n launchId?: string;\n directory: string;\n workspaceId?: string | null;\n workspaceConfig?: WorkspaceDescriptor['config'];\n userSessionId?: string | null;\n initialPrompt?: string | null;\n metadata?: Record<string, unknown> | null;\n worktreeName?: string | null;\n source: 'local' | 'rpc';\n}\n\ninterface LaunchSessionResult {\n launchId: string;\n userSessionId: string;\n workspaceId: string;\n workspaceConfig: WorkspaceDescriptor['config'];\n}\n\nexport class MachineSupervisor {\n private readonly backendUrl: string;\n private readonly frontendUrl?: string;\n private readonly directoryRegistry: DirectoryRegistry;\n private readonly configStore: DaemonConfigStore;\n private readonly authProvider: AuthProvider;\n private readonly apiClient: ApiClient;\n private readonly logger: Logger;\n private readonly sessionManager: SessionManager;\n\n private running = false;\n private stopRequested = false;\n private loopPromise: Promise<void> | null = null;\n private websocket: WebSocket | null = null;\n private heartbeatTimer: NodeJS.Timeout | null = null;\n private waitingForLogin = false;\n private machineRegistrationReady = false;\n\n constructor(options: MachineSupervisorOptions) {\n this.backendUrl = options.backendUrl;\n this.frontendUrl = options.frontendUrl;\n this.directoryRegistry = options.directoryRegistry;\n this.configStore = options.configStore;\n this.authProvider = options.authProvider;\n this.logger = options.logger ?? defaultLogger;\n this.apiClient = new ApiClient({ baseUrl: this.backendUrl });\n this.sessionManager = new SessionManager({\n backendUrl: this.backendUrl,\n frontendUrl: this.frontendUrl,\n directoryRegistry: this.directoryRegistry,\n logger: this.logger,\n });\n }\n\n async start(): Promise<void> {\n if (this.running) {\n return;\n }\n this.running = true;\n this.stopRequested = false;\n this.loopPromise = this.runLoop();\n }\n\n async launchWorkspaceSessionLocal(options: {\n path: string;\n initialPrompt?: string;\n userSessionId?: string;\n worktreeName?: string;\n }): Promise<LaunchWorkspaceResult> {\n const result = await this.launchWorkspaceSession({\n launchId: undefined,\n directory: options.path,\n userSessionId: options.userSessionId ?? null,\n initialPrompt: options.initialPrompt ?? null,\n worktreeName: options.worktreeName ?? null,\n source: 'local',\n });\n\n return {\n status: 'ok',\n payload: {\n user_session_id: result.userSessionId,\n workspace_id: result.workspaceId,\n launch_id: result.launchId,\n },\n };\n }\n\n async stop(status: Exclude<MachineMessageSchema.MachineStatus, 'ONLINE'>): Promise<void> {\n this.stopRequested = true;\n const directories = await this.directoryRegistry.list();\n const payload: MachineHeartbeatMessage = {\n type: 'heartbeat',\n status: status,\n metadata: {\n hostname: os.hostname(),\n platform: os.platform(),\n architecture: os.arch(),\n daemon_version: DAEMON_VERSION,\n },\n directories: directories.map((entry) => entry.path),\n };\n await this.sendMessage(payload);\n await this.closeWebsocket();\n if (this.loopPromise) {\n await this.loopPromise;\n this.loopPromise = null;\n }\n this.running = false;\n }\n\n private async runLoop(): Promise<void> {\n let retryDelayMs = INITIAL_RETRY_DELAY_MS;\n\n while (!this.stopRequested) {\n try {\n const identity = await this.registerMachine();\n this.clearLoginWait();\n await this.runWebsocket(identity);\n retryDelayMs = INITIAL_RETRY_DELAY_MS;\n } catch (error) {\n if (this.stopRequested) {\n break;\n }\n if (isLoginRequiredError(error) || isUnauthorizedApiError(error)) {\n if (!this.waitingForLogin) {\n this.waitingForLogin = true;\n const detail =\n error instanceof ApiError ? ` (backend responded with HTTP ${error.status})` : '';\n this.logger.warn(\n `Machine supervisor requires login${detail}. Run \\`omnara auth login\\` in a terminal.`,\n );\n } else {\n this.logger.debug('Machine supervisor still waiting for login\u2026');\n }\n await delay(LOGIN_WAIT_DELAY_MS);\n } else {\n Sentry.captureException(error);\n this.logger.warn(\n `Machine supervisor error: ${(error as Error).message}. Retrying in ${Math.round(retryDelayMs / 1000)}s.`,\n );\n await delay(retryDelayMs);\n retryDelayMs = calculateBackoff(retryDelayMs);\n }\n }\n }\n }\n\n private async registerMachine(): Promise<MachineIdentity> {\n this.machineRegistrationReady = false;\n const directories = await this.directoryRegistry.list();\n const config = await this.configStore.load();\n const machineName = config.machine?.name ?? deriveMachineName();\n\n const directoryLabels = directories\n .filter((entry) => entry.label)\n .reduce<Record<string, string>>((acc, entry) => {\n if (entry.label) {\n acc[entry.path] = entry.label;\n }\n return acc;\n }, {});\n\n const payload: MachineRegisterRequest = {\n machine_id: config.machine?.id,\n machine_name: machineName,\n hostname: os.hostname(),\n platform: os.platform(),\n architecture: os.arch(),\n daemon_version: DAEMON_VERSION,\n directories: directories.map((entry) => entry.path),\n metadata: {\n last_boot_reason: process.env.OMNARA_DAEMON_BOOT_REASON ?? 'manual',\n ...(Object.keys(directoryLabels).length ? { directory_labels: directoryLabels } : {}),\n },\n };\n\n const accessToken = await this.authProvider.getAccessToken({ interactive: false });\n let response;\n try {\n response = await registerMachine(this.apiClient, accessToken, payload);\n } catch (error) {\n if (error instanceof ApiError && error.status === 404 && config.machine?.id) {\n this.logger.warn(`Stored machine id ${config.machine.id} was not found. Re-registering.`);\n await this.configStore.update((current) => {\n current.machine = {\n name: machineName,\n };\n });\n return await this.registerMachine();\n }\n Sentry.captureException(error);\n throw error;\n }\n\n const now = new Date();\n await this.configStore.update((current) => {\n current.machine = {\n id: response.machine.id,\n name: machineName,\n token: response.machine_token,\n tokenExpiresAt: new Date(\n now.getTime() + response.machine_token_expires_in * 1000,\n ).toISOString(),\n lastSeenAt: now.toISOString(),\n };\n });\n\n this.logger.info(\n `Registered machine ${response.machine.name} (${response.machine.id}) with backend`,\n );\n this.machineRegistrationReady = true;\n\n return {\n id: response.machine.id,\n token: response.machine_token,\n wsPath: response.machine_ws_path,\n };\n }\n\n private async runWebsocket(identity: MachineIdentity): Promise<void> {\n const url = buildMachineWebsocketUrl(this.backendUrl, identity.wsPath);\n this.logger.info(`Connecting to machine websocket at ${url}`);\n\n await new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(url, {\n headers: {\n authorization: `Bearer ${identity.token}`,\n },\n });\n this.websocket = ws;\n\n let done = false;\n let connectTimer: NodeJS.Timeout | null = null;\n\n const finish = (error?: Error) => {\n if (done) return;\n done = true;\n if (connectTimer) {\n clearTimeout(connectTimer);\n connectTimer = null;\n }\n this.clearHeartbeatTimer();\n this.websocket = null;\n safeCloseWebSocket(ws);\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n };\n\n connectTimer = setTimeout(() => {\n finish(new Error('machine websocket connection timed out'));\n }, CONNECT_TIMEOUT_MS);\n\n ws.on('open', () => {\n if (connectTimer) {\n clearTimeout(connectTimer);\n connectTimer = null;\n }\n this.logger.success('\u2713 Machine daemon connected to backend');\n void this.sendHeartbeat().catch((error) => {\n this.logger.error('Failed to send heartbeat:', error);\n });\n this.startHeartbeatTimer();\n });\n\n ws.on('message', (data) => {\n try {\n this.handleSocketMessage(data);\n } catch (error) {\n Sentry.captureException(error);\n this.logger.error('Failed to process machine message:', error);\n }\n });\n\n ws.on('close', (code, reason) => {\n if (connectTimer) {\n clearTimeout(connectTimer);\n connectTimer = null;\n }\n this.logger.warn(\n `Machine websocket closed (${code}${reason ? `: ${reason.toString()}` : ''})`,\n );\n if (this.stopRequested) {\n finish();\n } else {\n finish(new Error('machine websocket closed'));\n }\n });\n\n ws.on('error', (error) => {\n Sentry.captureException(error);\n this.logger.error('Machine websocket error:', error);\n finish(new Error('machine websocket error'));\n });\n });\n }\n\n private handleSocketMessage(raw: WebSocket.RawData): void {\n const decoded = decodeJson(raw);\n if (!decoded) {\n this.logger.warn('Ignoring malformed machine message');\n return;\n }\n\n const isValid = validateMachineMessage(decoded);\n if (!isValid) {\n this.logger.warn('Dropping invalid machine message payload');\n return;\n }\n\n const message = decoded as MachineMessage;\n if (message.type === 'rpc_request') {\n void this.handleRpcRequest(message);\n }\n }\n\n private async handleRpcRequest(message: MachineRpcRequest): Promise<void> {\n if (message.method === 'start_session') {\n await this.handleStartSession(message);\n } else if (message.method === 'stop_session') {\n await this.handleStopSession(message);\n } else {\n await this.sendRpcResponse(message.request_id, 'error', `Unknown method ${message.method}`);\n }\n }\n\n private async handleStartSession(message: MachineRpcRequest): Promise<void> {\n try {\n const payload = message.payload as MachineStartSessionPayload;\n const result = await this.launchWorkspaceSessionFromRpc(payload);\n await this.sendRpcResponse(message.request_id, 'ok', undefined, {\n launch_id: result.launchId,\n user_session_id: result.userSessionId,\n workspace_id: result.workspaceId,\n });\n } catch (error) {\n // Payment/billing errors are normalized upstream; translate to RPC status for 402s.\n if (error instanceof PaymentRequiredError) {\n const messageText = error.message || 'Payment required';\n await this.sendRpcResponse(message.request_id, 'payment_required', messageText, {\n message: messageText,\n });\n return;\n }\n\n Sentry.captureException(error);\n const messageText = error instanceof Error ? error.message : String(error);\n await this.sendRpcResponse(message.request_id, 'error', messageText);\n }\n }\n\n private async handleStopSession(message: MachineRpcRequest): Promise<void> {\n const payload = message.payload as MachineStopSessionPayload;\n const userSessionId = payload.user_session_id;\n\n try {\n const stopped = await this.sessionManager.stopSession(userSessionId);\n if (stopped) {\n this.logger.info(`Stopped session ${userSessionId}`);\n await this.sendRpcResponse(message.request_id, 'ok');\n } else {\n this.logger.debug(`Session ${userSessionId} was not running`);\n await this.sendRpcResponse(message.request_id, 'not_found', 'Session not running');\n }\n } catch (error) {\n Sentry.captureException(error);\n const messageText = error instanceof Error ? error.message : String(error);\n this.logger.warn(`Failed to stop session ${userSessionId}: ${messageText}`);\n await this.sendRpcResponse(message.request_id, 'error', messageText);\n }\n }\n\n private async sendRpcResponse(\n requestId: string,\n status: MachineRpcResponse['status'],\n error?: string,\n body?: MachineRpcResponse['payload'],\n ): Promise<void> {\n const response: MachineRpcResponse = {\n type: 'rpc_response',\n request_id: requestId,\n status,\n };\n if (error) {\n response.error = error;\n }\n if (body) {\n response.payload = body;\n }\n await this.sendMessage(response);\n }\n\n private async launchWorkspaceSessionFromRpc(\n payload: MachineStartSessionPayload,\n ): Promise<LaunchSessionResult> {\n return await this.launchWorkspaceSession({\n launchId: payload.launch_id ?? undefined,\n directory: payload.directory,\n workspaceId: payload.workspace_id ?? null,\n workspaceConfig: payload.workspace_config ?? undefined,\n userSessionId: payload.user_session_id,\n initialPrompt: payload.initial_prompt ?? null,\n metadata: payload.metadata ?? null,\n worktreeName: payload.worktree_name ?? null,\n source: 'rpc',\n });\n }\n\n private async launchWorkspaceSession(\n options: LaunchSessionOptions,\n ): Promise<LaunchSessionResult> {\n await this.waitForMachineRegistration();\n const entry = await this.directoryRegistry.getEntry(options.directory);\n if (!entry) {\n throw new Error(`Directory ${options.directory} is not registered with the daemon`);\n }\n\n const metadata = this.buildWorkspaceMetadata(entry, options.metadata);\n const workspace = await this.ensureWorkspaceForDirectory(entry.path, metadata);\n if (options.workspaceId && options.workspaceId !== workspace.id) {\n this.logger.warn(\n `Workspace id mismatch for ${entry.path}: expected ${options.workspaceId}, got ${workspace.id}`,\n );\n }\n\n const userSession = await this.ensureUserSessionForWorkspace(\n workspace.id,\n options.userSessionId,\n options.source,\n );\n const workspaceConfig = options.workspaceConfig ?? workspace.workspace_config;\n const launchId = options.launchId ?? randomUUID();\n\n // If worktreeName is explicitly null/undefined, don't create a worktree\n // If worktreeName is \"omnara-changes\", generate a random name\n // Otherwise use the provided name\n const resolvedWorktreeName =\n options.worktreeName === null || options.worktreeName === undefined\n ? null\n : options.worktreeName === 'omnara-changes'\n ? generateWorktreeName()\n : options.worktreeName;\n\n await this.sessionManager.startSession({\n launchId,\n directory: entry.path,\n userSessionId: userSession.session_id,\n workspaceId: workspace.id,\n workspaceConfig,\n initialPrompt: options.initialPrompt ?? null,\n metadata,\n worktreeName: resolvedWorktreeName,\n });\n return {\n launchId,\n userSessionId: userSession.session_id,\n workspaceId: workspace.id,\n workspaceConfig,\n };\n }\n\n private async ensureWorkspaceForDirectory(\n directory: string,\n metadata: Record<string, unknown> | null,\n ): Promise<WorkspaceDescriptor> {\n return await this.ensureWorkspaceWithRetry(directory, metadata, 0);\n }\n\n private async ensureWorkspaceWithRetry(\n directory: string,\n metadata: Record<string, unknown> | null,\n attempt: number,\n ): Promise<WorkspaceDescriptor> {\n const machineId = await this.getMachineId();\n const accessToken = await this.authProvider.getAccessToken({ interactive: false });\n try {\n return await ensureWorkspace(this.apiClient, accessToken, {\n machine_id: machineId,\n local_path: directory,\n workspace_metadata: metadata ?? undefined,\n });\n } catch (error) {\n if (error instanceof ApiError && error.status === 404 && attempt === 0) {\n await this.recoverMachineRegistration('workspace ensure returned 404');\n return await this.ensureWorkspaceWithRetry(directory, metadata, attempt + 1);\n }\n Sentry.captureException(error);\n throw error;\n }\n }\n\n private async ensureUserSessionForWorkspace(\n workspaceId: string,\n userSessionId: string | null | undefined,\n source: 'local' | 'rpc',\n ): Promise<UserSessionDescriptor> {\n const accessToken = await this.authProvider.getAccessToken({ interactive: false });\n return await ensureUserSession(this.apiClient, accessToken, {\n workspaceId,\n userSessionId: userSessionId ?? undefined,\n metadata: { source },\n });\n }\n\n private buildWorkspaceMetadata(\n entry: DirectoryEntry,\n metadata: Record<string, unknown> | null | undefined,\n ): Record<string, unknown> | null {\n const combined: Record<string, unknown> = {};\n if (entry.label) {\n combined.label = entry.label;\n }\n if (metadata) {\n Object.assign(combined, metadata);\n }\n return Object.keys(combined).length > 0 ? combined : null;\n }\n\n private async getMachineId(): Promise<string> {\n const config = await this.configStore.load();\n const machineId = config.machine?.id;\n if (!machineId) {\n throw new Error('Machine has not been registered with the backend yet');\n }\n return machineId;\n }\n\n private async waitForMachineRegistration(): Promise<void> {\n const deadline = Date.now() + 10_000;\n while (Date.now() < deadline) {\n if (this.machineRegistrationReady) {\n const id = await this.configStore.load().then((cfg) => cfg.machine?.id);\n if (id) {\n return;\n }\n }\n await delay(250);\n }\n throw new Error('Machine has not finished registering yet. Try again in a few seconds.');\n }\n\n private startHeartbeatTimer(): void {\n this.clearHeartbeatTimer();\n this.heartbeatTimer = setInterval(() => {\n void this.sendHeartbeat().catch((error) => {\n Sentry.captureException(error);\n this.logger.error('Failed to send heartbeat:', error);\n });\n }, HEARTBEAT_INTERVAL_MS);\n }\n\n private clearHeartbeatTimer(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private async sendHeartbeat(): Promise<void> {\n const directories = await this.directoryRegistry.list();\n const payload: MachineHeartbeatMessage = {\n type: 'heartbeat',\n status: 'ONLINE',\n metadata: {\n hostname: os.hostname(),\n platform: os.platform(),\n architecture: os.arch(),\n daemon_version: DAEMON_VERSION,\n },\n directories: directories.map((entry) => entry.path),\n };\n await this.sendMessage(payload);\n }\n\n private async sendMessage(payload: unknown): Promise<void> {\n const ws = this.websocket;\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n throw new Error('Machine websocket is not connected');\n }\n await new Promise<void>((resolve, reject) => {\n ws.send(JSON.stringify(payload), (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n }\n\n private clearLoginWait(): void {\n if (this.waitingForLogin) {\n this.waitingForLogin = false;\n this.logger.info('Machine supervisor detected refreshed credentials. Resuming operations.');\n }\n }\n\n private async closeWebsocket(): Promise<void> {\n this.clearHeartbeatTimer();\n if (!this.websocket) {\n return;\n }\n await new Promise<void>((resolve) => {\n this.websocket?.once('close', () => resolve());\n try {\n this.websocket?.close();\n } catch {\n resolve();\n }\n });\n this.websocket = null;\n }\n\n private async recoverMachineRegistration(reason: string): Promise<void> {\n this.logger.warn(`Machine registration invalid. ${reason} \u2013 refreshing registration.`);\n await this.configStore.update((current) => {\n const name = current.machine?.name;\n current.machine = name ? { name } : undefined;\n });\n this.machineRegistrationReady = false;\n await this.closeWebsocket();\n await this.waitForMachineRegistration();\n }\n}\n\nfunction buildMachineWebsocketUrl(baseUrl: string, path: string): string {\n const url = new URL(baseUrl);\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n url.search = '';\n url.hash = '';\n url.pathname = path.startsWith('/') ? path : `/${path}`;\n return url.toString();\n}\n\nfunction isLoginRequiredError(error: unknown): error is AuthContextError {\n return (\n error instanceof AuthContextError &&\n (error.code === 'missing_credentials' || error.code === 'invalid_credentials')\n );\n}\n\nfunction isUnauthorizedApiError(error: unknown): error is ApiError {\n return error instanceof ApiError && (error.status === 401 || error.status === 403);\n}\n\nfunction deriveMachineName(): string {\n return process.env.OMNARA_MACHINE_NAME || os.hostname();\n}\n\nfunction decodeJson(raw: WebSocket.RawData): unknown {\n const text = typeof raw === 'string' ? raw : raw.toString('utf8');\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return null;\n }\n}\n", "[\n \"abacus\",\n \"abdomen\",\n \"abdominal\",\n \"abide\",\n \"abiding\",\n \"ability\",\n \"ablaze\",\n \"able\",\n \"abnormal\",\n \"abrasion\",\n \"abrasive\",\n \"abreast\",\n \"abridge\",\n \"abroad\",\n \"abruptly\",\n \"absence\",\n \"absentee\",\n \"absently\",\n \"absinthe\",\n \"absolute\",\n \"absolve\",\n \"abstain\",\n \"abstract\",\n \"absurd\",\n \"accent\",\n \"acclaim\",\n \"acclimate\",\n \"accompany\",\n \"account\",\n \"accuracy\",\n \"accurate\",\n \"accustom\",\n \"acetone\",\n \"achiness\",\n \"aching\",\n \"acid\",\n \"acorn\",\n \"acquaint\",\n \"acquire\",\n \"acre\",\n \"acrobat\",\n \"acronym\",\n \"acting\",\n \"action\",\n \"activate\",\n \"activator\",\n \"active\",\n \"activism\",\n \"activist\",\n \"activity\",\n \"actress\",\n \"acts\",\n \"acutely\",\n \"acuteness\",\n \"aeration\",\n \"aerobics\",\n \"aerosol\",\n \"aerospace\",\n \"afar\",\n \"affair\",\n \"affected\",\n \"affecting\",\n \"affection\",\n \"affidavit\",\n \"affiliate\",\n \"affirm\",\n \"affix\",\n \"afflicted\",\n \"affluent\",\n \"afford\",\n \"affront\",\n \"aflame\",\n \"afloat\",\n \"aflutter\",\n \"afoot\",\n \"afraid\",\n \"afterglow\",\n \"afterlife\",\n \"aftermath\",\n \"aftermost\",\n \"afternoon\",\n \"aged\",\n \"ageless\",\n \"agency\",\n \"agenda\",\n \"agent\",\n \"aggregate\",\n \"aghast\",\n \"agile\",\n \"agility\",\n \"aging\",\n \"agnostic\",\n \"agonize\",\n \"agonizing\",\n \"agony\",\n \"agreeable\",\n \"agreeably\",\n \"agreed\",\n \"agreeing\",\n \"agreement\",\n \"aground\",\n \"ahead\",\n \"ahoy\",\n \"aide\",\n \"aids\",\n \"aim\",\n \"ajar\",\n \"alabaster\",\n \"alarm\",\n \"albatross\",\n \"album\",\n \"alfalfa\",\n \"algebra\",\n \"algorithm\",\n \"alias\",\n \"alibi\",\n \"alienable\",\n \"alienate\",\n \"aliens\",\n \"alike\",\n \"alive\",\n \"alkaline\",\n \"alkalize\",\n \"almanac\",\n \"almighty\",\n \"almost\",\n \"aloe\",\n \"aloft\",\n \"aloha\",\n \"alone\",\n \"alongside\",\n \"aloof\",\n \"alphabet\",\n \"alright\",\n \"although\",\n \"altitude\",\n \"alto\",\n \"aluminum\",\n \"alumni\",\n \"always\",\n \"amaretto\",\n \"amaze\",\n \"amazingly\",\n \"amber\",\n \"ambiance\",\n \"ambiguity\",\n \"ambiguous\",\n \"ambition\",\n \"ambitious\",\n \"ambulance\",\n \"ambush\",\n \"amendable\",\n \"amendment\",\n \"amends\",\n \"amenity\",\n \"amiable\",\n \"amicably\",\n \"amid\",\n \"amigo\",\n \"amino\",\n \"amiss\",\n \"ammonia\",\n \"ammonium\",\n \"amnesty\",\n \"amniotic\",\n \"among\",\n \"amount\",\n \"amperage\",\n \"ample\",\n \"amplifier\",\n \"amplify\",\n \"amply\",\n \"amuck\",\n \"amulet\",\n \"amusable\",\n \"amused\",\n \"amusement\",\n \"amuser\",\n \"amusing\",\n \"anaconda\",\n \"anaerobic\",\n \"anagram\",\n \"anatomist\",\n \"anatomy\",\n \"anchor\",\n \"anchovy\",\n \"ancient\",\n \"android\",\n \"anemia\",\n \"anemic\",\n \"aneurism\",\n \"anew\",\n \"angelfish\",\n \"angelic\",\n \"anger\",\n \"angled\",\n \"angler\",\n \"angles\",\n \"angling\",\n \"angrily\",\n \"angriness\",\n \"anguished\",\n \"angular\",\n \"animal\",\n \"animate\",\n \"animating\",\n \"animation\",\n \"animator\",\n \"anime\",\n \"animosity\",\n \"ankle\",\n \"annex\",\n \"annotate\",\n \"announcer\",\n \"annoying\",\n \"annually\",\n \"annuity\",\n \"anointer\",\n \"another\",\n \"answering\",\n \"antacid\",\n \"antarctic\",\n \"anteater\",\n \"antelope\",\n \"antennae\",\n \"anthem\",\n \"anthill\",\n \"anthology\",\n \"antibody\",\n \"antics\",\n \"antidote\",\n \"antihero\",\n \"antiquely\",\n \"antiques\",\n \"antiquity\",\n \"antirust\",\n \"antitoxic\",\n \"antitrust\",\n \"antiviral\",\n \"antivirus\",\n \"antler\",\n \"antonym\",\n \"antsy\",\n \"anvil\",\n \"anybody\",\n \"anyhow\",\n \"anymore\",\n \"anyone\",\n \"anyplace\",\n \"anything\",\n \"anytime\",\n \"anyway\",\n \"anywhere\",\n \"aorta\",\n \"apache\",\n \"apostle\",\n \"appealing\",\n \"appear\",\n \"appease\",\n \"appeasing\",\n \"appendage\",\n \"appendix\",\n \"appetite\",\n \"appetizer\",\n \"applaud\",\n \"applause\",\n \"apple\",\n \"appliance\",\n \"applicant\",\n \"applied\",\n \"apply\",\n \"appointee\",\n \"appraisal\",\n \"appraiser\",\n \"apprehend\",\n \"approach\",\n \"approval\",\n \"approve\",\n \"apricot\",\n \"april\",\n \"apron\",\n \"aptitude\",\n \"aptly\",\n \"aqua\",\n \"aqueduct\",\n \"arbitrary\",\n \"arbitrate\",\n \"ardently\",\n \"area\",\n \"arena\",\n \"arguable\",\n \"arguably\",\n \"argue\",\n \"arise\",\n \"armadillo\",\n \"armband\",\n \"armchair\",\n \"armed\",\n \"armful\",\n \"armhole\",\n \"arming\",\n \"armless\",\n \"armoire\",\n \"armored\",\n \"armory\",\n \"armrest\",\n \"army\",\n \"aroma\",\n \"arose\",\n \"around\",\n \"arousal\",\n \"arrange\",\n \"array\",\n \"arrest\",\n \"arrival\",\n \"arrive\",\n \"arrogance\",\n \"arrogant\",\n \"arson\",\n \"art\",\n \"ascend\",\n \"ascension\",\n \"ascent\",\n \"ascertain\",\n \"ashamed\",\n \"ashen\",\n \"ashes\",\n \"ashy\",\n \"aside\",\n \"askew\",\n \"asleep\",\n \"asparagus\",\n \"aspect\",\n \"aspirate\",\n \"aspire\",\n \"aspirin\",\n \"astonish\",\n \"astound\",\n \"astride\",\n \"astrology\",\n \"astronaut\",\n \"astronomy\",\n \"astute\",\n \"atlantic\",\n \"atlas\",\n \"atom\",\n \"atonable\",\n \"atop\",\n \"atrium\",\n \"atrocious\",\n \"atrophy\",\n \"attach\",\n \"attain\",\n \"attempt\",\n \"attendant\",\n \"attendee\",\n \"attention\",\n \"attentive\",\n \"attest\",\n \"attic\",\n \"attire\",\n \"attitude\",\n \"attractor\",\n \"attribute\",\n \"atypical\",\n \"auction\",\n \"audacious\",\n \"audacity\",\n \"audible\",\n \"audibly\",\n \"audience\",\n \"audio\",\n \"audition\",\n \"augmented\",\n \"august\",\n \"authentic\",\n \"author\",\n \"autism\",\n \"autistic\",\n \"autograph\",\n \"automaker\",\n \"automated\",\n \"automatic\",\n \"autopilot\",\n \"available\",\n \"avalanche\",\n \"avatar\",\n \"avenge\",\n \"avenging\",\n \"avenue\",\n \"average\",\n \"aversion\",\n \"avert\",\n \"aviation\",\n \"aviator\",\n \"avid\",\n \"avoid\",\n \"await\",\n \"awaken\",\n \"award\",\n \"aware\",\n \"awhile\",\n \"awkward\",\n \"awning\",\n \"awoke\",\n \"awry\",\n \"axis\",\n \"babble\",\n \"babbling\",\n \"babied\",\n \"baboon\",\n \"backache\",\n \"backboard\",\n \"backboned\",\n \"backdrop\",\n \"backed\",\n \"backer\",\n \"backfield\",\n \"backfire\",\n \"backhand\",\n \"backing\",\n \"backlands\",\n \"backlash\",\n \"backless\",\n \"backlight\",\n \"backlit\",\n \"backlog\",\n \"backpack\",\n \"backpedal\",\n \"backrest\",\n \"backroom\",\n \"backshift\",\n \"backside\",\n \"backslid\",\n \"backspace\",\n \"backspin\",\n \"backstab\",\n \"backstage\",\n \"backtalk\",\n \"backtrack\",\n \"backup\",\n \"backward\",\n \"backwash\",\n \"backwater\",\n \"backyard\",\n \"bacon\",\n \"bacteria\",\n \"bacterium\",\n \"badass\",\n \"badge\",\n \"badland\",\n \"badly\",\n \"badness\",\n \"baffle\",\n \"baffling\",\n \"bagel\",\n \"bagful\",\n \"baggage\",\n \"bagged\",\n \"baggie\",\n \"bagginess\",\n \"bagging\",\n \"baggy\",\n \"bagpipe\",\n \"baguette\",\n \"baked\",\n \"bakery\",\n \"bakeshop\",\n \"baking\",\n \"balance\",\n \"balancing\",\n \"balcony\",\n \"balmy\",\n \"balsamic\",\n \"bamboo\",\n \"banana\",\n \"banish\",\n \"banister\",\n \"banjo\",\n \"bankable\",\n \"bankbook\",\n \"banked\",\n \"banker\",\n \"banking\",\n \"banknote\",\n \"bankroll\",\n \"banner\",\n \"bannister\",\n \"banshee\",\n \"banter\",\n \"barbecue\",\n \"barbed\",\n \"barbell\",\n \"barber\",\n \"barcode\",\n \"barge\",\n \"bargraph\",\n \"barista\",\n \"baritone\",\n \"barley\",\n \"barmaid\",\n \"barman\",\n \"barn\",\n \"barometer\",\n \"barrack\",\n \"barracuda\",\n \"barrel\",\n \"barrette\",\n \"barricade\",\n \"barrier\",\n \"barstool\",\n \"bartender\",\n \"barterer\",\n \"bash\",\n \"basically\",\n \"basics\",\n \"basil\",\n \"basin\",\n \"basis\",\n \"basket\",\n \"batboy\",\n \"batch\",\n \"bath\",\n \"baton\",\n \"bats\",\n \"battalion\",\n \"battered\",\n \"battering\",\n \"battery\",\n \"batting\",\n \"battle\",\n \"bauble\",\n \"bazooka\",\n \"blabber\",\n \"bladder\",\n \"blade\",\n \"blah\",\n \"blame\",\n \"blaming\",\n \"blanching\",\n \"blandness\",\n \"blank\",\n \"blaspheme\",\n \"blasphemy\",\n \"blast\",\n \"blatancy\",\n \"blatantly\",\n \"blazer\",\n \"blazing\",\n \"bleach\",\n \"bleak\",\n \"bleep\",\n \"blemish\",\n \"blend\",\n \"bless\",\n \"blighted\",\n \"blimp\",\n \"bling\",\n \"blinked\",\n \"blinker\",\n \"blinking\",\n \"blinks\",\n \"blip\",\n \"blissful\",\n \"blitz\",\n \"blizzard\",\n \"bloated\",\n \"bloating\",\n \"blob\",\n \"blog\",\n \"bloomers\",\n \"blooming\",\n \"blooper\",\n \"blot\",\n \"blouse\",\n \"blubber\",\n \"bluff\",\n \"bluish\",\n \"blunderer\",\n \"blunt\",\n \"blurb\",\n \"blurred\",\n \"blurry\",\n \"blurt\",\n \"blush\",\n \"blustery\",\n \"boaster\",\n \"boastful\",\n \"boasting\",\n \"boat\",\n \"bobbed\",\n \"bobbing\",\n \"bobble\",\n \"bobcat\",\n \"bobsled\",\n \"bobtail\",\n \"bodacious\",\n \"body\",\n \"bogged\",\n \"boggle\",\n \"bogus\",\n \"boil\",\n \"bok\",\n \"bolster\",\n \"bolt\",\n \"bonanza\",\n \"bonded\",\n \"bonding\",\n \"bondless\",\n \"boned\",\n \"bonehead\",\n \"boneless\",\n \"bonelike\",\n \"boney\",\n \"bonfire\",\n \"bonnet\",\n \"bonsai\",\n \"bonus\",\n \"bony\",\n \"boogeyman\",\n \"boogieman\",\n \"book\",\n \"boondocks\",\n \"booted\",\n \"booth\",\n \"bootie\",\n \"booting\",\n \"bootlace\",\n \"bootleg\",\n \"boots\",\n \"boozy\",\n \"borax\",\n \"boring\",\n \"borough\",\n \"borrower\",\n \"borrowing\",\n \"boss\",\n \"botanical\",\n \"botanist\",\n \"botany\",\n \"botch\",\n \"both\",\n \"bottle\",\n \"bottling\",\n \"bottom\",\n \"bounce\",\n \"bouncing\",\n \"bouncy\",\n \"bounding\",\n \"boundless\",\n \"bountiful\",\n \"bovine\",\n \"boxcar\",\n \"boxer\",\n \"boxing\",\n \"boxlike\",\n \"boxy\",\n \"breach\",\n \"breath\",\n \"breeches\",\n \"breeching\",\n \"breeder\",\n \"breeding\",\n \"breeze\",\n \"breezy\",\n \"brethren\",\n \"brewery\",\n \"brewing\",\n \"briar\",\n \"bribe\",\n \"brick\",\n \"bride\",\n \"bridged\",\n \"brigade\",\n \"bright\",\n \"brilliant\",\n \"brim\",\n \"bring\",\n \"brink\",\n \"brisket\",\n \"briskly\",\n \"briskness\",\n \"bristle\",\n \"brittle\",\n \"broadband\",\n \"broadcast\",\n \"broaden\",\n \"broadly\",\n \"broadness\",\n \"broadside\",\n \"broadways\",\n \"broiler\",\n \"broiling\",\n \"broken\",\n \"broker\",\n \"bronchial\",\n \"bronco\",\n \"bronze\",\n \"bronzing\",\n \"brook\",\n \"broom\",\n \"brought\",\n \"browbeat\",\n \"brownnose\",\n \"browse\",\n \"browsing\",\n \"bruising\",\n \"brunch\",\n \"brunette\",\n \"brunt\",\n \"brush\",\n \"brussels\",\n \"brute\",\n \"brutishly\",\n \"bubble\",\n \"bubbling\",\n \"bubbly\",\n \"buccaneer\",\n \"bucked\",\n \"bucket\",\n \"buckle\",\n \"buckshot\",\n \"buckskin\",\n \"bucktooth\",\n \"buckwheat\",\n \"buddhism\",\n \"buddhist\",\n \"budding\",\n \"buddy\",\n \"budget\",\n \"buffalo\",\n \"buffed\",\n \"buffer\",\n \"buffing\",\n \"buffoon\",\n \"buggy\",\n \"bulb\",\n \"bulge\",\n \"bulginess\",\n \"bulgur\",\n \"bulk\",\n \"bulldog\",\n \"bulldozer\",\n \"bullfight\",\n \"bullfrog\",\n \"bullhorn\",\n \"bullion\",\n \"bullish\",\n \"bullpen\",\n \"bullring\",\n \"bullseye\",\n \"bullwhip\",\n \"bully\",\n \"bunch\",\n \"bundle\",\n \"bungee\",\n \"bunion\",\n \"bunkbed\",\n \"bunkhouse\",\n \"bunkmate\",\n \"bunny\",\n \"bunt\",\n \"busboy\",\n \"bush\",\n \"busily\",\n \"busload\",\n \"bust\",\n \"busybody\",\n \"buzz\",\n \"cabana\",\n \"cabbage\",\n \"cabbie\",\n \"cabdriver\",\n \"cable\",\n \"caboose\",\n \"cache\",\n \"cackle\",\n \"cacti\",\n \"cactus\",\n \"caddie\",\n \"caddy\",\n \"cadet\",\n \"cadillac\",\n \"cadmium\",\n \"cage\",\n \"cahoots\",\n \"cake\",\n \"calamari\",\n \"calamity\",\n \"calcium\",\n \"calculate\",\n \"calculus\",\n \"caliber\",\n \"calibrate\",\n \"calm\",\n \"caloric\",\n \"calorie\",\n \"calzone\",\n \"camcorder\",\n \"cameo\",\n \"camera\",\n \"camisole\",\n \"camper\",\n \"campfire\",\n \"camping\",\n \"campsite\",\n \"campus\",\n \"canal\",\n \"canary\",\n \"cancel\",\n \"candied\",\n \"candle\",\n \"candy\",\n \"cane\",\n \"canine\",\n \"canister\",\n \"cannabis\",\n \"canned\",\n \"canning\",\n \"cannon\",\n \"cannot\",\n \"canola\",\n \"canon\",\n \"canopener\",\n \"canopy\",\n \"canteen\",\n \"canyon\",\n \"capable\",\n \"capably\",\n \"capacity\",\n \"cape\",\n \"capillary\",\n \"capital\",\n \"capitol\",\n \"capped\",\n \"capricorn\",\n \"capsize\",\n \"capsule\",\n \"caption\",\n \"captivate\",\n \"captive\",\n \"captivity\",\n \"capture\",\n \"caramel\",\n \"carat\",\n \"caravan\",\n \"carbon\",\n \"cardboard\",\n \"carded\",\n \"cardiac\",\n \"cardigan\",\n \"cardinal\",\n \"cardstock\",\n \"carefully\",\n \"caregiver\",\n \"careless\",\n \"caress\",\n \"caretaker\",\n \"cargo\",\n \"caring\",\n \"carless\",\n \"carload\",\n \"carmaker\",\n \"carnage\",\n \"carnation\",\n \"carnival\",\n \"carnivore\",\n \"carol\",\n \"carpenter\",\n \"carpentry\",\n \"carpool\",\n \"carport\",\n \"carried\",\n \"carrot\",\n \"carrousel\",\n \"carry\",\n \"cartel\",\n \"cartload\",\n \"carton\",\n \"cartoon\",\n \"cartridge\",\n \"cartwheel\",\n \"carve\",\n \"carving\",\n \"carwash\",\n \"cascade\",\n \"case\",\n \"cash\",\n \"casing\",\n \"casino\",\n \"casket\",\n \"cassette\",\n \"casually\",\n \"casualty\",\n \"catacomb\",\n \"catalog\",\n \"catalyst\",\n \"catalyze\",\n \"catapult\",\n \"cataract\",\n \"catatonic\",\n \"catcall\",\n \"catchable\",\n \"catcher\",\n \"catching\",\n \"catchy\",\n \"caterer\",\n \"catering\",\n \"catfight\",\n \"catfish\",\n \"cathedral\",\n \"cathouse\",\n \"catlike\",\n \"catnap\",\n \"catnip\",\n \"catsup\",\n \"cattail\",\n \"cattishly\",\n \"cattle\",\n \"catty\",\n \"catwalk\",\n \"caucasian\",\n \"caucus\",\n \"causal\",\n \"causation\",\n \"cause\",\n \"causing\",\n \"cauterize\",\n \"caution\",\n \"cautious\",\n \"cavalier\",\n \"cavalry\",\n \"caviar\",\n \"cavity\",\n \"cedar\",\n \"celery\",\n \"celestial\",\n \"celibacy\",\n \"celibate\",\n \"celtic\",\n \"cement\",\n \"census\",\n \"ceramics\",\n \"ceremony\",\n \"certainly\",\n \"certainty\",\n \"certified\",\n \"certify\",\n \"cesarean\",\n \"cesspool\",\n \"chafe\",\n \"chaffing\",\n \"chain\",\n \"chair\",\n \"chalice\",\n \"challenge\",\n \"chamber\",\n \"chamomile\",\n \"champion\",\n \"chance\",\n \"change\",\n \"channel\",\n \"chant\",\n \"chaos\",\n \"chaperone\",\n \"chaplain\",\n \"chapped\",\n \"chaps\",\n \"chapter\",\n \"character\",\n \"charbroil\",\n \"charcoal\",\n \"charger\",\n \"charging\",\n \"chariot\",\n \"charity\",\n \"charm\",\n \"charred\",\n \"charter\",\n \"charting\",\n \"chase\",\n \"chasing\",\n \"chaste\",\n \"chastise\",\n \"chastity\",\n \"chatroom\",\n \"chatter\",\n \"chatting\",\n \"chatty\",\n \"cheating\",\n \"cheddar\",\n \"cheek\",\n \"cheer\",\n \"cheese\",\n \"cheesy\",\n \"chef\",\n \"chemicals\",\n \"chemist\",\n \"chemo\",\n \"cherisher\",\n \"cherub\",\n \"chess\",\n \"chest\",\n \"chevron\",\n \"chevy\",\n \"chewable\",\n \"chewer\",\n \"chewing\",\n \"chewy\",\n \"chief\",\n \"chihuahua\",\n \"childcare\",\n \"childhood\",\n \"childish\",\n \"childless\",\n \"childlike\",\n \"chili\",\n \"chill\",\n \"chimp\",\n \"chip\",\n \"chirping\",\n \"chirpy\",\n \"chitchat\",\n \"chivalry\",\n \"chive\",\n \"chloride\",\n \"chlorine\",\n \"choice\",\n \"chokehold\",\n \"choking\",\n \"chomp\",\n \"chooser\",\n \"choosing\",\n \"choosy\",\n \"chop\",\n \"chosen\",\n \"chowder\",\n \"chowtime\",\n \"chrome\",\n \"chubby\",\n \"chuck\",\n \"chug\",\n \"chummy\",\n \"chump\",\n \"chunk\",\n \"churn\",\n \"chute\",\n \"cider\",\n \"cilantro\",\n \"cinch\",\n \"cinema\",\n \"cinnamon\",\n \"circle\",\n \"circling\",\n \"circular\",\n \"circulate\",\n \"circus\",\n \"citable\",\n \"citadel\",\n \"citation\",\n \"citizen\",\n \"citric\",\n \"citrus\",\n \"city\",\n \"civic\",\n \"civil\",\n \"clad\",\n \"claim\",\n \"clambake\",\n \"clammy\",\n \"clamor\",\n \"clamp\",\n \"clamshell\",\n \"clang\",\n \"clanking\",\n \"clapped\",\n \"clapper\",\n \"clapping\",\n \"clarify\",\n \"clarinet\",\n \"clarity\",\n \"clash\",\n \"clasp\",\n \"class\",\n \"clatter\",\n \"clause\",\n \"clavicle\",\n \"claw\",\n \"clay\",\n \"clean\",\n \"clear\",\n \"cleat\",\n \"cleaver\",\n \"cleft\",\n \"clench\",\n \"clergyman\",\n \"clerical\",\n \"clerk\",\n \"clever\",\n \"clicker\",\n \"client\",\n \"climate\",\n \"climatic\",\n \"cling\",\n \"clinic\",\n \"clinking\",\n \"clip\",\n \"clique\",\n \"cloak\",\n \"clobber\",\n \"clock\",\n \"clone\",\n \"cloning\",\n \"closable\",\n \"closure\",\n \"clothes\",\n \"clothing\",\n \"cloud\",\n \"clover\",\n \"clubbed\",\n \"clubbing\",\n \"clubhouse\",\n \"clump\",\n \"clumsily\",\n \"clumsy\",\n \"clunky\",\n \"clustered\",\n \"clutch\",\n \"clutter\",\n \"coach\",\n \"coagulant\",\n \"coastal\",\n \"coaster\",\n \"coasting\",\n \"coastland\",\n \"coastline\",\n \"coat\",\n \"coauthor\",\n \"cobalt\",\n \"cobbler\",\n \"cobweb\",\n \"cocoa\",\n \"coconut\",\n \"cod\",\n \"coeditor\",\n \"coerce\",\n \"coexist\",\n \"coffee\",\n \"cofounder\",\n \"cognition\",\n \"cognitive\",\n \"cogwheel\",\n \"coherence\",\n \"coherent\",\n \"cohesive\",\n \"coil\",\n \"coke\",\n \"cola\",\n \"cold\",\n \"coleslaw\",\n \"coliseum\",\n \"collage\",\n \"collapse\",\n \"collar\",\n \"collected\",\n \"collector\",\n \"collide\",\n \"collie\",\n \"collision\",\n \"colonial\",\n \"colonist\",\n \"colonize\",\n \"colony\",\n \"colossal\",\n \"colt\",\n \"coma\",\n \"come\",\n \"comfort\",\n \"comfy\",\n \"comic\",\n \"coming\",\n \"comma\",\n \"commence\",\n \"commend\",\n \"comment\",\n \"commerce\",\n \"commode\",\n \"commodity\",\n \"commodore\",\n \"common\",\n \"commotion\",\n \"commute\",\n \"commuting\",\n \"compacted\",\n \"compacter\",\n \"compactly\",\n \"compactor\",\n \"companion\",\n \"company\",\n \"compare\",\n \"compel\",\n \"compile\",\n \"comply\",\n \"component\",\n \"composed\",\n \"composer\",\n \"composite\",\n \"compost\",\n \"composure\",\n \"compound\",\n \"compress\",\n \"comprised\",\n \"computer\",\n \"computing\",\n \"comrade\",\n \"concave\",\n \"conceal\",\n \"conceded\",\n \"concept\",\n \"concerned\",\n \"concert\",\n \"conch\",\n \"concierge\",\n \"concise\",\n \"conclude\",\n \"concrete\",\n \"concur\",\n \"condense\",\n \"condiment\",\n \"condition\",\n \"condone\",\n \"conducive\",\n \"conductor\",\n \"conduit\",\n \"cone\",\n \"confess\",\n \"confetti\",\n \"confidant\",\n \"confident\",\n \"confider\",\n \"confiding\",\n \"configure\",\n \"confined\",\n \"confining\",\n \"confirm\",\n \"conflict\",\n \"conform\",\n \"confound\",\n \"confront\",\n \"confused\",\n \"confusing\",\n \"confusion\",\n \"congenial\",\n \"congested\",\n \"congrats\",\n \"congress\",\n \"conical\",\n \"conjoined\",\n \"conjure\",\n \"conjuror\",\n \"connected\",\n \"connector\",\n \"consensus\",\n \"consent\",\n \"console\",\n \"consoling\",\n \"consonant\",\n \"constable\",\n \"constant\",\n \"constrain\",\n \"constrict\",\n \"construct\",\n \"consult\",\n \"consumer\",\n \"consuming\",\n \"contact\",\n \"container\",\n \"contempt\",\n \"contend\",\n \"contented\",\n \"contently\",\n \"contents\",\n \"contest\",\n \"context\",\n \"contort\",\n \"contour\",\n \"contrite\",\n \"control\",\n \"contusion\",\n \"convene\",\n \"convent\",\n \"copartner\",\n \"cope\",\n \"copied\",\n \"copier\",\n \"copilot\",\n \"coping\",\n \"copious\",\n \"copper\",\n \"copy\",\n \"coral\",\n \"cork\",\n \"cornball\",\n \"cornbread\",\n \"corncob\",\n \"cornea\",\n \"corned\",\n \"corner\",\n \"cornfield\",\n \"cornflake\",\n \"cornhusk\",\n \"cornmeal\",\n \"cornstalk\",\n \"corny\",\n \"coronary\",\n \"coroner\",\n \"corporal\",\n \"corporate\",\n \"corral\",\n \"correct\",\n \"corridor\",\n \"corrode\",\n \"corroding\",\n \"corrosive\",\n \"corsage\",\n \"corset\",\n \"cortex\",\n \"cosigner\",\n \"cosmetics\",\n \"cosmic\",\n \"cosmos\",\n \"cosponsor\",\n \"cost\",\n \"cottage\",\n \"cotton\",\n \"couch\",\n \"cough\",\n \"could\",\n \"countable\",\n \"countdown\",\n \"counting\",\n \"countless\",\n \"country\",\n \"county\",\n \"courier\",\n \"covenant\",\n \"cover\",\n \"coveted\",\n \"coveting\",\n \"coyness\",\n \"cozily\",\n \"coziness\",\n \"cozy\",\n \"crabbing\",\n \"crabgrass\",\n \"crablike\",\n \"crabmeat\",\n \"cradle\",\n \"cradling\",\n \"crafter\",\n \"craftily\",\n \"craftsman\",\n \"craftwork\",\n \"crafty\",\n \"cramp\",\n \"cranberry\",\n \"crane\",\n \"cranial\",\n \"cranium\",\n \"crank\",\n \"crate\",\n \"crave\",\n \"craving\",\n \"crawfish\",\n \"crawlers\",\n \"crawling\",\n \"crayfish\",\n \"crayon\",\n \"crazed\",\n \"crazily\",\n \"craziness\",\n \"crazy\",\n \"creamed\",\n \"creamer\",\n \"creamlike\",\n \"crease\",\n \"creasing\",\n \"creatable\",\n \"create\",\n \"creation\",\n \"creative\",\n \"creature\",\n \"credible\",\n \"credibly\",\n \"credit\",\n \"creed\",\n \"creme\",\n \"creole\",\n \"crepe\",\n \"crept\",\n \"crescent\",\n \"crested\",\n \"cresting\",\n \"crestless\",\n \"crevice\",\n \"crewless\",\n \"crewman\",\n \"crewmate\",\n \"crib\",\n \"cricket\",\n \"cried\",\n \"crier\",\n \"crimp\",\n \"crimson\",\n \"cringe\",\n \"cringing\",\n \"crinkle\",\n \"crinkly\",\n \"crisped\",\n \"crisping\",\n \"crisply\",\n \"crispness\",\n \"crispy\",\n \"criteria\",\n \"critter\",\n \"croak\",\n \"crock\",\n \"crook\",\n \"croon\",\n \"crop\",\n \"cross\",\n \"crouch\",\n \"crouton\",\n \"crowbar\",\n \"crowd\",\n \"crown\",\n \"crucial\",\n \"crudely\",\n \"crudeness\",\n \"cruelly\",\n \"cruelness\",\n \"cruelty\",\n \"crumb\",\n \"crummiest\",\n \"crummy\",\n \"crumpet\",\n \"crumpled\",\n \"cruncher\",\n \"crunching\",\n \"crunchy\",\n \"crusader\",\n \"crushable\",\n \"crushed\",\n \"crusher\",\n \"crushing\",\n \"crust\",\n \"crux\",\n \"crying\",\n \"cryptic\",\n \"crystal\",\n \"cubbyhole\",\n \"cube\",\n \"cubical\",\n \"cubicle\",\n \"cucumber\",\n \"cuddle\",\n \"cuddly\",\n \"cufflink\",\n \"culinary\",\n \"culminate\",\n \"culpable\",\n \"culprit\",\n \"cultivate\",\n \"cultural\",\n \"culture\",\n \"cupbearer\",\n \"cupcake\",\n \"cupid\",\n \"cupped\",\n \"cupping\",\n \"curable\",\n \"curator\",\n \"curdle\",\n \"cure\",\n \"curfew\",\n \"curing\",\n \"curled\",\n \"curler\",\n \"curliness\",\n \"curling\",\n \"curly\",\n \"curry\",\n \"curse\",\n \"cursive\",\n \"cursor\",\n \"curtain\",\n \"curtly\",\n \"curtsy\",\n \"curvature\",\n \"curve\",\n \"curvy\",\n \"cushy\",\n \"cusp\",\n \"cussed\",\n \"custard\",\n \"custodian\",\n \"custody\",\n \"customary\",\n \"customer\",\n \"customize\",\n \"customs\",\n \"cut\",\n \"cycle\",\n \"cyclic\",\n \"cycling\",\n \"cyclist\",\n \"cylinder\",\n \"cymbal\",\n \"cytoplasm\",\n \"cytoplast\",\n \"dab\",\n \"dad\",\n \"daffodil\",\n \"dagger\",\n \"daily\",\n \"daintily\",\n \"dainty\",\n \"dairy\",\n \"daisy\",\n \"dallying\",\n \"dance\",\n \"dancing\",\n \"dandelion\",\n \"dander\",\n \"dandruff\",\n \"dandy\",\n \"danger\",\n \"dangle\",\n \"dangling\",\n \"daredevil\",\n \"dares\",\n \"daringly\",\n \"darkened\",\n \"darkening\",\n \"darkish\",\n \"darkness\",\n \"darkroom\",\n \"darling\",\n \"darn\",\n \"dart\",\n \"darwinism\",\n \"dash\",\n \"dastardly\",\n \"data\",\n \"datebook\",\n \"dating\",\n \"daughter\",\n \"daunting\",\n \"dawdler\",\n \"dawn\",\n \"daybed\",\n \"daybreak\",\n \"daycare\",\n \"daydream\",\n \"daylight\",\n \"daylong\",\n \"dayroom\",\n \"daytime\",\n \"dazzler\",\n \"dazzling\",\n \"deacon\",\n \"deafening\",\n \"deafness\",\n \"dealer\",\n \"dealing\",\n \"dealmaker\",\n \"dealt\",\n \"dean\",\n \"debatable\",\n \"debate\",\n \"debating\",\n \"debit\",\n \"debrief\",\n \"debtless\",\n \"debtor\",\n \"debug\",\n \"debunk\",\n \"decade\",\n \"decaf\",\n \"decal\",\n \"decathlon\",\n \"decay\",\n \"deceased\",\n \"deceit\",\n \"deceiver\",\n \"deceiving\",\n \"december\",\n \"decency\",\n \"decent\",\n \"deception\",\n \"deceptive\",\n \"decibel\",\n \"decidable\",\n \"decimal\",\n \"decimeter\",\n \"decipher\",\n \"deck\",\n \"declared\",\n \"decline\",\n \"decode\",\n \"decompose\",\n \"decorated\",\n \"decorator\",\n \"decoy\",\n \"decrease\",\n \"decree\",\n \"dedicate\",\n \"dedicator\",\n \"deduce\",\n \"deduct\",\n \"deed\",\n \"deem\",\n \"deepen\",\n \"deeply\",\n \"deepness\",\n \"deface\",\n \"defacing\",\n \"defame\",\n \"default\",\n \"defeat\",\n \"defection\",\n \"defective\",\n \"defendant\",\n \"defender\",\n \"defense\",\n \"defensive\",\n \"deferral\",\n \"deferred\",\n \"defiance\",\n \"defiant\",\n \"defile\",\n \"defiling\",\n \"define\",\n \"definite\",\n \"deflate\",\n \"deflation\",\n \"deflator\",\n \"deflected\",\n \"deflector\",\n \"defog\",\n \"deforest\",\n \"defraud\",\n \"defrost\",\n \"deftly\",\n \"defuse\",\n \"defy\",\n \"degraded\",\n \"degrading\",\n \"degrease\",\n \"degree\",\n \"dehydrate\",\n \"deity\",\n \"dejected\",\n \"delay\",\n \"delegate\",\n \"delegator\",\n \"delete\",\n \"deletion\",\n \"delicacy\",\n \"delicate\",\n \"delicious\",\n \"delighted\",\n \"delirious\",\n \"delirium\",\n \"deliverer\",\n \"delivery\",\n \"delouse\",\n \"delta\",\n \"deluge\",\n \"delusion\",\n \"deluxe\",\n \"demanding\",\n \"demeaning\",\n \"demeanor\",\n \"demise\",\n \"democracy\",\n \"democrat\",\n \"demote\",\n \"demotion\",\n \"demystify\",\n \"denatured\",\n \"deniable\",\n \"denial\",\n \"denim\",\n \"denote\",\n \"dense\",\n \"density\",\n \"dental\",\n \"dentist\",\n \"denture\",\n \"deny\",\n \"deodorant\",\n \"deodorize\",\n \"departed\",\n \"departure\",\n \"depict\",\n \"deplete\",\n \"depletion\",\n \"deplored\",\n \"deploy\",\n \"deport\",\n \"depose\",\n \"depraved\",\n \"depravity\",\n \"deprecate\",\n \"depress\",\n \"deprive\",\n \"depth\",\n \"deputize\",\n \"deputy\",\n \"derail\",\n \"deranged\",\n \"derby\",\n \"derived\",\n \"desecrate\",\n \"deserve\",\n \"deserving\",\n \"designate\",\n \"designed\",\n \"designer\",\n \"designing\",\n \"deskbound\",\n \"desktop\",\n \"deskwork\",\n \"desolate\",\n \"despair\",\n \"despise\",\n \"despite\",\n \"destiny\",\n \"destitute\",\n \"destruct\",\n \"detached\",\n \"detail\",\n \"detection\",\n \"detective\",\n \"detector\",\n \"detention\",\n \"detergent\",\n \"detest\",\n \"detonate\",\n \"detonator\",\n \"detoxify\",\n \"detract\",\n \"deuce\",\n \"devalue\",\n \"deviancy\",\n \"deviant\",\n \"deviate\",\n \"deviation\",\n \"deviator\",\n \"device\",\n \"devious\",\n \"devotedly\",\n \"devotee\",\n \"devotion\",\n \"devourer\",\n \"devouring\",\n \"devoutly\",\n \"dexterity\",\n \"dexterous\",\n \"diabetes\",\n \"diabetic\",\n \"diabolic\",\n \"diagnoses\",\n \"diagnosis\",\n \"diagram\",\n \"dial\",\n \"diameter\",\n \"diaper\",\n \"diaphragm\",\n \"diary\",\n \"dice\",\n \"dicing\",\n \"dictate\",\n \"dictation\",\n \"dictator\",\n \"difficult\",\n \"diffused\",\n \"diffuser\",\n \"diffusion\",\n \"diffusive\",\n \"dig\",\n \"dilation\",\n \"diligence\",\n \"diligent\",\n \"dill\",\n \"dilute\",\n \"dime\",\n \"diminish\",\n \"dimly\",\n \"dimmed\",\n \"dimmer\",\n \"dimness\",\n \"dimple\",\n \"diner\",\n \"dingbat\",\n \"dinghy\",\n \"dinginess\",\n \"dingo\",\n \"dingy\",\n \"dining\",\n \"dinner\",\n \"diocese\",\n \"dioxide\",\n \"diploma\",\n \"dipped\",\n \"dipper\",\n \"dipping\",\n \"directed\",\n \"direction\",\n \"directive\",\n \"directly\",\n \"directory\",\n \"direness\",\n \"dirtiness\",\n \"disabled\",\n \"disagree\",\n \"disallow\",\n \"disarm\",\n \"disarray\",\n \"disaster\",\n \"disband\",\n \"disbelief\",\n \"disburse\",\n \"discard\",\n \"discern\",\n \"discharge\",\n \"disclose\",\n \"discolor\",\n \"discount\",\n \"discourse\",\n \"discover\",\n \"discuss\",\n \"disdain\",\n \"disengage\",\n \"disfigure\",\n \"disgrace\",\n \"dish\",\n \"disinfect\",\n \"disjoin\",\n \"disk\",\n \"dislike\",\n \"disliking\",\n \"dislocate\",\n \"dislodge\",\n \"disloyal\",\n \"dismantle\",\n \"dismay\",\n \"dismiss\",\n \"dismount\",\n \"disobey\",\n \"disorder\",\n \"disown\",\n \"disparate\",\n \"disparity\",\n \"dispatch\",\n \"dispense\",\n \"dispersal\",\n \"dispersed\",\n \"disperser\",\n \"displace\",\n \"display\",\n \"displease\",\n \"disposal\",\n \"dispose\",\n \"disprove\",\n \"dispute\",\n \"disregard\",\n \"disrupt\",\n \"dissuade\",\n \"distance\",\n \"distant\",\n \"distaste\",\n \"distill\",\n \"distinct\",\n \"distort\",\n \"distract\",\n \"distress\",\n \"district\",\n \"distrust\",\n \"ditch\",\n \"ditto\",\n \"ditzy\",\n \"dividable\",\n \"divided\",\n \"dividend\",\n \"dividers\",\n \"dividing\",\n \"divinely\",\n \"diving\",\n \"divinity\",\n \"divisible\",\n \"divisibly\",\n \"division\",\n \"divisive\",\n \"divorcee\",\n \"dizziness\",\n \"dizzy\",\n \"doable\",\n \"docile\",\n \"dock\",\n \"doctrine\",\n \"document\",\n \"dodge\",\n \"dodgy\",\n \"doily\",\n \"doing\",\n \"dole\",\n \"dollar\",\n \"dollhouse\",\n \"dollop\",\n \"dolly\",\n \"dolphin\",\n \"domain\",\n \"domelike\",\n \"domestic\",\n \"dominion\",\n \"dominoes\",\n \"donated\",\n \"donation\",\n \"donator\",\n \"donor\",\n \"donut\",\n \"doodle\",\n \"doorbell\",\n \"doorframe\",\n \"doorknob\",\n \"doorman\",\n \"doormat\",\n \"doornail\",\n \"doorpost\",\n \"doorstep\",\n \"doorstop\",\n \"doorway\",\n \"doozy\",\n \"dork\",\n \"dormitory\",\n \"dorsal\",\n \"dosage\",\n \"dose\",\n \"dotted\",\n \"doubling\",\n \"douche\",\n \"dove\",\n \"down\",\n \"dowry\",\n \"doze\",\n \"drab\",\n \"dragging\",\n \"dragonfly\",\n \"dragonish\",\n \"dragster\",\n \"drainable\",\n \"drainage\",\n \"drained\",\n \"drainer\",\n \"drainpipe\",\n \"dramatic\",\n \"dramatize\",\n \"drank\",\n \"drapery\",\n \"drastic\",\n \"draw\",\n \"dreaded\",\n \"dreadful\",\n \"dreadlock\",\n \"dreamboat\",\n \"dreamily\",\n \"dreamland\",\n \"dreamless\",\n \"dreamlike\",\n \"dreamt\",\n \"dreamy\",\n \"drearily\",\n \"dreary\",\n \"drench\",\n \"dress\",\n \"drew\",\n \"dribble\",\n \"dried\",\n \"drier\",\n \"drift\",\n \"driller\",\n \"drilling\",\n \"drinkable\",\n \"drinking\",\n \"dripping\",\n \"drippy\",\n \"drivable\",\n \"driven\",\n \"driver\",\n \"driveway\",\n \"driving\",\n \"drizzle\",\n \"drizzly\",\n \"drone\",\n \"drool\",\n \"droop\",\n \"drop-down\",\n \"dropbox\",\n \"dropkick\",\n \"droplet\",\n \"dropout\",\n \"dropper\",\n \"drove\",\n \"drown\",\n \"drowsily\",\n \"drudge\",\n \"drum\",\n \"dry\",\n \"dubbed\",\n \"dubiously\",\n \"duchess\",\n \"duckbill\",\n \"ducking\",\n \"duckling\",\n \"ducktail\",\n \"ducky\",\n \"duct\",\n \"dude\",\n \"duffel\",\n \"dugout\",\n \"duh\",\n \"duke\",\n \"duller\",\n \"dullness\",\n \"duly\",\n \"dumping\",\n \"dumpling\",\n \"dumpster\",\n \"duo\",\n \"dupe\",\n \"duplex\",\n \"duplicate\",\n \"duplicity\",\n \"durable\",\n \"durably\",\n \"duration\",\n \"duress\",\n \"during\",\n \"dusk\",\n \"dust\",\n \"dutiful\",\n \"duty\",\n \"duvet\",\n \"dwarf\",\n \"dweeb\",\n \"dwelled\",\n \"dweller\",\n \"dwelling\",\n \"dwindle\",\n \"dwindling\",\n \"dynamic\",\n \"dynamite\",\n \"dynasty\",\n \"dyslexia\",\n \"dyslexic\",\n \"each\",\n \"eagle\",\n \"earache\",\n \"eardrum\",\n \"earflap\",\n \"earful\",\n \"earlobe\",\n \"early\",\n \"earmark\",\n \"earmuff\",\n \"earphone\",\n \"earpiece\",\n \"earplugs\",\n \"earring\",\n \"earshot\",\n \"earthen\",\n \"earthlike\",\n \"earthling\",\n \"earthly\",\n \"earthworm\",\n \"earthy\",\n \"earwig\",\n \"easeful\",\n \"easel\",\n \"easiest\",\n \"easily\",\n \"easiness\",\n \"easing\",\n \"eastbound\",\n \"eastcoast\",\n \"easter\",\n \"eastward\",\n \"eatable\",\n \"eaten\",\n \"eatery\",\n \"eating\",\n \"eats\",\n \"ebay\",\n \"ebony\",\n \"ebook\",\n \"ecard\",\n \"eccentric\",\n \"echo\",\n \"eclair\",\n \"eclipse\",\n \"ecologist\",\n \"ecology\",\n \"economic\",\n \"economist\",\n \"economy\",\n \"ecosphere\",\n \"ecosystem\",\n \"edge\",\n \"edginess\",\n \"edging\",\n \"edgy\",\n \"edition\",\n \"editor\",\n \"educated\",\n \"education\",\n \"educator\",\n \"eel\",\n \"effective\",\n \"effects\",\n \"efficient\",\n \"effort\",\n \"eggbeater\",\n \"egging\",\n \"eggnog\",\n \"eggplant\",\n \"eggshell\",\n \"egomaniac\",\n \"egotism\",\n \"egotistic\",\n \"either\",\n \"eject\",\n \"elaborate\",\n \"elastic\",\n \"elated\",\n \"elbow\",\n \"eldercare\",\n \"elderly\",\n \"eldest\",\n \"electable\",\n \"election\",\n \"elective\",\n \"elephant\",\n \"elevate\",\n \"elevating\",\n \"elevation\",\n \"elevator\",\n \"eleven\",\n \"elf\",\n \"eligible\",\n \"eligibly\",\n \"eliminate\",\n \"elite\",\n \"elitism\",\n \"elixir\",\n \"elk\",\n \"ellipse\",\n \"elliptic\",\n \"elm\",\n \"elongated\",\n \"elope\",\n \"eloquence\",\n \"eloquent\",\n \"elsewhere\",\n \"elude\",\n \"elusive\",\n \"elves\",\n \"email\",\n \"embargo\",\n \"embark\",\n \"embassy\",\n \"embattled\",\n \"embellish\",\n \"ember\",\n \"embezzle\",\n \"emblaze\",\n \"emblem\",\n \"embody\",\n \"embolism\",\n \"emboss\",\n \"embroider\",\n \"emcee\",\n \"emerald\",\n \"emergency\",\n \"emission\",\n \"emit\",\n \"emote\",\n \"emoticon\",\n \"emotion\",\n \"empathic\",\n \"empathy\",\n \"emperor\",\n \"emphases\",\n \"emphasis\",\n \"emphasize\",\n \"emphatic\",\n \"empirical\",\n \"employed\",\n \"employee\",\n \"employer\",\n \"emporium\",\n \"empower\",\n \"emptier\",\n \"emptiness\",\n \"empty\",\n \"emu\",\n \"enable\",\n \"enactment\",\n \"enamel\",\n \"enchanted\",\n \"enchilada\",\n \"encircle\",\n \"enclose\",\n \"enclosure\",\n \"encode\",\n \"encore\",\n \"encounter\",\n \"encourage\",\n \"encroach\",\n \"encrust\",\n \"encrypt\",\n \"endanger\",\n \"endeared\",\n \"endearing\",\n \"ended\",\n \"ending\",\n \"endless\",\n \"endnote\",\n \"endocrine\",\n \"endorphin\",\n \"endorse\",\n \"endowment\",\n \"endpoint\",\n \"endurable\",\n \"endurance\",\n \"enduring\",\n \"energetic\",\n \"energize\",\n \"energy\",\n \"enforced\",\n \"enforcer\",\n \"engaged\",\n \"engaging\",\n \"engine\",\n \"engorge\",\n \"engraved\",\n \"engraver\",\n \"engraving\",\n \"engross\",\n \"engulf\",\n \"enhance\",\n \"enigmatic\",\n \"enjoyable\",\n \"enjoyably\",\n \"enjoyer\",\n \"enjoying\",\n \"enjoyment\",\n \"enlarged\",\n \"enlarging\",\n \"enlighten\",\n \"enlisted\",\n \"enquirer\",\n \"enrage\",\n \"enrich\",\n \"enroll\",\n \"enslave\",\n \"ensnare\",\n \"ensure\",\n \"entail\",\n \"entangled\",\n \"entering\",\n \"entertain\",\n \"enticing\",\n \"entire\",\n \"entitle\",\n \"entity\",\n \"entomb\",\n \"entourage\",\n \"entrap\",\n \"entree\",\n \"entrench\",\n \"entrust\",\n \"entryway\",\n \"entwine\",\n \"enunciate\",\n \"envelope\",\n \"enviable\",\n \"enviably\",\n \"envious\",\n \"envision\",\n \"envoy\",\n \"envy\",\n \"enzyme\",\n \"epic\",\n \"epidemic\",\n \"epidermal\",\n \"epidermis\",\n \"epidural\",\n \"epilepsy\",\n \"epileptic\",\n \"epilogue\",\n \"epiphany\",\n \"episode\",\n \"equal\",\n \"equate\",\n \"equation\",\n \"equator\",\n \"equinox\",\n \"equipment\",\n \"equity\",\n \"equivocal\",\n \"eradicate\",\n \"erasable\",\n \"erased\",\n \"eraser\",\n \"erasure\",\n \"ergonomic\",\n \"errand\",\n \"errant\",\n \"erratic\",\n \"error\",\n \"erupt\",\n \"escalate\",\n \"escalator\",\n \"escapable\",\n \"escapade\",\n \"escapist\",\n \"escargot\",\n \"eskimo\",\n \"esophagus\",\n \"espionage\",\n \"espresso\",\n \"esquire\",\n \"essay\",\n \"essence\",\n \"essential\",\n \"establish\",\n \"estate\",\n \"esteemed\",\n \"estimate\",\n \"estimator\",\n \"estranged\",\n \"estrogen\",\n \"etching\",\n \"eternal\",\n \"eternity\",\n \"ethanol\",\n \"ether\",\n \"ethically\",\n \"ethics\",\n \"euphemism\",\n \"evacuate\",\n \"evacuee\",\n \"evade\",\n \"evaluate\",\n \"evaluator\",\n \"evaporate\",\n \"evasion\",\n \"evasive\",\n \"even\",\n \"everglade\",\n \"evergreen\",\n \"everybody\",\n \"everyday\",\n \"everyone\",\n \"evict\",\n \"evidence\",\n \"evident\",\n \"evil\",\n \"evoke\",\n \"evolution\",\n \"evolve\",\n \"exact\",\n \"exalted\",\n \"example\",\n \"excavate\",\n \"excavator\",\n \"exceeding\",\n \"exception\",\n \"excess\",\n \"exchange\",\n \"excitable\",\n \"exciting\",\n \"exclaim\",\n \"exclude\",\n \"excluding\",\n \"exclusion\",\n \"exclusive\",\n \"excretion\",\n \"excretory\",\n \"excursion\",\n \"excusable\",\n \"excusably\",\n \"excuse\",\n \"exemplary\",\n \"exemplify\",\n \"exemption\",\n \"exerciser\",\n \"exert\",\n \"exes\",\n \"exfoliate\",\n \"exhale\",\n \"exhaust\",\n \"exhume\",\n \"exile\",\n \"existing\",\n \"exit\",\n \"exodus\",\n \"exonerate\",\n \"exorcism\",\n \"exorcist\",\n \"expand\",\n \"expanse\",\n \"expansion\",\n \"expansive\",\n \"expectant\",\n \"expedited\",\n \"expediter\",\n \"expel\",\n \"expend\",\n \"expenses\",\n \"expensive\",\n \"expert\",\n \"expire\",\n \"expiring\",\n \"explain\",\n \"expletive\",\n \"explicit\",\n \"explode\",\n \"exploit\",\n \"explore\",\n \"exploring\",\n \"exponent\",\n \"exporter\",\n \"exposable\",\n \"expose\",\n \"exposure\",\n \"express\",\n \"expulsion\",\n \"exquisite\",\n \"extended\",\n \"extending\",\n \"extent\",\n \"extenuate\",\n \"exterior\",\n \"external\",\n \"extinct\",\n \"extortion\",\n \"extradite\",\n \"extras\",\n \"extrovert\",\n \"extrude\",\n \"extruding\",\n \"exuberant\",\n \"fable\",\n \"fabric\",\n \"fabulous\",\n \"facebook\",\n \"facecloth\",\n \"facedown\",\n \"faceless\",\n \"facelift\",\n \"faceplate\",\n \"faceted\",\n \"facial\",\n \"facility\",\n \"facing\",\n \"facsimile\",\n \"faction\",\n \"factoid\",\n \"factor\",\n \"factsheet\",\n \"factual\",\n \"faculty\",\n \"fade\",\n \"fading\",\n \"failing\",\n \"falcon\",\n \"fall\",\n \"false\",\n \"falsify\",\n \"fame\",\n \"familiar\",\n \"family\",\n \"famine\",\n \"famished\",\n \"fanatic\",\n \"fancied\",\n \"fanciness\",\n \"fancy\",\n \"fanfare\",\n \"fang\",\n \"fanning\",\n \"fantasize\",\n \"fantastic\",\n \"fantasy\",\n \"fascism\",\n \"fastball\",\n \"faster\",\n \"fasting\",\n \"fastness\",\n \"faucet\",\n \"favorable\",\n \"favorably\",\n \"favored\",\n \"favoring\",\n \"favorite\",\n \"fax\",\n \"feast\",\n \"federal\",\n \"fedora\",\n \"feeble\",\n \"feed\",\n \"feel\",\n \"feisty\",\n \"feline\",\n \"felt-tip\",\n \"feminine\",\n \"feminism\",\n \"feminist\",\n \"feminize\",\n \"femur\",\n \"fence\",\n \"fencing\",\n \"fender\",\n \"ferment\",\n \"fernlike\",\n \"ferocious\",\n \"ferocity\",\n \"ferret\",\n \"ferris\",\n \"ferry\",\n \"fervor\",\n \"fester\",\n \"festival\",\n \"festive\",\n \"festivity\",\n \"fetal\",\n \"fetch\",\n \"fever\",\n \"fiber\",\n \"fiction\",\n \"fiddle\",\n \"fiddling\",\n \"fidelity\",\n \"fidgeting\",\n \"fidgety\",\n \"fifteen\",\n \"fifth\",\n \"fiftieth\",\n \"fifty\",\n \"figment\",\n \"figure\",\n \"figurine\",\n \"filing\",\n \"filled\",\n \"filler\",\n \"filling\",\n \"film\",\n \"filter\",\n \"filth\",\n \"filtrate\",\n \"finale\",\n \"finalist\",\n \"finalize\",\n \"finally\",\n \"finance\",\n \"financial\",\n \"finch\",\n \"fineness\",\n \"finer\",\n \"finicky\",\n \"finished\",\n \"finisher\",\n \"finishing\",\n \"finite\",\n \"finless\",\n \"finlike\",\n \"fiscally\",\n \"fit\",\n \"five\",\n \"flaccid\",\n \"flagman\",\n \"flagpole\",\n \"flagship\",\n \"flagstick\",\n \"flagstone\",\n \"flail\",\n \"flakily\",\n \"flaky\",\n \"flame\",\n \"flammable\",\n \"flanked\",\n \"flanking\",\n \"flannels\",\n \"flap\",\n \"flaring\",\n \"flashback\",\n \"flashbulb\",\n \"flashcard\",\n \"flashily\",\n \"flashing\",\n \"flashy\",\n \"flask\",\n \"flatbed\",\n \"flatfoot\",\n \"flatly\",\n \"flatness\",\n \"flatten\",\n \"flattered\",\n \"flatterer\",\n \"flattery\",\n \"flattop\",\n \"flatware\",\n \"flatworm\",\n \"flavored\",\n \"flavorful\",\n \"flavoring\",\n \"flaxseed\",\n \"fled\",\n \"fleshed\",\n \"fleshy\",\n \"flick\",\n \"flier\",\n \"flight\",\n \"flinch\",\n \"fling\",\n \"flint\",\n \"flip\",\n \"flirt\",\n \"float\",\n \"flock\",\n \"flogging\",\n \"flop\",\n \"floral\",\n \"florist\",\n \"floss\",\n \"flounder\",\n \"flyable\",\n \"flyaway\",\n \"flyer\",\n \"flying\",\n \"flyover\",\n \"flypaper\",\n \"foam\",\n \"foe\",\n \"fog\",\n \"foil\",\n \"folic\",\n \"folk\",\n \"follicle\",\n \"follow\",\n \"fondling\",\n \"fondly\",\n \"fondness\",\n \"fondue\",\n \"font\",\n \"food\",\n \"fool\",\n \"footage\",\n \"football\",\n \"footbath\",\n \"footboard\",\n \"footer\",\n \"footgear\",\n \"foothill\",\n \"foothold\",\n \"footing\",\n \"footless\",\n \"footman\",\n \"footnote\",\n \"footpad\",\n \"footpath\",\n \"footprint\",\n \"footrest\",\n \"footsie\",\n \"footsore\",\n \"footwear\",\n \"footwork\",\n \"fossil\",\n \"foster\",\n \"founder\",\n \"founding\",\n \"fountain\",\n \"fox\",\n \"foyer\",\n \"fraction\",\n \"fracture\",\n \"fragile\",\n \"fragility\",\n \"fragment\",\n \"fragrance\",\n \"fragrant\",\n \"frail\",\n \"frame\",\n \"framing\",\n \"frantic\",\n \"fraternal\",\n \"frayed\",\n \"fraying\",\n \"frays\",\n \"freckled\",\n \"freckles\",\n \"freebase\",\n \"freebee\",\n \"freebie\",\n \"freedom\",\n \"freefall\",\n \"freehand\",\n \"freeing\",\n \"freeload\",\n \"freely\",\n \"freemason\",\n \"freeness\",\n \"freestyle\",\n \"freeware\",\n \"freeway\",\n \"freewill\",\n \"freezable\",\n \"freezing\",\n \"freight\",\n \"french\",\n \"frenzied\",\n \"frenzy\",\n \"frequency\",\n \"frequent\",\n \"fresh\",\n \"fretful\",\n \"fretted\",\n \"friction\",\n \"friday\",\n \"fridge\",\n \"fried\",\n \"friend\",\n \"frighten\",\n \"frightful\",\n \"frigidity\",\n \"frigidly\",\n \"frill\",\n \"fringe\",\n \"frisbee\",\n \"frisk\",\n \"fritter\",\n \"frivolous\",\n \"frolic\",\n \"from\",\n \"front\",\n \"frostbite\",\n \"frosted\",\n \"frostily\",\n \"frosting\",\n \"frostlike\",\n \"frosty\",\n \"froth\",\n \"frown\",\n \"frozen\",\n \"fructose\",\n \"frugality\",\n \"frugally\",\n \"fruit\",\n \"frustrate\",\n \"frying\",\n \"gab\",\n \"gaffe\",\n \"gag\",\n \"gainfully\",\n \"gaining\",\n \"gains\",\n \"gala\",\n \"gallantly\",\n \"galleria\",\n \"gallery\",\n \"galley\",\n \"gallon\",\n \"gallows\",\n \"gallstone\",\n \"galore\",\n \"galvanize\",\n \"gambling\",\n \"game\",\n \"gaming\",\n \"gamma\",\n \"gander\",\n \"gangly\",\n \"gangrene\",\n \"gangway\",\n \"gap\",\n \"garage\",\n \"garbage\",\n \"garden\",\n \"gargle\",\n \"garland\",\n \"garlic\",\n \"garment\",\n \"garnet\",\n \"garnish\",\n \"garter\",\n \"gas\",\n \"gatherer\",\n \"gathering\",\n \"gating\",\n \"gauging\",\n \"gauntlet\",\n \"gauze\",\n \"gave\",\n \"gawk\",\n \"gazing\",\n \"gear\",\n \"gecko\",\n \"geek\",\n \"geiger\",\n \"gem\",\n \"gender\",\n \"generic\",\n \"generous\",\n \"genetics\",\n \"genre\",\n \"gentile\",\n \"gentleman\",\n \"gently\",\n \"gents\",\n \"geography\",\n \"geologic\",\n \"geologist\",\n \"geology\",\n \"geometric\",\n \"geometry\",\n \"geranium\",\n \"gerbil\",\n \"geriatric\",\n \"germicide\",\n \"germinate\",\n \"germless\",\n \"germproof\",\n \"gestate\",\n \"gestation\",\n \"gesture\",\n \"getaway\",\n \"getting\",\n \"getup\",\n \"giant\",\n \"gibberish\",\n \"giblet\",\n \"giddily\",\n \"giddiness\",\n \"giddy\",\n \"gift\",\n \"gigabyte\",\n \"gigahertz\",\n \"gigantic\",\n \"giggle\",\n \"giggling\",\n \"giggly\",\n \"gigolo\",\n \"gilled\",\n \"gills\",\n \"gimmick\",\n \"girdle\",\n \"giveaway\",\n \"given\",\n \"giver\",\n \"giving\",\n \"gizmo\",\n \"gizzard\",\n \"glacial\",\n \"glacier\",\n \"glade\",\n \"gladiator\",\n \"gladly\",\n \"glamorous\",\n \"glamour\",\n \"glance\",\n \"glancing\",\n \"glandular\",\n \"glare\",\n \"glaring\",\n \"glass\",\n \"glaucoma\",\n \"glazing\",\n \"gleaming\",\n \"gleeful\",\n \"glider\",\n \"gliding\",\n \"glimmer\",\n \"glimpse\",\n \"glisten\",\n \"glitch\",\n \"glitter\",\n \"glitzy\",\n \"gloater\",\n \"gloating\",\n \"gloomily\",\n \"gloomy\",\n \"glorified\",\n \"glorifier\",\n \"glorify\",\n \"glorious\",\n \"glory\",\n \"gloss\",\n \"glove\",\n \"glowing\",\n \"glowworm\",\n \"glucose\",\n \"glue\",\n \"gluten\",\n \"glutinous\",\n \"glutton\",\n \"gnarly\",\n \"gnat\",\n \"goal\",\n \"goatskin\",\n \"goes\",\n \"goggles\",\n \"going\",\n \"goldfish\",\n \"goldmine\",\n \"goldsmith\",\n \"golf\",\n \"goliath\",\n \"gonad\",\n \"gondola\",\n \"gone\",\n \"gong\",\n \"good\",\n \"gooey\",\n \"goofball\",\n \"goofiness\",\n \"goofy\",\n \"google\",\n \"goon\",\n \"gopher\",\n \"gore\",\n \"gorged\",\n \"gorgeous\",\n \"gory\",\n \"gosling\",\n \"gossip\",\n \"gothic\",\n \"gotten\",\n \"gout\",\n \"gown\",\n \"grab\",\n \"graceful\",\n \"graceless\",\n \"gracious\",\n \"gradation\",\n \"graded\",\n \"grader\",\n \"gradient\",\n \"grading\",\n \"gradually\",\n \"graduate\",\n \"graffiti\",\n \"grafted\",\n \"grafting\",\n \"grain\",\n \"granddad\",\n \"grandkid\",\n \"grandly\",\n \"grandma\",\n \"grandpa\",\n \"grandson\",\n \"granite\",\n \"granny\",\n \"granola\",\n \"grant\",\n \"granular\",\n \"grape\",\n \"graph\",\n \"grapple\",\n \"grappling\",\n \"grasp\",\n \"grass\",\n \"gratified\",\n \"gratify\",\n \"grating\",\n \"gratitude\",\n \"gratuity\",\n \"gravel\",\n \"graveness\",\n \"graves\",\n \"graveyard\",\n \"gravitate\",\n \"gravity\",\n \"gravy\",\n \"gray\",\n \"grazing\",\n \"greasily\",\n \"greedily\",\n \"greedless\",\n \"greedy\",\n \"green\",\n \"greeter\",\n \"greeting\",\n \"grew\",\n \"greyhound\",\n \"grid\",\n \"grief\",\n \"grievance\",\n \"grieving\",\n \"grievous\",\n \"grill\",\n \"grimace\",\n \"grimacing\",\n \"grime\",\n \"griminess\",\n \"grimy\",\n \"grinch\",\n \"grinning\",\n \"grip\",\n \"gristle\",\n \"grit\",\n \"groggily\",\n \"groggy\",\n \"groin\",\n \"groom\",\n \"groove\",\n \"grooving\",\n \"groovy\",\n \"grope\",\n \"ground\",\n \"grouped\",\n \"grout\",\n \"grove\",\n \"grower\",\n \"growing\",\n \"growl\",\n \"grub\",\n \"grudge\",\n \"grudging\",\n \"grueling\",\n \"gruffly\",\n \"grumble\",\n \"grumbling\",\n \"grumbly\",\n \"grumpily\",\n \"grunge\",\n \"grunt\",\n \"guacamole\",\n \"guidable\",\n \"guidance\",\n \"guide\",\n \"guiding\",\n \"guileless\",\n \"guise\",\n \"gulf\",\n \"gullible\",\n \"gully\",\n \"gulp\",\n \"gumball\",\n \"gumdrop\",\n \"gumminess\",\n \"gumming\",\n \"gummy\",\n \"gurgle\",\n \"gurgling\",\n \"guru\",\n \"gush\",\n \"gusto\",\n \"gusty\",\n \"gutless\",\n \"guts\",\n \"gutter\",\n \"guy\",\n \"guzzler\",\n \"gyration\",\n \"habitable\",\n \"habitant\",\n \"habitat\",\n \"habitual\",\n \"hacked\",\n \"hacker\",\n \"hacking\",\n \"hacksaw\",\n \"had\",\n \"haggler\",\n \"haiku\",\n \"half\",\n \"halogen\",\n \"halt\",\n \"halved\",\n \"halves\",\n \"hamburger\",\n \"hamlet\",\n \"hammock\",\n \"hamper\",\n \"hamster\",\n \"hamstring\",\n \"handbag\",\n \"handball\",\n \"handbook\",\n \"handbrake\",\n \"handcart\",\n \"handclap\",\n \"handclasp\",\n \"handcraft\",\n \"handcuff\",\n \"handed\",\n \"handful\",\n \"handgrip\",\n \"handgun\",\n \"handheld\",\n \"handiness\",\n \"handiwork\",\n \"handlebar\",\n \"handled\",\n \"handler\",\n \"handling\",\n \"handmade\",\n \"handoff\",\n \"handpick\",\n \"handprint\",\n \"handrail\",\n \"handsaw\",\n \"handset\",\n \"handsfree\",\n \"handshake\",\n \"handstand\",\n \"handwash\",\n \"handwork\",\n \"handwoven\",\n \"handwrite\",\n \"handyman\",\n \"hangnail\",\n \"hangout\",\n \"hangover\",\n \"hangup\",\n \"hankering\",\n \"hankie\",\n \"hanky\",\n \"haphazard\",\n \"happening\",\n \"happier\",\n \"happiest\",\n \"happily\",\n \"happiness\",\n \"happy\",\n \"harbor\",\n \"hardcopy\",\n \"hardcore\",\n \"hardcover\",\n \"harddisk\",\n \"hardened\",\n \"hardener\",\n \"hardening\",\n \"hardhat\",\n \"hardhead\",\n \"hardiness\",\n \"hardly\",\n \"hardness\",\n \"hardship\",\n \"hardware\",\n \"hardwired\",\n \"hardwood\",\n \"hardy\",\n \"harmful\",\n \"harmless\",\n \"harmonica\",\n \"harmonics\",\n \"harmonize\",\n \"harmony\",\n \"harness\",\n \"harpist\",\n \"harsh\",\n \"harvest\",\n \"hash\",\n \"hassle\",\n \"haste\",\n \"hastily\",\n \"hastiness\",\n \"hasty\",\n \"hatbox\",\n \"hatchback\",\n \"hatchery\",\n \"hatchet\",\n \"hatching\",\n \"hatchling\",\n \"hate\",\n \"hatless\",\n \"hatred\",\n \"haunt\",\n \"haven\",\n \"hazard\",\n \"hazelnut\",\n \"hazily\",\n \"haziness\",\n \"hazing\",\n \"hazy\",\n \"headache\",\n \"headband\",\n \"headboard\",\n \"headcount\",\n \"headdress\",\n \"headed\",\n \"header\",\n \"headfirst\",\n \"headgear\",\n \"heading\",\n \"headlamp\",\n \"headless\",\n \"headlock\",\n \"headphone\",\n \"headpiece\",\n \"headrest\",\n \"headroom\",\n \"headscarf\",\n \"headset\",\n \"headsman\",\n \"headstand\",\n \"headstone\",\n \"headway\",\n \"headwear\",\n \"heap\",\n \"heat\",\n \"heave\",\n \"heavily\",\n \"heaviness\",\n \"heaving\",\n \"hedge\",\n \"hedging\",\n \"heftiness\",\n \"hefty\",\n \"helium\",\n \"helmet\",\n \"helper\",\n \"helpful\",\n \"helping\",\n \"helpless\",\n \"helpline\",\n \"hemlock\",\n \"hemstitch\",\n \"hence\",\n \"henchman\",\n \"henna\",\n \"herald\",\n \"herbal\",\n \"herbicide\",\n \"herbs\",\n \"heritage\",\n \"hermit\",\n \"heroics\",\n \"heroism\",\n \"herring\",\n \"herself\",\n \"hertz\",\n \"hesitancy\",\n \"hesitant\",\n \"hesitate\",\n \"hexagon\",\n \"hexagram\",\n \"hubcap\",\n \"huddle\",\n \"huddling\",\n \"huff\",\n \"hug\",\n \"hula\",\n \"hulk\",\n \"hull\",\n \"human\",\n \"humble\",\n \"humbling\",\n \"humbly\",\n \"humid\",\n \"humiliate\",\n \"humility\",\n \"humming\",\n \"hummus\",\n \"humongous\",\n \"humorist\",\n \"humorless\",\n \"humorous\",\n \"humpback\",\n \"humped\",\n \"humvee\",\n \"hunchback\",\n \"hundredth\",\n \"hunger\",\n \"hungrily\",\n \"hungry\",\n \"hunk\",\n \"hunter\",\n \"hunting\",\n \"huntress\",\n \"huntsman\",\n \"hurdle\",\n \"hurled\",\n \"hurler\",\n \"hurling\",\n \"hurray\",\n \"hurricane\",\n \"hurried\",\n \"hurry\",\n \"hurt\",\n \"husband\",\n \"hush\",\n \"husked\",\n \"huskiness\",\n \"hut\",\n \"hybrid\",\n \"hydrant\",\n \"hydrated\",\n \"hydration\",\n \"hydrogen\",\n \"hydroxide\",\n \"hyperlink\",\n \"hypertext\",\n \"hyphen\",\n \"hypnoses\",\n \"hypnosis\",\n \"hypnotic\",\n \"hypnotism\",\n \"hypnotist\",\n \"hypnotize\",\n \"hypocrisy\",\n \"hypocrite\",\n \"ibuprofen\",\n \"ice\",\n \"iciness\",\n \"icing\",\n \"icky\",\n \"icon\",\n \"icy\",\n \"idealism\",\n \"idealist\",\n \"idealize\",\n \"ideally\",\n \"idealness\",\n \"identical\",\n \"identify\",\n \"identity\",\n \"ideology\",\n \"idiocy\",\n \"idiom\",\n \"idly\",\n \"igloo\",\n \"ignition\",\n \"ignore\",\n \"iguana\",\n \"illicitly\",\n \"illusion\",\n \"illusive\",\n \"image\",\n \"imaginary\",\n \"imagines\",\n \"imaging\",\n \"imbecile\",\n \"imitate\",\n \"imitation\",\n \"immature\",\n \"immerse\",\n \"immersion\",\n \"imminent\",\n \"immobile\",\n \"immodest\",\n \"immorally\",\n \"immortal\",\n \"immovable\",\n \"immovably\",\n \"immunity\",\n \"immunize\",\n \"impaired\",\n \"impale\",\n \"impart\",\n \"impatient\",\n \"impeach\",\n \"impeding\",\n \"impending\",\n \"imperfect\",\n \"imperial\",\n \"impish\",\n \"implant\",\n \"implement\",\n \"implicate\",\n \"implicit\",\n \"implode\",\n \"implosion\",\n \"implosive\",\n \"imply\",\n \"impolite\",\n \"important\",\n \"importer\",\n \"impose\",\n \"imposing\",\n \"impotence\",\n \"impotency\",\n \"impotent\",\n \"impound\",\n \"imprecise\",\n \"imprint\",\n \"imprison\",\n \"impromptu\",\n \"improper\",\n \"improve\",\n \"improving\",\n \"improvise\",\n \"imprudent\",\n \"impulse\",\n \"impulsive\",\n \"impure\",\n \"impurity\",\n \"iodine\",\n \"iodize\",\n \"ion\",\n \"ipad\",\n \"iphone\",\n \"ipod\",\n \"irate\",\n \"irk\",\n \"iron\",\n \"irregular\",\n \"irrigate\",\n \"irritable\",\n \"irritably\",\n \"irritant\",\n \"irritate\",\n \"islamic\",\n \"islamist\",\n \"isolated\",\n \"isolating\",\n \"isolation\",\n \"isotope\",\n \"issue\",\n \"issuing\",\n \"italicize\",\n \"italics\",\n \"item\",\n \"itinerary\",\n \"itunes\",\n \"ivory\",\n \"ivy\",\n \"jab\",\n \"jackal\",\n \"jacket\",\n \"jackknife\",\n \"jackpot\",\n \"jailbird\",\n \"jailbreak\",\n \"jailer\",\n \"jailhouse\",\n \"jalapeno\",\n \"jam\",\n \"janitor\",\n \"january\",\n \"jargon\",\n \"jarring\",\n \"jasmine\",\n \"jaundice\",\n \"jaunt\",\n \"java\",\n \"jawed\",\n \"jawless\",\n \"jawline\",\n \"jaws\",\n \"jaybird\",\n \"jaywalker\",\n \"jazz\",\n \"jeep\",\n \"jeeringly\",\n \"jellied\",\n \"jelly\",\n \"jersey\",\n \"jester\",\n \"jet\",\n \"jiffy\",\n \"jigsaw\",\n \"jimmy\",\n \"jingle\",\n \"jingling\",\n \"jinx\",\n \"jitters\",\n \"jittery\",\n \"job\",\n \"jockey\",\n \"jockstrap\",\n \"jogger\",\n \"jogging\",\n \"john\",\n \"joining\",\n \"jokester\",\n \"jokingly\",\n \"jolliness\",\n \"jolly\",\n \"jolt\",\n \"jot\",\n \"jovial\",\n \"joyfully\",\n \"joylessly\",\n \"joyous\",\n \"joyride\",\n \"joystick\",\n \"jubilance\",\n \"jubilant\",\n \"judge\",\n \"judgingly\",\n \"judicial\",\n \"judiciary\",\n \"judo\",\n \"juggle\",\n \"juggling\",\n \"jugular\",\n \"juice\",\n \"juiciness\",\n \"juicy\",\n \"jujitsu\",\n \"jukebox\",\n \"july\",\n \"jumble\",\n \"jumbo\",\n \"jump\",\n \"junction\",\n \"juncture\",\n \"june\",\n \"junior\",\n \"juniper\",\n \"junkie\",\n \"junkman\",\n \"junkyard\",\n \"jurist\",\n \"juror\",\n \"jury\",\n \"justice\",\n \"justifier\",\n \"justify\",\n \"justly\",\n \"justness\",\n \"juvenile\",\n \"kabob\",\n \"kangaroo\",\n \"karaoke\",\n \"karate\",\n \"karma\",\n \"kebab\",\n \"keenly\",\n \"keenness\",\n \"keep\",\n \"keg\",\n \"kelp\",\n \"kennel\",\n \"kept\",\n \"kerchief\",\n \"kerosene\",\n \"kettle\",\n \"kick\",\n \"kiln\",\n \"kilobyte\",\n \"kilogram\",\n \"kilometer\",\n \"kilowatt\",\n \"kilt\",\n \"kimono\",\n \"kindle\",\n \"kindling\",\n \"kindly\",\n \"kindness\",\n \"kindred\",\n \"kinetic\",\n \"kinfolk\",\n \"king\",\n \"kinship\",\n \"kinsman\",\n \"kinswoman\",\n \"kissable\",\n \"kisser\",\n \"kissing\",\n \"kitchen\",\n \"kite\",\n \"kitten\",\n \"kitty\",\n \"kiwi\",\n \"kleenex\",\n \"knapsack\",\n \"knee\",\n \"knelt\",\n \"knickers\",\n \"knoll\",\n \"koala\",\n \"kooky\",\n \"kosher\",\n \"krypton\",\n \"kudos\",\n \"kung\",\n \"labored\",\n \"laborer\",\n \"laboring\",\n \"laborious\",\n \"labrador\",\n \"ladder\",\n \"ladies\",\n \"ladle\",\n \"ladybug\",\n \"ladylike\",\n \"lagged\",\n \"lagging\",\n \"lagoon\",\n \"lair\",\n \"lake\",\n \"lance\",\n \"landed\",\n \"landfall\",\n \"landfill\",\n \"landing\",\n \"landlady\",\n \"landless\",\n \"landline\",\n \"landlord\",\n \"landmark\",\n \"landmass\",\n \"landmine\",\n \"landowner\",\n \"landscape\",\n \"landside\",\n \"landslide\",\n \"language\",\n \"lankiness\",\n \"lanky\",\n \"lantern\",\n \"lapdog\",\n \"lapel\",\n \"lapped\",\n \"lapping\",\n \"laptop\",\n \"lard\",\n \"large\",\n \"lark\",\n \"lash\",\n \"lasso\",\n \"last\",\n \"latch\",\n \"late\",\n \"lather\",\n \"latitude\",\n \"latrine\",\n \"latter\",\n \"latticed\",\n \"launch\",\n \"launder\",\n \"laundry\",\n \"laurel\",\n \"lavender\",\n \"lavish\",\n \"laxative\",\n \"lazily\",\n \"laziness\",\n \"lazy\",\n \"lecturer\",\n \"left\",\n \"legacy\",\n \"legal\",\n \"legend\",\n \"legged\",\n \"leggings\",\n \"legible\",\n \"legibly\",\n \"legislate\",\n \"lego\",\n \"legroom\",\n \"legume\",\n \"legwarmer\",\n \"legwork\",\n \"lemon\",\n \"lend\",\n \"length\",\n \"lens\",\n \"lent\",\n \"leotard\",\n \"lesser\",\n \"letdown\",\n \"lethargic\",\n \"lethargy\",\n \"letter\",\n \"lettuce\",\n \"level\",\n \"leverage\",\n \"levers\",\n \"levitate\",\n \"levitator\",\n \"liability\",\n \"liable\",\n \"liberty\",\n \"librarian\",\n \"library\",\n \"licking\",\n \"licorice\",\n \"lid\",\n \"life\",\n \"lifter\",\n \"lifting\",\n \"liftoff\",\n \"ligament\",\n \"likely\",\n \"likeness\",\n \"likewise\",\n \"liking\",\n \"lilac\",\n \"lilly\",\n \"lily\",\n \"limb\",\n \"limeade\",\n \"limelight\",\n \"limes\",\n \"limit\",\n \"limping\",\n \"limpness\",\n \"line\",\n \"lingo\",\n \"linguini\",\n \"linguist\",\n \"lining\",\n \"linked\",\n \"linoleum\",\n \"linseed\",\n \"lint\",\n \"lion\",\n \"lip\",\n \"liquefy\",\n \"liqueur\",\n \"liquid\",\n \"lisp\",\n \"list\",\n \"litigate\",\n \"litigator\",\n \"litmus\",\n \"litter\",\n \"little\",\n \"livable\",\n \"lived\",\n \"lively\",\n \"liver\",\n \"livestock\",\n \"lividly\",\n \"living\",\n \"lizard\",\n \"lubricant\",\n \"lubricate\",\n \"lucid\",\n \"luckily\",\n \"luckiness\",\n \"luckless\",\n \"lucrative\",\n \"ludicrous\",\n \"lugged\",\n \"lukewarm\",\n \"lullaby\",\n \"lumber\",\n \"luminance\",\n \"luminous\",\n \"lumpiness\",\n \"lumping\",\n \"lumpish\",\n \"lunacy\",\n \"lunar\",\n \"lunchbox\",\n \"luncheon\",\n \"lunchroom\",\n \"lunchtime\",\n \"lung\",\n \"lurch\",\n \"lure\",\n \"luridness\",\n \"lurk\",\n \"lushly\",\n \"lushness\",\n \"luster\",\n \"lustfully\",\n \"lustily\",\n \"lustiness\",\n \"lustrous\",\n \"lusty\",\n \"luxurious\",\n \"luxury\",\n \"lying\",\n \"lyrically\",\n \"lyricism\",\n \"lyricist\",\n \"lyrics\",\n \"macarena\",\n \"macaroni\",\n \"macaw\",\n \"mace\",\n \"machine\",\n \"machinist\",\n \"magazine\",\n \"magenta\",\n \"maggot\",\n \"magical\",\n \"magician\",\n \"magma\",\n \"magnesium\",\n \"magnetic\",\n \"magnetism\",\n \"magnetize\",\n \"magnifier\",\n \"magnify\",\n \"magnitude\",\n \"magnolia\",\n \"mahogany\",\n \"maimed\",\n \"majestic\",\n \"majesty\",\n \"majorette\",\n \"majority\",\n \"makeover\",\n \"maker\",\n \"makeshift\",\n \"making\",\n \"malformed\",\n \"malt\",\n \"mama\",\n \"mammal\",\n \"mammary\",\n \"mammogram\",\n \"manager\",\n \"managing\",\n \"manatee\",\n \"mandarin\",\n \"mandate\",\n \"mandatory\",\n \"mandolin\",\n \"manger\",\n \"mangle\",\n \"mango\",\n \"mangy\",\n \"manhandle\",\n \"manhole\",\n \"manhood\",\n \"manhunt\",\n \"manicotti\",\n \"manicure\",\n \"manifesto\",\n \"manila\",\n \"mankind\",\n \"manlike\",\n \"manliness\",\n \"manly\",\n \"manmade\",\n \"manned\",\n \"mannish\",\n \"manor\",\n \"manpower\",\n \"mantis\",\n \"mantra\",\n \"manual\",\n \"many\",\n \"map\",\n \"marathon\",\n \"marauding\",\n \"marbled\",\n \"marbles\",\n \"marbling\",\n \"march\",\n \"mardi\",\n \"margarine\",\n \"margarita\",\n \"margin\",\n \"marigold\",\n \"marina\",\n \"marine\",\n \"marital\",\n \"maritime\",\n \"marlin\",\n \"marmalade\",\n \"maroon\",\n \"married\",\n \"marrow\",\n \"marry\",\n \"marshland\",\n \"marshy\",\n \"marsupial\",\n \"marvelous\",\n \"marxism\",\n \"mascot\",\n \"masculine\",\n \"mashed\",\n \"mashing\",\n \"massager\",\n \"masses\",\n \"massive\",\n \"mastiff\",\n \"matador\",\n \"matchbook\",\n \"matchbox\",\n \"matcher\",\n \"matching\",\n \"matchless\",\n \"material\",\n \"maternal\",\n \"maternity\",\n \"math\",\n \"mating\",\n \"matriarch\",\n \"matrimony\",\n \"matrix\",\n \"matron\",\n \"matted\",\n \"matter\",\n \"maturely\",\n \"maturing\",\n \"maturity\",\n \"mauve\",\n \"maverick\",\n \"maximize\",\n \"maximum\",\n \"maybe\",\n \"mayday\",\n \"mayflower\",\n \"moaner\",\n \"moaning\",\n \"mobile\",\n \"mobility\",\n \"mobilize\",\n \"mobster\",\n \"mocha\",\n \"mocker\",\n \"mockup\",\n \"modified\",\n \"modify\",\n \"modular\",\n \"modulator\",\n \"module\",\n \"moisten\",\n \"moistness\",\n \"moisture\",\n \"molar\",\n \"molasses\",\n \"mold\",\n \"molecular\",\n \"molecule\",\n \"molehill\",\n \"mollusk\",\n \"mom\",\n \"monastery\",\n \"monday\",\n \"monetary\",\n \"monetize\",\n \"moneybags\",\n \"moneyless\",\n \"moneywise\",\n \"mongoose\",\n \"mongrel\",\n \"monitor\",\n \"monkhood\",\n \"monogamy\",\n \"monogram\",\n \"monologue\",\n \"monopoly\",\n \"monorail\",\n \"monotone\",\n \"monotype\",\n \"monoxide\",\n \"monsieur\",\n \"monsoon\",\n \"monstrous\",\n \"monthly\",\n \"monument\",\n \"moocher\",\n \"moodiness\",\n \"moody\",\n \"mooing\",\n \"moonbeam\",\n \"mooned\",\n \"moonlight\",\n \"moonlike\",\n \"moonlit\",\n \"moonrise\",\n \"moonscape\",\n \"moonshine\",\n \"moonstone\",\n \"moonwalk\",\n \"mop\",\n \"morale\",\n \"morality\",\n \"morally\",\n \"morbidity\",\n \"morbidly\",\n \"morphine\",\n \"morphing\",\n \"morse\",\n \"mortality\",\n \"mortally\",\n \"mortician\",\n \"mortified\",\n \"mortify\",\n \"mortuary\",\n \"mosaic\",\n \"mossy\",\n \"most\",\n \"mothball\",\n \"mothproof\",\n \"motion\",\n \"motivate\",\n \"motivator\",\n \"motive\",\n \"motocross\",\n \"motor\",\n \"motto\",\n \"mountable\",\n \"mountain\",\n \"mounted\",\n \"mounting\",\n \"mourner\",\n \"mournful\",\n \"mouse\",\n \"mousiness\",\n \"moustache\",\n \"mousy\",\n \"mouth\",\n \"movable\",\n \"move\",\n \"movie\",\n \"moving\",\n \"mower\",\n \"mowing\",\n \"much\",\n \"muck\",\n \"mud\",\n \"mug\",\n \"mulberry\",\n \"mulch\",\n \"mule\",\n \"mulled\",\n \"mullets\",\n \"multiple\",\n \"multiply\",\n \"multitask\",\n \"multitude\",\n \"mumble\",\n \"mumbling\",\n \"mumbo\",\n \"mummified\",\n \"mummify\",\n \"mummy\",\n \"mumps\",\n \"munchkin\",\n \"mundane\",\n \"municipal\",\n \"muppet\",\n \"mural\",\n \"murkiness\",\n \"murky\",\n \"murmuring\",\n \"muscular\",\n \"museum\",\n \"mushily\",\n \"mushiness\",\n \"mushroom\",\n \"mushy\",\n \"music\",\n \"musket\",\n \"muskiness\",\n \"musky\",\n \"mustang\",\n \"mustard\",\n \"muster\",\n \"mustiness\",\n \"musty\",\n \"mutable\",\n \"mutate\",\n \"mutation\",\n \"mute\",\n \"mutilated\",\n \"mutilator\",\n \"mutiny\",\n \"mutt\",\n \"mutual\",\n \"muzzle\",\n \"myself\",\n \"myspace\",\n \"mystified\",\n \"mystify\",\n \"myth\",\n \"nacho\",\n \"nag\",\n \"nail\",\n \"name\",\n \"naming\",\n \"nanny\",\n \"nanometer\",\n \"nape\",\n \"napkin\",\n \"napped\",\n \"napping\",\n \"nappy\",\n \"narrow\",\n \"nastily\",\n \"nastiness\",\n \"national\",\n \"native\",\n \"nativity\",\n \"natural\",\n \"nature\",\n \"naturist\",\n \"nautical\",\n \"navigate\",\n \"navigator\",\n \"navy\",\n \"nearby\",\n \"nearest\",\n \"nearly\",\n \"nearness\",\n \"neatly\",\n \"neatness\",\n \"nebula\",\n \"nebulizer\",\n \"nectar\",\n \"negate\",\n \"negation\",\n \"negative\",\n \"neglector\",\n \"negligee\",\n \"negligent\",\n \"negotiate\",\n \"nemeses\",\n \"nemesis\",\n \"neon\",\n \"nephew\",\n \"nerd\",\n \"nervous\",\n \"nervy\",\n \"nest\",\n \"net\",\n \"neurology\",\n \"neuron\",\n \"neurosis\",\n \"neurotic\",\n \"neuter\",\n \"neutron\",\n \"never\",\n \"next\",\n \"nibble\",\n \"nickname\",\n \"nicotine\",\n \"niece\",\n \"nifty\",\n \"nimble\",\n \"nimbly\",\n \"nineteen\",\n \"ninetieth\",\n \"ninja\",\n \"nintendo\",\n \"ninth\",\n \"nuclear\",\n \"nuclei\",\n \"nucleus\",\n \"nugget\",\n \"nullify\",\n \"number\",\n \"numbing\",\n \"numbly\",\n \"numbness\",\n \"numeral\",\n \"numerate\",\n \"numerator\",\n \"numeric\",\n \"numerous\",\n \"nuptials\",\n \"nursery\",\n \"nursing\",\n \"nurture\",\n \"nutcase\",\n \"nutlike\",\n \"nutmeg\",\n \"nutrient\",\n \"nutshell\",\n \"nuttiness\",\n \"nutty\",\n \"nuzzle\",\n \"nylon\",\n \"oaf\",\n \"oak\",\n \"oasis\",\n \"oat\",\n \"obedience\",\n \"obedient\",\n \"obituary\",\n \"object\",\n \"obligate\",\n \"obliged\",\n \"oblivion\",\n \"oblivious\",\n \"oblong\",\n \"obnoxious\",\n \"oboe\",\n \"obscure\",\n \"obscurity\",\n \"observant\",\n \"observer\",\n \"observing\",\n \"obsessed\",\n \"obsession\",\n \"obsessive\",\n \"obsolete\",\n \"obstacle\",\n \"obstinate\",\n \"obstruct\",\n \"obtain\",\n \"obtrusive\",\n \"obtuse\",\n \"obvious\",\n \"occultist\",\n \"occupancy\",\n \"occupant\",\n \"occupier\",\n \"occupy\",\n \"ocean\",\n \"ocelot\",\n \"octagon\",\n \"octane\",\n \"october\",\n \"octopus\",\n \"ogle\",\n \"oil\",\n \"oink\",\n \"ointment\",\n \"okay\",\n \"old\",\n \"olive\",\n \"olympics\",\n \"omega\",\n \"omen\",\n \"ominous\",\n \"omission\",\n \"omit\",\n \"omnivore\",\n \"onboard\",\n \"oncoming\",\n \"ongoing\",\n \"onion\",\n \"online\",\n \"onlooker\",\n \"only\",\n \"onscreen\",\n \"onset\",\n \"onshore\",\n \"onslaught\",\n \"onstage\",\n \"onto\",\n \"onward\",\n \"onyx\",\n \"oops\",\n \"ooze\",\n \"oozy\",\n \"opacity\",\n \"opal\",\n \"open\",\n \"operable\",\n \"operate\",\n \"operating\",\n \"operation\",\n \"operative\",\n \"operator\",\n \"opium\",\n \"opossum\",\n \"opponent\",\n \"oppose\",\n \"opposing\",\n \"opposite\",\n \"oppressed\",\n \"oppressor\",\n \"opt\",\n \"opulently\",\n \"osmosis\",\n \"other\",\n \"otter\",\n \"ouch\",\n \"ought\",\n \"ounce\",\n \"outage\",\n \"outback\",\n \"outbid\",\n \"outboard\",\n \"outbound\",\n \"outbreak\",\n \"outburst\",\n \"outcast\",\n \"outclass\",\n \"outcome\",\n \"outdated\",\n \"outdoors\",\n \"outer\",\n \"outfield\",\n \"outfit\",\n \"outflank\",\n \"outgoing\",\n \"outgrow\",\n \"outhouse\",\n \"outing\",\n \"outlast\",\n \"outlet\",\n \"outline\",\n \"outlook\",\n \"outlying\",\n \"outmatch\",\n \"outmost\",\n \"outnumber\",\n \"outplayed\",\n \"outpost\",\n \"outpour\",\n \"output\",\n \"outrage\",\n \"outrank\",\n \"outreach\",\n \"outright\",\n \"outscore\",\n \"outsell\",\n \"outshine\",\n \"outshoot\",\n \"outsider\",\n \"outskirts\",\n \"outsmart\",\n \"outsource\",\n \"outspoken\",\n \"outtakes\",\n \"outthink\",\n \"outward\",\n \"outweigh\",\n \"outwit\",\n \"oval\",\n \"ovary\",\n \"oven\",\n \"overact\",\n \"overall\",\n \"overarch\",\n \"overbid\",\n \"overbill\",\n \"overbite\",\n \"overblown\",\n \"overboard\",\n \"overbook\",\n \"overbuilt\",\n \"overcast\",\n \"overcoat\",\n \"overcome\",\n \"overcook\",\n \"overcrowd\",\n \"overdraft\",\n \"overdrawn\",\n \"overdress\",\n \"overdrive\",\n \"overdue\",\n \"overeager\",\n \"overeater\",\n \"overexert\",\n \"overfed\",\n \"overfeed\",\n \"overfill\",\n \"overflow\",\n \"overfull\",\n \"overgrown\",\n \"overhand\",\n \"overhang\",\n \"overhaul\",\n \"overhead\",\n \"overhear\",\n \"overheat\",\n \"overhung\",\n \"overjoyed\",\n \"overkill\",\n \"overlabor\",\n \"overlaid\",\n \"overlap\",\n \"overlay\",\n \"overload\",\n \"overlook\",\n \"overlord\",\n \"overlying\",\n \"overnight\",\n \"overpass\",\n \"overpay\",\n \"overplant\",\n \"overplay\",\n \"overpower\",\n \"overprice\",\n \"overrate\",\n \"overreach\",\n \"overreact\",\n \"override\",\n \"overripe\",\n \"overrule\",\n \"overrun\",\n \"overshoot\",\n \"overshot\",\n \"oversight\",\n \"oversized\",\n \"oversleep\",\n \"oversold\",\n \"overspend\",\n \"overstate\",\n \"overstay\",\n \"overstep\",\n \"overstock\",\n \"overstuff\",\n \"oversweet\",\n \"overtake\",\n \"overthrow\",\n \"overtime\",\n \"overtly\",\n \"overtone\",\n \"overture\",\n \"overturn\",\n \"overuse\",\n \"overvalue\",\n \"overview\",\n \"overwrite\",\n \"owl\",\n \"oxford\",\n \"oxidant\",\n \"oxidation\",\n \"oxidize\",\n \"oxidizing\",\n \"oxygen\",\n \"oxymoron\",\n \"oyster\",\n \"ozone\",\n \"paced\",\n \"pacemaker\",\n \"pacific\",\n \"pacifier\",\n \"pacifism\",\n \"pacifist\",\n \"pacify\",\n \"padded\",\n \"padding\",\n \"paddle\",\n \"paddling\",\n \"padlock\",\n \"pagan\",\n \"pager\",\n \"paging\",\n \"pajamas\",\n \"palace\",\n \"palatable\",\n \"palm\",\n \"palpable\",\n \"palpitate\",\n \"paltry\",\n \"pampered\",\n \"pamperer\",\n \"pampers\",\n \"pamphlet\",\n \"panama\",\n \"pancake\",\n \"pancreas\",\n \"panda\",\n \"pandemic\",\n \"pang\",\n \"panhandle\",\n \"panic\",\n \"panning\",\n \"panorama\",\n \"panoramic\",\n \"panther\",\n \"pantomime\",\n \"pantry\",\n \"pants\",\n \"pantyhose\",\n \"paparazzi\",\n \"papaya\",\n \"paper\",\n \"paprika\",\n \"papyrus\",\n \"parabola\",\n \"parachute\",\n \"parade\",\n \"paradox\",\n \"paragraph\",\n \"parakeet\",\n \"paralegal\",\n \"paralyses\",\n \"paralysis\",\n \"paralyze\",\n \"paramedic\",\n \"parameter\",\n \"paramount\",\n \"parasail\",\n \"parasite\",\n \"parasitic\",\n \"parcel\",\n \"parched\",\n \"parchment\",\n \"pardon\",\n \"parish\",\n \"parka\",\n \"parking\",\n \"parkway\",\n \"parlor\",\n \"parmesan\",\n \"parole\",\n \"parrot\",\n \"parsley\",\n \"parsnip\",\n \"partake\",\n \"parted\",\n \"parting\",\n \"partition\",\n \"partly\",\n \"partner\",\n \"partridge\",\n \"party\",\n \"passable\",\n \"passably\",\n \"passage\",\n \"passcode\",\n \"passenger\",\n \"passerby\",\n \"passing\",\n \"passion\",\n \"passive\",\n \"passivism\",\n \"passover\",\n \"passport\",\n \"password\",\n \"pasta\",\n \"pasted\",\n \"pastel\",\n \"pastime\",\n \"pastor\",\n \"pastrami\",\n \"pasture\",\n \"pasty\",\n \"patchwork\",\n \"patchy\",\n \"paternal\",\n \"paternity\",\n \"path\",\n \"patience\",\n \"patient\",\n \"patio\",\n \"patriarch\",\n \"patriot\",\n \"patrol\",\n \"patronage\",\n \"patronize\",\n \"pauper\",\n \"pavement\",\n \"paver\",\n \"pavestone\",\n \"pavilion\",\n \"paving\",\n \"pawing\",\n \"payable\",\n \"payback\",\n \"paycheck\",\n \"payday\",\n \"payee\",\n \"payer\",\n \"paying\",\n \"payment\",\n \"payphone\",\n \"payroll\",\n \"pebble\",\n \"pebbly\",\n \"pecan\",\n \"pectin\",\n \"peculiar\",\n \"peddling\",\n \"pediatric\",\n \"pedicure\",\n \"pedigree\",\n \"pedometer\",\n \"pegboard\",\n \"pelican\",\n \"pellet\",\n \"pelt\",\n \"pelvis\",\n \"penalize\",\n \"penalty\",\n \"pencil\",\n \"pendant\",\n \"pending\",\n \"penholder\",\n \"penknife\",\n \"pennant\",\n \"penniless\",\n \"penny\",\n \"penpal\",\n \"pension\",\n \"pentagon\",\n \"pentagram\",\n \"pep\",\n \"perceive\",\n \"percent\",\n \"perch\",\n \"percolate\",\n \"perennial\",\n \"perfected\",\n \"perfectly\",\n \"perfume\",\n \"periscope\",\n \"perish\",\n \"perjurer\",\n \"perjury\",\n \"perkiness\",\n \"perky\",\n \"perm\",\n \"peroxide\",\n \"perpetual\",\n \"perplexed\",\n \"persecute\",\n \"persevere\",\n \"persuaded\",\n \"persuader\",\n \"pesky\",\n \"peso\",\n \"pessimism\",\n \"pessimist\",\n \"pester\",\n \"pesticide\",\n \"petal\",\n \"petite\",\n \"petition\",\n \"petri\",\n \"petroleum\",\n \"petted\",\n \"petticoat\",\n \"pettiness\",\n \"petty\",\n \"petunia\",\n \"phantom\",\n \"phobia\",\n \"phoenix\",\n \"phonebook\",\n \"phoney\",\n \"phonics\",\n \"phoniness\",\n \"phony\",\n \"phosphate\",\n \"photo\",\n \"phrase\",\n \"phrasing\",\n \"placard\",\n \"placate\",\n \"placidly\",\n \"plank\",\n \"planner\",\n \"plant\",\n \"plasma\",\n \"plaster\",\n \"plastic\",\n \"plated\",\n \"platform\",\n \"plating\",\n \"platinum\",\n \"platonic\",\n \"platter\",\n \"platypus\",\n \"plausible\",\n \"plausibly\",\n \"playable\",\n \"playback\",\n \"player\",\n \"playful\",\n \"playgroup\",\n \"playhouse\",\n \"playing\",\n \"playlist\",\n \"playmaker\",\n \"playmate\",\n \"playoff\",\n \"playpen\",\n \"playroom\",\n \"playset\",\n \"plaything\",\n \"playtime\",\n \"plaza\",\n \"pleading\",\n \"pleat\",\n \"pledge\",\n \"plentiful\",\n \"plenty\",\n \"plethora\",\n \"plexiglas\",\n \"pliable\",\n \"plod\",\n \"plop\",\n \"plot\",\n \"plow\",\n \"ploy\",\n \"pluck\",\n \"plug\",\n \"plunder\",\n \"plunging\",\n \"plural\",\n \"plus\",\n \"plutonium\",\n \"plywood\",\n \"poach\",\n \"pod\",\n \"poem\",\n \"poet\",\n \"pogo\",\n \"pointed\",\n \"pointer\",\n \"pointing\",\n \"pointless\",\n \"pointy\",\n \"poise\",\n \"poison\",\n \"poker\",\n \"poking\",\n \"polar\",\n \"police\",\n \"policy\",\n \"polio\",\n \"polish\",\n \"politely\",\n \"polka\",\n \"polo\",\n \"polyester\",\n \"polygon\",\n \"polygraph\",\n \"polymer\",\n \"poncho\",\n \"pond\",\n \"pony\",\n \"popcorn\",\n \"pope\",\n \"poplar\",\n \"popper\",\n \"poppy\",\n \"popsicle\",\n \"populace\",\n \"popular\",\n \"populate\",\n \"porcupine\",\n \"pork\",\n \"porous\",\n \"porridge\",\n \"portable\",\n \"portal\",\n \"portfolio\",\n \"porthole\",\n \"portion\",\n \"portly\",\n \"portside\",\n \"poser\",\n \"posh\",\n \"posing\",\n \"possible\",\n \"possibly\",\n \"possum\",\n \"postage\",\n \"postal\",\n \"postbox\",\n \"postcard\",\n \"posted\",\n \"poster\",\n \"posting\",\n \"postnasal\",\n \"posture\",\n \"postwar\",\n \"pouch\",\n \"pounce\",\n \"pouncing\",\n \"pound\",\n \"pouring\",\n \"pout\",\n \"powdered\",\n \"powdering\",\n \"powdery\",\n \"power\",\n \"powwow\",\n \"pox\",\n \"praising\",\n \"prance\",\n \"prancing\",\n \"pranker\",\n \"prankish\",\n \"prankster\",\n \"prayer\",\n \"praying\",\n \"preacher\",\n \"preaching\",\n \"preachy\",\n \"preamble\",\n \"precinct\",\n \"precise\",\n \"precision\",\n \"precook\",\n \"precut\",\n \"predator\",\n \"predefine\",\n \"predict\",\n \"preface\",\n \"prefix\",\n \"preflight\",\n \"preformed\",\n \"pregame\",\n \"pregnancy\",\n \"pregnant\",\n \"preheated\",\n \"prelaunch\",\n \"prelaw\",\n \"prelude\",\n \"premiere\",\n \"premises\",\n \"premium\",\n \"prenatal\",\n \"preoccupy\",\n \"preorder\",\n \"prepaid\",\n \"prepay\",\n \"preplan\",\n \"preppy\",\n \"preschool\",\n \"prescribe\",\n \"preseason\",\n \"preset\",\n \"preshow\",\n \"president\",\n \"presoak\",\n \"press\",\n \"presume\",\n \"presuming\",\n \"preteen\",\n \"pretended\",\n \"pretender\",\n \"pretense\",\n \"pretext\",\n \"pretty\",\n \"pretzel\",\n \"prevail\",\n \"prevalent\",\n \"prevent\",\n \"preview\",\n \"previous\",\n \"prewar\",\n \"prewashed\",\n \"prideful\",\n \"pried\",\n \"primal\",\n \"primarily\",\n \"primary\",\n \"primate\",\n \"primer\",\n \"primp\",\n \"princess\",\n \"print\",\n \"prior\",\n \"prism\",\n \"prison\",\n \"prissy\",\n \"pristine\",\n \"privacy\",\n \"private\",\n \"privatize\",\n \"prize\",\n \"proactive\",\n \"probable\",\n \"probably\",\n \"probation\",\n \"probe\",\n \"probing\",\n \"probiotic\",\n \"problem\",\n \"procedure\",\n \"process\",\n \"proclaim\",\n \"procreate\",\n \"procurer\",\n \"prodigal\",\n \"prodigy\",\n \"produce\",\n \"product\",\n \"profane\",\n \"profanity\",\n \"professed\",\n \"professor\",\n \"profile\",\n \"profound\",\n \"profusely\",\n \"progeny\",\n \"prognosis\",\n \"program\",\n \"progress\",\n \"projector\",\n \"prologue\",\n \"prolonged\",\n \"promenade\",\n \"prominent\",\n \"promoter\",\n \"promotion\",\n \"prompter\",\n \"promptly\",\n \"prone\",\n \"prong\",\n \"pronounce\",\n \"pronto\",\n \"proofing\",\n \"proofread\",\n \"proofs\",\n \"propeller\",\n \"properly\",\n \"property\",\n \"proponent\",\n \"proposal\",\n \"propose\",\n \"props\",\n \"prorate\",\n \"protector\",\n \"protegee\",\n \"proton\",\n \"prototype\",\n \"protozoan\",\n \"protract\",\n \"protrude\",\n \"proud\",\n \"provable\",\n \"proved\",\n \"proven\",\n \"provided\",\n \"provider\",\n \"providing\",\n \"province\",\n \"proving\",\n \"provoke\",\n \"provoking\",\n \"provolone\",\n \"prowess\",\n \"prowler\",\n \"prowling\",\n \"proximity\",\n \"proxy\",\n \"prozac\",\n \"prude\",\n \"prudishly\",\n \"prune\",\n \"pruning\",\n \"pry\",\n \"psychic\",\n \"public\",\n \"publisher\",\n \"pucker\",\n \"pueblo\",\n \"pug\",\n \"pull\",\n \"pulmonary\",\n \"pulp\",\n \"pulsate\",\n \"pulse\",\n \"pulverize\",\n \"puma\",\n \"pumice\",\n \"pummel\",\n \"punch\",\n \"punctual\",\n \"punctuate\",\n \"punctured\",\n \"pungent\",\n \"punisher\",\n \"punk\",\n \"pupil\",\n \"puppet\",\n \"puppy\",\n \"purchase\",\n \"pureblood\",\n \"purebred\",\n \"purely\",\n \"pureness\",\n \"purgatory\",\n \"purge\",\n \"purging\",\n \"purifier\",\n \"purify\",\n \"purist\",\n \"puritan\",\n \"purity\",\n \"purple\",\n \"purplish\",\n \"purposely\",\n \"purr\",\n \"purse\",\n \"pursuable\",\n \"pursuant\",\n \"pursuit\",\n \"purveyor\",\n \"pushcart\",\n \"pushchair\",\n \"pusher\",\n \"pushiness\",\n \"pushing\",\n \"pushover\",\n \"pushpin\",\n \"pushup\",\n \"pushy\",\n \"putdown\",\n \"putt\",\n \"puzzle\",\n \"puzzling\",\n \"pyramid\",\n \"pyromania\",\n \"python\",\n \"quack\",\n \"quadrant\",\n \"quail\",\n \"quaintly\",\n \"quake\",\n \"quaking\",\n \"qualified\",\n \"qualifier\",\n \"qualify\",\n \"quality\",\n \"qualm\",\n \"quantum\",\n \"quarrel\",\n \"quarry\",\n \"quartered\",\n \"quarterly\",\n \"quarters\",\n \"quartet\",\n \"quench\",\n \"query\",\n \"quicken\",\n \"quickly\",\n \"quickness\",\n \"quicksand\",\n \"quickstep\",\n \"quiet\",\n \"quill\",\n \"quilt\",\n \"quintet\",\n \"quintuple\",\n \"quirk\",\n \"quit\",\n \"quiver\",\n \"quizzical\",\n \"quotable\",\n \"quotation\",\n \"quote\",\n \"rabid\",\n \"race\",\n \"racing\",\n \"racism\",\n \"rack\",\n \"racoon\",\n \"radar\",\n \"radial\",\n \"radiance\",\n \"radiantly\",\n \"radiated\",\n \"radiation\",\n \"radiator\",\n \"radio\",\n \"radish\",\n \"raffle\",\n \"raft\",\n \"rage\",\n \"ragged\",\n \"raging\",\n \"ragweed\",\n \"raider\",\n \"railcar\",\n \"railing\",\n \"railroad\",\n \"railway\",\n \"raisin\",\n \"rake\",\n \"raking\",\n \"rally\",\n \"ramble\",\n \"rambling\",\n \"ramp\",\n \"ramrod\",\n \"ranch\",\n \"rancidity\",\n \"random\",\n \"ranged\",\n \"ranger\",\n \"ranging\",\n \"ranked\",\n \"ranking\",\n \"ransack\",\n \"ranting\",\n \"rants\",\n \"rare\",\n \"rarity\",\n \"rascal\",\n \"rash\",\n \"rasping\",\n \"ravage\",\n \"raven\",\n \"ravine\",\n \"raving\",\n \"ravioli\",\n \"ravishing\",\n \"reabsorb\",\n \"reach\",\n \"reacquire\",\n \"reaction\",\n \"reactive\",\n \"reactor\",\n \"reaffirm\",\n \"ream\",\n \"reanalyze\",\n \"reappear\",\n \"reapply\",\n \"reappoint\",\n \"reapprove\",\n \"rearrange\",\n \"rearview\",\n \"reason\",\n \"reassign\",\n \"reassure\",\n \"reattach\",\n \"reawake\",\n \"rebalance\",\n \"rebate\",\n \"rebel\",\n \"rebirth\",\n \"reboot\",\n \"reborn\",\n \"rebound\",\n \"rebuff\",\n \"rebuild\",\n \"rebuilt\",\n \"reburial\",\n \"rebuttal\",\n \"recall\",\n \"recant\",\n \"recapture\",\n \"recast\",\n \"recede\",\n \"recent\",\n \"recess\",\n \"recharger\",\n \"recipient\",\n \"recital\",\n \"recite\",\n \"reckless\",\n \"reclaim\",\n \"recliner\",\n \"reclining\",\n \"recluse\",\n \"reclusive\",\n \"recognize\",\n \"recoil\",\n \"recollect\",\n \"recolor\",\n \"reconcile\",\n \"reconfirm\",\n \"reconvene\",\n \"recopy\",\n \"record\",\n \"recount\",\n \"recoup\",\n \"recovery\",\n \"recreate\",\n \"rectal\",\n \"rectangle\",\n \"rectified\",\n \"rectify\",\n \"recycled\",\n \"recycler\",\n \"recycling\",\n \"reemerge\",\n \"reenact\",\n \"reenter\",\n \"reentry\",\n \"reexamine\",\n \"referable\",\n \"referee\",\n \"reference\",\n \"refill\",\n \"refinance\",\n \"refined\",\n \"refinery\",\n \"refining\",\n \"refinish\",\n \"reflected\",\n \"reflector\",\n \"reflex\",\n \"reflux\",\n \"refocus\",\n \"refold\",\n \"reforest\",\n \"reformat\",\n \"reformed\",\n \"reformer\",\n \"reformist\",\n \"refract\",\n \"refrain\",\n \"refreeze\",\n \"refresh\",\n \"refried\",\n \"refueling\",\n \"refund\",\n \"refurbish\",\n \"refurnish\",\n \"refusal\",\n \"refuse\",\n \"refusing\",\n \"refutable\",\n \"refute\",\n \"regain\",\n \"regalia\",\n \"regally\",\n \"reggae\",\n \"regime\",\n \"region\",\n \"register\",\n \"registrar\",\n \"registry\",\n \"regress\",\n \"regretful\",\n \"regroup\",\n \"regular\",\n \"regulate\",\n \"regulator\",\n \"rehab\",\n \"reheat\",\n \"rehire\",\n \"rehydrate\",\n \"reimburse\",\n \"reissue\",\n \"reiterate\",\n \"rejoice\",\n \"rejoicing\",\n \"rejoin\",\n \"rekindle\",\n \"relapse\",\n \"relapsing\",\n \"relatable\",\n \"related\",\n \"relation\",\n \"relative\",\n \"relax\",\n \"relay\",\n \"relearn\",\n \"release\",\n \"relenting\",\n \"reliable\",\n \"reliably\",\n \"reliance\",\n \"reliant\",\n \"relic\",\n \"relieve\",\n \"relieving\",\n \"relight\",\n \"relish\",\n \"relive\",\n \"reload\",\n \"relocate\",\n \"relock\",\n \"reluctant\",\n \"rely\",\n \"remake\",\n \"remark\",\n \"remarry\",\n \"rematch\",\n \"remedial\",\n \"remedy\",\n \"remember\",\n \"reminder\",\n \"remindful\",\n \"remission\",\n \"remix\",\n \"remnant\",\n \"remodeler\",\n \"remold\",\n \"remorse\",\n \"remote\",\n \"removable\",\n \"removal\",\n \"removed\",\n \"remover\",\n \"removing\",\n \"rename\",\n \"renderer\",\n \"rendering\",\n \"rendition\",\n \"renegade\",\n \"renewable\",\n \"renewably\",\n \"renewal\",\n \"renewed\",\n \"renounce\",\n \"renovate\",\n \"renovator\",\n \"rentable\",\n \"rental\",\n \"rented\",\n \"renter\",\n \"reoccupy\",\n \"reoccur\",\n \"reopen\",\n \"reorder\",\n \"repackage\",\n \"repacking\",\n \"repaint\",\n \"repair\",\n \"repave\",\n \"repaying\",\n \"repayment\",\n \"repeal\",\n \"repeated\",\n \"repeater\",\n \"repent\",\n \"rephrase\",\n \"replace\",\n \"replay\",\n \"replica\",\n \"reply\",\n \"reporter\",\n \"repose\",\n \"repossess\",\n \"repost\",\n \"repressed\",\n \"reprimand\",\n \"reprint\",\n \"reprise\",\n \"reproach\",\n \"reprocess\",\n \"reproduce\",\n \"reprogram\",\n \"reps\",\n \"reptile\",\n \"reptilian\",\n \"repugnant\",\n \"repulsion\",\n \"repulsive\",\n \"repurpose\",\n \"reputable\",\n \"reputably\",\n \"request\",\n \"require\",\n \"requisite\",\n \"reroute\",\n \"rerun\",\n \"resale\",\n \"resample\",\n \"rescuer\",\n \"reseal\",\n \"research\",\n \"reselect\",\n \"reseller\",\n \"resemble\",\n \"resend\",\n \"resent\",\n \"reset\",\n \"reshape\",\n \"reshoot\",\n \"reshuffle\",\n \"residence\",\n \"residency\",\n \"resident\",\n \"residual\",\n \"residue\",\n \"resigned\",\n \"resilient\",\n \"resistant\",\n \"resisting\",\n \"resize\",\n \"resolute\",\n \"resolved\",\n \"resonant\",\n \"resonate\",\n \"resort\",\n \"resource\",\n \"respect\",\n \"resubmit\",\n \"result\",\n \"resume\",\n \"resupply\",\n \"resurface\",\n \"resurrect\",\n \"retail\",\n \"retainer\",\n \"retaining\",\n \"retake\",\n \"retaliate\",\n \"retention\",\n \"rethink\",\n \"retinal\",\n \"retired\",\n \"retiree\",\n \"retiring\",\n \"retold\",\n \"retool\",\n \"retorted\",\n \"retouch\",\n \"retrace\",\n \"retract\",\n \"retrain\",\n \"retread\",\n \"retreat\",\n \"retrial\",\n \"retrieval\",\n \"retriever\",\n \"retry\",\n \"return\",\n \"retying\",\n \"retype\",\n \"reunion\",\n \"reunite\",\n \"reusable\",\n \"reuse\",\n \"reveal\",\n \"reveler\",\n \"revenge\",\n \"revenue\",\n \"reverb\",\n \"revered\",\n \"reverence\",\n \"reverend\",\n \"reversal\",\n \"reverse\",\n \"reversing\",\n \"reversion\",\n \"revert\",\n \"revisable\",\n \"revise\",\n \"revision\",\n \"revisit\",\n \"revivable\",\n \"revival\",\n \"reviver\",\n \"reviving\",\n \"revocable\",\n \"revoke\",\n \"revolt\",\n \"revolver\",\n \"revolving\",\n \"reward\",\n \"rewash\",\n \"rewind\",\n \"rewire\",\n \"reword\",\n \"rework\",\n \"rewrap\",\n \"rewrite\",\n \"rhyme\",\n \"ribbon\",\n \"ribcage\",\n \"rice\",\n \"riches\",\n \"richly\",\n \"richness\",\n \"rickety\",\n \"ricotta\",\n \"riddance\",\n \"ridden\",\n \"ride\",\n \"riding\",\n \"rifling\",\n \"rift\",\n \"rigging\",\n \"rigid\",\n \"rigor\",\n \"rimless\",\n \"rimmed\",\n \"rind\",\n \"rink\",\n \"rinse\",\n \"rinsing\",\n \"riot\",\n \"ripcord\",\n \"ripeness\",\n \"ripening\",\n \"ripping\",\n \"ripple\",\n \"rippling\",\n \"riptide\",\n \"rise\",\n \"rising\",\n \"risk\",\n \"risotto\",\n \"ritalin\",\n \"ritzy\",\n \"rival\",\n \"riverbank\",\n \"riverbed\",\n \"riverboat\",\n \"riverside\",\n \"riveter\",\n \"riveting\",\n \"roamer\",\n \"roaming\",\n \"roast\",\n \"robbing\",\n \"robe\",\n \"robin\",\n \"robotics\",\n \"robust\",\n \"rockband\",\n \"rocker\",\n \"rocket\",\n \"rockfish\",\n \"rockiness\",\n \"rocking\",\n \"rocklike\",\n \"rockslide\",\n \"rockstar\",\n \"rocky\",\n \"rogue\",\n \"roman\",\n \"romp\",\n \"rope\",\n \"roping\",\n \"roster\",\n \"rosy\",\n \"rotten\",\n \"rotting\",\n \"rotunda\",\n \"roulette\",\n \"rounding\",\n \"roundish\",\n \"roundness\",\n \"roundup\",\n \"roundworm\",\n \"routine\",\n \"routing\",\n \"rover\",\n \"roving\",\n \"royal\",\n \"rubbed\",\n \"rubber\",\n \"rubbing\",\n \"rubble\",\n \"rubdown\",\n \"ruby\",\n \"ruckus\",\n \"rudder\",\n \"rug\",\n \"ruined\",\n \"rule\",\n \"rumble\",\n \"rumbling\",\n \"rummage\",\n \"rumor\",\n \"runaround\",\n \"rundown\",\n \"runner\",\n \"running\",\n \"runny\",\n \"runt\",\n \"runway\",\n \"rupture\",\n \"rural\",\n \"ruse\",\n \"rush\",\n \"rust\",\n \"rut\",\n \"sabbath\",\n \"sabotage\",\n \"sacrament\",\n \"sacred\",\n \"sacrifice\",\n \"sadden\",\n \"saddlebag\",\n \"saddled\",\n \"saddling\",\n \"sadly\",\n \"sadness\",\n \"safari\",\n \"safeguard\",\n \"safehouse\",\n \"safely\",\n \"safeness\",\n \"saffron\",\n \"saga\",\n \"sage\",\n \"sagging\",\n \"saggy\",\n \"said\",\n \"saint\",\n \"sake\",\n \"salad\",\n \"salami\",\n \"salaried\",\n \"salary\",\n \"saline\",\n \"salon\",\n \"saloon\",\n \"salsa\",\n \"salt\",\n \"salutary\",\n \"salute\",\n \"salvage\",\n \"salvaging\",\n \"salvation\",\n \"same\",\n \"sample\",\n \"sampling\",\n \"sanction\",\n \"sanctity\",\n \"sanctuary\",\n \"sandal\",\n \"sandbag\",\n \"sandbank\",\n \"sandbar\",\n \"sandblast\",\n \"sandbox\",\n \"sanded\",\n \"sandfish\",\n \"sanding\",\n \"sandlot\",\n \"sandpaper\",\n \"sandpit\",\n \"sandstone\",\n \"sandstorm\",\n \"sandworm\",\n \"sandy\",\n \"sanitary\",\n \"sanitizer\",\n \"sank\",\n \"santa\",\n \"sapling\",\n \"sappiness\",\n \"sappy\",\n \"sarcasm\",\n \"sarcastic\",\n \"sardine\",\n \"sash\",\n \"sasquatch\",\n \"sassy\",\n \"satchel\",\n \"satiable\",\n \"satin\",\n \"satirical\",\n \"satisfied\",\n \"satisfy\",\n \"saturate\",\n \"saturday\",\n \"sauciness\",\n \"saucy\",\n \"sauna\",\n \"savage\",\n \"savanna\",\n \"saved\",\n \"savings\",\n \"savior\",\n \"savor\",\n \"saxophone\",\n \"say\",\n \"scabbed\",\n \"scabby\",\n \"scalded\",\n \"scalding\",\n \"scale\",\n \"scaling\",\n \"scallion\",\n \"scallop\",\n \"scalping\",\n \"scam\",\n \"scandal\",\n \"scanner\",\n \"scanning\",\n \"scant\",\n \"scapegoat\",\n \"scarce\",\n \"scarcity\",\n \"scarecrow\",\n \"scared\",\n \"scarf\",\n \"scarily\",\n \"scariness\",\n \"scarring\",\n \"scary\",\n \"scavenger\",\n \"scenic\",\n \"schedule\",\n \"schematic\",\n \"scheme\",\n \"scheming\",\n \"schilling\",\n \"schnapps\",\n \"scholar\",\n \"science\",\n \"scientist\",\n \"scion\",\n \"scoff\",\n \"scolding\",\n \"scone\",\n \"scoop\",\n \"scooter\",\n \"scope\",\n \"scorch\",\n \"scorebook\",\n \"scorecard\",\n \"scored\",\n \"scoreless\",\n \"scorer\",\n \"scoring\",\n \"scorn\",\n \"scorpion\",\n \"scotch\",\n \"scoundrel\",\n \"scoured\",\n \"scouring\",\n \"scouting\",\n \"scouts\",\n \"scowling\",\n \"scrabble\",\n \"scraggly\",\n \"scrambled\",\n \"scrambler\",\n \"scrap\",\n \"scratch\",\n \"scrawny\",\n \"screen\",\n \"scribble\",\n \"scribe\",\n \"scribing\",\n \"scrimmage\",\n \"script\",\n \"scroll\",\n \"scrooge\",\n \"scrounger\",\n \"scrubbed\",\n \"scrubber\",\n \"scruffy\",\n \"scrunch\",\n \"scrutiny\",\n \"scuba\",\n \"scuff\",\n \"sculptor\",\n \"sculpture\",\n \"scurvy\",\n \"scuttle\",\n \"secluded\",\n \"secluding\",\n \"seclusion\",\n \"second\",\n \"secrecy\",\n \"secret\",\n \"sectional\",\n \"sector\",\n \"secular\",\n \"securely\",\n \"security\",\n \"sedan\",\n \"sedate\",\n \"sedation\",\n \"sedative\",\n \"sediment\",\n \"seduce\",\n \"seducing\",\n \"segment\",\n \"seismic\",\n \"seizing\",\n \"seldom\",\n \"selected\",\n \"selection\",\n \"selective\",\n \"selector\",\n \"self\",\n \"seltzer\",\n \"semantic\",\n \"semester\",\n \"semicolon\",\n \"semifinal\",\n \"seminar\",\n \"semisoft\",\n \"semisweet\",\n \"senate\",\n \"senator\",\n \"send\",\n \"senior\",\n \"senorita\",\n \"sensation\",\n \"sensitive\",\n \"sensitize\",\n \"sensually\",\n \"sensuous\",\n \"sepia\",\n \"september\",\n \"septic\",\n \"septum\",\n \"sequel\",\n \"sequence\",\n \"sequester\",\n \"series\",\n \"sermon\",\n \"serotonin\",\n \"serpent\",\n \"serrated\",\n \"serve\",\n \"service\",\n \"serving\",\n \"sesame\",\n \"sessions\",\n \"setback\",\n \"setting\",\n \"settle\",\n \"settling\",\n \"setup\",\n \"sevenfold\",\n \"seventeen\",\n \"seventh\",\n \"seventy\",\n \"severity\",\n \"shabby\",\n \"shack\",\n \"shaded\",\n \"shadily\",\n \"shadiness\",\n \"shading\",\n \"shadow\",\n \"shady\",\n \"shaft\",\n \"shakable\",\n \"shakily\",\n \"shakiness\",\n \"shaking\",\n \"shaky\",\n \"shale\",\n \"shallot\",\n \"shallow\",\n \"shame\",\n \"shampoo\",\n \"shamrock\",\n \"shank\",\n \"shanty\",\n \"shape\",\n \"shaping\",\n \"share\",\n \"sharpener\",\n \"sharper\",\n \"sharpie\",\n \"sharply\",\n \"sharpness\",\n \"shawl\",\n \"sheath\",\n \"shed\",\n \"sheep\",\n \"sheet\",\n \"shelf\",\n \"shell\",\n \"shelter\",\n \"shelve\",\n \"shelving\",\n \"sherry\",\n \"shield\",\n \"shifter\",\n \"shifting\",\n \"shiftless\",\n \"shifty\",\n \"shimmer\",\n \"shimmy\",\n \"shindig\",\n \"shine\",\n \"shingle\",\n \"shininess\",\n \"shining\",\n \"shiny\",\n \"ship\",\n \"shirt\",\n \"shivering\",\n \"shock\",\n \"shone\",\n \"shoplift\",\n \"shopper\",\n \"shopping\",\n \"shoptalk\",\n \"shore\",\n \"shortage\",\n \"shortcake\",\n \"shortcut\",\n \"shorten\",\n \"shorter\",\n \"shorthand\",\n \"shortlist\",\n \"shortly\",\n \"shortness\",\n \"shorts\",\n \"shortwave\",\n \"shorty\",\n \"shout\",\n \"shove\",\n \"showbiz\",\n \"showcase\",\n \"showdown\",\n \"shower\",\n \"showgirl\",\n \"showing\",\n \"showman\",\n \"shown\",\n \"showoff\",\n \"showpiece\",\n \"showplace\",\n \"showroom\",\n \"showy\",\n \"shrank\",\n \"shrapnel\",\n \"shredder\",\n \"shredding\",\n \"shrewdly\",\n \"shriek\",\n \"shrill\",\n \"shrimp\",\n \"shrine\",\n \"shrink\",\n \"shrivel\",\n \"shrouded\",\n \"shrubbery\",\n \"shrubs\",\n \"shrug\",\n \"shrunk\",\n \"shucking\",\n \"shudder\",\n \"shuffle\",\n \"shuffling\",\n \"shun\",\n \"shush\",\n \"shut\",\n \"shy\",\n \"siamese\",\n \"siberian\",\n \"sibling\",\n \"siding\",\n \"sierra\",\n \"siesta\",\n \"sift\",\n \"sighing\",\n \"silenced\",\n \"silencer\",\n \"silent\",\n \"silica\",\n \"silicon\",\n \"silk\",\n \"silliness\",\n \"silly\",\n \"silo\",\n \"silt\",\n \"silver\",\n \"similarly\",\n \"simile\",\n \"simmering\",\n \"simple\",\n \"simplify\",\n \"simply\",\n \"sincere\",\n \"sincerity\",\n \"singer\",\n \"singing\",\n \"single\",\n \"singular\",\n \"sinister\",\n \"sinless\",\n \"sinner\",\n \"sinuous\",\n \"sip\",\n \"siren\",\n \"sister\",\n \"sitcom\",\n \"sitter\",\n \"sitting\",\n \"situated\",\n \"situation\",\n \"sixfold\",\n \"sixteen\",\n \"sixth\",\n \"sixties\",\n \"sixtieth\",\n \"sixtyfold\",\n \"sizable\",\n \"sizably\",\n \"size\",\n \"sizing\",\n \"sizzle\",\n \"sizzling\",\n \"skater\",\n \"skating\",\n \"skedaddle\",\n \"skeletal\",\n \"skeleton\",\n \"skeptic\",\n \"sketch\",\n \"skewed\",\n \"skewer\",\n \"skid\",\n \"skied\",\n \"skier\",\n \"skies\",\n \"skiing\",\n \"skilled\",\n \"skillet\",\n \"skillful\",\n \"skimmed\",\n \"skimmer\",\n \"skimming\",\n \"skimpily\",\n \"skincare\",\n \"skinhead\",\n \"skinless\",\n \"skinning\",\n \"skinny\",\n \"skintight\",\n \"skipper\",\n \"skipping\",\n \"skirmish\",\n \"skirt\",\n \"skittle\",\n \"skydiver\",\n \"skylight\",\n \"skyline\",\n \"skype\",\n \"skyrocket\",\n \"skyward\",\n \"slab\",\n \"slacked\",\n \"slacker\",\n \"slacking\",\n \"slackness\",\n \"slacks\",\n \"slain\",\n \"slam\",\n \"slander\",\n \"slang\",\n \"slapping\",\n \"slapstick\",\n \"slashed\",\n \"slashing\",\n \"slate\",\n \"slather\",\n \"slaw\",\n \"sled\",\n \"sleek\",\n \"sleep\",\n \"sleet\",\n \"sleeve\",\n \"slept\",\n \"sliceable\",\n \"sliced\",\n \"slicer\",\n \"slicing\",\n \"slick\",\n \"slider\",\n \"slideshow\",\n \"sliding\",\n \"slighted\",\n \"slighting\",\n \"slightly\",\n \"slimness\",\n \"slimy\",\n \"slinging\",\n \"slingshot\",\n \"slinky\",\n \"slip\",\n \"slit\",\n \"sliver\",\n \"slobbery\",\n \"slogan\",\n \"sloped\",\n \"sloping\",\n \"sloppily\",\n \"sloppy\",\n \"slot\",\n \"slouching\",\n \"slouchy\",\n \"sludge\",\n \"slug\",\n \"slum\",\n \"slurp\",\n \"slush\",\n \"sly\",\n \"small\",\n \"smartly\",\n \"smartness\",\n \"smasher\",\n \"smashing\",\n \"smashup\",\n \"smell\",\n \"smelting\",\n \"smile\",\n \"smilingly\",\n \"smirk\",\n \"smite\",\n \"smith\",\n \"smitten\",\n \"smock\",\n \"smog\",\n \"smoked\",\n \"smokeless\",\n \"smokiness\",\n \"smoking\",\n \"smoky\",\n \"smolder\",\n \"smooth\",\n \"smother\",\n \"smudge\",\n \"smudgy\",\n \"smuggler\",\n \"smuggling\",\n \"smugly\",\n \"smugness\",\n \"snack\",\n \"snagged\",\n \"snaking\",\n \"snap\",\n \"snare\",\n \"snarl\",\n \"snazzy\",\n \"sneak\",\n \"sneer\",\n \"sneeze\",\n \"sneezing\",\n \"snide\",\n \"sniff\",\n \"snippet\",\n \"snipping\",\n \"snitch\",\n \"snooper\",\n \"snooze\",\n \"snore\",\n \"snoring\",\n \"snorkel\",\n \"snort\",\n \"snout\",\n \"snowbird\",\n \"snowboard\",\n \"snowbound\",\n \"snowcap\",\n \"snowdrift\",\n \"snowdrop\",\n \"snowfall\",\n \"snowfield\",\n \"snowflake\",\n \"snowiness\",\n \"snowless\",\n \"snowman\",\n \"snowplow\",\n \"snowshoe\",\n \"snowstorm\",\n \"snowsuit\",\n \"snowy\",\n \"snub\",\n \"snuff\",\n \"snuggle\",\n \"snugly\",\n \"snugness\",\n \"speak\",\n \"spearfish\",\n \"spearhead\",\n \"spearman\",\n \"spearmint\",\n \"species\",\n \"specimen\",\n \"specked\",\n \"speckled\",\n \"specks\",\n \"spectacle\",\n \"spectator\",\n \"spectrum\",\n \"speculate\",\n \"speech\",\n \"speed\",\n \"spellbind\",\n \"speller\",\n \"spelling\",\n \"spendable\",\n \"spender\",\n \"spending\",\n \"spent\",\n \"spew\",\n \"sphere\",\n \"spherical\",\n \"sphinx\",\n \"spider\",\n \"spied\",\n \"spiffy\",\n \"spill\",\n \"spilt\",\n \"spinach\",\n \"spinal\",\n \"spindle\",\n \"spinner\",\n \"spinning\",\n \"spinout\",\n \"spinster\",\n \"spiny\",\n \"spiral\",\n \"spirited\",\n \"spiritism\",\n \"spirits\",\n \"spiritual\",\n \"splashed\",\n \"splashing\",\n \"splashy\",\n \"splatter\",\n \"spleen\",\n \"splendid\",\n \"splendor\",\n \"splice\",\n \"splicing\",\n \"splinter\",\n \"splotchy\",\n \"splurge\",\n \"spoilage\",\n \"spoiled\",\n \"spoiler\",\n \"spoiling\",\n \"spoils\",\n \"spoken\",\n \"spokesman\",\n \"sponge\",\n \"spongy\",\n \"sponsor\",\n \"spoof\",\n \"spookily\",\n \"spooky\",\n \"spool\",\n \"spoon\",\n \"spore\",\n \"sporting\",\n \"sports\",\n \"sporty\",\n \"spotless\",\n \"spotlight\",\n \"spotted\",\n \"spotter\",\n \"spotting\",\n \"spotty\",\n \"spousal\",\n \"spouse\",\n \"spout\",\n \"sprain\",\n \"sprang\",\n \"sprawl\",\n \"spray\",\n \"spree\",\n \"sprig\",\n \"spring\",\n \"sprinkled\",\n \"sprinkler\",\n \"sprint\",\n \"sprite\",\n \"sprout\",\n \"spruce\",\n \"sprung\",\n \"spry\",\n \"spud\",\n \"spur\",\n \"sputter\",\n \"spyglass\",\n \"squabble\",\n \"squad\",\n \"squall\",\n \"squander\",\n \"squash\",\n \"squatted\",\n \"squatter\",\n \"squatting\",\n \"squeak\",\n \"squealer\",\n \"squealing\",\n \"squeamish\",\n \"squeegee\",\n \"squeeze\",\n \"squeezing\",\n \"squid\",\n \"squiggle\",\n \"squiggly\",\n \"squint\",\n \"squire\",\n \"squirt\",\n \"squishier\",\n \"squishy\",\n \"stability\",\n \"stabilize\",\n \"stable\",\n \"stack\",\n \"stadium\",\n \"staff\",\n \"stage\",\n \"staging\",\n \"stagnant\",\n \"stagnate\",\n \"stainable\",\n \"stained\",\n \"staining\",\n \"stainless\",\n \"stalemate\",\n \"staleness\",\n \"stalling\",\n \"stallion\",\n \"stamina\",\n \"stammer\",\n \"stamp\",\n \"stand\",\n \"stank\",\n \"staple\",\n \"stapling\",\n \"starboard\",\n \"starch\",\n \"stardom\",\n \"stardust\",\n \"starfish\",\n \"stargazer\",\n \"staring\",\n \"stark\",\n \"starless\",\n \"starlet\",\n \"starlight\",\n \"starlit\",\n \"starring\",\n \"starry\",\n \"starship\",\n \"starter\",\n \"starting\",\n \"startle\",\n \"startling\",\n \"startup\",\n \"starved\",\n \"starving\",\n \"stash\",\n \"state\",\n \"static\",\n \"statistic\",\n \"statue\",\n \"stature\",\n \"status\",\n \"statute\",\n \"statutory\",\n \"staunch\",\n \"stays\",\n \"steadfast\",\n \"steadier\",\n \"steadily\",\n \"steadying\",\n \"steam\",\n \"steed\",\n \"steep\",\n \"steerable\",\n \"steering\",\n \"steersman\",\n \"stegosaur\",\n \"stellar\",\n \"stem\",\n \"stench\",\n \"stencil\",\n \"step\",\n \"stereo\",\n \"sterile\",\n \"sterility\",\n \"sterilize\",\n \"sterling\",\n \"sternness\",\n \"sternum\",\n \"stew\",\n \"stick\",\n \"stiffen\",\n \"stiffly\",\n \"stiffness\",\n \"stifle\",\n \"stifling\",\n \"stillness\",\n \"stilt\",\n \"stimulant\",\n \"stimulate\",\n \"stimuli\",\n \"stimulus\",\n \"stinger\",\n \"stingily\",\n \"stinging\",\n \"stingray\",\n \"stingy\",\n \"stinking\",\n \"stinky\",\n \"stipend\",\n \"stipulate\",\n \"stir\",\n \"stitch\",\n \"stock\",\n \"stoic\",\n \"stoke\",\n \"stole\",\n \"stomp\",\n \"stonewall\",\n \"stoneware\",\n \"stonework\",\n \"stoning\",\n \"stony\",\n \"stood\",\n \"stooge\",\n \"stool\",\n \"stoop\",\n \"stoplight\",\n \"stoppable\",\n \"stoppage\",\n \"stopped\",\n \"stopper\",\n \"stopping\",\n \"stopwatch\",\n \"storable\",\n \"storage\",\n \"storeroom\",\n \"storewide\",\n \"storm\",\n \"stout\",\n \"stove\",\n \"stowaway\",\n \"stowing\",\n \"straddle\",\n \"straggler\",\n \"strained\",\n \"strainer\",\n \"straining\",\n \"strangely\",\n \"stranger\",\n \"strangle\",\n \"strategic\",\n \"strategy\",\n \"stratus\",\n \"straw\",\n \"stray\",\n \"streak\",\n \"stream\",\n \"street\",\n \"strength\",\n \"strenuous\",\n \"strep\",\n \"stress\",\n \"stretch\",\n \"strewn\",\n \"stricken\",\n \"strict\",\n \"stride\",\n \"strife\",\n \"strike\",\n \"striking\",\n \"strive\",\n \"striving\",\n \"strobe\",\n \"strode\",\n \"stroller\",\n \"strongbox\",\n \"strongly\",\n \"strongman\",\n \"struck\",\n \"structure\",\n \"strudel\",\n \"struggle\",\n \"strum\",\n \"strung\",\n \"strut\",\n \"stubbed\",\n \"stubble\",\n \"stubbly\",\n \"stubborn\",\n \"stucco\",\n \"stuck\",\n \"student\",\n \"studied\",\n \"studio\",\n \"study\",\n \"stuffed\",\n \"stuffing\",\n \"stuffy\",\n \"stumble\",\n \"stumbling\",\n \"stump\",\n \"stung\",\n \"stunned\",\n \"stunner\",\n \"stunning\",\n \"stunt\",\n \"stupor\",\n \"sturdily\",\n \"sturdy\",\n \"styling\",\n \"stylishly\",\n \"stylist\",\n \"stylized\",\n \"stylus\",\n \"suave\",\n \"subarctic\",\n \"subatomic\",\n \"subdivide\",\n \"subdued\",\n \"subduing\",\n \"subfloor\",\n \"subgroup\",\n \"subheader\",\n \"subject\",\n \"sublease\",\n \"sublet\",\n \"sublevel\",\n \"sublime\",\n \"submarine\",\n \"submerge\",\n \"submersed\",\n \"submitter\",\n \"subpanel\",\n \"subpar\",\n \"subplot\",\n \"subprime\",\n \"subscribe\",\n \"subscript\",\n \"subsector\",\n \"subside\",\n \"subsiding\",\n \"subsidize\",\n \"subsidy\",\n \"subsoil\",\n \"subsonic\",\n \"substance\",\n \"subsystem\",\n \"subtext\",\n \"subtitle\",\n \"subtly\",\n \"subtotal\",\n \"subtract\",\n \"subtype\",\n \"suburb\",\n \"subway\",\n \"subwoofer\",\n \"subzero\",\n \"succulent\",\n \"such\",\n \"suction\",\n \"sudden\",\n \"sudoku\",\n \"suds\",\n \"sufferer\",\n \"suffering\",\n \"suffice\",\n \"suffix\",\n \"suffocate\",\n \"suffrage\",\n \"sugar\",\n \"suggest\",\n \"suing\",\n \"suitable\",\n \"suitably\",\n \"suitcase\",\n \"suitor\",\n \"sulfate\",\n \"sulfide\",\n \"sulfite\",\n \"sulfur\",\n \"sulk\",\n \"sullen\",\n \"sulphate\",\n \"sulphuric\",\n \"sultry\",\n \"superbowl\",\n \"superglue\",\n \"superhero\",\n \"superior\",\n \"superjet\",\n \"superman\",\n \"supermom\",\n \"supernova\",\n \"supervise\",\n \"supper\",\n \"supplier\",\n \"supply\",\n \"support\",\n \"supremacy\",\n \"supreme\",\n \"surcharge\",\n \"surely\",\n \"sureness\",\n \"surface\",\n \"surfacing\",\n \"surfboard\",\n \"surfer\",\n \"surgery\",\n \"surgical\",\n \"surging\",\n \"surname\",\n \"surpass\",\n \"surplus\",\n \"surprise\",\n \"surreal\",\n \"surrender\",\n \"surrogate\",\n \"surround\",\n \"survey\",\n \"survival\",\n \"survive\",\n \"surviving\",\n \"survivor\",\n \"sushi\",\n \"suspect\",\n \"suspend\",\n \"suspense\",\n \"sustained\",\n \"sustainer\",\n \"swab\",\n \"swaddling\",\n \"swagger\",\n \"swampland\",\n \"swan\",\n \"swapping\",\n \"swarm\",\n \"sway\",\n \"swear\",\n \"sweat\",\n \"sweep\",\n \"swell\",\n \"swept\",\n \"swerve\",\n \"swifter\",\n \"swiftly\",\n \"swiftness\",\n \"swimmable\",\n \"swimmer\",\n \"swimming\",\n \"swimsuit\",\n \"swimwear\",\n \"swinger\",\n \"swinging\",\n \"swipe\",\n \"swirl\",\n \"switch\",\n \"swivel\",\n \"swizzle\",\n \"swooned\",\n \"swoop\",\n \"swoosh\",\n \"swore\",\n \"sworn\",\n \"swung\",\n \"sycamore\",\n \"sympathy\",\n \"symphonic\",\n \"symphony\",\n \"symptom\",\n \"synapse\",\n \"syndrome\",\n \"synergy\",\n \"synopses\",\n \"synopsis\",\n \"synthesis\",\n \"synthetic\",\n \"syrup\",\n \"system\",\n \"t-shirt\",\n \"tabasco\",\n \"tabby\",\n \"tableful\",\n \"tables\",\n \"tablet\",\n \"tableware\",\n \"tabloid\",\n \"tackiness\",\n \"tacking\",\n \"tackle\",\n \"tackling\",\n \"tacky\",\n \"taco\",\n \"tactful\",\n \"tactical\",\n \"tactics\",\n \"tactile\",\n \"tactless\",\n \"tadpole\",\n \"taekwondo\",\n \"tag\",\n \"tainted\",\n \"take\",\n \"taking\",\n \"talcum\",\n \"talisman\",\n \"tall\",\n \"talon\",\n \"tamale\",\n \"tameness\",\n \"tamer\",\n \"tamper\",\n \"tank\",\n \"tanned\",\n \"tannery\",\n \"tanning\",\n \"tantrum\",\n \"tapeless\",\n \"tapered\",\n \"tapering\",\n \"tapestry\",\n \"tapioca\",\n \"tapping\",\n \"taps\",\n \"tarantula\",\n \"target\",\n \"tarmac\",\n \"tarnish\",\n \"tarot\",\n \"tartar\",\n \"tartly\",\n \"tartness\",\n \"task\",\n \"tassel\",\n \"taste\",\n \"tastiness\",\n \"tasting\",\n \"tasty\",\n \"tattered\",\n \"tattle\",\n \"tattling\",\n \"tattoo\",\n \"taunt\",\n \"tavern\",\n \"thank\",\n \"that\",\n \"thaw\",\n \"theater\",\n \"theatrics\",\n \"thee\",\n \"theft\",\n \"theme\",\n \"theology\",\n \"theorize\",\n \"thermal\",\n \"thermos\",\n \"thesaurus\",\n \"these\",\n \"thesis\",\n \"thespian\",\n \"thicken\",\n \"thicket\",\n \"thickness\",\n \"thieving\",\n \"thievish\",\n \"thigh\",\n \"thimble\",\n \"thing\",\n \"think\",\n \"thinly\",\n \"thinner\",\n \"thinness\",\n \"thinning\",\n \"thirstily\",\n \"thirsting\",\n \"thirsty\",\n \"thirteen\",\n \"thirty\",\n \"thong\",\n \"thorn\",\n \"those\",\n \"thousand\",\n \"thrash\",\n \"thread\",\n \"threaten\",\n \"threefold\",\n \"thrift\",\n \"thrill\",\n \"thrive\",\n \"thriving\",\n \"throat\",\n \"throbbing\",\n \"throng\",\n \"throttle\",\n \"throwaway\",\n \"throwback\",\n \"thrower\",\n \"throwing\",\n \"thud\",\n \"thumb\",\n \"thumping\",\n \"thursday\",\n \"thus\",\n \"thwarting\",\n \"thyself\",\n \"tiara\",\n \"tibia\",\n \"tidal\",\n \"tidbit\",\n \"tidiness\",\n \"tidings\",\n \"tidy\",\n \"tiger\",\n \"tighten\",\n \"tightly\",\n \"tightness\",\n \"tightrope\",\n \"tightwad\",\n \"tigress\",\n \"tile\",\n \"tiling\",\n \"till\",\n \"tilt\",\n \"timid\",\n \"timing\",\n \"timothy\",\n \"tinderbox\",\n \"tinfoil\",\n \"tingle\",\n \"tingling\",\n \"tingly\",\n \"tinker\",\n \"tinkling\",\n \"tinsel\",\n \"tinsmith\",\n \"tint\",\n \"tinwork\",\n \"tiny\",\n \"tipoff\",\n \"tipped\",\n \"tipper\",\n \"tipping\",\n \"tiptoeing\",\n \"tiptop\",\n \"tiring\",\n \"tissue\",\n \"trace\",\n \"tracing\",\n \"track\",\n \"traction\",\n \"tractor\",\n \"trade\",\n \"trading\",\n \"tradition\",\n \"traffic\",\n \"tragedy\",\n \"trailing\",\n \"trailside\",\n \"train\",\n \"traitor\",\n \"trance\",\n \"tranquil\",\n \"transfer\",\n \"transform\",\n \"translate\",\n \"transpire\",\n \"transport\",\n \"transpose\",\n \"trapdoor\",\n \"trapeze\",\n \"trapezoid\",\n \"trapped\",\n \"trapper\",\n \"trapping\",\n \"traps\",\n \"trash\",\n \"travel\",\n \"traverse\",\n \"travesty\",\n \"tray\",\n \"treachery\",\n \"treading\",\n \"treadmill\",\n \"treason\",\n \"treat\",\n \"treble\",\n \"tree\",\n \"trekker\",\n \"tremble\",\n \"trembling\",\n \"tremor\",\n \"trench\",\n \"trend\",\n \"trespass\",\n \"triage\",\n \"trial\",\n \"triangle\",\n \"tribesman\",\n \"tribunal\",\n \"tribune\",\n \"tributary\",\n \"tribute\",\n \"triceps\",\n \"trickery\",\n \"trickily\",\n \"tricking\",\n \"trickle\",\n \"trickster\",\n \"tricky\",\n \"tricolor\",\n \"tricycle\",\n \"trident\",\n \"tried\",\n \"trifle\",\n \"trifocals\",\n \"trillion\",\n \"trilogy\",\n \"trimester\",\n \"trimmer\",\n \"trimming\",\n \"trimness\",\n \"trinity\",\n \"trio\",\n \"tripod\",\n \"tripping\",\n \"triumph\",\n \"trivial\",\n \"trodden\",\n \"trolling\",\n \"trombone\",\n \"trophy\",\n \"tropical\",\n \"tropics\",\n \"trouble\",\n \"troubling\",\n \"trough\",\n \"trousers\",\n \"trout\",\n \"trowel\",\n \"truce\",\n \"truck\",\n \"truffle\",\n \"trump\",\n \"trunks\",\n \"trustable\",\n \"trustee\",\n \"trustful\",\n \"trusting\",\n \"trustless\",\n \"truth\",\n \"try\",\n \"tubby\",\n \"tubeless\",\n \"tubular\",\n \"tucking\",\n \"tuesday\",\n \"tug\",\n \"tuition\",\n \"tulip\",\n \"tumble\",\n \"tumbling\",\n \"tummy\",\n \"turban\",\n \"turbine\",\n \"turbofan\",\n \"turbojet\",\n \"turbulent\",\n \"turf\",\n \"turkey\",\n \"turmoil\",\n \"turret\",\n \"turtle\",\n \"tusk\",\n \"tutor\",\n \"tutu\",\n \"tux\",\n \"tweak\",\n \"tweed\",\n \"tweet\",\n \"tweezers\",\n \"twelve\",\n \"twentieth\",\n \"twenty\",\n \"twerp\",\n \"twice\",\n \"twiddle\",\n \"twiddling\",\n \"twig\",\n \"twilight\",\n \"twine\",\n \"twins\",\n \"twirl\",\n \"twistable\",\n \"twisted\",\n \"twister\",\n \"twisting\",\n \"twisty\",\n \"twitch\",\n \"twitter\",\n \"tycoon\",\n \"tying\",\n \"tyke\",\n \"udder\",\n \"ultimate\",\n \"ultimatum\",\n \"ultra\",\n \"umbilical\",\n \"umbrella\",\n \"umpire\",\n \"unabashed\",\n \"unable\",\n \"unadorned\",\n \"unadvised\",\n \"unafraid\",\n \"unaired\",\n \"unaligned\",\n \"unaltered\",\n \"unarmored\",\n \"unashamed\",\n \"unaudited\",\n \"unawake\",\n \"unaware\",\n \"unbaked\",\n \"unbalance\",\n \"unbeaten\",\n \"unbend\",\n \"unbent\",\n \"unbiased\",\n \"unbitten\",\n \"unblended\",\n \"unblessed\",\n \"unblock\",\n \"unbolted\",\n \"unbounded\",\n \"unboxed\",\n \"unbraided\",\n \"unbridle\",\n \"unbroken\",\n \"unbuckled\",\n \"unbundle\",\n \"unburned\",\n \"unbutton\",\n \"uncanny\",\n \"uncapped\",\n \"uncaring\",\n \"uncertain\",\n \"unchain\",\n \"unchanged\",\n \"uncharted\",\n \"uncheck\",\n \"uncivil\",\n \"unclad\",\n \"unclaimed\",\n \"unclamped\",\n \"unclasp\",\n \"uncle\",\n \"unclip\",\n \"uncloak\",\n \"unclog\",\n \"unclothed\",\n \"uncoated\",\n \"uncoiled\",\n \"uncolored\",\n \"uncombed\",\n \"uncommon\",\n \"uncooked\",\n \"uncork\",\n \"uncorrupt\",\n \"uncounted\",\n \"uncouple\",\n \"uncouth\",\n \"uncover\",\n \"uncross\",\n \"uncrown\",\n \"uncrushed\",\n \"uncured\",\n \"uncurious\",\n \"uncurled\",\n \"uncut\",\n \"undamaged\",\n \"undated\",\n \"undaunted\",\n \"undead\",\n \"undecided\",\n \"undefined\",\n \"underage\",\n \"underarm\",\n \"undercoat\",\n \"undercook\",\n \"undercut\",\n \"underdog\",\n \"underdone\",\n \"underfed\",\n \"underfeed\",\n \"underfoot\",\n \"undergo\",\n \"undergrad\",\n \"underhand\",\n \"underline\",\n \"underling\",\n \"undermine\",\n \"undermost\",\n \"underpaid\",\n \"underpass\",\n \"underpay\",\n \"underrate\",\n \"undertake\",\n \"undertone\",\n \"undertook\",\n \"undertow\",\n \"underuse\",\n \"underwear\",\n \"underwent\",\n \"underwire\",\n \"undesired\",\n \"undiluted\",\n \"undivided\",\n \"undocked\",\n \"undoing\",\n \"undone\",\n \"undrafted\",\n \"undress\",\n \"undrilled\",\n \"undusted\",\n \"undying\",\n \"unearned\",\n \"unearth\",\n \"unease\",\n \"uneasily\",\n \"uneasy\",\n \"uneatable\",\n \"uneaten\",\n \"unedited\",\n \"unelected\",\n \"unending\",\n \"unengaged\",\n \"unenvied\",\n \"unequal\",\n \"unethical\",\n \"uneven\",\n \"unexpired\",\n \"unexposed\",\n \"unfailing\",\n \"unfair\",\n \"unfasten\",\n \"unfazed\",\n \"unfeeling\",\n \"unfiled\",\n \"unfilled\",\n \"unfitted\",\n \"unfitting\",\n \"unfixable\",\n \"unfixed\",\n \"unflawed\",\n \"unfocused\",\n \"unfold\",\n \"unfounded\",\n \"unframed\",\n \"unfreeze\",\n \"unfrosted\",\n \"unfrozen\",\n \"unfunded\",\n \"unglazed\",\n \"ungloved\",\n \"unglue\",\n \"ungodly\",\n \"ungraded\",\n \"ungreased\",\n \"unguarded\",\n \"unguided\",\n \"unhappily\",\n \"unhappy\",\n \"unharmed\",\n \"unhealthy\",\n \"unheard\",\n \"unhearing\",\n \"unheated\",\n \"unhelpful\",\n \"unhidden\",\n \"unhinge\",\n \"unhitched\",\n \"unholy\",\n \"unhook\",\n \"unicorn\",\n \"unicycle\",\n \"unified\",\n \"unifier\",\n \"uniformed\",\n \"uniformly\",\n \"unify\",\n \"unimpeded\",\n \"uninjured\",\n \"uninstall\",\n \"uninsured\",\n \"uninvited\",\n \"union\",\n \"uniquely\",\n \"unisexual\",\n \"unison\",\n \"unissued\",\n \"unit\",\n \"universal\",\n \"universe\",\n \"unjustly\",\n \"unkempt\",\n \"unkind\",\n \"unknotted\",\n \"unknowing\",\n \"unknown\",\n \"unlaced\",\n \"unlatch\",\n \"unlawful\",\n \"unleaded\",\n \"unlearned\",\n \"unleash\",\n \"unless\",\n \"unleveled\",\n \"unlighted\",\n \"unlikable\",\n \"unlimited\",\n \"unlined\",\n \"unlinked\",\n \"unlisted\",\n \"unlit\",\n \"unlivable\",\n \"unloaded\",\n \"unloader\",\n \"unlocked\",\n \"unlocking\",\n \"unlovable\",\n \"unloved\",\n \"unlovely\",\n \"unloving\",\n \"unluckily\",\n \"unlucky\",\n \"unmade\",\n \"unmanaged\",\n \"unmanned\",\n \"unmapped\",\n \"unmarked\",\n \"unmasked\",\n \"unmasking\",\n \"unmatched\",\n \"unmindful\",\n \"unmixable\",\n \"unmixed\",\n \"unmolded\",\n \"unmoral\",\n \"unmovable\",\n \"unmoved\",\n \"unmoving\",\n \"unnamable\",\n \"unnamed\",\n \"unnatural\",\n \"unneeded\",\n \"unnerve\",\n \"unnerving\",\n \"unnoticed\",\n \"unopened\",\n \"unopposed\",\n \"unpack\",\n \"unpadded\",\n \"unpaid\",\n \"unpainted\",\n \"unpaired\",\n \"unpaved\",\n \"unpeeled\",\n \"unpicked\",\n \"unpiloted\",\n \"unpinned\",\n \"unplanned\",\n \"unplanted\",\n \"unpleased\",\n \"unpledged\",\n \"unplowed\",\n \"unplug\",\n \"unpopular\",\n \"unproven\",\n \"unquote\",\n \"unranked\",\n \"unrated\",\n \"unraveled\",\n \"unreached\",\n \"unread\",\n \"unreal\",\n \"unreeling\",\n \"unrefined\",\n \"unrelated\",\n \"unrented\",\n \"unrest\",\n \"unretired\",\n \"unrevised\",\n \"unrigged\",\n \"unripe\",\n \"unrivaled\",\n \"unroasted\",\n \"unrobed\",\n \"unroll\",\n \"unruffled\",\n \"unruly\",\n \"unrushed\",\n \"unsaddle\",\n \"unsafe\",\n \"unsaid\",\n \"unsalted\",\n \"unsaved\",\n \"unsavory\",\n \"unscathed\",\n \"unscented\",\n \"unscrew\",\n \"unsealed\",\n \"unseated\",\n \"unsecured\",\n \"unseeing\",\n \"unseemly\",\n \"unseen\",\n \"unselect\",\n \"unselfish\",\n \"unsent\",\n \"unsettled\",\n \"unshackle\",\n \"unshaken\",\n \"unshaved\",\n \"unshaven\",\n \"unsheathe\",\n \"unshipped\",\n \"unsightly\",\n \"unsigned\",\n \"unskilled\",\n \"unsliced\",\n \"unsmooth\",\n \"unsnap\",\n \"unsocial\",\n \"unsoiled\",\n \"unsold\",\n \"unsolved\",\n \"unsorted\",\n \"unspoiled\",\n \"unspoken\",\n \"unstable\",\n \"unstaffed\",\n \"unstamped\",\n \"unsteady\",\n \"unsterile\",\n \"unstirred\",\n \"unstitch\",\n \"unstopped\",\n \"unstuck\",\n \"unstuffed\",\n \"unstylish\",\n \"unsubtle\",\n \"unsubtly\",\n \"unsuited\",\n \"unsure\",\n \"unsworn\",\n \"untagged\",\n \"untainted\",\n \"untaken\",\n \"untamed\",\n \"untangled\",\n \"untapped\",\n \"untaxed\",\n \"unthawed\",\n \"unthread\",\n \"untidy\",\n \"untie\",\n \"until\",\n \"untimed\",\n \"untimely\",\n \"untitled\",\n \"untoasted\",\n \"untold\",\n \"untouched\",\n \"untracked\",\n \"untrained\",\n \"untreated\",\n \"untried\",\n \"untrimmed\",\n \"untrue\",\n \"untruth\",\n \"unturned\",\n \"untwist\",\n \"untying\",\n \"unusable\",\n \"unused\",\n \"unusual\",\n \"unvalued\",\n \"unvaried\",\n \"unvarying\",\n \"unveiled\",\n \"unveiling\",\n \"unvented\",\n \"unviable\",\n \"unvisited\",\n \"unvocal\",\n \"unwanted\",\n \"unwarlike\",\n \"unwary\",\n \"unwashed\",\n \"unwatched\",\n \"unweave\",\n \"unwed\",\n \"unwelcome\",\n \"unwell\",\n \"unwieldy\",\n \"unwilling\",\n \"unwind\",\n \"unwired\",\n \"unwitting\",\n \"unwomanly\",\n \"unworldly\",\n \"unworn\",\n \"unworried\",\n \"unworthy\",\n \"unwound\",\n \"unwoven\",\n \"unwrapped\",\n \"unwritten\",\n \"unzip\",\n \"upbeat\",\n \"upchuck\",\n \"upcoming\",\n \"upcountry\",\n \"update\",\n \"upfront\",\n \"upgrade\",\n \"upheaval\",\n \"upheld\",\n \"uphill\",\n \"uphold\",\n \"uplifted\",\n \"uplifting\",\n \"upload\",\n \"upon\",\n \"upper\",\n \"upright\",\n \"uprising\",\n \"upriver\",\n \"uproar\",\n \"uproot\",\n \"upscale\",\n \"upside\",\n \"upstage\",\n \"upstairs\",\n \"upstart\",\n \"upstate\",\n \"upstream\",\n \"upstroke\",\n \"upswing\",\n \"uptake\",\n \"uptight\",\n \"uptown\",\n \"upturned\",\n \"upward\",\n \"upwind\",\n \"uranium\",\n \"urban\",\n \"urchin\",\n \"urethane\",\n \"urgency\",\n \"urgent\",\n \"urging\",\n \"urologist\",\n \"urology\",\n \"usable\",\n \"usage\",\n \"useable\",\n \"used\",\n \"uselessly\",\n \"user\",\n \"usher\",\n \"usual\",\n \"utensil\",\n \"utility\",\n \"utilize\",\n \"utmost\",\n \"utopia\",\n \"utter\",\n \"vacancy\",\n \"vacant\",\n \"vacate\",\n \"vacation\",\n \"vagabond\",\n \"vagrancy\",\n \"vagrantly\",\n \"vaguely\",\n \"vagueness\",\n \"valiant\",\n \"valid\",\n \"valium\",\n \"valley\",\n \"valuables\",\n \"value\",\n \"vanilla\",\n \"vanish\",\n \"vanity\",\n \"vanquish\",\n \"vantage\",\n \"vaporizer\",\n \"variable\",\n \"variably\",\n \"varied\",\n \"variety\",\n \"various\",\n \"varmint\",\n \"varnish\",\n \"varsity\",\n \"varying\",\n \"vascular\",\n \"vaseline\",\n \"vastly\",\n \"vastness\",\n \"veal\",\n \"vegan\",\n \"veggie\",\n \"vehicular\",\n \"velcro\",\n \"velocity\",\n \"velvet\",\n \"vendetta\",\n \"vending\",\n \"vendor\",\n \"veneering\",\n \"vengeful\",\n \"venomous\",\n \"ventricle\",\n \"venture\",\n \"venue\",\n \"venus\",\n \"verbalize\",\n \"verbally\",\n \"verbose\",\n \"verdict\",\n \"verify\",\n \"verse\",\n \"version\",\n \"versus\",\n \"vertebrae\",\n \"vertical\",\n \"vertigo\",\n \"very\",\n \"vessel\",\n \"vest\",\n \"veteran\",\n \"veto\",\n \"vexingly\",\n \"viability\",\n \"viable\",\n \"vibes\",\n \"vice\",\n \"vicinity\",\n \"victory\",\n \"video\",\n \"viewable\",\n \"viewer\",\n \"viewing\",\n \"viewless\",\n \"viewpoint\",\n \"vigorous\",\n \"village\",\n \"villain\",\n \"vindicate\",\n \"vineyard\",\n \"vintage\",\n \"violate\",\n \"violation\",\n \"violator\",\n \"violet\",\n \"violin\",\n \"viper\",\n \"viral\",\n \"virtual\",\n \"virtuous\",\n \"virus\",\n \"visa\",\n \"viscosity\",\n \"viscous\",\n \"viselike\",\n \"visible\",\n \"visibly\",\n \"vision\",\n \"visiting\",\n \"visitor\",\n \"visor\",\n \"vista\",\n \"vitality\",\n \"vitalize\",\n \"vitally\",\n \"vitamins\",\n \"vivacious\",\n \"vividly\",\n \"vividness\",\n \"vixen\",\n \"vocalist\",\n \"vocalize\",\n \"vocally\",\n \"vocation\",\n \"voice\",\n \"voicing\",\n \"void\",\n \"volatile\",\n \"volley\",\n \"voltage\",\n \"volumes\",\n \"voter\",\n \"voting\",\n \"voucher\",\n \"vowed\",\n \"vowel\",\n \"voyage\",\n \"wackiness\",\n \"wad\",\n \"wafer\",\n \"waffle\",\n \"waged\",\n \"wager\",\n \"wages\",\n \"waggle\",\n \"wagon\",\n \"wake\",\n \"waking\",\n \"walk\",\n \"walmart\",\n \"walnut\",\n \"walrus\",\n \"waltz\",\n \"wand\",\n \"wannabe\",\n \"wanted\",\n \"wanting\",\n \"wasabi\",\n \"washable\",\n \"washbasin\",\n \"washboard\",\n \"washbowl\",\n \"washcloth\",\n \"washday\",\n \"washed\",\n \"washer\",\n \"washhouse\",\n \"washing\",\n \"washout\",\n \"washroom\",\n \"washstand\",\n \"washtub\",\n \"wasp\",\n \"wasting\",\n \"watch\",\n \"water\",\n \"waviness\",\n \"waving\",\n \"wavy\",\n \"whacking\",\n \"whacky\",\n \"wham\",\n \"wharf\",\n \"wheat\",\n \"whenever\",\n \"whiff\",\n \"whimsical\",\n \"whinny\",\n \"whiny\",\n \"whisking\",\n \"whoever\",\n \"whole\",\n \"whomever\",\n \"whoopee\",\n \"whooping\",\n \"whoops\",\n \"why\",\n \"wick\",\n \"widely\",\n \"widen\",\n \"widget\",\n \"widow\",\n \"width\",\n \"wieldable\",\n \"wielder\",\n \"wife\",\n \"wifi\",\n \"wikipedia\",\n \"wildcard\",\n \"wildcat\",\n \"wilder\",\n \"wildfire\",\n \"wildfowl\",\n \"wildland\",\n \"wildlife\",\n \"wildly\",\n \"wildness\",\n \"willed\",\n \"willfully\",\n \"willing\",\n \"willow\",\n \"willpower\",\n \"wilt\",\n \"wimp\",\n \"wince\",\n \"wincing\",\n \"wind\",\n \"wing\",\n \"winking\",\n \"winner\",\n \"winnings\",\n \"winter\",\n \"wipe\",\n \"wired\",\n \"wireless\",\n \"wiring\",\n \"wiry\",\n \"wisdom\",\n \"wise\",\n \"wish\",\n \"wisplike\",\n \"wispy\",\n \"wistful\",\n \"wizard\",\n \"wobble\",\n \"wobbling\",\n \"wobbly\",\n \"wok\",\n \"wolf\",\n \"wolverine\",\n \"womanhood\",\n \"womankind\",\n \"womanless\",\n \"womanlike\",\n \"womanly\",\n \"womb\",\n \"woof\",\n \"wooing\",\n \"wool\",\n \"woozy\",\n \"word\",\n \"work\",\n \"worried\",\n \"worrier\",\n \"worrisome\",\n \"worry\",\n \"worsening\",\n \"worshiper\",\n \"worst\",\n \"wound\",\n \"woven\",\n \"wow\",\n \"wrangle\",\n \"wrath\",\n \"wreath\",\n \"wreckage\",\n \"wrecker\",\n \"wrecking\",\n \"wrench\",\n \"wriggle\",\n \"wriggly\",\n \"wrinkle\",\n \"wrinkly\",\n \"wrist\",\n \"writing\",\n \"written\",\n \"wrongdoer\",\n \"wronged\",\n \"wrongful\",\n \"wrongly\",\n \"wrongness\",\n \"wrought\",\n \"xbox\",\n \"xerox\",\n \"yahoo\",\n \"yam\",\n \"yanking\",\n \"yapping\",\n \"yard\",\n \"yarn\",\n \"yeah\",\n \"yearbook\",\n \"yearling\",\n \"yearly\",\n \"yearning\",\n \"yeast\",\n \"yelling\",\n \"yelp\",\n \"yen\",\n \"yesterday\",\n \"yiddish\",\n \"yield\",\n \"yin\",\n \"yippee\",\n \"yo-yo\",\n \"yodel\",\n \"yoga\",\n \"yogurt\",\n \"yonder\",\n \"yoyo\",\n \"yummy\",\n \"zap\",\n \"zealous\",\n \"zebra\",\n \"zen\",\n \"zeppelin\",\n \"zero\",\n \"zestfully\",\n \"zesty\",\n \"zigzagged\",\n \"zipfile\",\n \"zipping\",\n \"zippy\",\n \"zips\",\n \"zit\",\n \"zodiac\",\n \"zombie\",\n \"zone\",\n \"zoning\",\n \"zookeeper\",\n \"zoologist\",\n \"zoology\",\n \"zoom\"\n]\n", "/**\n * Generates random, memorable worktree names using the EFF large wordlist.\n *\n * Format: omnara/{word1}-{word2} e.g., \"omnara/abacus-ability\"\n * Uses the EFF large wordlist (7,776 words) for cryptographically random names.\n * @see https://www.eff.org/files/2016/07/18/eff_large_wordlist.txt\n */\nimport EFF_WORDLIST from \"./eff_wordlist.json\";\nfunction randomElement(array) {\n return array[Math.floor(Math.random() * array.length)];\n}\n/**\n * Generates a random worktree name in the format \"omnara/{word1}-{word2}\".\n *\n * @returns A memorable, URL-safe worktree name with omnara/ prefix\n */\nexport function generateWorktreeName() {\n const word1 = randomElement(EFF_WORDLIST);\n const word2 = randomElement(EFF_WORDLIST);\n return `omnara/${word1}-${word2}`;\n}\n/**\n * Validates a worktree name for use as a git branch name.\n *\n * Requirements:\n * - Must be at least 1 character\n * - Can only contain alphanumeric characters, hyphens, underscores, and forward slashes\n * - Cannot start or end with a hyphen or slash\n * - Cannot contain consecutive slashes or dots\n *\n * @param name - The worktree name to validate\n * @returns True if the name is valid\n */\nexport function isValidWorktreeName(name) {\n if (!name || name.length === 0) {\n return false;\n }\n // Git branch name restrictions (simplified)\n // Cannot start/end with /, -, or .\n // eslint-disable-next-line no-useless-escape\n if (/^[/.\\\\-]|[/.\\\\-]$/.test(name)) {\n return false;\n }\n // Cannot contain consecutive dots or slashes\n if (/\\.{2}|\\/\\//.test(name)) {\n return false;\n }\n // Cannot contain spaces, ~, ^, :, ?, *, [, \\, or control characters\n // eslint-disable-next-line no-control-regex\n if (/[\\s~^:?*[\\\\\\x00-\\x1f\\x7f]/.test(name)) {\n return false;\n }\n // Must be alphanumeric with allowed separators\n if (!/^[a-zA-Z0-9][a-zA-Z0-9_/.-]*[a-zA-Z0-9]$|^[a-zA-Z0-9]$/.test(name)) {\n return false;\n }\n return true;\n}\n", "import { ApiClient } from './api-client.js';\nimport type { MachineRegisterRequest, MachineRegisterResponse } from '@omnara/shared-js/schemas';\n\nexport async function registerMachine(\n client: ApiClient,\n accessToken: string,\n payload: MachineRegisterRequest,\n): Promise<MachineRegisterResponse> {\n return await client.postJson<MachineRegisterRequest, MachineRegisterResponse>(\n '/api/v1/machines/register',\n payload,\n { accessToken },\n );\n}\n", "import type {\n WorkspaceConfig,\n WorkspaceDescriptor,\n WorkspaceEnsureRequest,\n WorkspaceSessionLaunchRequest,\n WorkspaceSessionLaunchResponse,\n} from '@omnara/shared-js/schemas';\n\nimport { ApiClient } from './api-client.js';\n\ninterface WorkspaceDescriptorWire {\n id: string;\n user_id: string;\n workspace_type: WorkspaceDescriptor['workspace_type'];\n user_machine_id?: string | null;\n local_path?: string | null;\n git_host?: string | null;\n git_path?: string | null;\n workspace_metadata?: Record<string, unknown> | null;\n workspace_config: WorkspaceConfig;\n created_at: string;\n updated_at: string;\n}\n\nexport async function ensureWorkspace(\n client: ApiClient,\n accessToken: string,\n payload: WorkspaceEnsureRequest,\n): Promise<WorkspaceDescriptor> {\n const response = await client.postJson<WorkspaceEnsureRequest, WorkspaceDescriptorWire>(\n '/api/v1/workspaces/ensure',\n payload,\n { accessToken },\n );\n\n return {\n id: response.id,\n user_id: response.user_id,\n workspace_type: response.workspace_type,\n user_machine_id: response.user_machine_id ?? null,\n local_path: response.local_path ?? null,\n git_host: response.git_host ?? null,\n git_path: response.git_path ?? null,\n workspace_metadata: response.workspace_metadata ?? null,\n workspace_config: response.workspace_config,\n created_at: response.created_at,\n updated_at: response.updated_at,\n };\n}\n\nexport async function launchWorkspaceSession(\n client: ApiClient,\n accessToken: string,\n workspaceId: string,\n payload: WorkspaceSessionLaunchRequest,\n): Promise<WorkspaceSessionLaunchResponse> {\n return await client.postJson<WorkspaceSessionLaunchRequest, WorkspaceSessionLaunchResponse>(\n `/api/v1/workspaces/${workspaceId}/sessions`,\n payload,\n { accessToken },\n );\n}\n", "import { spawn } from 'node:child_process';\nimport { setTimeout as delay } from 'node:timers/promises';\nimport * as Sentry from '@sentry/node';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { DirectoryEntry } from './config-store.js';\nimport type { WorkspaceConfig } from '@omnara/shared-js/schemas';\nimport { DirectoryRegistry } from './directory-registry.js';\nimport { type Logger } from '../utils/logger.js';\nimport { USER_SESSION_LOG_ROOT, ensureDirectory, ensureOmnaraHome } from './paths.js';\nimport {\n withSessionRegistry,\n isSessionProcessAlive,\n isProcessAlive,\n} from './session-pid-registry.js';\nimport { getSpawnArgs, getExecutablePath } from '../utils/executable.js';\n\nexport interface SessionManagerOptions {\n backendUrl: string;\n frontendUrl?: string;\n directoryRegistry: DirectoryRegistry;\n logger: Logger;\n}\n\nexport interface SessionLaunchSpec {\n launchId: string;\n directory: string;\n userSessionId: string;\n workspaceId: string;\n workspaceConfig?: WorkspaceConfig | null;\n initialPrompt?: string | null;\n metadata?: Record<string, unknown> | null;\n /** Name for the worktree/branch. If null/undefined, no worktree is created. */\n worktreeName?: string | null;\n}\n\n/** Delay between SIGTERM and SIGKILL when stopping a session. */\nconst GRACEFUL_STOP_DELAY_MS = 2_000;\n\nexport class SessionManager {\n private readonly backendUrl: string;\n private readonly frontendUrl?: string;\n private readonly directoryRegistry: DirectoryRegistry;\n private readonly logger: Logger;\n\n constructor(options: SessionManagerOptions) {\n this.backendUrl = options.backendUrl;\n this.frontendUrl = options.frontendUrl;\n this.directoryRegistry = options.directoryRegistry;\n this.logger = options.logger;\n }\n\n async startSession(spec: SessionLaunchSpec): Promise<void> {\n const entry = await this.directoryRegistry.getEntry(spec.directory);\n if (!entry) {\n throw new Error(`Directory ${spec.directory} is not registered on this machine`);\n }\n\n const runner = new SessionRunner({\n spec,\n directory: entry,\n backendUrl: this.backendUrl,\n frontendUrl: this.frontendUrl,\n logger: this.logger,\n onExit: () => {},\n });\n\n try {\n await runner.start();\n } catch (error) {\n Sentry.captureException(error);\n throw error;\n }\n }\n\n /**\n * Stop a running session by user session ID.\n *\n * Looks up the session in the PID registry, sends SIGTERM for graceful\n * shutdown, waits briefly, then sends SIGKILL if still alive.\n *\n * @returns true if a running session was found and terminated, false if\n * the session was not running.\n */\n async stopSession(userSessionId: string): Promise<boolean> {\n return await withSessionRegistry(async (registry) => {\n const record = registry[userSessionId];\n if (!record) {\n return [registry, false];\n }\n\n const alive = await isSessionProcessAlive(record);\n if (!alive) {\n // Session entry exists but process is dead; clean up registry\n delete registry[userSessionId];\n return [registry, false];\n }\n\n // Attempt graceful shutdown with SIGTERM\n try {\n process.kill(record.pid, 'SIGTERM');\n this.logger.debug(`Sent SIGTERM to session ${userSessionId} (pid ${record.pid})`);\n } catch (error) {\n // Process may have exited between check and kill\n this.logger.debug(`SIGTERM failed for pid ${record.pid}: ${String(error)}`);\n delete registry[userSessionId];\n return [registry, false];\n }\n\n // Wait for graceful shutdown\n await delay(GRACEFUL_STOP_DELAY_MS);\n\n // Check if still alive, force kill if necessary\n const stillAlive = await isProcessAlive(record.pid);\n if (stillAlive) {\n try {\n process.kill(record.pid, 'SIGKILL');\n this.logger.debug(`Sent SIGKILL to session ${userSessionId} (pid ${record.pid})`);\n } catch {\n // Ignore - process may have exited\n }\n }\n\n delete registry[userSessionId];\n return [registry, true];\n });\n }\n}\n\ninterface SessionRunnerOptions {\n spec: SessionLaunchSpec;\n directory: DirectoryEntry;\n backendUrl: string;\n frontendUrl?: string;\n logger: Logger;\n onExit: () => void;\n}\n\nclass SessionRunner {\n private readonly spec: SessionLaunchSpec;\n private readonly directory: DirectoryEntry;\n private readonly backendUrl: string;\n private readonly frontendUrl?: string;\n private readonly logger: Logger;\n private readonly onExit: () => void;\n\n private child: ReturnType<typeof spawn> | null = null;\n\n constructor(options: SessionRunnerOptions) {\n this.spec = options.spec;\n this.directory = options.directory;\n this.backendUrl = options.backendUrl;\n this.frontendUrl = options.frontendUrl;\n this.logger = options.logger;\n this.onExit = options.onExit;\n }\n\n async start(): Promise<void> {\n if (this.child) {\n throw new Error('Session runner already started');\n }\n\n const sessionLogPath = await createSessionLogPath(this.spec.workspaceId, this.spec.launchId);\n this.logger.info(`Session ${this.spec.launchId} logs available at ${sessionLogPath}`);\n\n await withSessionRegistry(async (registry) => {\n const existing = registry[this.spec.userSessionId];\n if (existing) {\n const alive = await isSessionProcessAlive(existing);\n if (alive) {\n throw new Error(`User session ${this.spec.userSessionId} is already running`);\n }\n delete registry[this.spec.userSessionId];\n }\n return [registry, null];\n });\n\n // Use the centralized executable utility for Bun SFE detection\n const execPath = getExecutablePath();\n const args = getSpawnArgs([\n 'daemon',\n 'run-session',\n '--user-session-id',\n this.spec.userSessionId,\n '--workspace-id',\n this.spec.workspaceId,\n '--directory',\n this.directory.path,\n ]);\n\n this.logger.debug(`Spawning session: ${execPath} ${args.join(' ')}`);\n\n // Only add --worktree-name if a worktree is requested\n if (this.spec.worktreeName) {\n args.push('--worktree-name', this.spec.worktreeName);\n }\n\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n ...(this.backendUrl ? { OMNARA_BACKEND_URL: this.backendUrl } : {}),\n ...(this.frontendUrl ? { OMNARA_FRONTEND_URL: this.frontendUrl } : {}),\n OMNARA_WORKSPACE_ID: this.spec.workspaceId,\n OMNARA_WORKSPACE_DIR: this.directory.path,\n OMNARA_USER_SESSION_ID: this.spec.userSessionId,\n OMNARA_SESSION_LOG_PATH: sessionLogPath,\n };\n if (this.spec.workspaceConfig) {\n env.OMNARA_WORKSPACE_CONFIG = JSON.stringify(this.spec.workspaceConfig);\n }\n if (this.spec.initialPrompt) {\n env.OMNARA_INITIAL_PROMPT = this.spec.initialPrompt;\n }\n if (this.spec.metadata) {\n env.OMNARA_WORKSPACE_METADATA = JSON.stringify(this.spec.metadata);\n }\n\n let logFd: number | null = null;\n try {\n logFd = fs.openSync(sessionLogPath, 'a');\n const child = spawn(execPath, args, {\n cwd: this.directory.path,\n stdio: ['ignore', logFd, logFd],\n env,\n detached: true,\n });\n // Child has its own fd copies; close ours.\n fs.closeSync(logFd);\n logFd = null;\n child.unref();\n\n // Ensure the process actually spawns; if it fails, propagate.\n await new Promise<void>((resolve, reject) => {\n child.once('spawn', resolve);\n child.once('error', reject);\n });\n\n this.child = child;\n\n child.once('exit', () => {\n this.onExit();\n this.child = null;\n });\n\n const startedAt = new Date().toISOString();\n const command = `${execPath} ${args.join(' ')}`;\n await withSessionRegistry(async (registry) => {\n registry[this.spec.userSessionId] = {\n pid: child.pid ?? -1,\n startedAt,\n command,\n };\n return [registry, null];\n });\n } catch (error) {\n if (logFd !== null) {\n try {\n fs.closeSync(logFd);\n } catch {\n // ignore\n }\n }\n Sentry.captureException(error);\n this.logger.error('Failed to start session process:', error);\n throw error;\n }\n }\n\n async stop(): Promise<void> {\n if (!this.child) {\n return;\n }\n if (!this.child.killed) {\n this.child.kill('SIGINT');\n }\n }\n}\n\nasync function createSessionLogPath(workspaceId: string, launchId: string): Promise<string> {\n await ensureOmnaraHome();\n const workspaceDir = path.join(USER_SESSION_LOG_ROOT, workspaceId);\n await ensureDirectory(workspaceDir);\n const fileName = `launch-${launchId}.log`;\n const logPath = path.join(workspaceDir, fileName);\n return logPath;\n}\n", "/**\n * Package information constants.\n *\n * These are replaced at build time by esbuild/bun with values from package.json.\n * The build process uses --define flags to replace __PACKAGE_* constants.\n *\n * In bundled context: Constants are replaced with literal strings at compile time.\n * In dev context: Falls back to default values (actual version comes from build).\n */\n\n// Check if constants were replaced at build time\n// (globals are declared in global.d.ts)\nconst isBundled =\n typeof __PACKAGE_NAME__ !== 'undefined' && __PACKAGE_NAME__ !== '__PACKAGE_NAME__';\n\n// Export package info - uses build-time constants or development defaults\nexport const PACKAGE_NAME: string = isBundled ? __PACKAGE_NAME__ : 'omnara';\nexport const PACKAGE_VERSION: string = isBundled ? __PACKAGE_VERSION__ : '0.0.0-dev';\nexport const PACKAGE_DESCRIPTION: string = isBundled\n ? __PACKAGE_DESCRIPTION__\n : 'Command-line interface for Omnara.';\n", "import { PACKAGE_VERSION } from '../package-info.js';\nimport chalk from 'chalk';\nimport { execSync } from 'node:child_process';\nimport { realpathSync } from 'node:fs';\nimport { platform, arch } from 'node:os';\nimport { DaemonClient } from '../daemon/daemon-client.js';\nimport * as Sentry from '@sentry/node';\nimport { isBunSingleFileExecutable } from './executable.js';\n\n// Release server configuration\nconst RELEASE_BASE_URL = process.env.OMNARA_RELEASE_URL ?? 'https://releases.omnara.com';\n\n// Frontend URL for install scripts\nconst FRONTEND_BASE_URL = process.env.OMNARA_FRONTEND_URL ?? 'https://omnara.com';\n\n// Prerelease mode - check PRERELEASE env var (same as install script)\nexport const IS_PRERELEASE = process.env.PRERELEASE === '1';\n\n// Install script URLs (served from frontend at /install/)\nconst INSTALL_SCRIPT_URL_UNIX = `${FRONTEND_BASE_URL}/install/install.sh`;\nconst INSTALL_SCRIPT_URL_WINDOWS = `${FRONTEND_BASE_URL}/install/install.ps1`;\n\ninterface ReleaseInfo {\n version: string;\n platforms: Record<\n string,\n {\n url: string;\n sha256: string;\n }\n >;\n}\n\n/**\n * Detects the current platform identifier for binary downloads.\n */\nfunction detectPlatform(): string {\n const os = platform();\n const cpuArch = arch();\n\n let platformId: string;\n\n if (os === 'darwin' && cpuArch === 'arm64') {\n platformId = 'darwin-arm64';\n } else if (os === 'darwin' && cpuArch === 'x64') {\n platformId = 'darwin-x64';\n } else if (os === 'linux' && cpuArch === 'x64') {\n platformId = isMusl() ? 'linux-x64-musl' : 'linux-x64';\n } else if (os === 'linux' && cpuArch === 'arm64') {\n platformId = 'linux-arm64';\n } else if (os === 'win32' && cpuArch === 'x64') {\n platformId = 'windows-x64';\n } else {\n throw new Error(`Unsupported platform: ${os}-${cpuArch}`);\n }\n\n return platformId;\n}\n\n/**\n * Detects if the system is using musl libc (Alpine Linux, etc.)\n */\nfunction isMusl(): boolean {\n try {\n const result = execSync('ldd --version 2>&1 || true', { encoding: 'utf8' });\n return result.toLowerCase().includes('musl');\n } catch {\n return false;\n }\n}\n\n/**\n * Fetches the latest release info from the release server.\n * Uses prerelease channel if PRERELEASE=1 env var is set.\n */\nasync function fetchLatestRelease(): Promise<ReleaseInfo | null> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000);\n timeout.unref?.();\n\n try {\n // Use prerelease path if PRERELEASE=1\n const basePath = IS_PRERELEASE ? `${RELEASE_BASE_URL}/prerelease` : RELEASE_BASE_URL;\n const url = `${basePath}/latest/release.json`;\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n return null;\n }\n\n return (await response.json()) as ReleaseInfo;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/**\n * Compares two semantic versions.\n * Returns: 1 if v1 > v2, -1 if v1 < v2, 0 if equal\n */\nfunction compareVersions(v1: string, v2: string): number {\n const clean1 = v1.replace(/^v/, '');\n const clean2 = v2.replace(/^v/, '');\n\n const parts1 = clean1.split('.').map(Number);\n const parts2 = clean2.split('.').map(Number);\n\n for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {\n const part1 = parts1[i] || 0;\n const part2 = parts2[i] || 0;\n\n if (part1 > part2) return 1;\n if (part1 < part2) return -1;\n }\n\n return 0;\n}\n\n/**\n * Detects if the CLI was installed via npm (not as a standalone binary).\n */\nexport function isNpmInstallation(): boolean {\n // Bun single-file executables are never npm installations\n if (isBunSingleFileExecutable()) {\n return false;\n }\n\n const execPath = process.argv[1] ?? '';\n\n // Check if we're in a node_modules directory\n if (execPath.includes('node_modules')) {\n return true;\n }\n\n // Check if the executable is in a typical npm global bin location\n if (execPath.includes('/lib/node_modules/') || execPath.includes('\\\\node_modules\\\\')) {\n return true;\n }\n\n // Check if we're running via a symlink to a node_modules location\n try {\n const realPath = realpathSync(execPath);\n if (realPath.includes('node_modules')) {\n return true;\n }\n } catch {\n // Ignore errors\n }\n\n return false;\n}\n\n/**\n * Uninstalls the npm version of omnara.\n */\nfunction uninstallNpmVersion(): boolean {\n console.log(chalk.blue('Uninstalling npm version of Omnara...'));\n\n try {\n // Try without sudo first\n execSync('npm uninstall -g omnara', { stdio: 'inherit' });\n return true;\n } catch {\n try {\n // Try with sudo on Unix\n if (platform() !== 'win32') {\n execSync('sudo npm uninstall -g omnara', { stdio: 'inherit' });\n return true;\n }\n } catch {\n // Ignore\n }\n }\n\n console.log(chalk.yellow('Could not automatically uninstall npm version.'));\n console.log(chalk.yellow('Please run manually: npm uninstall -g omnara'));\n return false;\n}\n\n/**\n * Runs the installation script to install/update the binary version.\n * Returns true if installation succeeded.\n * Passes PRERELEASE=1 env var to install script if in prerelease mode.\n *\n * @param options.silent - If true, suppress output (for daemon background updates)\n */\nexport async function runInstallScript(options?: { silent?: boolean }): Promise<boolean> {\n const os = platform();\n const silent = options?.silent ?? false;\n const stdio = silent ? 'pipe' : 'inherit';\n\n if (!silent) {\n if (IS_PRERELEASE) {\n console.log(chalk.blue('\\nRunning Omnara installation script (prerelease channel)...\\n'));\n } else {\n console.log(chalk.blue('\\nRunning Omnara installation script...\\n'));\n }\n }\n\n // Pass PRERELEASE env var to the install script\n const env = { ...process.env };\n if (IS_PRERELEASE) {\n env.PRERELEASE = '1';\n }\n\n try {\n if (os === 'win32') {\n // Windows: Run PowerShell install script with PRERELEASE env var\n const prereleaseEnv = IS_PRERELEASE ? '$env:PRERELEASE=\"1\"; ' : '';\n const cmd = `powershell -ExecutionPolicy Bypass -Command \"& { ${prereleaseEnv}iwr -useb '${INSTALL_SCRIPT_URL_WINDOWS}' | iex }\"`;\n execSync(cmd, { stdio, env });\n } else {\n // Unix: Run bash install script (env var passed via execSync env option)\n const cmd = `curl -fsSL '${INSTALL_SCRIPT_URL_UNIX}' | bash`;\n execSync(cmd, { stdio, shell: '/bin/bash', env });\n }\n return true;\n } catch (error) {\n Sentry.captureException(error);\n if (!silent) {\n console.log(chalk.red('\\nInstallation script failed.'));\n console.log(chalk.yellow('Please install manually:'));\n const prereleasePrefix = IS_PRERELEASE ? 'PRERELEASE=1 ' : '';\n if (os === 'win32') {\n const psPrefix = IS_PRERELEASE ? '$env:PRERELEASE=\"1\"; ' : '';\n console.log(chalk.cyan(` ${psPrefix}irm ${INSTALL_SCRIPT_URL_WINDOWS} | iex`));\n } else {\n console.log(\n chalk.cyan(` ${prereleasePrefix}curl -fsSL ${INSTALL_SCRIPT_URL_UNIX} | bash`),\n );\n }\n }\n return false;\n }\n}\n\n/**\n * Handles npm installation: show warning and migrate to binary.\n */\nasync function handleNpmInstallation(): Promise<boolean> {\n const os = platform();\n const installCmd =\n os === 'win32'\n ? `irm ${INSTALL_SCRIPT_URL_WINDOWS} | iex`\n : `curl -fsSL ${INSTALL_SCRIPT_URL_UNIX} | bash`;\n\n const border = chalk.yellow('='.repeat(60));\n\n console.log('\\n' + border);\n console.log(chalk.yellow.bold(' npm Installation Detected'));\n console.log(border);\n console.log(\n chalk.white(`\n Omnara CLI is now distributed as a standalone executable\n with automatic updates and improved performance.\n\n Migrating to the new installation method...\n`),\n );\n\n // Uninstall npm version\n uninstallNpmVersion();\n\n // Run install script\n const success = await runInstallScript();\n\n if (success) {\n console.log(chalk.green('\\nMigration complete!'));\n console.log(chalk.white('Please restart your terminal and run `omnara` again.\\n'));\n return true;\n } else {\n console.log(\n chalk.yellow(`\\nTo complete migration manually, run:\\n\\n ${chalk.cyan(installCmd)}\\n`),\n );\n return false;\n }\n}\n\n/**\n * Checks if an update is available.\n * Checks prerelease channel if PRERELEASE=1 env var is set.\n */\nexport async function checkForUpdate(): Promise<{\n available: boolean;\n latestVersion?: string;\n currentVersion: string;\n isPrerelease: boolean;\n}> {\n const currentVersion = PACKAGE_VERSION;\n\n if (!currentVersion) {\n return { available: false, currentVersion: '0.0.0', isPrerelease: IS_PRERELEASE };\n }\n\n try {\n const release = await fetchLatestRelease();\n\n if (!release) {\n return { available: false, currentVersion, isPrerelease: IS_PRERELEASE };\n }\n\n const platformId = detectPlatform();\n const hasPlatformBinary = !!release.platforms[platformId];\n\n if (!hasPlatformBinary) {\n return { available: false, currentVersion, isPrerelease: IS_PRERELEASE };\n }\n\n const updateAvailable = compareVersions(release.version, currentVersion) > 0;\n\n return {\n available: updateAvailable,\n latestVersion: release.version,\n currentVersion,\n isPrerelease: IS_PRERELEASE,\n };\n } catch {\n return { available: false, currentVersion, isPrerelease: IS_PRERELEASE };\n }\n}\n\n/**\n * Performs an update by running the install script.\n * Used by both CLI and daemon for updates.\n */\nexport async function performUpdate(options?: { silent?: boolean }): Promise<boolean> {\n const silent = options?.silent ?? false;\n\n try {\n // Stop daemon before updating (only if not already running as daemon)\n if (!silent) {\n const client = new DaemonClient();\n const status = await client.getStatus().catch(() => null);\n if (status) {\n console.log(chalk.yellow('Stopping daemon for update...'));\n await client.stop('UPDATING').catch(() => {});\n }\n }\n\n // Run the install script\n const success = await runInstallScript({ silent });\n\n if (success && !silent) {\n console.log(chalk.green('\\nUpdate complete!'));\n console.log(chalk.white('The daemon will restart automatically.\\n'));\n }\n\n return success;\n } catch (error) {\n Sentry.captureException(error);\n return false;\n }\n}\n\n/**\n * Background update check for the daemon.\n * Checks for updates and triggers install script if available.\n */\nexport async function daemonUpdateCheck(): Promise<boolean> {\n try {\n const updateInfo = await checkForUpdate();\n\n if (!updateInfo.available) {\n return false;\n }\n\n console.log(`Update available: ${updateInfo.currentVersion} -> ${updateInfo.latestVersion}`);\n console.log('Starting update...');\n\n // Run install script (will update binary and restart daemon via service manager)\n return await performUpdate({ silent: true });\n } catch (error) {\n Sentry.captureException(error);\n return false;\n }\n}\n\n/**\n * Checks for updates and performs auto-update if available.\n * Called when CLI starts.\n * Returns true if an update was installed and the CLI should exit.\n */\nexport async function attemptUpdate(): Promise<boolean> {\n try {\n const currentVersion = PACKAGE_VERSION;\n\n if (!currentVersion) {\n return false;\n }\n\n // Check if this is an npm installation - migrate to binary\n if (isNpmInstallation()) {\n return await handleNpmInstallation();\n }\n\n // Check for updates\n const updateInfo = await checkForUpdate();\n\n if (!updateInfo.available) {\n const channel = IS_PRERELEASE ? ' (prerelease channel)' : '';\n console.log(chalk.grey(`Omnara is up to date${channel}!\\n`));\n return false;\n }\n\n // Show update notification\n const channelLabel = IS_PRERELEASE ? ' (prerelease)' : '';\n console.log(\n chalk.yellow(\n '\u2550'.repeat(60) +\n `\\nUpdate available for Omnara CLI${channelLabel}` +\n `\\nCurrent version: ${updateInfo.currentVersion}` +\n `\\nLatest version: ${updateInfo.latestVersion}` +\n `\\n${'\u2550'.repeat(60)}`,\n ),\n );\n\n // Perform update\n const success = await performUpdate();\n\n if (success) {\n console.log(chalk.white('Please restart `omnara` to use the new version.\\n'));\n return true;\n }\n\n return false;\n } catch (e) {\n Sentry.captureException(e);\n }\n\n return false;\n}\n", "import type { Console } from 'node:console';\n\nimport { CredentialsStore } from './credentials-store.js';\nimport { createAuthProvider } from './auth-provider.js';\nimport { resolveBackendUrl, resolveFrontendUrl } from './login-flow.js';\n\nexport interface EnsureCliCredentialsOptions {\n backendUrl?: string;\n frontendUrl?: string;\n store?: CredentialsStore;\n logger?: Console;\n}\n\n// Guarantees that the CLI has a stored PAT; runs interactive login if missing.\nexport async function ensureCliCredentials(\n options: EnsureCliCredentialsOptions = {},\n): Promise<void> {\n const backendUrl = resolveBackendUrl(options.backendUrl);\n const frontendUrl = resolveFrontendUrl(options.frontendUrl);\n const store = options.store ?? new CredentialsStore();\n\n const provider = await createAuthProvider({\n store,\n backendUrl,\n frontendUrl,\n logger: options.logger ?? console,\n });\n await provider.getAccessToken();\n}\n", "import { Command } from 'commander';\nimport {\n killAllDaemonProcesses,\n killDaemonByState,\n killSessionsByRegistry,\n} from '../daemon/daemon-launcher.js';\nimport { logger } from '../utils/logger.js';\nimport { isDevEnv } from '../env/env-mode.js';\n\nexport function buildKillCommand(): Command {\n const kill = new Command('kill').description('Kill Omnara processes.');\n\n kill\n .command('daemon')\n .description('Kill the daemon for the current environment (uses state file).')\n .action(async () => {\n const dev = isDevEnv();\n await killDaemonByState({ logger, dev });\n });\n\n kill\n .command('sessions')\n .description('Kill session processes for the current environment (uses session registry).')\n .action(async () => {\n await killSessionsByRegistry({ logger });\n });\n\n kill\n .command('all')\n .description('Kill daemon and sessions for the current environment (uses state/registry).')\n .action(async () => {\n await killSessionsByRegistry({ logger });\n await killDaemonByState({ logger, dev: isDevEnv() });\n });\n\n kill\n .command('all-force')\n .description('Force kill all Omnara processes (all environments).')\n .action(async () => {\n await killAllDaemonProcesses({ logger });\n });\n\n return kill;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;AAAA,OAAOA,YAAU;AACjB,SAAS,WAAAC,gBAAe;AACxB,YAAYC,cAAY;;;ACFxB,OAAOC,SAAQ;;;ACAf,SAAS,cAAAC,mBAAkB;AAC3B,YAAYC,aAAY;AACxB,OAOO;;;ACTP,OAAO,QAAQ;AACf,YAAY,YAAY;AACxB;AAAA,EACE,SAAAC;AAAA,OAKK;;;ACRP,OAAO,WAAW;AAClB,SAAS,aAAa;AACtB,SAAS,gBAAgB;;;ACqClB,SAAS,4BAAqC;AACnD,QAAM,OAAO,QAAQ,KAAK,CAAC,KAAK;AAChC,SAAO,KAAK,WAAW,UAAU;AACnC;AAUO,SAAS,aAAa,aAAiC;AAC5D,MAAI,0BAA0B,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,QAAQ,KAAK,CAAC,KAAK;AACtC,SAAO,CAAC,YAAY,GAAG,WAAW;AACpC;AAMO,SAAS,oBAA4B;AAC1C,SAAO,QAAQ;AACjB;;;ADpDO,SAAS,uBAAgE;AAE9E,MAAI,CAAC,0BAA0B,GAAG;AAChC,WAAO,CAAC;AAAA,EACV;AAGA,MAAI;AACF,UAAM,UAAU,QAAQ,aAAa,UAAU,iBAAiB;AAChE,UAAM,SAAS,SAAS,SAAS,EAAE,UAAU,SAAS,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE,CAAC;AACvF,UAAM,YAAY,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;AAC7C,QAAI,WAAW;AACb,aAAO,EAAE,4BAA4B,UAAU;AAAA,IACjD;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,UAAQ;AAAA,IACN;AAAA,EAEF;AACA,SAAO,CAAC;AACV;AAOA,eAAsB,yBAA2C;AAE/D,MAAI,QAAQ,IAAI,6BAA6B,QAAQ;AACnD,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,2BAA2B;AAC7C,MAAI;AACF,eAAW,MAAM;AAEjB,qBAAiB,WAAW,MAAM;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,gBAAgB,CAAC,QAAQ,WAAW,OAAO;AAAA;AAAA,QAE3C,GAAG,qBAAqB;AAAA,MAC1B;AAAA,IACF,CAAC,GAAG;AAEF,WAAK;AAAA,IACP;AACA,eAAW,KAAK,IAAI;AACpB,WAAO;AAAA,EACT,QAAQ;AACN,eAAW,KAAK,MAAM;AACtB,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAIA,SAAS,6BAGA;AACP,MAAI,CAAC,QAAQ,OAAO,OAAO;AACzB,WAAO;AAAA,MACL,QAAQ;AACN,gBAAQ,IAAI,8BAA8B;AAAA,MAC5C;AAAA,MACA,KAAK,QAAyB;AAC5B,YAAI,WAAW,MAAM;AACnB,kBAAQ,IAAI,0BAA0B;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ;AACd,QAAM,SAAS,CAAC,KAAK,MAAM,KAAK,GAAG;AACnC,MAAI,QAAQ;AACZ,MAAI,WAAkC;AACtC,MAAI,UAAU;AACd,QAAM,WAAW,CAAC,WAA4B;AAC5C,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,cAAU;AACV,QAAI,UAAU;AACZ,oBAAc,QAAQ;AAAA,IACxB;AACA,UAAM,aAAa,WAAW,OAAO,MAAM,MAAM,IAAI,IAAI,MAAM,IAAI,QAAQ;AAC3E,UAAM,UAAU;AAChB,YAAQ,OAAO,MAAM,KAAK,KAAK,IAAI,UAAU,GAAG,OAAO;AAAA,CAAI;AAAA,EAC7D;AAEA,SAAO;AAAA,IACL,QAAQ;AACN,UAAI,SAAS;AACX;AAAA,MACF;AACA,gBAAU;AACV,cAAQ,OAAO,MAAM,GAAG,KAAK,MAAM;AACnC,iBAAW,YAAY,MAAM;AAC3B,gBAAQ,OAAO,MAAM,KAAK,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI;AACpD,iBAAS,QAAQ,KAAK,OAAO;AAAA,MAC/B,GAAG,GAAG;AAAA,IACR;AAAA,IACA,MAAM;AAAA,EACR;AACF;;;ADpHO,IAAM,YAAuC;AAAA,EAClD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AACR;AAeO,IAAM,kCAAkC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,uBAAuB;AAEtB,IAAM,WAAN,MAAsC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAA0B;AAAA,EAElC,YAAY,QAAyB;AACnC,UAAM,iBAA0B;AAAA,MAC9B,UAAU;AAAA,MACV,OAAO,UAAU,QAAQ;AAAA,MACzB,KAAK,QAAQ,IAAI;AAAA,MACjB,wBAAwB;AAAA,MACxB,cAAc,CAAC,GAAG,+BAA+B;AAAA,MACjD,gBAAgB,CAAC,QAAQ,WAAW,OAAO;AAAA;AAAA,MAE3C,GAAG,qBAAqB;AAAA,IAC1B;AAEA,SAAK,cAAc;AAAA,MACjB,GAAG;AAAA,MACH,GAAG,QAAQ;AAAA,IACb;AAGA,QAAI,KAAK,YAAY,OAAO,KAAK,YAAY,QAAQ,QAAQ,IAAI,GAAG;AAClE,cAAQ,IAAI,8CAA8C,KAAK,YAAY,GAAG;AAAA,IAChF;AAEA,SAAK,uBAAuB,KAAK,YAAY,GAAG;AAAA,EAClD;AAAA,EAEA,OAAO,kBACLC,SACA,WAC2B;AAC3B,SAAK,kBAAkB,IAAI,gBAAgB;AAC3C,UAAM,IAAI,KAAK,YAAYA,SAAQ,SAAS;AAC5C,SAAK,QAAQ;AACb,QAAI;AACF,uBAAiB,WAAW,GAAG;AAC7B,cAAM;AAAA,MACR;AAAA,IACF,UAAE;AACA,WAAK,QAAQ;AACb,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,YACNA,SACA,WACO;AACP,UAAM,SAAkB;AAAA,MACtB,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,MACH,iBAAiB,KAAK;AAAA,IACxB;AAEA,SAAK,uBAAuB,OAAO,GAAG;AAEtC,WAAOC,OAAM;AAAA,MACX,QAAAD;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS;AACb,QAAI,CAAC,KAAK,OAAO;AACf,cAAQ,KAAK,4CAA4C;AACzD;AAAA,IACF;AAGA,QAAI;AACF,YAAM,mBAAmB,KAAK,MAAM,UAAU;AAC9C,YAAM,iBAAiB,IAAI;AAAA,QAAmB,CAAC,YAC7C,WAAW,MAAM,QAAQ,SAAS,GAAG,oBAAoB;AAAA,MAC3D;AAEA,YAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,kBAAkB,cAAc,CAAC;AAEpE,UAAI,WAAW,WAAW;AACxB,gBAAQ;AAAA,UACN,0CAA0C,oBAAoB;AAAA,QAChE;AACA,aAAK,iBAAiB,MAAM;AAAA,MAC9B;AAAA,IACF,SAAS,OAAO;AAEd,cAAQ,KAAK,yDAAyD,KAAK;AAC3E,WAAK,iBAAiB,MAAM;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,eAAwB;AACtB,WAAO,CAAC,CAAC,KAAK;AAAA,EAChB;AAAA,EAEA,SAAS,OAAwB;AAC/B,SAAK,eAAe;AACpB,SAAK,cAAc;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,OAAO,UAAU,KAAK;AAAA,IACxB;AACA,YAAQ,IAAI,gCAAgC,KAAK,EAAE;AAAA,EACrD;AAAA,EAEA,WAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAAW,SAAiC;AAC1C,SAAK,cAAc;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AAGA,QAAI,QAAQ,OAAO;AACjB,YAAM,aAAa,OAAO,QAAQ,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,QAAQ,KAAK;AACxF,UAAI,YAAY;AACd,aAAK,eAAe,WAAW,CAAC;AAAA,MAClC;AAAA,IACF;AAGA,QAAI,QAAQ,KAAK;AACf,cAAQ,IAAI,yCAAyC,QAAQ,GAAG;AAAA,IAClE;AAEA,YAAQ,IAAI,4BAA4B;AAAA,EAC1C;AAAA,EAEA,aAAsB;AACpB,WAAO,EAAE,GAAG,KAAK,YAAY;AAAA,EAC/B;AAAA,EAEQ,uBAAuB,KAAoB;AACjD,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AACA,QAAI;AACF,SAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACvC,SAAS,OAAO;AACd,MAAO,wBAAiB,KAAK;AAC7B,cAAQ,KAAK,sCAAsC,GAAG,KAAK,KAAK;AAAA,IAClE;AAAA,EACF;AACF;;;ADxMA,SAAS,aAAAE,kBAAiC;;;AIjB1C;AAAA,EACE,SAAAC;AAAA,OAKK;AAIP,SAAS,cAAc,aAAa;;;ACDpC,OAAO,UAAU;AAEjB,SAAS,UAAU,kBAAkB;AAiB9B,SAAS,eAAwB;AAEtC,MAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,WAAO;AAAA,EACT;AAGA,MAAI;AAEF,UAAM,cAAc,OAAO,eAAe,cAAc,aAAa;AACrE,UAAM,WAAW,YAAY,SAAS,KAAK,MAAM,SAAS,KAAK,GAAG;AAGlE,QAAI,YAAY,QAAQ,IAAI,aAAa,eAAe;AACtD,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,QAAM,WAAW,QAAQ,IAAI,kBAAkB,YAAY;AAC3D,MAAI,aAAa,UAAU,aAAa,UAAU;AAChD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKO,SAAS,cAAwB;AACtC,QAAM,WAAW,QAAQ,IAAI,kBAAkB,YAAY;AAE3D,UAAQ,UAAU;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AAEE,aAAO,aAAa,IAAI,gBAAiB;AAAA,EAC7C;AACF;AAiBO,IAAM,mBAAN,MAAyC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,OAAe,MAAyB;AACzD,UAAM,SAAS,KAAI,oBAAI,KAAK,GAAE,YAAY,CAAC,MAAM,KAAK;AACtD,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO;AAAA,IACT;AACA,UAAM,OAAO,WAAW,GAAI,IAAkB;AAC9C,WAAO,GAAG,MAAM,IAAI,IAAI;AAAA,EAC1B;AAAA;AAAA,EAGA;AAAA,EAEA,YAAY,SAKT;AACD,SAAK,WAAW,SAAS,YAAY,YAAY;AACjD,SAAK,cAAc,SAAS,eAAe;AAC3C,SAAK,WAAW;AAChB,SAAK,QAAQ,SAAS,SAAS;AAAA,MAC7B,CAAC,UAAU;AACT,gBAAQ,IAAI,GAAI,MAAM,GAAiB;AAAA,MACzC;AAAA,IACF;AACA,SAAK,UAAU,SAAS,WAAW,CAAC;AAGpC,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAuB;AAC5B,QAAI,KAAK,UAAU,YAAa,GAAG;AACjC,WAAK,MAAM,QAAQ,IAAI;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAuB;AAC9B,QAAI,KAAK,UAAU,aAAc,GAAG;AAClC,WAAK,MAAM,SAAS,IAAI;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAuB;AAC7B,QAAI,KAAK,UAAU,YAAa,GAAG;AACjC,WAAK,MAAM,QAAQ,IAAI;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAuB;AAC7B,QAAI,KAAK,UAAU,YAAa,GAAG;AACjC,WAAK,MAAM,QAAQ,IAAI;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAuB;AAC9B,QAAI,KAAK,UAAU,aAAc,GAAG;AAClC,WAAK,MAAM,SAAS,IAAI;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAuB;AAC9B,QAAI,KAAK,UAAU,eAAgB,GAAG;AACpC,WAAK,MAAM,SAAS,IAAI;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,MAAuB;AAElC,QAAI,KAAK,aAAa,gBAAiB,KAAK,aAAa;AACvD,WAAK,MAAM,aAAa,IAAI;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAuB;AAEhC,QAAI,KAAK,UAAU,YAAa,KAAK,KAAK,aAAa;AACrD,WAAK,MAAM,WAAW,IAAI;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,eAAW,UAAU,KAAK,SAAS;AACjC,UAAI;AACF,cAAM,OAAO;AAAA,MACf,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,OAA0B;AAC1C,WAAO,KAAK,eAAe,KAAK,YAAY;AAAA,EAC9C;AAAA,EAEQ,MAAM,OAAe,MAAuB;AAClD,UAAM,OAAO,KAAK,WAAW,OAAO,IAAI;AACxC,UAAM,QAAQ,EAAE,MAAM,KAAK,KAAK;AAChC,eAAW,QAAQ,KAAK,OAAO;AAC7B,UAAI;AACF,aAAK,KAAK;AAAA,MACZ,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAuB;AACjC,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,OAAO,cAAwB,MAAuB;AACpD,QAAI,KAAK,UAAU,aAAc,GAAG;AAClC,WAAK,SAAS,OAAO,WAAW,GAAG,IAAI;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,KAAK,UAAU,aAAc,GAAG;AAClC,WAAK,SAAS,MAAM,KAAK;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,WAAW,OAAsB;AAC/B,QAAI,KAAK,UAAU,aAAc,GAAG;AAClC,WAAK,SAAS,WAAW,KAAK;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,IAAI,MAAgB,SAAgC;AAClD,QAAI,KAAK,UAAU,aAAc,GAAG;AAClC,WAAK,SAAS,IAAI,MAAM,OAAO;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,UAAU,MAAuB;AAC/B,QAAI,KAAK,UAAU,aAAc,GAAG;AAClC,WAAK,SAAS,OAAO,GAAG,IAAI;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,SAAS,MAAuB;AAC9B,QAAI,KAAK,UAAU,aAAc,GAAG;AAClC,WAAK,SAAS,MAAM,GAAG,IAAI;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,kBAAkB,MAAuB;AACvC,QAAI,KAAK,UAAU,aAAc,GAAG;AAClC,WAAK,SAAS,eAAe,GAAG,IAAI;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,WAAiB;AACf,QAAI,KAAK,UAAU,aAAc,GAAG;AAClC,WAAK,SAAS,SAAS;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,aAAuB,YAA6B;AACxD,QAAI,KAAK,UAAU,YAAa,GAAG;AACjC,WAAK,SAAS,MAAM,aAAa,UAAU;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,KAAK,OAAsB;AACzB,QAAI,KAAK,UAAU,aAAc,GAAG;AAClC,WAAK,SAAS,KAAK,KAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,QAAQ,OAAsB;AAC5B,QAAI,KAAK,UAAU,aAAc,GAAG;AAClC,WAAK,SAAS,QAAQ,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,QAAQ,UAAmB,MAAuB;AAChD,QAAI,KAAK,UAAU,aAAc,GAAG;AAClC,WAAK,SAAS,QAAQ,OAAO,GAAG,IAAI;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,UAAU,OAAsB;AAC9B,QAAI,KAAK,UAAU,aAAc,GAAG;AAClC,WAAK,SAAS,UAAU,KAAK;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,QAAQ,OAAsB;AAC5B,QAAI,KAAK,UAAU,aAAc,GAAG;AAElC,YAAM,qBAAqB,KAAK;AAChC,yBAAmB,UAAU,KAAK;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,WAAW,OAAsB;AAC/B,QAAI,KAAK,UAAU,aAAc,GAAG;AAElC,YAAM,wBAAwB,KAAK;AAGnC,4BAAsB,aAAa,KAAK;AAAA,IAC1C;AAAA,EACF;AACF;AAKO,IAAM,SAAS,IAAI,iBAAiB;AAKpC,SAAS,aACd,eACA,SAMQ;AACR,QAAM,aAAa,IAAI,iBAAiB,OAAO;AAE/C,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAGA,QAAM,gBAAgB,OAAO,OAAO,UAAU;AAG9C,gBAAc,MAAM,IAAI,SAAS,WAAW,IAAI,IAAI,aAAa,KAAK,GAAG,IAAI;AAC7E,gBAAc,QAAQ,IAAI,SAAS,WAAW,MAAM,IAAI,aAAa,KAAK,GAAG,IAAI;AACjF,gBAAc,OAAO,IAAI,SAAS,WAAW,KAAK,IAAI,aAAa,KAAK,GAAG,IAAI;AAC/E,gBAAc,OAAO,IAAI,SAAS,WAAW,KAAK,IAAI,aAAa,KAAK,GAAG,IAAI;AAC/E,gBAAc,QAAQ,IAAI,SAAS,WAAW,MAAM,IAAI,aAAa,KAAK,GAAG,IAAI;AACjF,gBAAc,QAAQ,IAAI,SAAS,WAAW,MAAM,IAAI,aAAa,KAAK,GAAG,IAAI;AAEjF,gBAAc,YAAY,IAAI,SAAS,WAAW,UAAU,GAAG,IAAI;AACnE,gBAAc,UAAU,IAAI,SAAS,WAAW,QAAQ,GAAG,IAAI;AAC/D,gBAAc,QAAQ,YAAY;AAChC,QAAI,OAAO,WAAW,UAAU,YAAY;AAC1C,YAAM,WAAW,MAAM;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,oBAAoB,OAAwB;AAC1D,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,SAAO,OAAO,KAAK;AACrB;;;AC3ZO,IAAM,yBAAyB;AAC/B,IAAM,qBAAqB;AAK3B,SAAS,iBAAiB,gBAAgC;AAC/D,MAAI,YAAY,iBAAiB;AAEjC,QAAM,cAAc,YAAY;AAChC,cAAY,YAAY,cAAc,KAAK,OAAO,IAAI,cAAc;AACpE,SAAO,KAAK,IAAI,WAAW,kBAAkB;AAC/C;;;ACZA,SAAS,kBAAkB;AAapB,SAAS,eACd,WACA,SACA,UACA,UACA,iBACiB;AACjB,QAAM,UAAgD;AAAA,IACpD,SAAS;AAAA,IACT;AAAA,EACF;AAEA,MAAI,mBAAmB,OAAO,KAAK,eAAe,EAAE,SAAS,GAAG;AAC9D,YAAQ,WAAW;AAAA,EACrB;AAEA,QAAM,WAA4B;AAAA,IAChC,YAAY,WAAW;AAAA,IACvB,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,IAAI,YAAY;AAAA,IAClB;AAAA,IACA;AAAA,IACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,EACrC;AAEA,MAAI,YAAY,OAAO,KAAK,QAAQ,EAAE,SAAS,GAAG;AAChD,aAAS,WAAW;AAAA,EACtB;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,SAAqB,WAAsC;AAC5F,QAAM,YAA+B,CAAC;AAItC,QAAM,aAAa;AACnB,QAAM,oBACJ,OAAO,WAAW,eAAe,WAAW,WAAW,aAAa;AACtE,QAAM,kBACJ,OAAO,WAAW,uBAAuB,WAAW,WAAW,qBAAqB;AAGtF,QAAM,+BAA+B,MAA2C;AAC9E,UAAM,WAAoC,CAAC;AAC3C,QAAI,iBAAiB;AACnB,eAAS,qBAAqB;AAAA,IAChC;AACA,QAAI,qBAAqB,sBAAsB,WAAW;AACxD,eAAS,sBAAsB;AAAA,IACjC;AACA,WAAO,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,WAAW;AAAA,EACvD;AAEA,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK,aAAa;AAChB,YAAM,mBAAmB,6BAA6B;AAEtD,iBAAW,SAAS,QAAQ,QAAQ,SAAS;AAC3C,YAAI,YAAY,KAAK,GAAG;AACtB,gBAAM,UAA6C;AAAA,YACjD,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,UACd;AACA,oBAAU;AAAA,YACR;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,cACR;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF,WAAW,eAAe,KAAK,GAAG;AAChC,gBAAM,UAAiD;AAAA,YACrD,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,aAAa,MAAM;AAAA,YACnB,WAAW,uBAAuB,MAAM,KAAK;AAAA,UAC/C;AACA,oBAAU;AAAA,YACR;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,cACR;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AAEX,UAAI,iBAAiB;AACnB;AAAA,MACF;AAGA,YAAM,aAAa,QAAQ,QAAQ,QAAQ,CAAC;AAC5C,UACE,YAAY,UAAU,MACrB,WAAW,SAAS,mCACnB,WAAW,SAAS,+CACtB;AACA;AAAA,MACF;AAEA,YAAM,mBAAmB,6BAA6B;AAEtD,iBAAW,SAAS,QAAQ,QAAQ,SAAS;AAC3C,YAAI,kBAAkB,KAAK,GAAG;AAC5B,gBAAM,UAAmD;AAAA,YACvD,MAAM;AAAA,YACN,aAAa,MAAM;AAAA,YACnB,QAAQ,oBAAoB,MAAM,OAAO;AAAA,YACzC,UAAU,QAAQ,MAAM,QAAQ;AAAA,UAClC;AACA,oBAAU;AAAA,YACR;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,cACR;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF,WAAW,YAAY,KAAK,GAAG;AAC7B,gBAAM,UAA6C;AAAA,YACjD,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,UACd;AACA,oBAAU;AAAA,YACR;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,cACR;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,gBAAgB;AACnB,YAAM,QAAQ,iBAAiB,OAAO;AACtC,UAAI,OAAO;AACT,cAAM,UAA6C;AAAA,UACjD,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAEA,cAAM,wBAAiD;AAAA,UACrD,cAAc;AAAA,QAChB;AACA,cAAM,eAAe,6BAA6B;AAClD,YAAI,cAAc;AAChB,iBAAO,OAAO,uBAAuB,YAAY;AAAA,QACnD;AACA,kBAAU;AAAA,UACR;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,cACE,MAAM;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,iBAAiB;AACpB,YAAM,kBAAkB,QAAQ,cAAc;AAC9C,YAAM,UAAsD;AAAA,QAC1D,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ,WAAW,QAAQ,SAAS;AAAA,QACpC,UAAU;AAAA,UACR,aAAa,QAAQ;AAAA,UACrB,oBAAoB,QAAQ;AAAA,UAC5B,WAAW,QAAQ;AAAA,UACnB,sBAAsB,QAAQ;AAAA,UAC9B,kBAAkB;AAAA,QACpB;AAAA,MACF;AAEA,gBAAU,KAAK,eAAe,iBAAiB,SAAS,eAAe,CAAC;AACxE;AAAA,IACF;AAAA,IACA;AACE;AAAA,EACJ;AAEA,SAAO;AACT;AAEO,SAAS,uBAAuBC,QAAyC;AAC9E,MAAIA,UAAS,OAAOA,WAAU,YAAY,CAAC,MAAM,QAAQA,MAAK,GAAG;AAC/D,WAAOA;AAAA,EACT;AACA,SAAO,EAAE,OAAOA,OAAM;AACxB;AAEO,SAAS,oBAAoBC,SAA0C;AAC5E,MAAIA,WAAU,OAAOA,YAAW,YAAY,CAAC,MAAM,QAAQA,OAAM,GAAG;AAClE,WAAOA;AAAA,EACT;AACA,SAAO,EAAE,OAAOA,QAAO;AACzB;AAEO,SAAS,YAAY,OAAoC;AAC9D,SACE,OAAO,UAAU,YACjB,UAAU,QACT,MAA6B,SAAS,UACvC,OAAQ,MAA6B,SAAS;AAElD;AAEA,SAAS,eAAe,OAAuC;AAC7D,SACE,OAAO,UAAU,YACjB,UAAU,QACT,MAA6B,SAAS,cACvC,OAAQ,MAA2B,OAAO,YAC1C,OAAQ,MAA6B,SAAS;AAElD;AAEA,SAAS,kBAAkB,OAA0C;AACnE,SACE,OAAO,UAAU,YACjB,UAAU,QACT,MAA6B,SAAS,iBACvC,OAAQ,MAAoC,gBAAgB;AAEhE;AAEO,SAAS,iBAAiB,SAAoC;AACnE,MAAI,QAAQ,SAAS,gBAAgB;AACnC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,uBAAuB;AACxC,UAAM,QAAQ,MAAM;AACpB,QAAI,OAAO,SAAS,gBAAgB,OAAO,MAAM,SAAS,UAAU;AAClE,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;;;ACzRA,SAAS,cAAAC,mBAAkB;AAgHpB,SAAS,4BACd,YACA,SACA,WACQ;AACR,QAAM,WAAqB,CAAC;AAE5B,MAAI,YAAY;AACd,aAAS,KAAK,mBAAmB,WAAW,KAAK,GAAG,kBAAkB;AAAA,EACxE;AACA,MAAI,SAAS;AACX,aAAS,KAAK,aAAa,QAAQ,KAAK,GAAG,YAAY;AAAA,EACzD;AACA,MAAI,WAAW;AACb,aAAS,KAAK,WAAW,UAAU,KAAK,GAAG,UAAU;AAAA,EACvD;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AACA,SAAO,SAAS,KAAK,IAAI;AAC3B;;;AJpHA,IAAM,yBAAyB;AA2CxB,IAAM,UAAN,MAAuD;AAAA,EAmB5D,YACS,IACC,IACR,UAA0B,CAAC,GAC3B;AAHO;AACC;AAGR,SAAK,qBAAqB;AAAA,MACxB,MAAM;AAAA,MACN,WAAW;AAAA,MACX,iBAAiB,QAAQ,mBAAmB;AAAA,MAC5C,UAAU;AAAA,QACR,cAAc,QAAQ,eAAe;AAAA,QACrC,GAAI,QAAQ,YAAY,CAAC;AAAA,MAC3B;AAAA,IACF;AACA,SAAK,kBAAkB,QAAQ,aAAa;AAAA,EAC9C;AAAA,EAjCO;AAAA,EAEC,sBAA6E,CAAC;AAAA,EAC9E,yBAEJ,CAAC;AAAA,EACG,QAA4B,CAAC;AAAA,EAC7B,aAAa;AAAA,EACb,oBAAqE;AAAA,EACrE,sBAA4C;AAAA,EAC5C,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,sBAA0C,CAAC;AAAA,EAC3C,eAAe;AAAA,EACf,aAAa;AAAA,EAEJ;AAAA,EAmBjB,QAAQ,SAAiC;AACvC,SAAK,MAAM,KAAK,OAAO;AAEvB,UAAM,OAAO,QAAQ,QAAQ,QAAQ,KAAK,KAAK;AAC/C,QAAI,MAAM;AACR,WAAK,oBAAoB,KAAK;AAAA,QAC5B,MAAM;AAAA,QACN;AAAA,QACA,WAAW,QAAQ,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC1D,CAAC;AAAA,IACH;AACA,WAAO,MAAM,oCAAoC;AAAA,MAC/C,WAAW,KAAK;AAAA,MAChB,aAAa,KAAK,MAAM;AAAA,IAC1B,CAAC;AAGD,QAAI,KAAK,mBAAmB;AAC1B,YAAM,WAAW,KAAK;AACtB,WAAK,oBAAoB;AACzB,YAAM,QAAQ,KAAK,MAAM,OAAO,GAAG,KAAK,MAAM,MAAM;AACpD,WAAK,KAAK,aAAa,WAAW,qBAAqB;AACvD,eAAS,KAAK;AAAA,IAChB,WAAW,CAAC,KAAK,cAAc,CAAC,KAAK,GAAG,aAAa,GAAG;AAEtD,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,QAAQ,OAAO,aAAa,IAAmC;AAC7D,WAAO,MAAM;AACX,UAAI;AAEJ,UAAI,KAAK,MAAM,SAAS,GAAG;AAEzB,gBAAQ,KAAK,MAAM,OAAO,GAAG,KAAK,MAAM,MAAM;AAAA,MAChD,OAAO;AAEL,eAAO,MAAM,2CAA2C;AAAA,UACtD,WAAW,KAAK;AAAA,QAClB,CAAC;AACD,gBAAQ,MAAM,IAAI,QAA4B,CAAC,YAAY;AACzD,eAAK,oBAAoB;AAAA,QAC3B,CAAC;AAAA,MACH;AAEA,aAAO,MAAM,mCAAmC;AAAA,QAC9C,WAAW,KAAK;AAAA,QAChB,WAAW,MAAM;AAAA,MACnB,CAAC;AAED,YAAM,cAAc;AAAA,QAClB,YAAY,KAAK;AAAA,QACjB,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC;AAAA,QACZ;AAAA,QACA,oBAAoB;AAAA,MACtB;AAEA,iBAAW,OAAO,OAAO;AACvB,oBAAY,QAAQ,QAAQ,KAAK;AAAA,UAC/B,MAAM;AAAA,UACN,MAAM,IAAI,QAAQ,QAAQ;AAAA,QAC5B,CAAC;AAAA,MACH;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,WAA0B;AACtC,QAAI,KAAK,YAAY;AACnB;AAAA,IACF;AACA,SAAK,aAAa;AAClB,WAAO,MAAM,gCAAgC,EAAE,WAAW,KAAK,GAAG,CAAC;AACnE,QAAI;AACF,YAAM,oBAA8B,CAAC;AACrC,UAAI,gBAAyC;AAE7C,YAAM,KAAK,aAAa,WAAW,qBAAqB;AAExD,UAAI;AACF,yBAAiB,WAAW,KAAK,GAAG,kBAAkB,MAAM;AAAA,UAC1D,GAAI,KAAK,uBAAuB,EAAE,QAAQ,KAAK,qBAAqB,IAAI,CAAC;AAAA,QAC3E,CAAC,GAAG;AACF,eAAK,oBAAoB,OAAO;AAEhC,cAAI,QAAQ,SAAS,aAAa;AAChC,iBAAK,8BAA8B,SAAS,iBAAiB;AAAA,UAC/D;AAEA,cAAI,QAAQ,SAAS,UAAU;AAC7B,4BAAgB;AAGhB,iBAAK,gBAAgB;AAGrB,kBAAM,WAAW,MAAM,KAAK,wBAAwB,eAAe,iBAAiB;AACpF,kBAAM,QAAQ,IAAI;AAAA,cAChB,KAAK,aAAa,QAAQ,wBAAwB;AAAA,cAClD,KAAK,iBAAiB,QAAQ;AAAA,YAChC,CAAC;AAGD,8BAAkB,SAAS;AAC3B,4BAAgB;AAAA,UAClB;AAEA,qBAAW,YAAY,mBAAmB,SAAS,KAAK,EAAE,GAAG;AAC3D,kBAAM,KAAK,iBAAiB,QAAQ;AAAA,UACtC;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AAEd,YAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD,iBAAO,KAAK,gCAAgC,EAAE,WAAW,KAAK,GAAG,CAAC;AAClE,gBAAM,KAAK,aAAa,QAAQ,sBAAsB;AACtD;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF,UAAE;AACA,WAAK,aAAa;AAClB,WAAK,oBAAoB;AACzB,aAAO,MAAM,iCAAiC;AAAA,QAC5C,WAAW,KAAK;AAAA,QAChB,iBAAiB,KAAK,MAAM;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,gBAAsB;AAC5B,SAAK,KAAK,SAAS,EAChB,KAAK,MAAM;AAEV,UAAI,KAAK,MAAM,SAAS,GAAG;AACzB,aAAK,cAAc;AAAA,MACrB;AAAA,IACF,CAAC,EACA,MAAM,OAAO,UAAU;AACtB,WAAK;AACL,aAAO,MAAM,+BAA+B;AAAA,QAC1C,WAAW,KAAK;AAAA,QAChB;AAAA,QACA,SAAS,KAAK;AAAA,QACd,YAAY;AAAA,MACd,CAAC;AAED,UAAI,KAAK,aAAa,0BAA0B,KAAK,MAAM,SAAS,GAAG;AAErE,eAAO;AAAA,UACL,yBAAyB,KAAK,MAAM,KAAK,eAAe,GAAI,CAAC,cAAc,KAAK,UAAU,IAAI,sBAAsB;AAAA,UACpH,EAAE,WAAW,KAAK,GAAG;AAAA,QACvB;AACA,cAAM,MAAM,KAAK,YAAY;AAC7B,aAAK,eAAe,iBAAiB,KAAK,YAAY;AACtD,aAAK,cAAc;AAAA,MACrB,WAAW,KAAK,MAAM,SAAS,GAAG;AAEhC,eAAO;AAAA,UACL,0BAA0B,sBAAsB;AAAA,UAChD,EAAE,WAAW,KAAK,GAAG;AAAA,QACvB;AACA,cAAM,gBAAgB,KAAK,6BAA6B,KAAK;AAC7D,aAAK,QAAQ,CAAC;AACd,cAAM,QAAQ,IAAI;AAAA,UAChB,KAAK,aAAa,SAAS,mBAAmB;AAAA,UAC9C,KAAK,iBAAiB,aAAa;AAAA,QACrC,CAAC;AACD,aAAK,gBAAgB;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACL;AAAA,EAEQ,oBAAoB,SAA2B;AACrD,QACE,CAAC,KAAK,wBACN,gBAAgB,WAChB,OAAO,QAAQ,eAAe,UAC9B;AACA,WAAK,uBAAuB,QAAQ;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,8BACN,SACA,mBACM;AACN,eAAW,SAAS,QAAQ,QAAQ,SAAS;AAC3C,UAAI,YAAY,KAAK,GAAG;AACtB,cAAM,UAAU,MAAM,KAAK,KAAK;AAChC,YAAI,SAAS;AACX,4BAAkB,KAAK,OAAO;AAE9B,eAAK,oBAAoB,KAAK;AAAA,YAC5B,MAAM;AAAA,YACN,MAAM;AAAA,YACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,wBACZ,QACA,mBACkC;AAClC,UAAM,UACJ,kBAAkB,SAAS,KAAK,KAAK,mBAChC,MAAM,KAAK,UAAU,iBAAiB,GAAG,KAAK,IAC/C;AAEN,UAAM,UAAU,QAAQ,YAAY;AACpC,UAAM,aAAa,UAAU,OAAO,YAAY,YAAa,OAAO,UAAU,OAAQ;AACtF,UAAM,YACJ,UAAU,OAAO,YAAY,aAAa,OAAO,UAAU,CAAC,GAAG,KAAK,IAAI,IAAI;AAE9E,UAAM,WAAoC;AAAA,MACxC,kBAAkB,KAAK;AAAA,IACzB;AACA,QAAI,SAAS;AACX,eAAS,UAAU;AAAA,IACrB;AACA,QAAI,YAAY;AACd,eAAS,SAAS;AAAA,IACpB;AACA,QAAI,WAAW;AACb,eAAS,QAAQ;AAAA,IACnB;AAEA,UAAM,UAAsD;AAAA,MAC1D,MAAM;AAAA,MACN;AAAA,MACA,aAAa,QAAQ,eAAe;AAAA,MACpC,UAAU,QAAQ,kBAAkB;AAAA,MACpC,SAAS,4BAA4B,YAAY,SAAS,SAAS;AAAA,MACnE;AAAA,IACF;AAEA,WAAO,eAAe,KAAK,IAAI,SAAS,KAAK,EAAE;AAAA,EACjD;AAAA,EAEQ,6BAA6B,OAAyC;AAC5E,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAE1E,UAAM,UAAsD;AAAA,MAC1D,MAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS,2BAA2B,KAAK,UAAU,aAAa,YAAY;AAAA,MAC5E,UAAU;AAAA,QACR,kBAAkB,KAAK;AAAA,QACvB,OAAO;AAAA,QACP,SAAS,KAAK;AAAA,MAChB;AAAA,IACF;AAEA,WAAO,eAAe,KAAK,IAAI,SAAS,KAAK,EAAE;AAAA,EACjD;AAAA,EAEQ,kBAAwB;AAC9B,SAAK,eAAe;AACpB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAc,UAAU,mBAA8C;AACpE,QAAI,kBAAkB,WAAW,GAAG;AAClC,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,kBAAkB,KAAK,MAAM,EAAE,KAAK;AACrD,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,UAAM,sBAAsB,qBAAqB,QAAQ;AAEzD,QAAI,UAAU;AACd,qBAAiB,WAAWC,OAAM;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,QAKd,UAAU;AAAA,QACV,OAAO;AAAA,QACP,cAAc,CAAC;AAAA,QACf,GAAG,qBAAqB;AAAA,MAC1B;AAAA,IACF,CAAC,GAAG;AACF,UAAI,QAAQ,SAAS,aAAa;AAChC,mBAAW,SAAS,QAAQ,QAAQ,SAAS;AAC3C,cAAI,YAAY,KAAK,GAAG;AACtB,uBAAW,GAAG,MAAM,IAAI;AAAA;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ,KAAK,KAAK;AAAA,EAC3B;AAAA,EAEA,MAAc,aAAa,QAAgB,QAAiB,UAAoC;AAC9F,UAAM,UAAsD;AAAA,MAC1D,MAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,QACR,kBAAkB,KAAK;AAAA,QACvB,GAAI,YAAY,CAAC;AAAA,MACnB;AAAA,IACF;AACA,QAAI,QAAQ;AACV,cAAQ,SAAS;AAAA,IACnB;AACA,UAAM,WAAW,eAAe,KAAK,IAAI,SAAS,KAAK,EAAE;AACzD,UAAM,KAAK,iBAAiB,QAAQ;AAAA,EACtC;AAAA,EAEA,WAAW,IAA0D;AACnE,SAAK,oBAAoB,KAAK,EAAE;AAAA,EAClC;AAAA,EAEA,cAAc,IAAsE;AAClF,SAAK,uBAAuB,KAAK,EAAE;AACnC,QAAI,KAAK,WAAW;AAClB,WAAK,QAAQ,QAAQ,GAAG,KAAK,kBAAkB,CAAC;AAAA,IAClD,OAAO;AACL,WAAK,KAAK,gBAAgB;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,WAAW,SAAiC;AAC1C,SAAK,GAAG,WAAW,OAAO;AAAA,EAC5B;AAAA,EAEA,aAAsB;AACpB,WAAO,KAAK,GAAG,WAAW;AAAA,EAC5B;AAAA,EAEA,MAAM,SAAwB;AAC5B,SAAK,QAAQ,CAAC;AACd,WAAO,MAAM,8BAA8B,EAAE,WAAW,KAAK,GAAG,CAAC;AACjE,UAAM,KAAK,GAAG,OAAO;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBAAsB,MAA+B;AACzD,UAAM,sBAAsB,KAAK,yBAAyB;AAE1D,QAAI,CAAC,uBAAuB,CAAC,MAAM;AACjC,aAAO;AAAA,IACT;AAEA,UAAMC,UAAS,KAAK,yBAAyB,qBAAqB,IAAI;AAEtE,QAAI,gBAAgB;AACpB,qBAAiB,WAAWD,OAAM;AAAA,MAChC,QAAAC;AAAA,MACA,SAAS;AAAA,QACP,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUd,UAAU;AAAA,QACV,OAAO;AAAA,QACP,cAAc,CAAC;AAAA,QACf,GAAG,qBAAqB;AAAA,MAC1B;AAAA,IACF,CAAC,GAAG;AACF,UAAI,QAAQ,SAAS,aAAa;AAChC,mBAAW,SAAS,QAAQ,QAAQ,SAAS;AAC3C,cAAI,YAAY,KAAK,GAAG;AACtB,6BAAiB,MAAM;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,cAAc,KAAK;AACnC,WAAO,WAAW;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,2BAAmC;AACzC,QAAI,KAAK,oBAAoB,WAAW,GAAG;AACzC,aAAO;AAAA,IACT;AAGA,UAAM,cAAc,KAAK,oBAAoB,MAAM,GAAG;AAEtD,UAAM,iBAAiB,YAAY,IAAI,CAAC,SAAS;AAC/C,YAAM,OAAO,KAAK,SAAS,SAAS,SAAS;AAE7C,YAAM,OAAO,KAAK,KAAK,SAAS,MAAM,GAAG,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC,QAAQ,KAAK;AAC7E,aAAO,GAAG,IAAI,KAAK,IAAI;AAAA,IACzB,CAAC;AAED,WAAO,eAAe,KAAK,MAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,qBAA6B,MAAsB;AAClF,UAAM,QAAkB,CAAC;AAEzB,QAAI,qBAAqB;AACvB,YAAM,KAAK;AAAA;AAAA;AAAA,EAGf,mBAAmB;AAAA,wBACG;AAAA,IACpB;AAEA,QAAI,MAAM;AAER,YAAM,gBACJ,KAAK,SAAS,MAAO,GAAG,KAAK,MAAM,GAAG,GAAI,CAAC;AAAA,wBAA2B;AACxE,YAAM,KAAK;AAAA,EACf,aAAa;AAAA,QACP;AAAA,IACJ;AAEA,UAAM,KAAK;AAAA;AAAA;AAAA,uDAGwC;AAEnD,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA,EAEA,MAAc,iBAAiB,UAA0C;AACvE,UAAM,KAAK,gBAAgB;AAC3B,eAAW,MAAM,KAAK,qBAAqB;AACzC,YAAM,GAAG,QAAQ;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAc,kBAAiC;AAC7C,QAAI,KAAK,WAAW;AAClB;AAAA,IACF;AACA,QAAI,CAAC,KAAK,qBAAqB;AAC7B,WAAK,uBAAuB,YAAY;AACtC,YAAI,KAAK,uBAAuB,WAAW,GAAG;AAC5C;AAAA,QACF;AACA,cAAM,QAAQ,IAAI,KAAK,uBAAuB,IAAI,CAAC,OAAO,GAAG,KAAK,kBAAkB,CAAC,CAAC;AACtF,aAAK,YAAY;AAAA,MACnB,GAAG;AAAA,IACL;AACA,UAAM,KAAK;AACX,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,sBAAsB;AAAA,IAC7B;AAAA,EACF;AACF;;;AK9jBA,SAAS,cAAAC,mBAAkB;AA0CpB,IAAM,gBAAN,MAAoB;AAAA,EASzB,YAA6B,SAA+B;AAA/B;AAC3B,SAAK,oBAAoB,QAAQ;AACjC,SAAK,mBAAmB,QAAQ;AAChC,SAAK,wBAAwB,QAAQ;AACrC,SAAK,WAAW,QAAQ;AACxB,SAAK,mBAAmB,QAAQ,oBAAoB,QAAQ;AAAA,EAC9D;AAAA,EAdQ,UAAU,oBAAI,IAAoB;AAAA,EAClC,cAAyB;AAAA,EACzB;AAAA,EACR;AAAA,EACA;AAAA,EACS;AAAA,EACQ;AAAA;AAAA;AAAA;AAAA;AAAA,EAcjB,oBAAoB,WAAyB;AAC3C,WAAO,KAAK,iDAAiD,SAAS,EAAE;AACxE,SAAK,mBAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,sBAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAwB;AACrC,WAAO,KAAK,4CAA4C,KAAK,EAAE;AAC/D,SAAK,cAAc;AAGnB,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI,OAAO,WAAW,WAAW;AAC/B,eAAO,GAAG,SAAS,KAAK;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAA4B;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAwB;AACtB,WAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;AAAA,EACzC;AAAA,EAEA,UAAU,IAAgC;AACxC,WAAO,KAAK,QAAQ,IAAI,EAAE;AAAA,EAC5B;AAAA,EAEA,gBAAgB,MAAkC;AAChD,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI,OAAO,SAAS,MAAM;AACxB,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,IAA8B;AAC/C,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,UAAM,OAAO,QAAQ,OAAO;AAC5B,WAAO,SAAS;AAChB,WAAO,eAAe,KAAK,IAAI;AAC/B,SAAK,QAAQ,IAAI,IAAI,MAAM;AAC3B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa;AAAA,IACjB;AAAA,IACA,QAAAC;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAyC;AACvC,UAAM,KAAKC,YAAW;AACtB,UAAM,MAAM,KAAK;AACjB,UAAM,KAAK,KAAK,QAAQ,aAAa,QAAW,GAAG;AAGnD,OAAG,SAAS,KAAK,WAAW;AAE5B,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,SAAiB;AAAA,MACrB,QAAQ;AAAA,MACR;AAAA,MACA,SAAS,IAAI,QAAQ,IAAI,IAAI;AAAA,QAC3B,iBAAiB,mBAAmB;AAAA,QACpC,aAAa;AAAA,QACb,UAAU;AAAA,UACR;AAAA,UACA,GAAG;AAAA,QACL;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AAAA,MACD;AAAA,MACA,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,WAAW;AAAA,MACX,cAAc;AAAA,IAChB;AAEA,WAAO,QAAQ,cAAc,OAAO,YAAY;AAC9C,YAAM,KAAK,wBAAwB;AAAA,QACjC,WAAW,QAAQ;AAAA,QACnB,iBAAiB,QAAQ,mBAAmB;AAAA,QAC5C,UAAU,QAAQ;AAAA,MACpB,CAAC;AAAA,IACH,CAAC;AAED,WAAO,QAAQ,WAAW,OAAO,aAAa;AAC5C,UAAI,SAAS,QAAQ,QAAQ,SAAS,kBAAkB;AACtD,cAAM,KAAK,WAAW,IAAI,QAAmC;AAAA,MAC/D,OAAO;AACL,cAAM,KAAK,UAAU,IAAI,QAAQ;AAAA,MACnC;AAAA,IACF,CAAC;AACD,WAAO,QAAQ,QAAQ;AAAA,MACrB,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACnC,YAAYA,YAAW;AAAA,MACvB,YAAY;AAAA,MACZ,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,MACA,SAAS;AAAA,QACP,SAAS;AAAA,UACP,MAAM;AAAA,UACN,MAAMD;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,QAAQ,IAAI,IAAI,MAAM;AAE3B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAkB,WAAmB,QAAgB,SAAmC;AAC5F,UAAM,SAAS,KAAK,UAAU,SAAS;AACvC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,WAAO,QAAQ,QAAQ;AAAA,MACrB,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACnC,YAAYC,YAAW;AAAA,MACvB,YAAY;AAAA,MACZ,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,MACA,SAAS;AAAA,QACP,SAAS;AAAA,UACP,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,SAAS;AAChB,WAAO,eAAe,KAAK,IAAI;AAC/B,SAAK,QAAQ,IAAI,WAAW,MAAM;AAElC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAkB,MAAc,SAAmC;AACvE,UAAM,SAAS,KAAK,gBAAgB,IAAI;AACxC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,WAAO,QAAQ,QAAQ;AAAA,MACrB,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACnC,YAAYA,YAAW;AAAA,MACvB,YAAY,OAAO,QAAQ;AAAA,MAC3B,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI,OAAO;AAAA,MACb;AAAA,MACA,SAAS;AAAA,QACP,SAAS;AAAA,UACP,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,SAAS;AAChB,WAAO,eAAe,KAAK,IAAI;AAC/B,SAAK,QAAQ,IAAI,OAAO,QAAQ,IAAI,MAAM;AAE1C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAA0B;AAC9B,WAAO,KAAK,8BAA8B;AAC1C,UAAM,QAAQ;AAAA,MACZ,KAAK,YAAY,EAAE,IAAI,OAAO,WAAW;AACvC,eAAO,KAAK,oBAAoB,OAAO,QAAQ,EAAE,kBAAkB;AACnE,cAAM,OAAO,QAAQ,OAAO;AAAA,MAC9B,CAAC;AAAA,IACH;AACA,WAAO,KAAK,kCAAkC;AAAA,EAChD;AAAA,EAEA,MAAc,WAAW,IAAY,UAAkD;AACrF,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AAEA,WAAO,SAAS,SAAS,QAAQ,QAAQ,UAAU,cAAc;AACjE,WAAO,eAAe,KAAK,IAAI;AAC/B,SAAK,QAAQ,IAAI,IAAI,MAAM;AAE3B,UAAM,KAAK,kBAAkB,QAAQ;AAAA,EACvC;AAAA,EAEA,MAAM,UAAU,IAAY,KAAqC;AAC/D,UAAM,SAAS,KAAK,QAAQ,IAAI,EAAE;AAClC,QAAI,QAAQ;AACV,aAAO,eAAe,KAAK,IAAI;AAC/B,WAAK,QAAQ,IAAI,IAAI,MAAM;AAAA,IAC7B;AACA,UAAM,KAAK,iBAAiB,GAAG;AAAA,EACjC;AACF;;;ACrSA,SAAS,iBAAiC;AAC1C,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AACtB,YAAYC,aAAY;;;ACHxB,OAAOC,SAAQ;AACf,SAAS,cAAcC,cAAa;AACpC,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,YAAYC,aAAY;;;ACJxB,OAAO,QAAQ;AACf,OAAOC,WAAU;AAEV,SAAS,WAAoB;AAClC,QAAM,UAAU,QAAQ,IAAI,sBAAsB;AAClD,QAAM,WAAW,QAAQ,IAAI,uBAAuB;AACpD,QAAM,kBAAkB,QAAQ,SAAS,WAAW,KAAK,QAAQ,SAAS,WAAW;AACrF,QAAM,mBAAmB,SAAS,SAAS,WAAW,KAAK,SAAS,SAAS,WAAW;AACxF,SAAO,mBAAmB;AAC5B;AAEO,SAAS,cAAc,aAA+B;AAC3D,QAAM,MAAM,eAAe,SAAS;AACpC,QAAM,UAAU,MAAM,gBAAgB;AACtC,SAAOA,MAAK,KAAK,GAAG,QAAQ,GAAG,OAAO;AACxC;;;ADOO,IAAM,cAAc,cAAc;AAClC,IAAM,2BAA2BC,MAAK,KAAK,aAAa,YAAY;AAC3E,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AACzB,IAAM,yBAAyB;AAC/B,IAAM,kBAAkB;AACxB,IAAM,0BAA0B;AAEhC,SAAS,oBAAoB,OAA4C;AACvE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU;AAC5C;AAEO,IAAM,mBAAN,MAAuB;AAAA,EAG5B,YAA6B,WAAmB,0BAA0B;AAA7C;AAAA,EAA8C;AAAA,EAFnE,YAAY;AAAA,EAIpB,MAAM,OAA0C;AAC9C,QAAI;AACF,YAAM,MAAM,MAAMC,IAAG,SAAS,KAAK,UAAU,MAAM;AACnD,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAI,CAAC,oBAAoB,MAAM,GAAG;AAChC,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAChE;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,eAAe,KAAK,GAAG;AACzB,eAAO;AAAA,MACT;AACA,MAAO,yBAAiB,KAAK;AAC7B,YAAM,IAAI;AAAA,QACR,mCAAmC,KAAK,QAAQ,KAAKC,qBAAoB,KAAK,CAAC;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,aAA+C;AACxD,UAAM,KAAK,SAAS,YAAY;AAC9B,YAAM,UAA6B;AAAA,QACjC,KAAK,YAAY;AAAA,MACnB;AAEA,YAAMD,IAAG,MAAMD,MAAK,QAAQ,KAAK,QAAQ,GAAG,EAAE,WAAW,MAAM,MAAM,iBAAiB,CAAC;AAEvF,YAAM,WAAW,GAAG,KAAK,QAAQ;AACjC,YAAM,aAAa,KAAK,UAAU,SAAS,MAAM,CAAC;AAClD,YAAMC,IAAG,UAAU,UAAU,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACpE,YAAMA,IAAG,MAAM,UAAU,iBAAiB;AAC1C,YAAMA,IAAG,OAAO,UAAU,KAAK,QAAQ;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,SAAS,YAAY;AAC9B,UAAI;AACF,cAAMA,IAAG,OAAO,KAAK,QAAQ;AAAA,MAC/B,SAAS,OAAO;AACd,YAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,UAAO,yBAAiB,KAAK;AAC7B,gBAAM,IAAI;AAAA,YACR,qCAAqC,KAAK,QAAQ,KAAKC,qBAAoB,KAAK,CAAC;AAAA,UACnF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAY,IAAkC;AAClD,QAAI,KAAK,YAAY,GAAG;AACtB,WAAK,aAAa;AAClB,UAAI;AACF,eAAO,MAAM,GAAG;AAAA,MAClB,UAAE;AACA,aAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,KAAK,YAAY;AACvC,SAAK,YAAY;AACjB,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,UAAE;AACA,WAAK,YAAY;AACjB,YAAM,QAAQ;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,WAAmB;AACzB,WAAO,GAAG,KAAK,QAAQ;AAAA,EACzB;AAAA,EAEA,MAAc,cAA4C;AACxD,UAAMD,IAAG,MAAMD,MAAK,QAAQ,KAAK,QAAQ,GAAG,EAAE,WAAW,MAAM,MAAM,iBAAiB,CAAC;AACvF,UAAM,WAAW,KAAK,SAAS;AAC/B,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,WAAW,mBAAmB;AAEpC,WAAO,MAAM;AACX,UAAI;AACF,cAAMC,IAAG,UAAU,UAAU,KAAK,UAAU,QAAQ,GAAG;AAAA,UACrD,MAAM;AAAA,UACN,MAAM;AAAA,QACR,CAAC;AACD,eAAO,YAAY;AACjB,cAAI;AACF,kBAAMA,IAAG,OAAO,QAAQ;AAAA,UAC1B,SAAS,OAAO;AACd,gBAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,cAAO,yBAAiB,KAAK;AAC7B,oBAAM,IAAI;AAAA,gBACR,sCAAsC,QAAQ,KAAKC,qBAAoB,KAAK,CAAC;AAAA,cAC/E;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,YAAI,CAAC,WAAW,KAAK,GAAG;AACtB,UAAO,yBAAiB,KAAK;AAC7B,gBAAM,IAAI;AAAA,YACR,sCAAsC,QAAQ,KAAKA,qBAAoB,KAAK,CAAC;AAAA,UAC/E;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,iBAAiB,QAAQ;AAE9C,YAAI,MAAM,KAAK,gBAAgB,UAAU,MAAM,GAAG;AAChD,gBAAM,iBAAiB,QAAQ;AAC/B;AAAA,QACF;AAEA,YAAI,KAAK,IAAI,IAAI,QAAQ,iBAAiB;AACxC,gBAAM,IAAI;AAAA,YACR,wCAAwC,QAAQ,GAAG,iBAAiB,MAAM,CAAC;AAAA,UAC7E;AAAA,QACF;AAEA,cAAMC,OAAM,sBAAsB;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,UAAkB,QAA+C;AAC7F,QAAI,CAAC,QAAQ;AACX,aAAO,MAAM,gBAAgB,QAAQ;AAAA,IACvC;AACA,QAAI,OAAO,aAAaC,IAAG,SAAS,KAAK,OAAO,QAAQ,QAAQ,KAAK;AACnE,aAAO;AAAA,IACT;AACA,QAAI,CAAC,eAAe,OAAO,GAAG,GAAG;AAC/B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,OAAyB;AAC/C,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,UAAU,SACT,MAA4B,SAAS;AAAA,EAC1C;AACF;AAEA,SAASF,qBAAoB,OAAwB;AACnD,MAAI,iBAAiB,SAAS,MAAM,SAAS;AAC3C,WAAO,MAAM;AAAA,EACf;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,WAAW,OAAyB;AAC3C,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,UAAU,SACT,MAA4B,SAAS;AAAA,EAC1C;AACF;AAEA,SAAS,qBAAmC;AAC1C,SAAO;AAAA,IACL,KAAK,QAAQ;AAAA,IACb,UAAUE,IAAG,SAAS;AAAA,IACtB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;AAEA,eAAe,iBAAiB,UAAgD;AAC9E,MAAI;AACF,UAAM,MAAM,MAAMH,IAAG,SAAS,UAAU,MAAM;AAC9C,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAI,OAAO,OAAO,QAAQ,YAAY,OAAO,OAAO,aAAa,UAAU;AACzE,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AACN,YAAM,SAAS,gBAAgB,GAAG;AAClC,UAAI,QAAQ;AACV,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,eAAe,KAAK,GAAG;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,KAAkC;AACzD,QAAM,CAAC,QAAQ,YAAY,IAAI,IAAI,MAAM,GAAG;AAC5C,QAAM,MAAM,OAAO,SAAS,UAAU,IAAI,EAAE;AAC5C,MAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AACzB,WAAO;AAAA,EACT;AACA,QAAM,cAAc,OAAO,SAAS,gBAAgB,IAAI,EAAE;AAC1D,MAAI,CAAC,OAAO,SAAS,WAAW,GAAG;AACjC,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL;AAAA,IACA,UAAUG,IAAG,SAAS;AAAA,IACtB,WAAW,IAAI,KAAK,WAAW,EAAE,YAAY;AAAA,EAC/C;AACF;AAEA,eAAe,gBAAgB,UAAoC;AACjE,MAAI;AACF,UAAM,QAAQ,MAAMH,IAAG,KAAK,QAAQ;AACpC,WAAO,KAAK,IAAI,IAAI,MAAM,UAAU;AAAA,EACtC,SAAS,OAAO;AACd,QAAI,eAAe,KAAK,GAAG;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,iBAAiB,UAAiC;AAC/D,MAAI;AACF,UAAMA,IAAG,OAAO,QAAQ;AAAA,EAC1B,SAAS,OAAO;AACd,QAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,eAAe,KAAsB;AAC5C,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,OAAO,GAAG;AACrC,WAAO;AAAA,EACT;AACA,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,QAAQ,OAAO,OAAO,GAAG;AAC3B,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,OAAO,OAAO,GAAG;AAC3B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,QAAQ,OAAgB,MAAuB;AACtD,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,UAAU,SACT,MAA4B,SAAS;AAAA,EAC1C;AACF;AAEA,SAAS,iBAAiB,QAAqC;AAC7D,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,SAAO,iBAAiB,OAAO,GAAG,OAAO,OAAO,QAAQ,UAAU,OAAO,SAAS;AACpF;;;AE/SA,SAAS,SAAS,kBAAmC;AACrD,YAAYI,SAAQ;AACpB,YAAYC,WAAU;AACtB,YAAY,OAAO;AAGnB,IAAM,eAAmE,SAAO;AAAA,EAC9E,WACG,SAAO;AAAA,IACN,SAAW,UAAQ,EAAE,QAAQ,KAAK;AAAA,IAClC,UAAY,SAAO,EAAE,SAAS;AAAA,EAChC,CAAC,EACA,QAAQ;AAAA,IACP,SAAS;AAAA,EACX,CAAC;AACL,CAAC;AAUD,eAAsB,iBAAiB,YAA4C;AACjF,QAAM,gBAAgB,OAAOA,WAAgD;AAC3E,QAAI,CAACA,QAAM;AACT,aAAO;AAAA,IACT;AAEA,UAAS,WAAOA,MAAI;AAEpB,UAAM,UAAU,MAAS,aAASA,QAAM,OAAO;AAC/C,UAAM,SAAuB,CAAC;AAC9B,UAAM,SAAS,WAAW,SAAS,QAAQ;AAAA,MACzC,oBAAoB;AAAA,MACpB,mBAAmB;AAAA,IACrB,CAAC;AACD,WAAO,aAAa,MAAM,MAAM;AAAA,EAClC;AAEA,QAAM,iBAAiB,MAAoB;AACzC,WAAO,aAAa,MAAM,CAAC,CAAC;AAAA,EAC9B;AAEA,SACG,MAAM,cAAc,UAAU,EAAE,MAAM,MAAM,IAAI,KAChD,MAAM,cAAmB,WAAK,QAAQ,IAAI,GAAG,cAAc,CAAC,EAAE,MAAM,MAAM,IAAI,KAC9E,MAAM,cAAmB,WAAK,QAAQ,IAAI,GAAG,aAAa,CAAC,EAAE,MAAM,MAAM,IAAI,KAC7E,MAAM,eAAe;AAE1B;;;AHnCO,IAAM,kBAAN,MAAsB;AAAA,EAO3B,YAAoB,UAAkB;AAAlB;AAClB,SAAK,MAAM,UAAU,QAAQ;AAC7B,SAAK,WAAgB,eAAS,KAAK,QAAQ;AAC3C,SAAK,mBAAwB,WAAK,aAAa,aAAa,KAAK,QAAQ;AAAA,EAC3E;AAAA,EAVS;AAAA,EACD;AAAA,EACS,YAAY,oBAAI,IAAsB;AAAA,EAC/C,gBAAgB,oBAAI,IAAyB;AAAA,EAC7C;AAAA,EAQR,MAAM,oBAAiF;AACrF,UAAM,SAAS,MAAM,iBAAiB;AACtC,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,qBAAqB,cAAsB,UAAmC;AAClF,UAAM,SAAS,MAAM,KAAK,IAAI,YAAY;AAC1C,QAAI,CAAC,QAAQ;AACX,aAAO,MAAM,yEAAyE;AAAA,QACpF,UAAU,KAAK;AAAA,MACjB,CAAC;AACD,aAAO,KAAK;AAAA,IACd;AAGA,UAAM,WAAW,KAAK,UAAU,IAAI,YAAY;AAChD,QAAI,UAAU;AACZ,UAAI,QAAQ,KAAK,cAAc,IAAI,YAAY;AAC/C,UAAI,CAAC,OAAO;AACV,gBAAQ,oBAAI,IAAI;AAAA,MAClB;AACA,YAAM,IAAI,QAAQ;AAClB,WAAK,cAAc,IAAI,cAAc,KAAK;AAC1C,aAAO,MAAM,6CAA6C;AAAA,QACxD;AAAA,QACA,cAAc,SAAS;AAAA,MACzB,CAAC;AACD,aAAO,SAAS;AAAA,IAClB;AAGA,UAAM,cAAc,MAAM,KAAK,eAAe,YAAY;AAC1D,SAAK,UAAU,IAAI,cAAc,WAAW;AAC5C,SAAK,cAAc,IAAI,cAAc,oBAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AAExD,WAAO,KAAK,0CAA0C;AAAA,MACpD;AAAA,MACA,cAAc,YAAY;AAAA,IAC5B,CAAC;AAED,WAAO,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,eAAe,cAAyC;AACpE,WAAO,KAAK,sBAAsB,YAAY,GAAG;AACjD,UAAS,UAAM,KAAK,kBAAkB,EAAE,WAAW,KAAK,CAAC;AAEzD,UAAM,eAAoB,WAAK,KAAK,kBAAkB,YAAY;AAClE,UAAM,eAAe,MAAM,KAAK,IAC7B,SAAS,CAAC,YAAY,YAAY,CAAC,EACnC,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AAEpB,UAAM,eAAe,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,QAAQ,aAAa,CAAC;AAC3E,UAAM,eAAe,KAAK,kBAAkB,YAAY;AACxD,UAAM,qBAAqB,aAAa,SAAS,YAAY;AAE7D,QAAI,CAAC,oBAAoB;AACvB,UAAI,cAAc;AAEhB,cAAM,KAAK,IAAI,IAAI,CAAC,YAAY,OAAO,cAAc,YAAY,CAAC;AAAA,MACpE,OAAO;AAEL,cAAM,UAAU,MAAM,KAAK,iBAAiB;AAC5C,YAAI,SAAS;AACX,gBAAM,KAAK,IAAI,IAAI,CAAC,YAAY,OAAO,MAAM,cAAc,cAAc,OAAO,CAAC;AAAA,QACnF,OAAO;AACL,gBAAM,KAAK,IAAI,IAAI,CAAC,YAAY,OAAO,MAAM,cAAc,YAAY,CAAC;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,cACA,UACA,QAAiB,OACF;AACf,UAAM,QAAQ,KAAK,cAAc,IAAI,YAAY;AACjD,QAAI,OAAO;AACT,YAAM,OAAO,QAAQ;AACrB,WAAK,cAAc,IAAI,cAAc,KAAK;AAAA,IAC5C;AAEA,UAAM,WAAW,KAAK,UAAU,IAAI,YAAY;AAChD,SAAK,CAAC,SAAS,MAAM,SAAS,MAAM,UAAU;AAE5C,YAAM,OAAO,CAAC,YAAY,UAAU,SAAS,YAAY;AACzD,UAAI,OAAO;AACT,aAAK,KAAK,SAAS;AAAA,MACrB;AAEA,UAAI;AACF,cAAM,KAAK,IAAI,IAAI,IAAI;AACvB,eAAO,KAAK,oBAAoB,YAAY,EAAE;AAAA,MAChD,SAAS,GAAG;AACV,cAAM,eAAe,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AAC9D,YACE,aAAa,SAAS,uBAAuB,KAC7C,aAAa,SAAS,gBAAgB,GACtC;AACA,iBAAO;AAAA,YACL,YAAY,SAAS,YAAY;AAAA,UACnC;AACA,gBAAM,KAAK,IAAI,IAAI,CAAC,YAAY,OAAO,CAAC;AACxC,gBAAS,OAAG,SAAS,cAAc,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,QACrE,OAAO;AACL,UAAO,yBAAiB,CAAC;AACzB,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAAiB,OAAsB;AACtD,UAAM,gBAAgB,MAAM,KAAK,KAAK,cAAc,QAAQ,CAAC;AAC7D,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,cAAc,IAAI,OAAO,CAAC,cAAc,WAAW,MAAM;AACvD,cAAM,QAAQ;AAAA,UACZ,MAAM,KAAK,YAAY,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa;AACjD,mBAAO,KAAK,mBAAmB,cAAc,UAAU,KAAK;AAAA,UAC9D,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU;AAC9D,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,MAAM,qBAAqB,SAAS,MAAM,YAAY;AAAA,IAC/D,OAAO;AACL,aAAO,KAAK,uCAAuC;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,sBAAiG;AAC/F,WAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc;AAAA,MAC5D,cAAc,SAAS;AAAA,MACvB,YAAY,SAAS;AAAA,MACrB,cAAc,SAAS;AAAA,IACzB,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,kBAAkBC,SAA0B;AAClD,UAAM,QAAQA,QAAO,MAAM,IAAI;AAC/B,UAAM,QAAkB,CAAC;AAEzB,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,WAAW,WAAW,GAAG;AAChC,cAAM,KAAK,KAAK,UAAU,YAAY,MAAM,CAAC;AAAA,MAC/C;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,mBAAgD;AAC5D,UAAM,WAAW,MAAM,iBAAiB,GAAG,WAAW;AAEtD,QAAI,SAAS;AACX,UAAI;AACF,cAAM,KAAK,IAAI,IAAI,CAAC,aAAa,YAAY,OAAO,CAAC;AACrD,eAAO,KAAK,8BAA8B,OAAO,EAAE;AACnD,eAAO;AAAA,MACT,QAAQ;AACN,eAAO,KAAK,wBAAwB,OAAO,oCAAoC;AAAA,MACjF;AAAA,IACF;AAGA,UAAM,eAAe,CAAC,QAAQ,UAAU,aAAa;AACrD,eAAW,OAAO,cAAc;AAC9B,UAAI;AACF,cAAM,KAAK,IAAI,IAAI,CAAC,aAAa,YAAY,GAAG,CAAC;AACjD,eAAO,KAAK,4BAA4B,GAAG,EAAE;AAC7C,eAAO;AAAA,MACT,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO,KAAK,iFAAiF;AAC7F,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBAAgB,cAAqC;AACzD,QAAI;AACF,YAAM,MAAM,UAAU,YAAY;AAClC,YAAM,IAAI,IAAI,CAAC,IAAI,CAAC;AACpB,aAAO,MAAM,2CAA2C,YAAY,EAAE;AAAA,IACxE,SAAS,OAAO;AACd,aAAO,MAAM,6CAA6C,EAAE,OAAO,aAAa,CAAC;AACjF,MAAO,yBAAiB,KAAK;AAAA,IAE/B;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,cAAuB,SAAiC;AAC1E,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,kBAAkB;AAC5C,UAAI,CAAC,QAAQ,SAAS;AACpB,eAAO,MAAM,uDAAuD;AACpE;AAAA,MACF;AAEA,UAAI,CAAC,cAAc;AACjB,eAAO,MAAM,8DAA8D;AAC3E;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,UAAU,IAAI,YAAY;AAChD,UAAI,CAAC,UAAU;AACb,eAAO,KAAK,uCAAuC,YAAY,oBAAoB;AACnF;AAAA,MACF;AAEA,YAAM,MAAM,UAAU,SAAS,YAAY;AAC3C,YAAM,SAAS,MAAM,IAAI,OAAO;AAChC,UAAI,OAAO,QAAQ,GAAG;AACpB,eAAO,MAAM,8CAA8C,YAAY,EAAE;AACzE;AAAA,MACF;AAEA,YAAM,IAAI,IAAI,CAAC,OAAO,CAAC;AACvB,YAAM,gBACJ,WAAW,QAAQ,KAAK,EAAE,SAAS,IAC/B,QAAQ,KAAK,EAAE,MAAM,GAAG,GAAG,IAC3B,UAAU,YAAY;AAE5B,YAAM,IAAI,OAAO,aAAa;AAC9B,aAAO,KAAK,2CAA2C,YAAY,EAAE;AAAA,IACvE,SAAS,OAAO;AACd,aAAO,MAAM,uDAAuD,EAAE,OAAO,aAAa,CAAC;AAC3F,MAAO,yBAAiB,KAAK;AAC7B,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;AIzSA,SAAS,oBAAoB,YAAY;AACzC,SAAS,KAAAC,UAAS;AASX,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAQ5B,SAAS,sBAAsB,eAA8B,SAA2B;AAC7F,SAAO,mBAAmB;AAAA,IACxB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;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,QA2BA;AAAA,UACE,MAAMA,GACH,OAAO,EACP,IAAI,GAAG,uBAAuB,EAC9B;AAAA,YACC;AAAA,UACF;AAAA,UACF,QAAQA,GAAE,OAAO,EAAE,IAAI,GAAG,oBAAoB;AAAA,UAC9C,UAAUA,GAAE,OAAOA,GAAE,IAAI,CAAC,EAAE,SAAS;AAAA,QACvC;AAAA,QACA,OAAO,MAAM,UAAU;AACrB,gBAAM,aAAa;AACnB,gBAAM,eAAe,YAAY,QAAQ,sBAAsB;AAC/D,gBAAM,YAAY,OAAO,iBAAiB,WAAW,eAAe;AAIpE,cAAI,kBAAkB,QAAQ,uBAAuB,KAAK;AAG1D,cAAI,CAAC,iBAAiB;AACpB,kBAAM,eAAe,YAAY;AACjC,8BAAkB,QAAQ,sBAAsB,YAAY;AAC5D,gBAAI,CAAC,mBAAmB,WAAW;AACjC,gCAAkB,QAAQ,0BAA0B,SAAS;AAAA,YAC/D;AACA,oBAAQ;AAAA,cACN;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAEA,kBAAQ,IAAI,mCAAmC;AAAA,YAC7C,MAAM,KAAK;AAAA,YACX;AAAA,YACA,mBAAmB,QAAQ,uBAAuB;AAAA,YAClD;AAAA,UACF,CAAC;AAED,gBAAM,SAAS,MAAM,cAAc,aAAa;AAAA,YAC9C,MAAM,KAAK;AAAA,YACX,QAAQ,KAAK;AAAA,YACb,iBAAiB,mBAAmB;AAAA,YACpC,UAAU,KAAK;AAAA,UACjB,CAAC;AAED,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,qDAC+B,KAAK,IAAI;AAAA,8CAChB,OAAO,SAAS;AAAA;AAAA,gFAEkB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,cAKrF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,QACA;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,QAsDA;AAAA,UACE,MAAMA,GACH,OAAO,EACP,IAAI,GAAG,uBAAuB,EAC9B,SAAS,wCAAwC;AAAA,UACpD,SAASA,GACN,OAAO,EACP,IAAI,GAAG,qBAAqB,EAC5B;AAAA,YACC;AAAA,UACF;AAAA,UACF,WAAWA,GACR,QAAQ,EACR,QAAQ,KAAK,EACb;AAAA,YACC;AAAA,UACF;AAAA,QACJ;AAAA,QACA,OAAO,MAAM,UAAU;AACrB,gBAAM,aAAa;AACnB,gBAAM,eAAe,YAAY,QAAQ,sBAAsB;AAC/D,gBAAM,YAAY,OAAO,iBAAiB,WAAW,eAAe;AAEpE,kBAAQ,IAAI,mCAAmC;AAAA,YAC7C,MAAM,KAAK;AAAA,YACX,SAAS,KAAK,QAAQ,UAAU,GAAG,GAAG;AAAA,YACtC,WAAW,KAAK;AAAA,YAChB;AAAA,UACF,CAAC;AAED,gBAAM,UAAU,MAAM,cAAc,kBAAkB,KAAK,MAAM,KAAK,OAAO;AAE7E,cAAI,CAAC,SAAS;AACZ,kBAAM,SAAS,cAAc,gBAAgB,KAAK,IAAI;AACtD,gBAAI,CAAC,QAAQ;AACX,qBAAO;AAAA,gBACL,SAAS;AAAA,kBACP;AAAA,oBACE,MAAM;AAAA,oBACN,MAAM,KAAK,UAAU;AAAA,sBACnB,SAAS;AAAA,sBACT,OAAO,mCAAmC,KAAK,IAAI;AAAA,oBACrD,CAAC;AAAA,kBACH;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAEA,mBAAO;AAAA,cACL,SAAS;AAAA,gBACP;AAAA,kBACE,MAAM;AAAA,kBACN,MAAM,KAAK,UAAU;AAAA,oBACnB,SAAS;AAAA,oBACT,OAAO,WAAW,KAAK,IAAI,6BAA6B,OAAO,MAAM;AAAA,kBACvE,CAAC;AAAA,gBACH;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,KAAK,UAAU;AAAA,kBACnB,SAAS;AAAA,kBACT,MAAM,KAAK;AAAA,kBACX,aAAa,KAAK;AAAA,kBAClB,SAAS,KAAK,YACV,2BAA2B,KAAK,IAAI,iCACpC,8BAA8B,KAAK,IAAI;AAAA,gBAC7C,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AC7PA,IAAO,8BAAQ;;;ACAf,SAAS,SAAAC,cAAa;AAEtB,SAAS,YAAY;AACrB,YAAYC,WAAU;AACtB,YAAYC,aAAY;AAGjB,IAAM,qBAAN,MAAyB;AAAA,EACtB;AAAA,EAKA,aAMJ,oBAAI,IAAI;AAAA,EAEZ,MAAM,qBAAwC;AAE5C,QACE,KAAK,sBACL,KAAK,IAAI,IAAI,KAAK,mBAAmB,QAAQ,QAAQ,IAAI,IAAI,KAAK,KAClE;AACA,aAAO,KAAK,mBAAmB;AAAA,IACjC;AAEA,QAAI,WAAqB,CAAC;AAC1B,qBAAiB,WAAWC,OAAM;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,gBAAgB,CAAC,QAAQ,WAAW,OAAO;AAAA,QAC3C,GAAG,qBAAqB;AAAA,MAC1B;AAAA,IACF,CAAC,GAAG;AACF,UAAI,QAAQ,SAAS,YAAY,QAAQ,YAAY,QAAQ;AAC3D,gBAAQ,IAAI,qCAAqC,QAAQ,cAAc;AACvE,mBAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AAEA,eAAW,SAAS,OAAO,CAAC,QAAQ;AAClC,aAAO,CAAC,CAAC,WAAW,QAAQ,iBAAiB,OAAO,EAAE;AAAA,QAAK,CAAC,YAC1D,QAAQ,SAAS,GAAG;AAAA,MACtB;AAAA,IACF,CAAC;AAED,SAAK,qBAAqB;AAAA,MACxB,SAAS,oBAAI,KAAK;AAAA,MAClB,eAAe;AAAA,IACjB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,gBAAwB,IAAuB;AAE9D,UAAM,SAAS,KAAK,WAAW,IAAI,aAAa;AAChD,QAAI,UAAU,KAAK,IAAI,IAAI,OAAO,QAAQ,QAAQ,IAAI,KAAK,KAAM;AAC/D,aAAO,OAAO;AAAA,IAChB;AAEA,QAAI;AACF,UAAI,WAAqB,CAAC;AAE1B,UAAI,kBAAkB,IAAI;AAExB,mBAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AAGL,YAAI,cAAc,SAAS,GAAG,GAAG;AAE/B,mBAAS;AAAA,YACP,MAAM,aAAa;AAAA;AAAA,YACnB,MAAM,aAAa;AAAA;AAAA,YACnB,GAAG,aAAa;AAAA;AAAA,YAChB,GAAG,aAAa;AAAA;AAAA,UAClB;AAAA,QACF,OAAO;AAEL,mBAAS;AAAA,YACP,OAAO,aAAa;AAAA;AAAA,YACpB,OAAO,aAAa;AAAA;AAAA,YACpB,MAAM,aAAa;AAAA;AAAA,YACnB,GAAG,aAAa;AAAA;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,WAAwB,oBAAI,IAAI;AAGtC,iBAAW,WAAW,UAAU;AAC9B,YAAI;AACF,gBAAM,QAAQ,MAAM,KAAK,SAAS;AAAA,YAChC,QAAQ;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA,UAAU;AAAA,YACV,UAAU;AAAA,YACV,OAAO;AAAA;AAAA,UACT,CAAC;AAGD,gBAAM,QAAQ,CAAC,MAAM,SAAS,IAAI,CAAC,CAAC;AAAA,QACtC,QAAQ;AAAA,QAER;AAAA,MACF;AAGA,YAAM,WAAW,MAAM,KAAK,QAAQ,EACjC,KAAK,CAAC,GAAG,MAAM;AACd,YAAI,kBAAkB,IAAI;AAExB,gBAAM,iBAAiB;AAAA,YACrB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,gBAAMC,SAAa,eAAS,CAAC;AAC7B,gBAAMC,SAAa,eAAS,CAAC;AAC7B,gBAAM,aAAa,eAAe,SAASD,MAAK;AAChD,gBAAM,aAAa,eAAe,SAASC,MAAK;AAChD,cAAI,cAAc,CAAC,WAAY,QAAO;AACtC,cAAI,CAAC,cAAc,WAAY,QAAO;AAGtC,gBAAMC,WAAU,EAAE,MAAM,KAAK,KAAK,CAAC,GAAG;AACtC,gBAAMC,WAAU,EAAE,MAAM,KAAK,KAAK,CAAC,GAAG;AACtC,cAAID,YAAWC,QAAQ,QAAOD,UAASC;AAEvC,iBAAO,EAAE,cAAc,CAAC;AAAA,QAC1B;AAGA,cAAM,QAAa,eAAS,CAAC,EAAE,YAAY;AAC3C,cAAM,QAAa,eAAS,CAAC,EAAE,YAAY;AAC3C,cAAM,cAAc,cAAc,YAAY;AAE9C,cAAM,SAAS,UAAU;AACzB,cAAM,SAAS,UAAU;AACzB,YAAI,UAAU,CAAC,OAAQ,QAAO;AAC9B,YAAI,CAAC,UAAU,OAAQ,QAAO;AAG9B,cAAM,UAAU,MAAM,WAAW,WAAW;AAC5C,cAAM,UAAU,MAAM,WAAW,WAAW;AAC5C,YAAI,WAAW,CAAC,QAAS,QAAO;AAChC,YAAI,CAAC,WAAW,QAAS,QAAO;AAGhC,cAAM,UAAU,EAAE,MAAM,KAAK,KAAK,CAAC,GAAG;AACtC,cAAM,UAAU,EAAE,MAAM,KAAK,KAAK,CAAC,GAAG;AACtC,YAAI,WAAW,OAAQ,QAAO,SAAS;AAGvC,eAAO,EAAE,cAAc,CAAC;AAAA,MAC1B,CAAC,EACA,MAAM,GAAG,kBAAkB,KAAK,KAAK,EAAE;AAG1C,WAAK,WAAW,IAAI,eAAe;AAAA,QACjC,SAAS,oBAAI,KAAK;AAAA,QAClB,OAAO;AAAA,MACT,CAAC;AAGD,UAAI,KAAK,WAAW,OAAO,KAAK;AAC9B,cAAM,UAAU,MAAM,KAAK,KAAK,WAAW,QAAQ,CAAC;AAEpD,gBACG,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,QAAQ,QAAQ,IAAI,EAAE,CAAC,EAAE,QAAQ,QAAQ,CAAC,EAC9D,MAAM,GAAG,EAAE,EACX,QAAQ,CAAC,CAAC,GAAG,MAAM,KAAK,WAAW,OAAO,GAAG,CAAC;AAAA,MACnD;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,MAAO,yBAAiB,KAAK;AAC7B,cAAQ,MAAM,yBAAyB,KAAK;AAC5C,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,cACJJ,QACA,QAAgB,IACgC;AAChD,UAAM,cAAqD,CAAC;AAE5D,QAAIA,OAAM,WAAW,GAAG,GAAG;AACzB,YAAM,aAAaA,OAAM,MAAM,CAAC;AAChC,YAAM,YAAY,MAAM,KAAK,mBAAmB,GAC7C,OAAO,CAAC,QAAQ,IAAI,WAAW,UAAU,CAAC,EAC1C,MAAM,GAAG,KAAK;AAEjB,iBAAW,OAAO,UAAU;AAC1B,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,WAAWA,OAAM,WAAW,GAAG,GAAG;AAChC,YAAM,YAAYA,OAAM,MAAM,CAAC;AAE/B,YAAM,QAAQ,MAAM,KAAK,WAAW,SAAS;AAG7C,iBAAW,QAAQ,MAAM,MAAM,GAAG,KAAK,GAAG;AACxC,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AhBnOA,IAAMK,UAAS,aAAa,mBAAmB;AAkC/C,IAAM,2BAA2D;AAAA,EAC/D,MAAM;AAAA,EACN,OAAO;AACT;AAEO,IAAM,oBAAN,MAAwB;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,oBAAI,IAA0B;AAAA,EACxC,aAAa,oBAAI,IAAoB;AAAA,EACrC,qBAAqB,IAAI,mBAAmB;AAAA,EACrD,UAA0B;AAAA,EAC1B,UAAU;AAAA,EACV,gBAA+B;AAAA,EAC/B,kBAA+B,EAAE,GAAG,yBAAyB;AAAA,EAC7D,eAA8B;AAAA,EAC9B,eAA8B;AAAA,EAE7B,kBAAkB,oBAAI,IAAY;AAAA,EAE3C,YAAY,cAA8C;AACxD,UAAM,wBAAwB,CAAC,iBAC7B,KAAK,0BAA0B,YAAY;AAE7C,UAAM,WAAW,cAAc,YAAY,QAAQ,IAAI;AAGvD,SAAK,kBAAkB,cAAc,mBAAmB,IAAI,gBAAgB,QAAQ;AAGpF,SAAK,eAAe,cAAc,gBAAgB;AAElD,UAAM,sBACJ,cAAc,uBACb,CAAC,YAA8C,QAC9C,IAAI,SAAS;AAAA,MACX,UAAU;AAAA,QACR,cAAc,CAAC,GAAG,yBAAyB;AAAA,QAC3C;AAAA,QACA,KAAK,OAAO,QAAQ,IAAI;AAAA,MAC1B;AAAA,IACF,CAAC;AAEL,SAAK,gBACH,cAAc,iBACd,IAAI,cAAc;AAAA,MAChB,cAAc;AAAA,MACd;AAAA,MACA,kBAAkB,CAAC,QAAQ,KAAK,oBAAoB,GAAG;AAAA,MACvD,mBAAmB,CAAC,QAAQ,KAAK,qBAAqB,GAAG;AAAA,MACzD,uBAAuB,OAAO,EAAE,WAAW,iBAAiB,SAAS,MAAM;AACzE,cAAM,KAAK,gBAAgB,WAAW,mBAAmB,MAAM,QAAQ;AAAA,MACzE;AAAA,IACF,CAAC;AAEH,SAAK,kBAAkB,sBAAsB,KAAK,eAAe;AAAA,MAC/D;AAAA,MACA,2BAA2B,CAAC,cAAsB,KAAK,eAAe,SAAS;AAAA,MAC/E,wBAAwB,MAAM,KAAK;AAAA,IACrC,CAAC;AAED,UAAM,2BAA2B;AAAA,MAC/B,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAEA,UAAM,oBACJ,cAAc,qBACb,MACC,IAAI,SAAS;AAAA,MACX,UAAU;AAAA,QACR,cAAc;AAAA,QACd,YAAY;AAAA,UACV,QAAQ,KAAK;AAAA,QACf;AAAA,QACA,cAAc;AAAA,MAChB;AAAA,IACF,CAAC;AAEL,SAAK,WAAW,kBAAkB;AAAA,EACpC;AAAA,EAEA,oBAAoB,oBAAqC;AACvD,UAAM,kBAAkB,KAAK,iBAAiB;AAC9C,QAAI,CAAC,KAAK,eAAe;AACvB,WAAK,gBAAgB;AAAA,IACvB;AAEA,QAAI,KAAK,WAAW,KAAK,QAAQ,OAAO,iBAAiB;AACvD,MAAAA,QAAO,MAAM,8CAA8C;AAAA,QACzD,WAAW;AAAA,QACX,cAAc,KAAK;AAAA,QACnB,cAAc,KAAK;AAAA,MACrB,CAAC;AACD,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,KAAK,WAAW,KAAK,QAAQ,OAAO,iBAAiB;AACvD,MAAAA,QAAO;AAAA,QACL,gDAAgD,KAAK,QAAQ,EAAE,SAAS,eAAe;AAAA,MACzF;AACA,WAAK,KAAK,QAAQ,OAAO,EAAE,MAAM,CAAC,UAAU;AAC1C,QAAAA,QAAO,MAAM,yDAAyD,EAAE,MAAM,CAAC;AAAA,MACjF,CAAC;AACD,WAAK,UAAU;AAAA,IACjB;AAGA,QAAI,KAAK,gBAAgB,CAAC,KAAK,cAAc;AAC3C,MAAAA,QAAO,KAAK,iFAAiF;AAAA,QAC3F,cAAc,KAAK;AAAA,QACnB,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,UAAM,kBAA2C,CAAC;AAClD,QAAI,KAAK,cAAc;AACrB,sBAAgB,gBAAgB,KAAK;AACrC,sBAAgB,SAAS,KAAK;AAAA,IAChC,OAAO;AAEL,sBAAgB,SAAS;AAAA,IAC3B;AAEA,IAAAA,QAAO,KAAK,4CAA4C;AAAA,MACtD,WAAW;AAAA,MACX,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,iBAAiB,CAAC,CAAC,KAAK;AAAA,MACxB,SAAS,KAAK;AAAA,IAChB,CAAC;AAED,UAAM,UAAU,IAAI,QAAQ,iBAAiB,KAAK,UAAU;AAAA,MAC1D,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,IACZ,CAAC;AAED,SAAK,UAAU;AACf,SAAK,YAAY,OAAO;AACxB,SAAK,qBAAqB;AAC1B,WAAO;AAAA,EACT;AAAA,EAEA,mBAAkC;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,qBAAsC;AACpC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,uBAAuB,WAAyB;AAC9C,QAAI,KAAK,kBAAkB,WAAW;AACpC;AAAA,IACF;AACA,SAAK,gBAAgB;AACrB,SAAK,oBAAoB,SAAS;AAAA,EACpC;AAAA,EAEA,UAAUC,SAAuE;AAC/E,UAAM,WAAWC,YAAW;AAC5B,UAAM,aAA2B;AAAA,MAC/B,IAAI;AAAA,MACJ,cAAc,OAAO,YAAY;AAC/B,cAAMD,QAAO,aAAa,OAAO;AAAA,MACnC;AAAA,MACA,aAAaA,QAAO,cAChB,OAAO,YAAY;AACjB,cAAMA,QAAO,cAAc,OAAO;AAAA,MACpC,IACA;AAAA,MACJ,SAASA,QAAO;AAAA,MAChB,OAAOA,QAAO;AAAA,IAChB;AAEA,SAAK,QAAQ,IAAI,UAAU,UAAU;AAErC,QAAI,eAAe;AACnB,UAAM,aAAa,MAAY;AAC7B,UAAI,cAAc;AAChB;AAAA,MACF;AACA,qBAAe;AACf,WAAK,QAAQ,OAAO,WAAW,EAAE;AACjC,UAAI;AACF,mBAAW,QAAQ;AAAA,MACrB,SAAS,OAAO;AACd,QAAO,yBAAiB,KAAK;AAC7B,gBAAQ,MAAM,sCAAsC,KAAK;AAAA,MAC3D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU,CAAC,YAA4B;AACrC,aAAK,oBAAoB,YAAY,OAAO;AAAA,MAC9C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,SAAS;AAChB,MAAAD,QAAO,MAAM,0DAA0D;AAAA,QACrE,cAAc,KAAK;AAAA,QACnB,cAAc,KAAK;AAAA,MACrB,CAAC;AACD;AAAA,IACF;AACA,SAAK,UAAU;AAEf,IAAAA,QAAO,KAAK,6CAA6C;AAAA,MACvD,cAAc,KAAK;AAAA,IACrB,CAAC;AAID,QAAI,KAAK,cAAc;AACrB,YAAM,KAAK,mBAAmB,KAAK,YAAY;AAAA,IACjD;AAEA,IAAAA,QAAO,KAAK,4CAA4C;AAAA,MACtD,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,iBAAiB,CAAC,CAAC,KAAK;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,mBAAmB,cAAqC;AACpE,QAAI;AAEF,YAAM,sBAAsB,gBAAgB,KAAK,iBAAiB,SAAS;AAC3E,WAAK,eAAe,MAAM,KAAK,gBAAgB;AAAA,QAC7C;AAAA,QACA;AAAA,MACF;AACA,MAAAA,QAAO,KAAK,2DAA2D;AAAA,QACrE;AAAA,QACA,cAAc,KAAK;AAAA,MACrB,CAAC;AAGD,WAAK,cAAc,oBAAoB,KAAK,YAAY;AAIxD,UAAI,KAAK,SAAS;AAChB,QAAAA,QAAO;AAAA,UACL;AAAA,QACF;AACA,aAAK,qBAAqB;AAAA,MAC5B;AAAA,IACF,SAAS,OAAO;AACd,MAAAA,QAAO,MAAM,qDAAqD;AAAA,QAChE;AAAA,QACA;AAAA,MACF,CAAC;AACD,MAAO,yBAAiB,KAAK;AAE7B,WAAK,eAAe,KAAK,cAAc;AACvC,MAAAA,QAAO,KAAK,4EAA4E;AAAA,QACtF;AAAA,QACA,cAAc,KAAK;AAAA,MACrB,CAAC;AACD,WAAK,cAAc,oBAAoB,KAAK,YAAY;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,kBAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,KAAK,cAAc,SAAS;AAElC,QAAI,KAAK,SAAS;AAChB,YAAM,KAAK,QAAQ,OAAO,EAAE,MAAM,MAAM,MAAS;AACjD,WAAK,UAAU;AAAA,IACjB;AAGA,QAAI,KAAK,gBAAgB,KAAK,eAAe;AAC3C,YAAM,sBAAsB,gBAAgB,KAAK,aAAa;AAC9D,YAAM,KAAK,gBACR,mBAAmB,KAAK,cAAc,mBAAmB,EACzD,MAAM,CAAC,UAAU;AAChB,QAAAA,QAAO,KAAK,wDAAwD;AAAA,UAClE,cAAc,KAAK;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACL;AAEA,eAAW,cAAc,KAAK,QAAQ,OAAO,GAAG;AAC9C,UAAI;AACF,mBAAW,QAAQ;AAAA,MACrB,SAAS,OAAO;AACd,QAAO,yBAAiB,KAAK;AAC7B,gBAAQ,MAAM,sCAAsC,KAAK;AAAA,MAC3D;AAAA,IACF;AACA,SAAK,QAAQ,MAAM;AACnB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,SAAwB;AAC5B,QAAI,KAAK,gBAAgB,SAAS,gBAAgB;AAChD,YAAM,QAAQ;AAAA,QACZ,KAAK,cACF,YAAY,EACZ,OAAO,CAAC,WAAW,OAAO,WAAW,SAAS,EAC9C,IAAI,CAAC,WAAW,KAAK,cAAc,aAAa,OAAO,QAAQ,EAAE,EAAE,MAAM,MAAM,KAAK,CAAC;AAAA,MAC1F;AAAA,IACF;AACA,UAAM,KAAK,SAAS,OAAO;AAAA,EAC7B;AAAA,EAEA,MAAM,eACJ,SACmD;AACnD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa,MAAM,KAAK,mBAAmB,cAAc,QAAQ,KAAK;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,MAAM,qBACJ,KACuD;AACvD,IAAAA,QAAO,KAAK,gDAAgD,GAAG;AAE/D,QAAI,IAAI,MAAM;AACZ,WAAK,kBAAkB,IAAI;AAC3B,WAAK,qBAAqB;AAAA,IAC5B;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,MAAM,KAAK;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,eACJ,KACgD;AAChD,IAAAA,QAAO,KAAK,0CAA0C,GAAG;AAEzD,UAAM,aAAa,IAAI;AAEvB,QAAI;AAEF,UAAI;AACJ,UAAI,eAAe,QAAQ;AAEzB,cAAM,WAAW,KAAK,cAAc;AACpC,cAAMG,WAAU,QAAQ;AAAA,MAC1B,WAAW,eAAe,QAAQ,eAAe,QAAW;AAE1D,cAAM,eAAe,KAAK,gBAAgB,oBAAoB;AAC9D,cAAM,WAAW,aAAa;AAAA,UAC5B,CAAC,OAA+B,GAAG,eAAe;AAAA,QACpD;AAEA,YAAI,CAAC,UAAU;AACb,UAAAH,QAAO,KAAK,qDAAqD,UAAU,EAAE;AAC7E,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO,iCAAiC,UAAU;AAAA,UACpD;AAAA,QACF;AACA,cAAMG,WAAU,SAAS,YAAY;AAAA,MACvC,WAAW,KAAK,cAAc;AAE5B,cAAMA,WAAU,KAAK,YAAY;AAAA,MACnC,OAAO;AAEL,cAAM,WAAW,KAAK,cAAc;AACpC,cAAMA,WAAU,QAAQ;AAAA,MAC1B;AAGA,YAAM,SAAS,MAAM,IAAI,OAAO;AAChC,UAAI,OAAO,QAAQ,GAAG;AACpB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,MACF;AAGA,YAAM,IAAI,IAAI,CAAC,OAAO,CAAC;AAGvB,YAAM,aAAa,MAAM,IAAI,KAAK,CAAC,YAAY,QAAQ,CAAC;AAGxD,YAAM,gBAAgB,MAAM,KAAK,iCAAiC,UAAU;AAG5E,YAAM,eAAe,MAAM,IAAI,OAAO,aAAa;AACnD,YAAM,YAAY,aAAa;AAE/B,MAAAH,QAAO,KAAK,uCAAuC,SAAS,EAAE;AAG9D,UAAI,IAAI,WAAW,eAAe;AAChC,YAAI;AAEF,gBAAM,gBAAgB,MAAM,IAAI,SAAS,CAAC,gBAAgB,MAAM,CAAC;AACjE,gBAAM,gBAAgB,cAAc,KAAK;AACzC,gBAAM,IAAI,KAAK,UAAU,eAAe,CAAC,gBAAgB,CAAC;AAC1D,UAAAA,QAAO,KAAK,wCAAwC,aAAa,EAAE;AAGnE,gBAAM,aAAa,MAAM,KAAK,mBAAmB,KAAK,aAAa;AAEnE,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,kCAAkC,aAAa;AAAA,YACxD,YAAY;AAAA,YACZ,aAAa;AAAA,UACf;AAAA,QACF,SAAS,WAAW;AAClB,UAAAA,QAAO,MAAM,sCAAsC,EAAE,OAAO,UAAU,CAAC;AACvE,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,8CAA8C,qBAAqB,QAAQ,UAAU,UAAU,OAAO,SAAS,CAAC;AAAA,YACzH,YAAY;AAAA,YACZ,OAAO,gBAAgB,qBAAqB,QAAQ,UAAU,UAAU,OAAO,SAAS,CAAC;AAAA,UAC3F;AAAA,QACF;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,kBAAkB;AACnC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,OAAO;AAAA,UACP,YAAY;AAAA,QACd;AAAA,MACF;AAGA,UAAI,IAAI,WAAW,mBAAmB;AACpC,YAAI;AAEF,gBAAM,gBAAgB,MAAM,IAAI,SAAS,CAAC,gBAAgB,MAAM,CAAC;AACjE,gBAAM,gBAAgB,cAAc,KAAK;AAGzC,gBAAM,WAAW,KAAK,cAAc;AACpC,gBAAM,UAAUG,WAAU,QAAQ;AAGlC,gBAAM,QAAQ,IAAI,CAAC,YAAY,MAAM,aAAa,CAAC;AACnD,UAAAH,QAAO,KAAK,mCAAmC,aAAa,mBAAmB;AAE/E,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,YACT,YAAY;AAAA,UACd;AAAA,QACF,SAAS,eAAe;AACtB,UAAAA,QAAO,MAAM,2DAA2D;AAAA,YACtE,OAAO;AAAA,UACT,CAAC;AACD,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,mEAAmE,yBAAyB,QAAQ,cAAc,UAAU,OAAO,aAAa,CAAC;AAAA,YAC1J,YAAY;AAAA,YACZ,OAAO,oBAAoB,yBAAyB,QAAQ,cAAc,UAAU,OAAO,aAAa,CAAC;AAAA,UAC3G;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,IACF,SAAS,OAAO;AACd,MAAAA,QAAO,MAAM,mDAAmD,EAAE,MAAM,CAAC;AACzE,MAAO,yBAAiB,KAAK;AAC7B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,iCAAiC,UAAmC;AAChF,QAAI;AAEF,UAAI,KAAK,SAAS;AAChB,eAAO,MAAM,KAAK,QAAQ,sBAAsB,QAAQ;AAAA,MAC1D;AAGA,MAAAA,QAAO,KAAK,wEAAwE;AACpF,aAAO;AAAA,IACT,SAAS,OAAO;AACd,MAAAA,QAAO,MAAM,yDAAyD,EAAE,MAAM,CAAC;AAC/E,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,mBAAmB,KAAgB,YAA4C;AAC3F,QAAI;AAEF,YAAM,YAAY,MAAM,IAAI,OAAO,CAAC,WAAW,QAAQ,CAAC;AACxD,UAAI,CAAC,WAAW;AACd,QAAAA,QAAO,KAAK,4CAA4C;AACxD,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,UAAU,KAAK;AAOlC,UAAI,QAAuB;AAC3B,UAAI,OAAsB;AAG1B,YAAM,WAAW,WAAW,MAAM,4CAA4C;AAC9E,UAAI,UAAU;AACZ,gBAAQ,SAAS,CAAC;AAClB,eAAO,SAAS,CAAC;AAAA,MACnB;AAGA,UAAI,CAAC,OAAO;AACV,cAAM,aAAa,WAAW,MAAM,mDAAmD;AACvF,YAAI,YAAY;AACd,kBAAQ,WAAW,CAAC;AACpB,iBAAO,WAAW,CAAC;AAAA,QACrB;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,CAAC,MAAM;AACnB,QAAAA,QAAO,KAAK,8DAA8D;AAAA,UACxE,WAAW;AAAA,QACb,CAAC;AACD,eAAO;AAAA,MACT;AAGA,YAAM,aAAa,sBAAsB,KAAK,IAAI,IAAI,YAAY,mBAAmB,UAAU,CAAC;AAChG,MAAAA,QAAO,KAAK,6CAA6C,EAAE,WAAW,CAAC;AACvE,aAAO;AAAA,IACT,SAAS,OAAO;AACd,MAAAA,QAAO,MAAM,sDAAsD,EAAE,MAAM,CAAC;AAC5E,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,uBAA6B;AACnC,QAAI,CAAC,KAAK,SAAS;AACjB,MAAAA,QAAO,MAAM,uEAAuE;AACpF;AAAA,IACF;AAEA,UAAM,WAAW,KAAK;AACtB,IAAAA,QAAO,KAAK,iDAAiD;AAAA,MAC3D,MAAM,SAAS;AAAA,MACf,WAAW,KAAK,QAAQ;AAAA,MACxB,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,IACrB,CAAC;AAED,UAAM,cAAc,UAAU,SAAS,KAAK;AAE5C,QAAI,SAAS,SAAS,gBAAgB;AACpC,WAAK,QAAQ,WAAW;AAAA,QACtB,OAAO;AAAA,QACP,gBAAgB;AAAA,QAChB,cAAc,KAAK,kBAAkB;AAAA,QACrC,cAAc,CAAC,GAAG,iCAAiC,oBAAoB,mBAAmB;AAAA,QAC1F,YAAY;AAAA,UACV,QAAQ,KAAK;AAAA,QACf;AAAA,MACF,CAAC;AAED,WAAK,cAAc,eAAe,SAAS,cAAc;AAAA,IAC3D,WAAW,SAAS,SAAS,QAAQ;AACnC,WAAK,QAAQ,WAAW;AAAA,QACtB,OAAO;AAAA,QACP,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd,cAAc,CAAC,GAAG,yBAAyB;AAAA,QAC3C,YAAY,CAAC;AAAA,MACf,CAAC;AAAA,IACH,OAAO;AAGL,YAAM,WAAW,KAAK,gBAAgB,KAAK,cAAc,YAAY,QAAQ,IAAI;AAEjF,MAAAA,QAAO,KAAK,oDAAoD;AAAA,QAC9D,cAAc,KAAK;AAAA,QACnB,cAAc,KAAK;AAAA,QACnB,UAAU,KAAK,cAAc;AAAA,QAC7B;AAAA,QACA,iBAAiB,CAAC,CAAC,KAAK;AAAA,QACxB,SAAS,KAAK;AAAA,MAChB,CAAC;AAID,UAAI,KAAK,gBAAgB,CAAC,KAAK,cAAc;AAC3C,QAAAA,QAAO;AAAA,UACL;AAAA,UACA;AAAA,YACE,cAAc,KAAK;AAAA,YACnB,aAAa;AAAA,YACb,SAAS,KAAK;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAEA,WAAK,QAAQ,WAAW;AAAA,QACtB,OAAO;AAAA,QACP,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd,cAAc,CAAC,GAAG,yBAAyB;AAAA,QAC3C,YAAY,CAAC;AAAA,QACb,KAAK;AAAA,QACL,GAAI,KAAK,eAAe,EAAE,OAAO,KAAK,oBAAoB,EAAE,IAAI,CAAC;AAAA,MACnE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAA6E;AACnF,UAAM,eAAe,KAAK;AAC1B,QAAI,CAAC,cAAc;AACjB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,kBAAuC;AAAA,MAC3C,OAAO;AAAA,QACL,OAAOI,WAA8C;AACnD,cAAIA,OAAM,oBAAoB,eAAe;AAC3C,mBAAO,CAAC;AAAA,UACV;AACA,gBAAM,WAAWA,OAAM;AACvB,cAAI,aAAa,UAAU,aAAa,WAAW,aAAa,aAAa;AAC3E,kBAAM,KAAK,gBAAgB,gBAAgB,YAAY;AAAA,UACzD;AACA,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,aAAa,CAAC,eAAe;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,YAAY,SAAwB;AAC1C,YAAQ,cAAc,OAAO,YAAY;AACvC,YAAM,KAAK,qBAAqB,OAAO;AAAA,IACzC,CAAC;AACD,YAAQ,WAAW,OAAO,aAAa;AACrC,UAAI,SAAS,QAAQ,QAAQ,SAAS,kBAAkB;AACtD,cAAM,KAAK,sBAAsB,QAAmC;AAAA,MACtE,OAAO;AACL,cAAM,KAAK,qBAAqB,QAAQ;AAAA,MAC1C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,qBAAqB,SAAiD;AAClF,QAAI,QAAQ,SAAS,gBAAgB;AACnC,YAAM,KAAK,iBAAiB;AAAA,QAC1B,MAAM;AAAA,QACN,WAAW,QAAQ;AAAA,QACnB,iBAAiB,QAAQ;AAAA,QACzB,UAAU,QAAQ;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,qBAAqB,SAAyC;AAC1E,SAAK,aAAa,OAAO;AACzB,UAAM,KAAK,gBAAgB,OAAO;AAAA,EACpC;AAAA,EAEA,MAAc,sBAAsB,SAAiD;AACnF,SAAK,aAAa,OAAO;AACzB,UAAM,KAAK,gBAAgB,OAAO;AAAA,EACpC;AAAA,EAEA,MAAc,oBAAoB,SAAyC;AACzE,SAAK,aAAa,OAAO;AACzB,UAAM,KAAK,gBAAgB,OAAO;AAAA,EACpC;AAAA,EAEA,MAAc,qBAAqB,SAAiD;AAClF,UAAM,KAAK,gBAAgB,OAAO;AAElC,QAAI,KAAK,gBAAgB,SAAS,gBAAgB;AAChD,WAAK,qBAAqB,OAAO;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAc,gBACZ,WACA,iBACA,UACe;AACf,IAAAJ,QAAO,MAAM,qDAAqD;AAAA,MAChE;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,KAAK,iBAAiB;AAAA,MAC1B,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,qBAAqB,SAAwC;AACnE,QAAI,CAAC,KAAK,SAAS;AACjB,MAAAA,QAAO,KAAK,8EAA8E;AAAA,QACxF,iBAAiB,QAAQ;AAAA,MAC3B,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,cAAc,UAAU,QAAQ,UAAU;AAC9D,UAAM,UAAU,eAAe,OAAO;AACtC,UAAM,cAAc,QAAQ,QAAQ,QAAQ;AAE5C,UAAM,gBAAgB;AAAA,MACpB;AAAA,MACA,SAAS,WAAW;AAAA,MACpB;AAAA,MACA,WAAW;AAAA,IACb,EACG,KAAK,IAAI,EACT,KAAK;AAER,UAAM,WAA8C;AAAA,MAClD,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACnC,YAAYE,YAAW;AAAA,MACvB,YAAY,KAAK,QAAQ;AAAA,MACzB,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI,QAAQ,mBAAmB,QAAQ;AAAA,MACzC;AAAA,MACA,SAAS;AAAA,QACP,SAAS;AAAA,UACP,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,SAAK,QAAQ,QAAQ,QAAQ;AAAA,EAC/B;AAAA,EAEQ,oBAAoB,YAA0B,SAA+B;AACnF,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,aAAK,KAAK,kBAAkB,YAAY,OAAO;AAC/C;AAAA,MACF,KAAK;AACH,aAAK,kBAAkB,OAAO;AAC9B;AAAA,MACF,KAAK;AACH,aAAK,mBAAmB,QAAQ,QAAQ;AACxC;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAEH;AAAA,MACF;AACE,QAAAF,QAAO,KAAK,mDAAmD;AAAA,UAC7D;AAAA,QACF,CAAC;AAAA,IACL;AAAA,EACF;AAAA,EAEQ,kBAAkB,SAAkE;AAC1F,QAAI,CAAC,QAAQ,mBAAmB,QAAQ,UAAU,iBAAiB,QAAQ;AACzE,WAAK,uBAAuB,QAAQ,SAAS;AAAA,IAC/C;AAEA,QAAI,QAAQ,UAAU,iBAAiB,SAAS;AAC9C,WAAK,gBAAgB,IAAI,QAAQ,SAAS;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,MAAc,kBACZ,aACA,SACe;AACf,UAAM,kBAAkB,QAAQ,aAAa,KAAK;AAClD,QAAI,CAAC,iBAAiB;AACpB,MAAAA,QAAO,KAAK,0DAA0D;AACtE;AAAA,IACF;AAEA,QAAI,KAAK,gBAAgB,IAAI,eAAe,GAAG;AAC7C,MAAAA,QAAO,MAAM,yDAAyD,eAAe,EAAE;AACvF;AAAA,IACF;AAEA,QAAI,KAAK,cAAc,UAAU,eAAe,GAAG;AACjD,YAAM,WAAW,QAAQ,YAAY;AACrC,YAAM,UAAU,MAAM,KAAK,cAAc;AAAA,QACvC;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AACA,UAAI,CAAC,SAAS;AACZ,QAAAA,QAAO,KAAK,2DAA2D,eAAe,EAAE;AAAA,MAC1F;AACA;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,oBAAoB,eAAe;AACxD,UAAM,WAA8C;AAAA,MAClD,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACnC,YAAYE,YAAW;AAAA,MACvB,YAAY,QAAQ;AAAA,MACpB,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI,QAAQ,YAAY,QAAQ;AAAA,MAClC;AAAA,MACA,SAAS;AAAA,QACP,SAAS;AAAA,UACP,MAAM;AAAA,UACN,MAAM,QAAQ;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AACA,YAAQ,QAAQ,QAAQ;AAAA,EAC1B;AAAA,EAEQ,mBAAmB,UAAwB;AACjD,SAAK,KAAK,cAAc,aAAa,QAAQ,EAAE,MAAM,CAAC,UAAU;AAC9D,MAAAF,QAAO,KAAK,+CAA+C;AAAA,QACzD;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,kBAAkB,SAAyC;AACvE,eAAW,cAAc,KAAK,QAAQ,OAAO,GAAG;AAC9C,YAAM,KAAK,iBAAiB,YAAY,OAAO;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB,SAAoD;AACjF,eAAW,cAAc,KAAK,QAAQ,OAAO,GAAG;AAC9C,UAAI,CAAC,WAAW,aAAa;AAC3B;AAAA,MACF;AACA,UAAI,WAAW,WAAW,CAAC,WAAW,QAAQ,GAAG;AAC/C;AAAA,MACF;AACA,UAAI;AACF,cAAM,WAAW,YAAY,OAAO;AAAA,MACtC,SAAS,OAAO;AACd,QAAAA,QAAO,MAAM,gEAAgE,EAAE,MAAM,CAAC;AACtF,YAAI;AACF,qBAAW,QAAQ;AAAA,QACrB,QAAQ;AAAA,QAER;AACA,aAAK,QAAQ,OAAO,WAAW,EAAE;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iBACZ,YACA,SACe;AACf,QAAI,WAAW,WAAW,CAAC,WAAW,QAAQ,GAAG;AAC/C;AAAA,IACF;AACA,QAAI;AACF,YAAM,WAAW,aAAa,OAAO;AAAA,IACvC,SAAS,OAAO;AACd,MAAAA,QAAO,MAAM,wDAAwD;AAAA,QACnE;AAAA,MACF,CAAC;AACD,UAAI;AACF,mBAAW,QAAQ;AAAA,MACrB,QAAQ;AAAA,MAER;AACA,WAAK,QAAQ,OAAO,WAAW,EAAE;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,UAA0C;AACtE,IAAAA,QAAO,MAAM,2CAA2C;AAAA,MACtD,WAAW,SAAS;AAAA,MACpB,MAAM,SAAS,QAAQ,QAAQ;AAAA,IACjC,CAAC;AACD,UAAM,KAAK,kBAAkB,QAAQ;AACrC,QAAI,KAAK,mBAAmB,QAAQ,GAAG;AACrC,YAAM,SAAS,KAAK;AACpB,UAAI,QAAQ;AACV,cAAM,WAAW,KAAK,eAAe,UAAU,MAAM;AACrD,cAAM,KAAK,kBAAkB,QAAQ;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAmB,UAAoC;AAC7D,UAAM,gBAAgB,KAAK;AAC3B,QAAI,CAAC,iBAAiB,SAAS,eAAe,eAAe;AAC3D,aAAO;AAAA,IACT;AACA,UAAM,cAAc,SAAS,QAAQ,QAAQ;AAC7C,WAAO,gBAAgB,oBAAoB,gBAAgB;AAAA,EAC7D;AAAA,EAEQ,eAAe,UAA2B,WAAoC;AACpF,UAAM,kBACJ,SAAS,QAAQ,QAAQ,SAAS,oBAClC,SAAS,QAAQ,QAAQ,SAAS,mBAC9B;AAAA,MACE,GAAG,SAAS,QAAQ;AAAA,MACpB,UAAU;AAAA,QACR,GAAI,SAAS,QAAQ,QAAQ,YAAY,CAAC;AAAA,QAC1C,kBAAkB,SAAS;AAAA,QAC3B,0BAA0B,SAAS;AAAA,MACrC;AAAA,IACF,IACA,SAAS,QAAQ;AAEvB,UAAM,0BAA0B;AAAA,MAC9B,GAAI,SAAS,QAAQ,YAAY,CAAC;AAAA,MAClC,0BAA0B,SAAS;AAAA,MACnC,kBAAkB,SAAS;AAAA,IAC7B;AACA,UAAM,mBAAmB;AAAA,MACvB,GAAI,SAAS,YAAY,CAAC;AAAA,MAC1B,0BAA0B,SAAS;AAAA,IACrC;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,YAAYE,YAAW;AAAA,MACvB,YAAY;AAAA,MACZ,QAAQ;AAAA,QACN,GAAG,SAAS;AAAA,QACZ,IAAI;AAAA,MACN;AAAA,MACA,SAAS;AAAA,QACP,GAAG,SAAS;AAAA,QACZ,SAAS;AAAA,QACT,UAAU;AAAA,MACZ;AAAA,MACA,UAAU;AAAA,MACV,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,aAAa,SAAgC;AACnD,UAAM,UAAU,QAAQ,QAAQ;AAChC,QAAI,QAAQ,SAAS,aAAa;AAChC,WAAK,WAAW,IAAI,QAAQ,aAAa,QAAQ,UAAU;AAG3D,UAAI,QAAQ,SAAS,kBAAkB,KAAK,gBAAgB,SAAS,QAAQ;AAC3E,QAAAF,QAAO,KAAK,oEAAoE;AAChF,aAAK,kBAAkB;AAAA,UACrB,MAAM;AAAA,UACN,OAAO,KAAK,gBAAgB;AAAA,QAC9B;AACA,aAAK,qBAAqB;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe,WAAuC;AAC5D,UAAM,YAAY,KAAK,WAAW,IAAI,SAAS;AAC/C,QAAI,WAAW;AACb,WAAK,WAAW,OAAO,SAAS;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,0BAA0B,cAA2C;AAC3E,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS,yBAAyB,cAAc;AACvD,aAAO,KAAK,QAAQ;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAA4B;AAElC,QAAI,KAAK,gBAAgB,SAAS,gBAAgB;AAChD,aAAO;AAAA,IACT;AACA,UAAM,gBAAgB,KAAK,yBAAyB;AACpD,WAAO,GAAG,aAAa;AAAA;AAAA,EAAO,2BAA0B;AAAA,EAC1D;AAAA,EAEQ,2BAAmC;AACzC,UAAM,UAAU,KAAK,cAAc,YAAY;AAC/C,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA;AAAA;AAAA;AAAA,IAIT;AAEA,UAAM,SAAS,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AACzC,UAAI,EAAE,WAAW,aAAa,EAAE,WAAW,WAAW;AACpD,eAAO;AAAA,MACT;AACA,UAAI,EAAE,WAAW,aAAa,EAAE,WAAW,WAAW;AACpD,eAAO;AAAA,MACT;AACA,cAAQ,EAAE,gBAAgB,MAAM,EAAE,gBAAgB;AAAA,IACpD,CAAC;AAED,UAAM,UAAU,OAAO,MAAM,GAAG,KAAK,IAAI,OAAO,QAAQ,EAAE,CAAC;AAC3D,UAAM,gBAAgB,QACnB,IAAI,CAAC,WAAW;AACf,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA,aAAa,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA,QACxC,eAAe,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,QAC5C,gBAAgB,KAAK,UAAU,OAAO,QAAQ,EAAE,CAAC;AAAA,QACjD;AAAA,MACF;AACA,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB,CAAC,EACA,KAAK,IAAI;AAEZ,UAAM,UACJ,OAAO,SAAS,QAAQ,SACpB;AAAA,aAAgB,OAAO,SAAS,QAAQ,MAAM,qCAC9C;AAEN,WAAO;AAAA,EACT,aAAa;AAAA,EACb,UAAU,GAAG,OAAO;AAAA,IAAO,EAAE;AAAA;AAAA,EAE7B;AAAA,EAEQ,UAAU,OAA0C;AAC1D,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AACA,WAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAAA,EAC3B;AACF;AAEA,eAAsB,uBACpB,cAC4B;AAC5B,QAAM,SAAS,IAAI,kBAAkB,YAAY;AACjD,QAAM,OAAO,MAAM;AACnB,SAAO;AACT;AAIA,SAAS,eAAe,UAAuD;AAC7E,QAAM,WAAW,SAAS,QAAQ,QAAQ;AAC1C,MACE,YACA,OAAO,aAAa,YACpB,OAAQ,SAAmC,YAAY,UACvD;AACA,UAAM,UAAW,SAAkC,SAAS,KAAK;AACjE,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,UAAU,SAAS,QAAQ,QAAQ;AACzC,MAAI,OAAO,YAAY,YAAY,QAAQ,KAAK,GAAG;AACjD,WAAO,QAAQ,KAAK;AAAA,EACtB;AACA,SAAO;AACT;;;AiBxqCA,SAAS,cAAAK,mBAAkB;AAC3B,OAAO,kBAAkB;AACzB,OAAOC,gBAAe;AACtB,SAAS,aAAAC,kBAAiC;AAC1C,YAAYC,cAAY;;;ACUjB,IAAM,WAAN,cAAuB,MAAM;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,SAAS,QAAQ,YAAY,SAAS;AAC9C,UAAM,OAAO;AACb,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,UAAU;AAAA,EACnB;AACJ;AAIO,IAAM,uBAAN,cAAmC,SAAS;AAAA,EAC/C,YAAY,SAAS,SAAS;AAC1B,UAAM,SAAS,KAAK,oBAAoB,OAAO;AAAA,EACnD;AACJ;;;AChCA,OAAO,aAAa;AACpB,OAAO,gBAAgB;;;ACDvB;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,OAAS;AAAA,IACP,uBAAyB;AAAA,MACvB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,WAAa;AAAA,MACX,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,OAAS;AAAA,UACP,MAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,wBAA0B;AAAA,MACxB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,iBAAmB;AAAA,UACjB,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,mBAAqB;AAAA,UACnB,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,cAAgB;AAAA,UACd,MAAQ;AAAA,QACV;AAAA,QACA,mBAAqB;AAAA,UACnB,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,kBAAoB;AAAA,MAClB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,iBAAmB;AAAA,MACjB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,oBAAsB;AAAA,MACpB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,mBAAqB;AAAA,UACnB,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,gBAAkB;AAAA,MAChB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,MAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,oBAAsB;AAAA,MACpB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,OAAS;AAAA,UACP,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,qBAAuB;AAAA,MACrB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,OAAS;AAAA,YACP,MAAQ;AAAA,UACV;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,eAAiB;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,OAAS;AAAA,UACP,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,cAAgB;AAAA,MACd,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,MAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,WAAa;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,WAAa;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,gBAAkB;AAAA,MAChB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,iBAAmB;AAAA,MACjB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,MAAQ;AAAA,UACN,OAAS;AAAA,YACP;AAAA,cACE,OAAS;AAAA,gBACP,MAAQ;AAAA,cACV;AAAA,cACA,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,oBAAsB;AAAA,MACpB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA,WAAa;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,qBAAuB;AAAA,MACrB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,WAAa;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,cAAgB;AAAA,UACd,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,iBAAmB;AAAA,MACjB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,MAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,kBAAoB;AAAA,MAClB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,YAAc;AAAA,UACZ,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,OAAS;AAAA,UACP,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,aAAe;AAAA,UACb,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,WAAa;AAAA,MACX,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,MAAQ;AAAA,UACN,SAAW;AAAA,UACX,MAAQ;AAAA,YACN;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,kBAAoB;AAAA,MAClB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,OAAS;AAAA,UACP,MAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,gBAAkB;AAAA,UAChB,MAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,UAAY;AAAA,MACV,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,OAAS;AAAA,UACP,MAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,qBAAuB;AAAA,MACrB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,sBAAwB;AAAA,MACtB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,iBAAmB;AAAA,MACjB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA,QAAU;AAAA,UACR,MAAQ;AAAA,YACN;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,kBAAoB;AAAA,MAClB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,MAAQ;AAAA,UACN,MAAQ;AAAA,QACV;AAAA,QACA,gBAAkB;AAAA,UAChB,OAAS;AAAA,YACP,MAAQ;AAAA,UACV;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,eAAiB;AAAA,MACf,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,aAAe;AAAA,MACb,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,iBAAmB;AAAA,UACjB,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,cAAgB;AAAA,UACd,MAAQ;AAAA,QACV;AAAA,QACA,mBAAqB;AAAA,UACnB,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,gBAAkB;AAAA,MAChB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,iBAAmB;AAAA,UACjB,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,mBAAqB;AAAA,UACnB,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,wBAA0B;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,MAAQ;AAAA,UACN,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,yBAA2B;AAAA,MACzB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,MAAQ;AAAA,UACN,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,uBAAyB;AAAA,MACvB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA,MAAQ;AAAA,UACN,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,mBAAqB;AAAA,MACnB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP;AAAA,MACE,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACpkCA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,OAAS;AAAA,IACP,sBAAwB;AAAA,MACtB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,sBAAwB;AAAA,MACtB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,gBAAkB;AAAA,MAChB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,SAAW;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,WAAa;AAAA,MACX,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,MAAQ;AAAA,YACN;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,IAAM;AAAA,UACJ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,aAAe;AAAA,MACb,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,OAAS;AAAA,YACP,MAAQ;AAAA,UACV;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,iBAAmB;AAAA,MACjB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,WAAa;AAAA,UACX,sBAAwB;AAAA,UACxB,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,mBAAqB;AAAA,MACnB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,sBAAwB;AAAA,EACxB,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,YAAc;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,QAAU;AAAA,MACR,MAAQ;AAAA,IACV;AAAA,IACA,SAAW;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,QACP;AAAA,UACE,sBAAwB;AAAA,UACxB,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,YAAc;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;AC5UA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,OAAS;AAAA,IACP,yBAA2B;AAAA,MACzB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,QACb;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,aAAe;AAAA,UACb,OAAS;AAAA,YACP;AAAA,cACE,OAAS;AAAA,gBACP,MAAQ;AAAA,cACV;AAAA,cACA,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,mBAAqB;AAAA,MACnB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,MAAQ;AAAA,YACN;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,oBAAsB;AAAA,MACpB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,OAAS;AAAA,UACP,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,4BAA8B;AAAA,MAC5B,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,iBAAmB;AAAA,UACjB,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,WAAa;AAAA,UACX,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,WAAa;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,gBAAkB;AAAA,UAChB,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,cAAgB;AAAA,UACd,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,kBAAoB;AAAA,UAClB,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,QACb;AAAA,QACA,eAAiB;AAAA,UACf,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,eAAiB;AAAA,MACf,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,2BAA6B;AAAA,MAC3B,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,iBAAmB;AAAA,UACjB,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,iBAAmB;AAAA,MACjB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,WAAa;AAAA,UACX,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,kBAAoB;AAAA,MAClB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,SAAW;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP;AAAA,MACE,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACxUA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,OAAS;AAAA,MACP,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,WAAa;AAAA,MACX,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;AC3BA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,WAAa;AAAA,MACX,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,aAAe;AAAA,MACb,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,cAAgB;AAAA,MACd,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,uBAAyB;AAAA,MACvB,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,cAAgB;AAAA,MACd,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,aAAe;AAAA,MACb,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,wBAA0B;AAAA,MACxB,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,aAAe;AAAA,MACb,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,mBAAqB;AAAA,MACnB,sBAAwB;AAAA,MACxB,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;AC7DA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,cAAgB;AAAA,MACd,aAAe;AAAA,MACf,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,iBAAmB;AAAA,MACjB,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,IACX;AAAA,IACA,MAAQ;AAAA,MACN,OAAS;AAAA,QACP;AAAA,UACE,WAAa;AAAA,UACb,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,QACP;AAAA,UACE,sBAAwB;AAAA,UACxB,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;ACvDA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,OAAS;AAAA,IACP,uBAAyB;AAAA,MACvB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,wBAA0B;AAAA,MACxB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,iBAAmB;AAAA,UACjB,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,mBAAqB;AAAA,UACnB,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,cAAgB;AAAA,UACd,MAAQ;AAAA,QACV;AAAA,QACA,mBAAqB;AAAA,UACnB,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,kBAAoB;AAAA,MAClB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,iBAAmB;AAAA,MACjB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,uBAAyB;AAAA,MACvB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA,MAAQ;AAAA,UACN,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,mBAAqB;AAAA,MACnB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,iBAAmB;AAAA,MACjB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,WAAa;AAAA,UACX,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,qBAAuB;AAAA,MACrB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,IAAM;AAAA,UACJ,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,gBAAkB;AAAA,UAChB,MAAQ;AAAA,QACV;AAAA,QACA,iBAAmB;AAAA,UACjB,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,YAAc;AAAA,UACZ,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,oBAAsB;AAAA,UACpB,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,kBAAoB;AAAA,UAClB,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,eAAiB;AAAA,MACf,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,kBAAoB;AAAA,MAClB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,SAAW;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,SAAW;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,gBAAkB;AAAA,MAChB,OAAS;AAAA,QACP,MAAQ;AAAA,MACV;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,WAAa;AAAA,MACX,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;ACrVA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,OAAS;AAAA,IACP,uBAAyB;AAAA,MACvB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,wBAA0B;AAAA,MACxB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,iBAAmB;AAAA,UACjB,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,mBAAqB;AAAA,UACnB,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,cAAgB;AAAA,UACd,MAAQ;AAAA,QACV;AAAA,QACA,mBAAqB;AAAA,UACnB,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,kBAAoB;AAAA,MAClB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,iBAAmB;AAAA,MACjB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,uBAAyB;AAAA,MACvB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA,MAAQ;AAAA,UACN,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,mBAAqB;AAAA,MACnB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,oBAAsB;AAAA,MACpB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,SAAW;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,gBAAkB;AAAA,UAChB,OAAS;AAAA,YACP,MAAQ;AAAA,UACV;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,WAAa;AAAA,UACX,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,QACb;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,iBAAmB;AAAA,MACjB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,WAAa;AAAA,UACX,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,qBAAuB;AAAA,MACrB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,IAAM;AAAA,UACJ,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,gBAAkB;AAAA,UAChB,MAAQ;AAAA,QACV;AAAA,QACA,iBAAmB;AAAA,UACjB,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,YAAc;AAAA,UACZ,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,oBAAsB;AAAA,UACpB,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,kBAAoB;AAAA,UAClB,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,eAAiB;AAAA,MACf,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,kBAAoB;AAAA,MAClB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,SAAW;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,UAAY;AAAA,MACV,OAAS;AAAA,QACP,MAAQ;AAAA,MACV;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;ACtWA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,OAAS;AAAA,IACP,sBAAwB;AAAA,MACtB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,sBAAwB;AAAA,MACtB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,iBAAmB;AAAA,MACjB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,gBAAkB;AAAA,MAChB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,SAAW;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,WAAa;AAAA,MACX,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,MAAQ;AAAA,YACN;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,IAAM;AAAA,UACJ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,aAAe;AAAA,MACb,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,OAAS;AAAA,YACP,MAAQ;AAAA,UACV;AAAA,UACA,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,iBAAmB;AAAA,MACjB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,WAAa;AAAA,UACX,sBAAwB;AAAA,UACxB,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,mBAAqB;AAAA,MACnB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,QAAU;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,UAAY;AAAA,MACV,OAAS;AAAA,QACP,MAAQ;AAAA,MACV;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,UAAY;AAAA,MACV,SAAW;AAAA,MACX,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,aAAe;AAAA,MACb,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;AC9WA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,OAAS;AAAA,IACP,uBAAyB;AAAA,MACvB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,wBAA0B;AAAA,MACxB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,iBAAmB;AAAA,UACjB,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,mBAAqB;AAAA,UACnB,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,cAAgB;AAAA,UACd,MAAQ;AAAA,QACV;AAAA,QACA,mBAAqB;AAAA,UACnB,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,kBAAoB;AAAA,MAClB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,iBAAmB;AAAA,MACjB,MAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,SAAW;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,gBAAkB;AAAA,MAChB,OAAS;AAAA,QACP,MAAQ;AAAA,MACV;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;ACzHA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,MAAQ;AAAA,MACN,WAAa;AAAA,MACb,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,QACP;AAAA,UACE,sBAAwB;AAAA,UACxB,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;AC7BA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,IAAM;AAAA,MACJ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,WAAa;AAAA,MACX,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,aAAe;AAAA,MACb,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,oBAAsB;AAAA,MACpB,OAAS;AAAA,QACP;AAAA,UACE,QAAU;AAAA,UACV,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,sBAAwB;AAAA,MACtB,SAAW;AAAA,MACX,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,MACnB,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,IACX;AAAA,IACA,mBAAqB;AAAA,MACnB,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,IACX;AAAA,IACA,qBAAuB;AAAA,MACrB,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,IACX;AAAA,IACA,qBAAuB;AAAA,MACrB,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;AC3GA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,cAAgB;AAAA,MACd,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,aAAe;AAAA,MACb,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,cAAgB;AAAA,MACd,QAAU;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,QAAU;AAAA,MACV,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;AChCA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,WAAa;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,aAAe;AAAA,MACb,aAAe;AAAA,MACf,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,aAAe;AAAA,MACf,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;ACzCA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,YAAc;AAAA,MACZ,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,cAAgB;AAAA,MACd,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;ACpBA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,MAAQ;AAAA,MACN,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;ACfA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,OAAS;AAAA,MACP,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,MAAQ;AAAA,MACN,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,eAAiB;AAAA,MACf,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,gBAAkB;AAAA,MAChB,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,aAAe;AAAA,MACb,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,OAAS;AAAA,MACP,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;AC3EA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,YAAc;AAAA,MACZ,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;ACrBA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,KAAO;AAAA,MACL,aAAe;AAAA,MACf,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,SAAW;AAAA,MACT,OAAS;AAAA,QACP;AAAA,UACE,QAAU;AAAA,UACV,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,IACX;AAAA,IACA,YAAc;AAAA,MACZ,OAAS;AAAA,QACP;AAAA,UACE,QAAU;AAAA,UACV,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;AC5CA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,4BAA8B;AAAA,MAC5B,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,6BAA+B;AAAA,MAC7B,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,2BAA6B;AAAA,MAC3B,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,cAAgB;AAAA,MACd,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,IACA,oBAAsB;AAAA,MACpB,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;ACpEA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,4BAA8B;AAAA,MAC5B,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,6BAA+B;AAAA,MAC7B,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,2BAA6B;AAAA,MAC3B,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,cAAgB;AAAA,MACd,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAS;AAAA,IACX;AAAA,IACA,oBAAsB;AAAA,MACpB,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;AC1CA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,OAAS;AAAA,IACP,kBAAoB;AAAA,MAClB,sBAAwB;AAAA,MACxB,aAAe;AAAA,MACf,YAAc;AAAA,QACZ,SAAW;AAAA,UACT,SAAW;AAAA,UACX,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,sBAAwB;AAAA,EACxB,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,WAAa;AAAA,MACX,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;ACvCA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,iBAAmB;AAAA,MACjB,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,IACX;AAAA,IACA,UAAY;AAAA,MACV,OAAS;AAAA,QACP;AAAA,UACE,sBAAwB;AAAA,UACxB,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,IACX;AAAA,IACA,gBAAkB;AAAA,MAChB,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,IACX;AAAA,IACA,eAAiB;AAAA,MACf,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,aAAe;AAAA,MACf,OAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;AC7DA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,QAAU;AAAA,MACR,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA,SAAW;AAAA,MACT,OAAS;AAAA,QACP;AAAA,UACE,sBAAwB;AAAA,UACxB,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,SAAW;AAAA,MACX,OAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;AC5BA;AAAA,EACE,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,OAAS;AAAA,IACP,mBAAqB;AAAA,MACnB,YAAc;AAAA,QACZ,IAAM;AAAA,UACJ,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,MAAQ;AAAA,UACN,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,cAAgB;AAAA,UACd,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,gBAAkB;AAAA,UAChB,OAAS;AAAA,YACP;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,QAAU;AAAA,UACR,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,cAAgB;AAAA,UACd,OAAS;AAAA,YACP;AAAA,cACE,QAAU;AAAA,cACV,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,QAAU;AAAA,UACV,OAAS;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,OAAS;AAAA,YACP;AAAA,cACE,sBAAwB;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,SAAW;AAAA,UACX,OAAS;AAAA,QACX;AAAA,MACF;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,YAAc;AAAA,IACZ,UAAY;AAAA,MACV,OAAS;AAAA,QACP,MAAQ;AAAA,MACV;AAAA,MACA,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAQ;AACV;;;AzBpGA,IAAM,MAAM,IAAI,QAAQ,EAAE,QAAQ,MAAM,WAAW,KAAK,CAAC;AACzD,WAAW,GAAG;AAEP,IAAM,yBAAyB,IAAI,QAAQ,8BAAa;AACxD,IAAM,0BAA0B,IAAI,QAAQ,+BAAc;AAC1D,IAAM,yBAAyB,IAAI,QAAQ,8BAAoB;AAC/D,IAAM,0BAA0B,IAAI,QAAQ,+BAAqB;AACjE,IAAM,wCAAwC,IAAI,QAAQ,oDAAmC;AAC7F,IAAM,yCAAyC,IAAI,QAAQ,qDAAoC;AAE/F,IAAM,kCAAkC,IAAI,QAAQ,uCAAwB;AAC5E,IAAM,mCAAmC,IAAI,QAAQ,wCAAyB;AAE9E,IAAM,mCAAmC,IAAI,QAAQ,0CAA8B;AACnF,IAAM,6BAA6B,IAAI,QAAQ,mCAAwB;AACvE,IAAM,kCAAkC,IAAI,QAAQ,yCAA6B;AACjF,IAAM,8BAA8B,IAAI,QAAQ,iDAAyB;AACzE,IAAM,6BAA6B,IAAI,QAAQ,wCAAwB;AACvE,IAAM,mCAAmC,IAAI,QAAQ,uDAA8B;AAEnF,IAAM,+BAA+B,IAAI,QAAQ,gDAA0B;AAC3E,IAAM,wBAAwB,IAAI,QAAQ,yCAAmB;AAC7D,IAAM,uCAAuC,IAAI,QAAQ,kDAA2B;AACpF,IAAM,kCAAkC,IAAI,QAAQ,4CAAsB;AAC1E,IAAM,mCAAmC,IAAI,QAAQ,iDAA0B;AAC/E,IAAM,sCAAsC,IAAI,QAAQ,oDAA6B;AACrF,IAAM,uCAAuC,IAAI,QAAQ,kDAA2B;AACpF,IAAM,wCAAwC,IAAI,QAAQ,mDAA4B;AAEtF,IAAM,0CAA0C,IAAI,QAAQ,gDAAyB;AACrF,IAAM,2CAA2C,IAAI,QAAQ,iDAA0B;AAEvF,IAAM,8BAA8B,IAAI,QAAQ,yCAAyB;;;A0B3DhF,YAAYC,aAAY;AAajB,IAAM,YAAN,MAAgB;AAAA,EACJ;AAAA,EAEjB,YAAY,SAA2B;AACrC,SAAK,UAAU,iBAAiB,QAAQ,OAAO;AAAA,EACjD;AAAA,EAEA,MAAM,QAAmBC,QAAc,SAA8C;AACnF,UAAM,MAAM,WAAW,KAAK,SAASA,MAAI;AACzC,UAAM,UAAU,KAAK,aAAa,OAAO;AAEzC,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAED,WAAO,MAAM,KAAK,eAA0B,QAAQ;AAAA,EACtD;AAAA,EAEA,MAAM,SACJA,QACA,MACA,SACoB;AACpB,UAAM,MAAM,WAAW,KAAK,SAASA,MAAI;AACzC,UAAM,UAAU,KAAK,aAAa,SAAS,EAAE,aAAa,KAAK,CAAC;AAEhE,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,QAAQ,CAAC,CAAC;AAAA,MAC/B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAED,WAAO,MAAM,KAAK,eAA0B,QAAQ;AAAA,EACtD;AAAA,EAEQ,aAAa,SAA0B,QAA6C;AAC1F,UAAM,UAAU,IAAI,QAAQ;AAC5B,QAAI,QAAQ,aAAa;AACvB,cAAQ,IAAI,gBAAgB,kBAAkB;AAAA,IAChD;AACA,QAAI,SAAS,SAAS;AACpB,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,OAAO,GAAG;AAC1D,gBAAQ,IAAI,KAAK,KAAK;AAAA,MACxB;AAAA,IACF;AACA,QAAI,SAAS,aAAa;AACxB,cAAQ,IAAI,iBAAiB,UAAU,QAAQ,WAAW,EAAE;AAAA,IAC9D,WAAW,SAAS,QAAQ;AAC1B,cAAQ,IAAI,iBAAiB,UAAU,QAAQ,MAAM,EAAE;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,eAA0B,UAAwC;AAC9E,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,UAAM,SAAS,aAAa,SAAS,kBAAkB;AAEvD,QAAI,UAAmB;AACvB,QAAI,QAAQ;AACV,UAAI;AACF,kBAAU,MAAM,SAAS,KAAK;AAAA,MAChC,SAAS,OAAO;AACd,QAAO,yBAAiB,KAAK;AAC7B,YAAI,SAAS,IAAI;AACf,gBAAM,IAAI;AAAA,YACR,kCAAkCC,qBAAoB,KAAK,CAAC;AAAA,YAC5D,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,SAAS,IAAI;AACtB,gBAAU,MAAM,SAAS,KAAK;AAAA,IAChC;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,UAAU,cAAc,OAAO,KAAK;AAC1C,cAAM,IAAI,qBAAqB,SAAS,OAAO;AAAA,MACjD;AACA,YAAM,SAAS,cAAc,OAAO;AACpC,YAAM,IAAI;AAAA,QACR,UAAU,QAAQ,SAAS,MAAM;AAAA,QACjC,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,iBAAiB,KAAqB;AACpD,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AACA,SAAO,IAAI,SAAS,GAAG,IAAI,MAAM,GAAG,GAAG;AACzC;AAEO,SAAS,WAAW,MAAcD,QAAsB;AAC7D,QAAM,UAAU,IAAI,IAAI,IAAI;AAC5B,MAAI,CAACA,OAAK,WAAW,GAAG,GAAG;AACzB,IAAAA,SAAO,IAAIA,MAAI;AAAA,EACjB;AACA,QAAM,WAAW,IAAI,IAAIA,QAAM,OAAO;AACtC,SAAO,SAAS,SAAS;AAC3B;AAEA,SAAS,cAAc,SAAiC;AACtD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACnD,UAAM,SAAS;AACf,UAAM,SAAS,OAAO;AACtB,QAAI,OAAO,WAAW,UAAU;AAC9B,aAAO;AAAA,IACT;AACA,UAAM,UAAU,OAAO;AACvB,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASC,qBAAoB,OAAwB;AACnD,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,SAAO,OAAO,KAAK;AACrB;;;AC5GA,eAAsB,qBACpB,QACA,aACA,SAC4B;AAC5B,QAAM,OAAiC;AAAA,IACrC,iBAAiB,QAAQ;AAAA,IACzB,aAAa,QAAQ,cAAc;AAAA,EACrC;AAEA,QAAM,WAAW,MAAM,OAAO;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,EAAE,YAAY;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,eAAe,SAAS;AAAA,IACxB,YAAY,SAAS;AAAA,IACrB,qBAAqB,SAAS;AAAA,IAC9B,aAAa,SAAS;AAAA,IACtB,2BAA2B,SAAS;AAAA,EACtC;AACF;;;AClEA,YAAYC,cAAY;;;ACGjB,IAAM,mBAAN,cAA+B,MAAM;AAAA,EACjC;AAAA,EAET,YAAY,SAAiB,MAA4B,SAA+B;AACtF,UAAM,SAAS,EAAE,OAAO,SAAS,MAAM,CAAC;AACxC,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAOA,eAAsB,kBACpB,OACA,oBACsB;AACtB,QAAM,cAAc,sBAAuB,MAAM,MAAM,KAAK;AAC5D,QAAM,SAAS,aAAa;AAE5B,MAAI,CAAC,eAAe,WAAW,UAAa,WAAW,MAAM;AAC3D,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,OAAO,KAAK;AACxB,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,EAAE,IAAI;AAAA,IACnB;AAAA,EACF;AACF;;;AC5CA,YAAYC,aAAY;;;ACDxB,OAAO,cAAc;AACrB,SAAS,SAAS,OAAO,UAAU,cAAc;AAEjD,eAAsB,OAAO,UAAmC;AAC9D,QAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,OAAO,CAAC;AACrD,MAAI;AACF,UAAM,SAAS,MAAM,GAAG,SAAS,QAAQ;AACzC,WAAO,OAAO,KAAK;AAAA,EACrB,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;;;AC6CA,eAAsB,qBACpB,QACA,UAAuC,CAAC,GACf;AACzB,QAAM,OAAiC,CAAC;AACxC,MAAI,QAAQ,aAAa;AACvB,SAAK,eAAe,QAAQ;AAAA,EAC9B;AACA,MAAI,QAAQ,qBAAqB;AAC/B,SAAK,wBAAwB,QAAQ;AAAA,EACvC;AACA,MAAI,QAAQ,eAAe;AACzB,SAAK,iBAAiB,QAAQ;AAAA,EAChC;AACA,MAAI,QAAQ,eAAe;AACzB,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,wBAAwB,QAAQ,uBAAuB;AAAA,EAC9D;AACA,QAAM,OAAO,MAAM,OAAO;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACA,SAAO;AAAA,IACL,WAAW,KAAK;AAAA,IAChB,iBAAiB,KAAK;AAAA,IACtB,yBAAyB,KAAK;AAAA,IAC9B,WAAW,KAAK;AAAA,IAChB,cAAc,KAAK;AAAA,EACrB;AACF;AAEA,eAAsB,gBACpB,QACA,WACA,MACA,UAAqC,CAAC,GACN;AAChC,QAAM,cAAmC;AAAA,IACvC,YAAY;AAAA,IACZ;AAAA,EACF;AACA,MAAI,QAAQ,cAAc;AACxB,gBAAY,gBAAgB,QAAQ;AAAA,EACtC;AAEA,QAAM,OAAO,MAAM,OAAO;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACA,SAAO;AAAA,IACL,aAAa,KAAK;AAAA,IAClB,sBAAsB,KAAK;AAAA,IAC3B,cAAc,KAAK;AAAA,IACnB,aAAa,KAAK;AAAA,IAClB,2BAA2B,KAAK;AAAA,EAClC;AACF;;;AChHA,SAAS,YAAY,mBAAmB;AAQjC,SAAS,mBAA6B;AAC3C,QAAM,WAAW,gBAAgB,YAAY,EAAE,CAAC;AAChD,QAAM,YAAY,gBAAgB,WAAW,QAAQ,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;AAChF,SAAO,EAAE,UAAU,WAAW,QAAQ,OAAO;AAC/C;AAEA,SAAS,gBAAgBC,QAA6C;AACpE,QAAM,SACJ,OAAOA,WAAU,WACb,OAAO,KAAKA,QAAO,MAAM,IACzB,OAAO,KAAKA,MAA4B;AAC9C,SAAO,OAAO,SAAS,QAAQ,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,EAAE;AAC7F;;;ACpBA,OAAO,UAAU;AAEjB,SAAS,eAAAC,oBAAmB;AAC5B,YAAYC,aAAY;AAQxB,IAAM,gBAAgB;AACtB,IAAM,cAAc;AAEb,IAAM,mBAAN,MAAM,kBAAiB;AAAA,EAC5B,aAAa,SAA2C;AACtD,UAAM,WAAW,IAAI,kBAAiB,cAAc,CAAC;AACrD,QAAI;AACF,YAAM,SAAS,MAAM;AACrB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,MAAO,yBAAiB,KAAK;AAC7B,YAAM,SAAS,KAAK,EAAE,MAAM,MAAM,MAAS;AAC3C,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAES;AAAA,EACT;AAAA,EAEiB;AAAA,EACT,kBAA8D;AAAA,EAC9D,iBAAsD;AAAA,EACtD,UAA4C;AAAA,EAE5C,YAAY,OAAe;AACjC,SAAK,QAAQ;AACb,SAAK,cAAc;AACnB,SAAK,SAAS,KAAK,aAAa,CAAC,SAAS,aAAa;AACrD,WAAK,KAAK,cAAc,SAAS,QAAQ;AAAA,IAC3C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBAA6C;AACjD,QAAI,KAAK,SAAS;AAChB,aAAO,KAAK;AAAA,IACd;AACA,SAAK,UAAU,IAAI,QAA0B,CAAC,SAAS,WAAW;AAChE,WAAK,kBAAkB;AACvB,WAAK,iBAAiB;AAAA,IACxB,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,CAAC,KAAK,OAAO,WAAW;AAC1B;AAAA,IACF;AACA,UAAM,IAAI,QAAc,CAAC,YAAY;AACnC,WAAK,OAAO,MAAM,MAAM,QAAQ,CAAC;AAAA,IACnC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,QAAuB;AACnC,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,WAAK,OAAO,KAAK,SAAS,MAAM;AAChC,WAAK,OAAO,OAAO,GAAG,aAAa,MAAM;AACvC,aAAK,OAAO,eAAe,SAAS,MAAM;AAC1C,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAED,UAAM,UAAU,KAAK,OAAO,QAAQ;AACpC,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AACA,UAAM,EAAE,KAAK,IAAI;AACjB,SAAK,cAAc,UAAU,WAAW,IAAI,IAAI,GAAG,aAAa;AAAA,EAClE;AAAA,EAEA,MAAc,cACZ,SACA,UACe;AACf,QAAI,QAAQ,WAAW,SAAS,CAAC,QAAQ,KAAK;AAC5C,WAAK,QAAQ,UAAU,KAAK,oBAAoB;AAChD;AAAA,IACF;AAEA,UAAM,MAAM,IAAI,IAAI,QAAQ,KAAK,UAAU,QAAQ,QAAQ,QAAQ,WAAW,EAAE;AAChF,QAAI,IAAI,aAAa,eAAe;AAClC,WAAK,QAAQ,UAAU,KAAK,WAAW;AACvC;AAAA,IACF;AAEA,UAAM,OAAO,IAAI,aAAa,IAAI,MAAM;AACxC,UAAM,YAAY,IAAI,aAAa,IAAI,SAAS;AAChD,UAAM,QAAQ,IAAI,aAAa,IAAI,OAAO;AAE1C,QAAI,CAAC,MAAM;AACT,WAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA,iBAAiB,+DAA+D;AAAA,MAClF;AACA;AAAA,IACF;AAEA,SAAK,QAAQ,UAAU,KAAK,iBAAiB,CAAC;AAE9C,QAAI,KAAK,iBAAiB;AACxB,WAAK,gBAAgB,EAAE,MAAM,WAAW,MAAM,CAAC;AAC/C,WAAK,kBAAkB;AACvB,WAAK,iBAAiB;AAAA,IACxB;AAEA,SAAK,KAAK,KAAK;AAAA,EACjB;AAAA,EAEQ,QAAQ,UAA+B,QAAgB,MAAoB;AACjF,aAAS,UAAU,QAAQ;AAAA,MACzB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,IACnB,CAAC;AACD,aAAS,IAAI,IAAI;AAAA,EACnB;AACF;AAEA,SAAS,mBAA2B;AAClC,QAAM,iBAAiB;AACvB,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,gDAKuC,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB9D;AAEA,SAAS,gBAAwB;AAC/B,SAAOC,iBAAgBF,aAAY,EAAE,CAAC;AACxC;AAEA,SAASE,iBAAgBC,QAA6C;AACpE,QAAM,SACJ,OAAOA,WAAU,WACb,OAAO,KAAKA,QAAO,MAAM,IACzB,OAAO,KAAKA,MAA4B;AAC9C,SAAO,OAAO,SAAS,QAAQ,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,EAAE;AAC7F;AAEA,SAAS,iBAAiB,SAAyB;AACjD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAgBE,OAAO;AAAA;AAAA;AAAA;AAIlB;;;AC5LA,SAAS,aAAa;AACtB,YAAYC,aAAY;AAExB,IAAM,6BAA6B,CAAC,QAClC,gCAAgC,GAAG;AAErC,IAAM,sBAAsB,CAAC,UAA0B,MAAM,QAAQ,MAAM,IAAI;AAExE,SAAS,eAAe,KAAmB;AAChD,MAAI;AACJ,MAAI;AAEJ,UAAQ,QAAQ,UAAU;AAAA,IACxB,KAAK;AACH,gBAAU;AACV,aAAO,CAAC,GAAG;AACX;AAAA,IACF,KAAK;AAEH,gBAAU;AACV,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,4BAA4B,oBAAoB,GAAG,CAAC;AAAA,MACtD;AACA;AAAA,IACF;AACE,gBAAU;AACV,aAAO,CAAC,GAAG;AAAA,EACf;AAEA,QAAM,gBAAgB,CAAC,UAA0B;AAC/C,UAAM,cAAc,2BAA2B,GAAG;AAElD,QAAI,QAAQ,IAAI,SAAS,OAAO;AAC9B,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,KAAK,GAAG,WAAW,KAAK,OAAO,IAAI;AAC3C,MAAO,yBAAiB,KAAK;AAC7B;AAAA,IACF;AAEA,QAAI,OAAO;AACT,MAAO,yBAAiB,KAAK;AAAA,IAC/B;AACA,YAAQ,KAAK,WAAW;AAAA,EAC1B;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aAAa,QAAQ,aAAa;AAAA,EACpC;AAEA,MAAI;AACF,UAAM,QAAQ,MAAM,SAAS,MAAM,YAAY;AAC/C,UAAM,GAAG,SAAS,aAAa;AAC/B,UAAM,MAAM;AAAA,EACd,SAAS,OAAO;AACd,kBAAc,KAAK;AAAA,EACrB;AACF;;;AL/CA,OAAOC,YAAW;AAQlB,eAAsB,yBAAyB;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AACF,GAA6C;AAC3C,QAAM,aAAa,kBAAkB,gBAAgB;AACrD,QAAM,cAAc,mBAAmB,iBAAiB;AACxD,QAAM,SAAS,IAAI,UAAU,EAAE,SAAS,WAAW,CAAC;AAEpD,UAAQ,IAAIA,OAAM,OAAO,0BAAqB,CAAC;AAC/C,QAAM,WAAW,MAAM,iBAAiB,OAAO;AAC/C,QAAM,OAAO,WAAW,iBAAiB,IAAI;AAE7C,QAAM,iBAA8C;AAAA,IAClD;AAAA,EACF;AAEA,MAAI,YAAY,MAAM;AACpB,mBAAe,sBAAsB,SAAS;AAC9C,mBAAe,gBAAgB,SAAS;AACxC,mBAAe,gBAAgB,KAAK;AACpC,mBAAe,sBAAsB,KAAK;AAAA,EAC5C;AAEA,QAAM,UAAU,MAAM,qBAAqB,QAAQ,cAAc;AACjE,2BAAyB,OAAO;AAChC,iBAAe,QAAQ,uBAAuB;AAE9C,MAAI,YAAY;AAChB,MAAI,gBAAgB;AACpB,MAAI,oBAA8C;AAElD,QAAM,gBAAgB,OAAO,MAAc,iBAAyC;AAClF,QAAI,WAAW;AACb;AAAA,IACF;AACA,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,IACrC;AACA,UAAM,MAAM,MAAM,cAAc,QAAQ,SAAS,WAAW;AAC5D,UAAM,UAA6B,EAAE,IAAI;AACzC,UAAM,MAAM,KAAK,OAAO;AACxB,wBAAoB;AACpB,QAAI,CAAC,eAAe;AAClB,cAAQ,IAAIA,OAAM,MAAM,0CAA0C,CAAC;AACnE,sBAAgB;AAAA,IAClB;AACA,gBAAY;AAAA,EACd;AAEA,QAAM,eACJ,YAAY,OACR,gBAAgB,UAAU,QAAQ,WAAW,OAAO,SAAS;AAC3D,UAAM,cAAc,MAAM,KAAK,QAAQ;AACvC,QAAI,OAAO,QAAQ,MAAM,SAAS,YAAY;AAC5C,cAAQ,MAAM,KAAK,QAAQ,IAAI;AAAA,IACjC;AAAA,EACF,CAAC,IACD;AAEN,MAAI,CAAC,gBAAgB,CAAC,WAAW;AAC/B,YAAQ,IAAI,6CAAwC;AAAA,EACtD;AAEA,SAAO,CAAC,WAAW;AACjB,UAAMC,SAAQ,MAAM;AAAA,MAClBD,OAAM,KAAK,6DAA6D;AAAA,IAC1E;AACA,UAAM,UAAUC,OAAM,KAAK;AAE3B,QAAI,WAAW;AACb;AAAA,IACF;AAEA,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,QAAI,CAAC,aAAa,KAAK,OAAO,GAAG;AAC/B,cAAQ,IAAI,mCAAmC;AAC/C;AAAA,IACF;AAEA,QAAI;AACF,YAAM,cAAc,OAAO;AAAA,IAC7B,SAAS,OAAO;AACd,UAAI,iBAAiB,UAAU;AAC7B,YAAI,MAAM,WAAW,KAAK;AACxB,kBAAQ,IAAI,oEAAoE;AAChF;AAAA,QACF;AACA,YAAI,MAAM,WAAW,KAAK;AACxB,kBAAQ,IAAI,wDAAmD;AAC/D,sBAAY;AACZ;AAAA,QACF;AAAA,MACF;AACA,MAAO,yBAAiB,KAAK;AAC7B,YAAM,UAAU,KAAK;AACrB,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,UAAU,KAAK;AAErB,MAAI,CAAC,mBAAmB;AACtB,UAAM,SAAS,MAAM,MAAM,KAAK;AAChC,QAAI,QAAQ;AACV,0BAAoB;AAAA,IACtB,OAAO;AACL,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACpE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB;AAEtB,SAAS,kBAAkB,QAAyB;AACzD,QAAM,YAAY,UAAU,QAAQ,IAAI,sBAAsB;AAC9D,SAAO,iBAAiB,SAAS;AACnC;AAEO,SAAS,mBAAmB,QAAyB;AAC1D,QAAM,YAAY,UAAU,QAAQ,IAAI,uBAAuB;AAC/D,SAAO,iBAAiB,SAAS;AACnC;AAMA,eAAe,cAAc,QAAmB,aAAsC;AACpF,QAAM,WAAW,MAAM,OAAO;AAAA,IAC5B;AAAA,IACA,CAAC;AAAA,IACD,EAAE,YAAY;AAAA,EAChB;AACA,SAAO,SAAS;AAClB;AAyBA,SAAS,oBAAoB,OAAsB;AACjD,MAAI,iBAAiB,UAAU;AAC7B,YAAQ;AAAA,MACN,gCAAgC,MAAM,MAAM;AAAA,IAC9C;AACA;AAAA,EACF;AACA,EAAO,yBAAiB,KAAK;AAC7B,UAAQ,IAAI,2BAA2BC,qBAAoB,KAAK,CAAC,EAAE;AACrE;AAEA,SAAS,yBAAyB,SAA+B;AAC/D,UAAQ;AAAA,IACNC,OAAM,KAAK,KAAK,oEAAoE;AAAA,EACtF;AACA,UAAQ,IAAIA,OAAM,WAAW,UAAU,GAAG,QAAQ,uBAAuB,EAAE,CAAC;AAC5E,UAAQ,IAAIA,OAAM,KAAK,gDAAgD,CAAC;AAC1E;AAEA,SAASD,qBAAoB,OAAwB;AACnD,MAAI,iBAAiB,SAAS,MAAM,SAAS;AAC3C,WAAO,MAAM;AAAA,EACf;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,eAAe,gBACb,UACA,WACA,QACe;AACf,MAAI;AACF,UAAM,WAAW,MAAM,SAAS,gBAAgB;AAChD,QAAI,SAAS,aAAa,SAAS,cAAc,WAAW;AAC1D,cAAQ,IAAI,oDAAoD;AAChE;AAAA,IACF;AACA,QAAI,SAAS,SAAS,SAAS,UAAU,SAAS,OAAO;AACvD,cAAQ,IAAI,kDAAkD;AAC9D;AAAA,IACF;AAEA,QAAI;AACF,YAAM,OAAO,SAAS,IAAI;AAAA,IAC5B,SAAS,OAAO;AACd,0BAAoB,KAAK;AAAA,IAC3B;AAAA,EACF,SAAS,OAAO;AACd,IAAO,yBAAiB,KAAK;AAC7B,YAAQ,IAAI,4BAA4BA,qBAAoB,KAAK,CAAC,EAAE;AAAA,EACtE;AACF;;;AF7NO,IAAM,eAAN,MAAmB;AAAA,EAKxB,YAA6B,SAA8B;AAA9B;AAC3B,SAAK,aAAa,iBAAiB,QAAQ,UAAU;AACrD,SAAK,qBAAqB,QAAQ,eAAe;AAAA,EACnD;AAAA,EAPQ,aAA4B;AAAA,EACnB;AAAA,EACA;AAAA,EAOjB,MAAM,eAAe,SAAmD;AACtE,UAAM,cAAc,SAAS,eAAe,KAAK;AACjD,WAAO,MAAM,KAAK,gBAAgB,WAAW;AAAA,EAC/C;AAAA,EAEA,MAAM,eAAe,SAA8C;AACjE,UAAM,OAAO,MAAM,KAAK,eAAe,OAAO;AAC9C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,gBAAgB,aAA4C;AACxE,UAAM,WAAW,MAAM,KAAK,QAAQ,MAAM,KAAK;AAE/C,QAAI,KAAK,cAAc,UAAU,QAAQ,KAAK,YAAY;AACxD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,kBAAkB,KAAK,QAAQ,OAAO,QAAQ;AACpE,WAAK,aAAa;AAClB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,YAAY,iBAAiB,mBAAmB,QAAQ;AAC9D,UAAI,WAAW,SAAS,uBAAuB;AAC7C,aAAK,aAAa,UAAU,OAAO;AAAA,MACrC;AACA,UAAI,WAAW;AACb,QAAO,0BAAiB,SAAS;AAAA,MACnC,OAAO;AACL,QAAO,0BAAiB,KAAK;AAAA,MAC/B;AAEA,UAAI,CAAC,aAAa;AAChB,cAAM,aAAa;AAAA,MACrB;AAEA,YAAM,KAAK,aAAa;AACxB,YAAM,UAAU,MAAM,KAAK,QAAQ,MAAM,KAAK;AAC9C,aAAO,MAAM,kBAAkB,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAc,eAA8B;AAC1C,UAAM,UAAU,KAAK,QAAQ,SAAS;AACtC,SAAK,QAAQ,QAAQ,IAAI,uCAAkC;AAC3D,UAAM,QAAQ;AAAA,MACZ,kBAAkB,KAAK;AAAA,MACvB,mBAAmB,KAAK,QAAQ;AAAA,MAChC,OAAO,KAAK,QAAQ;AAAA,IACtB,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,mBAAmB,SAAqD;AAC5F,QAAM,WAAW,IAAI,aAAa,OAAO;AACzC,SAAO;AACT;;;AQjEA,eAAsB,kBACpB,QACA,aACA,SACgC;AAChC,QAAM,OAAqC;AAAA,IACzC,cAAc,QAAQ;AAAA,IACtB,iBAAiB,QAAQ,iBAAiB;AAAA,IAC1C,MAAM,QAAQ,QAAQ;AAAA,IACtB,UAAU,QAAQ,YAAY;AAAA,EAChC;AAEA,SAAO,MAAM,OAAO;AAAA,IAClB;AAAA,IACA;AAAA,IACA,EAAE,YAAY;AAAA,EAChB;AACF;;;AC1CA,OAAO,eAAe;AAKf,SAAS,mBAAmB,IAAqB;AACtD,MAAI;AACF,OAAG,KAAK,SAAS,MAAM;AAAA,IAAC,CAAC;AAEzB,QAAI,GAAG,eAAe,UAAU,YAAY;AAC1C,SAAG,UAAU;AAAA,IACf,WAAW,GAAG,eAAe,UAAU,MAAM;AAC3C,SAAG,MAAM;AAAA,IACX;AAAA,EACF,QAAQ;AAAA,EAAC;AAET,eAAa,MAAM;AACjB,QAAI;AACF,SAAG,mBAAmB;AAAA,IACxB,QAAQ;AAAA,IAAC;AAAA,EACX,CAAC;AACH;;;AvCOA,IAAM,iBAAiB;AACvB,IAAM,sBAAsB;AAYrB,IAAM,cAAN,cAA0B,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,mBAAyD;AAAA,EACzD,KAAuB;AAAA,EACvB,UAAU;AAAA,EACV,kBAA4B,CAAC;AAAA,EAC7B,YAAmC;AAAA,EACnC,sBAAsB;AAAA,EACtB,sBAAoD;AAAA,EACpD,gBAA+B;AAAA,EAC/B,wBAAuC;AAAA,EAC9B;AAAA,EACT,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,kBAAkB;AAAA,EAE1B,YAAY,cAAiC,SAA6B;AACxE,UAAM;AACN,SAAK,eAAe;AACpB,SAAK,QAAQ,QAAQ,SAAS,IAAI,iBAAiB;AACnD,SAAK,SAAS,QAAQ,UAAU;AAChC,SAAK,aAAa,iBAAiB,QAAQ,UAAU;AACrD,SAAK,cAAc,QAAQ;AAC3B,UAAM,sBAAsB,QAAQ,eAAe,QAAQ,IAAI,uBAAuB;AACtF,QAAI,CAAC,qBAAqB;AACxB,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AACA,SAAK,cAAc;AACnB,SAAK,gBAAgB,QAAQ,iBAAiB;AAC9C,SAAK,wBAAwB,QAAQ,kBAAkB;AACvD,SAAK,uBAAuB,QAAQ,kBAAkB;AAAA,EACxD;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,kBAAkB;AACzB,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAEA,SAAK,mBAAmB,KAAK,aAAa,UAAU;AAAA,MAClD,SAAS,MAAM,CAAC,KAAK,YAAY,KAAK,IAAI,eAAeE,WAAU;AAAA,MACnE,cAAc,OAAO,YAAY;AAC/B,aAAK,UAAU,OAAO;AAAA,MACxB;AAAA,MACA,aAAa,OAAO,YAAY;AAC9B,aAAK,sBAAsB,OAAO;AAAA,MACpC;AAAA,IACF,CAAC;AACD,SAAK,yBAAyB;AAE9B,QAAI,YAAY;AAEhB,WAAO,CAAC,KAAK,SAAS;AACpB,UAAI;AACF,cAAM,KAAK,oBAAoB;AAC/B,aAAK,eAAe;AACpB,oBAAY;AAAA,MACd,SAAS,OAAO;AACd,YAAI,qBAAqB,KAAK,KAAK,uBAAuB,KAAK,GAAG;AAChE,cAAI,CAAC,KAAK,iBAAiB;AACzB,iBAAK,kBAAkB;AACvB,iBAAK,OAAO;AAAA,cACV,gDACE,iBAAiB,WAAW,iCAAiC,MAAM,MAAM,MAAM,EACjF;AAAA,YACF;AAAA,UACF,OAAO;AACL,iBAAK,OAAO,MAAM,+CAA+C;AAAA,UACnE;AACA,gBAAMC,OAAM,mBAAmB;AAC/B;AAAA,QACF;AACA,cAAM,UAAU,aAAa,KAAK;AAClC,YAAI,KAAK,WAAW,SAAS;AAC3B,cAAI,SAAS;AACX,iBAAK,UAAU;AAAA,UACjB;AACA;AAAA,QACF;AACA,QAAO,0BAAiB,KAAK;AAC7B,aAAK,OAAO;AAAA,UACV,4BAA4BC,qBAAoB,KAAK,CAAC,iBAAiB,KAAK,MAAM,YAAY,GAAI,CAAC;AAAA,QACrG;AACA,cAAMD,OAAM,SAAS;AACrB,oBAAY,iBAAiB,SAAS;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAC1B,SAAK,UAAU;AACf,SAAK,wBAAwB;AAC7B,SAAK,gBAAgB;AACrB,SAAK,WAAW;AAChB,QAAI,KAAK,WAAW;AAClB,oBAAc,KAAK,SAAS;AAC5B,WAAK,YAAY;AAAA,IACnB;AACA,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB,WAAW;AACjC,WAAK,mBAAmB;AAAA,IAC1B;AACA,QAAI,KAAK,MAAM,KAAK,GAAG,eAAeD,WAAU,MAAM;AACpD,WAAK,GAAG,MAAM,KAAM,mBAAmB;AAAA,IACzC;AACA,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,MAAc,sBAAqC;AACjD,UAAM,eAAe,MAAM,KAAK,gBAAgB;AAChD,UAAM,SAAS,IAAI,UAAU,EAAE,SAAS,KAAK,WAAW,CAAC;AAEzD,UAAM,cAAc,MAAM,aAAa,eAAe,EAAE,aAAa,MAAM,CAAC;AAC5E,UAAM,gBAAgB,MAAM,KAAK,kBAAkB,QAAQ,WAAW;AACtE,UAAM,eAAe,MAAM,qBAAqB,QAAQ,aAAa;AAAA,MACnE;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AACD,SAAK,gBAAgB,aAAa;AAElC,UAAM,iBAAiB,KAAK,yBAAyB;AAErD,UAAM,MAAM,uBAAuB,KAAK,YAAY,aAAa,WAAW;AAE5E,UAAM,KAAK,IAAIA,WAAU,KAAK;AAAA,MAC5B,SAAS;AAAA,QACP,iBAAiB,aAAa;AAAA,MAChC;AAAA,IACF,CAAC;AAED,UAAM,YAAY,EAAE;AAEpB,SAAK,OAAO;AAAA,MACV,oCAAoC,aAAa,aAAa,mBAAmB,cAAc;AAAA,IACjG;AAEA,SAAK,KAAK;AACV,SAAK,sBAAsB,aAAa,4BAA4B;AACpE,SAAK,eAAe;AACpB,UAAM,KAAK,uBAAuB,EAAE;AACpC,QAAI,KAAK,eAAe,CAAC,KAAK,eAAe;AAC3C,WAAK,OAAO;AAAA,QACV,0BAA0B,IAAI,IAAI,aAAa,KAAK,WAAW,EAAE,SAAS,CAAC;AAAA,MAC7E;AACA,WAAK,gBAAgB;AAAA,IACvB;AACA,SAAK,WAAW;AAEhB,UAAM,KAAK,yBAAyB,EAAE;AAAA,EACxC;AAAA,EAEA,MAAc,kBAAyC;AACrD,QAAI,CAAC,KAAK,qBAAqB;AAC7B,WAAK,sBAAsB,mBAAmB;AAAA,QAC5C,OAAO,KAAK;AAAA,QACZ,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,2BAAmC;AACzC,QAAI,CAAC,KAAK,uBAAuB;AAC/B,WAAK,wBAAwB,KAAK,wBAAwBG,YAAW;AAAA,IACvE;AACA,SAAK,aAAa,oBAAoB,KAAK,qBAAqB;AAEhE,SAAK,aAAa,uBAAuB,KAAK,qBAAqB;AACnE,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,kBAAkB,QAAmB,aAAsC;AACvF,QAAI,KAAK,eAAe;AACtB,aAAO,KAAK;AAAA,IACd;AACA,UAAM,aAAa,MAAM,kBAAkB,QAAQ,aAAa;AAAA,MAC9D,aAAa,KAAK;AAAA,MAClB,UAAU,EAAE,QAAQ,MAAM;AAAA,IAC5B,CAAC;AACD,SAAK,gBAAgB,WAAW;AAChC,SAAK,OAAO,IAAI,wBAAwB,KAAK,aAAa,kBAAkB,KAAK,WAAW,EAAE;AAC9F,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,uBAAuB,IAA8B;AACjE,QAAI,CAAC,KAAK,eAAe;AACvB,YAAM,IAAI,MAAM,4DAA4D;AAAA,IAC9E;AACA,UAAM,iBAAiB,KAAK,yBAAyB;AACrD,UAAM,eAAe,KAAK,aAAa,gBAAgB;AACvD,UAAM,YAA4B;AAAA,MAChC,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,iBAAiB,KAAK;AAAA,MACtB,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,UAAU;AAAA,QACR,cAAc;AAAA,QACd,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,IACF;AACA,SAAK,UAAU,WAAW,EAAE;AAAA,EAC9B;AAAA,EAEQ,UAAU,OAAyC,QAAiC;AAC1F,QAAI,KAAK,kBAAkB,KAAK,GAAG;AACjC,UAAI,CAAC,wBAAwB,KAAK,GAAG;AACnC,aAAK,OAAO,MAAM,mEAAmE;AAAA,UACnF,OAAO,KAAK,UAAU,KAAK;AAAA,UAC3B,QAAQ,wBAAwB;AAAA,QAClC,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,KAAK,UAAU,KAAK;AACvC,UAAM,SAAS,UAAU,KAAK;AAC9B,QAAI,UAAU,OAAO,eAAeH,WAAU,MAAM;AAClD,UAAI;AACF,eAAO,KAAK,UAAU;AACtB;AAAA,MACF,SAAS,OAAO;AACd,QAAO,0BAAiB,KAAK;AAC7B,aAAK,OAAO,MAAM,+BAA+BE,qBAAoB,KAAK,CAAC,EAAE;AAC7E,YAAI,WAAW,KAAK,IAAI;AACtB,eAAK,mBAAmB;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AACA,SAAK,QAAQ,UAAU;AAAA,EACzB;AAAA,EAEQ,sBAAsB,SAA2C;AACvE,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,aAAK,uBAAuB,OAAO;AACnC;AAAA,MACF;AACE,aAAK,OAAO;AAAA,UACV,qEAAqE,QAAQ,IAAI;AAAA,QACnF;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAc,yBAAyB,IAA8B;AACnE,UAAM,IAAI,QAAc,CAAC,YAAY;AACnC,YAAM,YAAY,CAAC,SAA4B;AAC7C,aAAK,cAAc,IAAI;AAAA,MACzB;AAEA,YAAM,UAAU,CAAC,MAAc,WAAmB;AAChD,aAAK,OAAO;AAAA,UACV,gCAAgC,IAAI,GAAG,OAAO,SAAS,aAAa,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,QAC9F;AACA,gBAAQ;AACR,gBAAQ;AAAA,MACV;AAEA,YAAM,UAAU,CAAC,UAAiB;AAChC,YAAI,CAAC,KAAK,SAAS;AACjB,UAAO,0BAAiB,KAAK;AAC7B,eAAK,OAAO,MAAM,0BAA0B,MAAM,OAAO,EAAE;AAAA,QAC7D;AAAA,MACF;AAEA,YAAM,UAAU,MAAM;AACpB,WAAG,eAAe,WAAW,SAAS;AACtC,WAAG,eAAe,SAAS,OAAO;AAClC,WAAG,eAAe,SAAS,OAAO;AAClC,YAAI,KAAK,WAAW;AAClB,wBAAc,KAAK,SAAS;AAC5B,eAAK,YAAY;AAAA,QACnB;AACA,YAAI,KAAK,OAAO,IAAI;AAClB,eAAK,KAAK;AAAA,QACZ;AAAA,MACF;AAEA,SAAG,GAAG,WAAW,SAAS;AAC1B,SAAG,GAAG,SAAS,OAAO;AACtB,SAAG,GAAG,SAAS,OAAO;AAEtB,UAAI,KAAK,SAAS;AAChB,gBAAQ;AACR,gBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,cAAc,MAA+B;AACnD,QAAI;AACJ,QAAI;AACF,YAAM,OAAO,OAAO,SAAS,WAAW,OAAO,KAAK,SAAS,MAAM;AACnE,eAAS,KAAK,MAAM,IAAI;AAAA,IAC1B,SAAS,OAAO;AACd,MAAO,0BAAiB,KAAK;AAC7B,WAAK,OAAO,MAAM,qCAAqCA,qBAAoB,KAAK,CAAC,EAAE;AACnF;AAAA,IACF;AAEA,QAAI,KAAK,wBAAwB,MAAM,GAAG;AACxC;AAAA,IACF;AAEA,QAAI,KAAK,yBAAyB,MAAM,GAAG;AACzC;AAAA,IACF;AAEA,SAAK,OAAO,MAAM,2CAA2C,EAAE,SAAS,OAAO,CAAC;AAAA,EAClF;AAAA,EAEQ,wBAAwB,SAA2B;AACzD,QAAI,CAAC,uBAAuB,OAAO,GAAG;AACpC,aAAO;AAAA,IACT;AACA,UAAM,UAAU;AAChB,UAAM,OAAO,QAAQ;AACrB,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,aAAK,uBAAuB,OAAgD;AAC5E;AAAA,MACF,KAAK;AACH,aAAK,qBAAqB,OAA8C;AACxE;AAAA,MACF,KAAK;AACH,aAAK,sBAAsB,OAA+C;AAC1E;AAAA,MACF,KAAK;AACH,aAAK,oBAAoB,OAA6C;AACtE;AAAA,MACF,KAAK;AACH,YAAK,QAA2C,SAAS,QAAQ;AAC/D,gBAAM,WAA2B;AAAA,YAC/B,MAAM;AAAA,YACN,MAAM;AAAA,YACN,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC;AACA,eAAK,UAAU,QAAQ;AAAA,QACzB;AACA;AAAA,MACF,KAAK;AACH,aAAK,kBAAkB,OAAkD;AACzE;AAAA,MACF,KAAK;AACH,aAAK,mBAAmB,OAAmD;AAC3E;AAAA,MACF;AACE,aAAK,OAAO,MAAM,4BAA4B,QAAQ,SAAS,EAAE;AAAA,IACrE;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,yBAAyB,SAA2B;AAC1D,QAAI,CAAC,wBAAwB,OAAO,GAAG;AACrC,aAAO;AAAA,IACT;AACA,UAAM,WAAW;AACjB,SAAK,sBAAsB,QAAQ;AACnC,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAuB,SAAsD;AACnF,UAAM,gBAAgB,QAAQ,KAAK;AACnC,QAAI,CAAC,KAAK,eAAe;AACvB,WAAK,gBAAgB;AAAA,IACvB;AACA,QAAI,KAAK,kBAAkB,eAAe;AACxC,WAAK,OAAO;AAAA,QACV,6CAA6C,KAAK,aAAa,SAAS,aAAa;AAAA,MACvF;AAAA,IACF;AAGA,eAAW,SAAS,QAAQ,kBAAkB,CAAC,GAAG;AAChD,UAAI,MAAM,iBAAiB,SAAS;AAClC,aAAK,aAAa,gBAAgB,IAAI,MAAM,UAAU;AACtD,gBAAQ,IAAI,wDAAwD;AAAA,UAClE,WAAW,MAAM;AAAA,UACjB,aAAa,MAAM;AAAA,UACnB,iBAAiB,MAAM;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF;AAGA,eAAW,SAAS,QAAQ,kBAAkB,CAAC,GAAG;AAGhD,UACG,MAAM,UAAkD,iBAAiB,YAC1E,MAAM,mBACN;AAGA,aAAK,kBAAkB,SAAS;AAAA,UAC9B,MAAM;AAAA,UACN,WAAW,MAAM;AAAA,UACjB,iBAAiB,MAAM,qBAAqB;AAAA,UAC5C,UAAU,EAAE,cAAc,UAAU,GAAG,MAAM,SAAS;AAAA,QACxD,CAAC;AACD,gBAAQ,IAAI,gEAAgE;AAAA,UAC1E,WAAW,MAAM;AAAA,UACjB,aAAa,MAAM;AAAA,UACnB,iBAAiB,MAAM;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF;AAGA,eAAW,SAAS,QAAQ,kBAAkB,CAAC,GAAG;AAChD,UAAI,MAAM,iBAAiB,UAAU,CAAC,MAAM,mBAAmB;AAC7D,aAAK,aAAa,oBAAoB,MAAM,UAAU;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAAqB,SAAoD;AAC/E,UAAM,YAAY,QAAQ;AAG1B,UAAM,gBAAgB,CAAC,QAAQ;AAE/B,QAAI,eAAe;AACjB,UAAI,CAAC,KAAK,uBAAuB;AAC/B,aAAK,wBAAwB;AAAA,MAC/B,WAAW,KAAK,0BAA0B,WAAW;AACnD,aAAK,OAAO;AAAA,UACV,iDAAiD,SAAS,aAAa,KAAK,qBAAqB;AAAA,QACnG;AAAA,MACF;AAAA,IACF,OAAO;AAEL,WAAK,OAAO;AAAA,QACV,4BAA4B,SAAS,YAAY,QAAQ,iBAAiB;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,sBAAsB,SAAqD;AACjF,QAAI,QAAQ,QAAQ,SAAS,iBAAiB;AAE5C,UAAI,QAAQ,QAAQ,iBAAiB,SAAS;AAC5C,aAAK,aAAa,gBAAgB,IAAI,QAAQ,QAAQ,UAAU;AAChE,gBAAQ,IAAI,uDAAuD;AAAA,UACjE,WAAW,QAAQ,QAAQ;AAAA,UAC3B,aAAa,QAAQ,QAAQ;AAAA,QAC/B,CAAC;AAAA,MACH;AAEA,UAAI,QAAQ,QAAQ,iBAAiB,UAAU,CAAC,QAAQ,QAAQ,mBAAmB;AACjF,aAAK,aAAa,oBAAoB,QAAQ,QAAQ,UAAU;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,kBAAkB,SAAiE;AAC/F,SAAK,OAAO;AAAA,MACV,uCAAuC,QAAQ,iBAAiB,GAAG,QAAQ,SAAS,aAAa,QAAQ,MAAM,MAAM,EAAE;AAAA,IACzH;AAGA,QAAI,QAAQ,sBAAsB,KAAK,uBAAuB;AAE5D,WAAK,OAAO,KAAK,8CAA8C;AAC/D,YAAM,KAAK,aAAa,OAAO;AAAA,IACjC,OAAO;AAEL,YAAM,UAAU,MAAM,KAAK,aACxB,iBAAiB,EACjB,aAAa,QAAQ,iBAAiB;AACzC,UAAI,SAAS;AACX,aAAK,OAAO,KAAK,qCAAqC,QAAQ,iBAAiB,EAAE;AAAA,MACnF,OAAO;AACL,aAAK,OAAO;AAAA,UACV,kCAAkC,QAAQ,iBAAiB;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBAAoB,SAAmD;AAC7E,UAAM,kBAAkB,QAAQ;AAChC,SAAK,OAAO,KAAK,mBAAmB,eAAe,cAAc,QAAQ,MAAM,EAAE;AAGjF,QAAI,oBAAoB,KAAK,uBAAuB;AAClD,WAAK,OAAO;AAAA,QACV,6BAA6B,eAAe;AAAA,MAC9C;AACA,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAc,qBACZ,SAC+C;AAC/C,UAAM,aAAa,QAAQ;AAE3B,QAAI;AACF,UAAI;AAEJ,UAAI,eAAe,UAAU,eAAe,MAAM;AAEhD,cAAME,WAAU,KAAK,aAAa,iBAAiB,EAAE,QAAQ;AAAA,MAC/D,OAAO;AAEL,cAAM,kBAAkB,KAAK,aAAa,mBAAmB;AAG7D,cAAM,eAAe,gBAAgB,oBAAoB;AACzD,cAAM,WAAW,aAAa;AAAA,UAC5B,CAAC,OAA+B,GAAG,eAAe;AAAA,QACpD;AAEA,YAAI,CAAC,UAAU;AACb,eAAK,OAAO,KAAK,iCAAiC,UAAU,EAAE;AAC9D,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF;AACA,cAAMA,WAAU,SAAS,YAAY;AAAA,MACvC;AAGA,UAAI,UAAU;AACd,YAAM,eAAe,CAAC,QAAQ,UAAU,aAAa;AACrD,iBAAW,OAAO,cAAc;AAC9B,YAAI;AACF,gBAAM,IAAI,IAAI,CAAC,aAAa,YAAY,GAAG,CAAC;AAC5C,eAAK,OAAO,KAAK,4BAA4B,GAAG,EAAE;AAClD,oBAAU;AACV;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,YAAM,aAAa,MAAM,IAAI,IAAI,CAAC,QAAQ,GAAG,OAAO,IAAI,WAAW,CAAC;AAGpE,YAAM,QAAQ,WACX,KAAK,EACL,MAAM,IAAI,EACV,OAAO,CAAC,SAAiB,KAAK,SAAS,CAAC;AAC3C,YAAM,OAKD,CAAC;AAEN,iBAAW,QAAQ,OAAO;AACxB,cAAM,QAAQ,KAAK,MAAM,GAAI;AAC7B,YAAI,MAAM,WAAW,GAAG;AACtB;AAAA,QACF;AAEA,cAAM,YAAY,SAAS,MAAM,CAAC,GAAG,EAAE;AACvC,cAAM,YAAY,SAAS,MAAM,CAAC,GAAG,EAAE;AACvC,cAAM,WAAW,MAAM,CAAC;AAGxB,YAAI;AACJ,YAAI,YAAY,KAAK,cAAc,GAAG;AACpC,mBAAS;AAAA,QACX,WAAW,cAAc,KAAK,YAAY,GAAG;AAC3C,mBAAS;AAAA,QACX,OAAO;AACL,mBAAS;AAAA,QACX;AAEA,aAAK,KAAK;AAAA,UACR,MAAM;AAAA,UACN;AAAA,UACA,WAAW,MAAM,SAAS,IAAI,IAAI;AAAA,UAClC,WAAW,MAAM,SAAS,IAAI,IAAI;AAAA,QACpC,CAAC;AAAA,MACH;AAEA,WAAK,OAAO,KAAK,uBAAuB,UAAU,KAAK,KAAK,MAAM,gBAAgB;AAElF,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,KAAK,SAAS,IAAI,OAAO;AAAA,MACjC;AAAA,IACF,SAAS,OAAO;AACd,MAAO,0BAAiB,KAAK;AAC7B,WAAK,OAAO,MAAM,qCAAqC,UAAU,KAAK,KAAK;AAC3E,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,yBACZ,SACmD;AACnD,UAAM,aAAa,QAAQ;AAC3B,UAAM,WAAW,QAAQ;AAEzB,QAAI;AACF,UAAI;AAEJ,UAAI,eAAe,UAAU,eAAe,MAAM;AAEhD,cAAMA,WAAU,KAAK,aAAa,iBAAiB,EAAE,QAAQ;AAAA,MAC/D,OAAO;AAEL,cAAM,kBAAkB,KAAK,aAAa,mBAAmB;AAG7D,cAAM,eAAe,gBAAgB,oBAAoB;AACzD,cAAM,WAAW,aAAa;AAAA,UAC5B,CAAC,OAA+B,GAAG,eAAe;AAAA,QACpD;AAEA,YAAI,CAAC,UAAU;AACb,eAAK,OAAO,KAAK,iCAAiC,UAAU,EAAE;AAC9D,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,YACX,cAAc;AAAA,UAChB;AAAA,QACF;AACA,cAAMA,WAAU,SAAS,YAAY;AAAA,MACvC;AAGA,UAAI,UAAU;AACd,YAAM,eAAe,CAAC,QAAQ,UAAU,aAAa;AACrD,iBAAW,OAAO,cAAc;AAC9B,YAAI;AACF,gBAAM,IAAI,IAAI,CAAC,aAAa,YAAY,GAAG,CAAC;AAC5C,oBAAU;AACV;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAGA,YAAM,aAAa,MAAM,IAAI,IAAI,CAAC,QAAQ,SAAS,MAAM,QAAQ,CAAC;AAElE,WAAK,OAAO;AAAA,QACV,qBAAqB,QAAQ,cAAc,UAAU,KAAK,WAAW,MAAM;AAAA,MAC7E;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW;AAAA,QACX,cAAc,WAAW,SAAS,IAAI,aAAa;AAAA,MACrD;AAAA,IACF,SAAS,OAAO;AACd,MAAO,0BAAiB,KAAK;AAC7B,WAAK,OAAO;AAAA,QACV,mCAAmC,QAAQ,cAAc,UAAU;AAAA,QACnE;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW;AAAA,QACX,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,6BACZ,SACuD;AACvD,WAAO,KAAK,aAAa,qBAAqB,OAAO;AAAA,EACvD;AAAA,EAEA,MAAc,mBACZ,SACe;AACf,UAAM,YAAY,QAAQ;AAC1B,UAAM,UAAU,QAAQ;AACxB,QAAI;AACJ,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK;AACH,mBAAW,MAAM,KAAK,aAAa;AAAA,UACjC;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,mBAAW,MAAM,KAAK,qBAAqB,OAA8C;AACzF;AAAA,MACF,KAAK;AACH,mBAAW,MAAM,KAAK;AAAA,UACpB;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,mBAAW,MAAM,KAAK;AAAA,UACpB;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,mBAAW,MAAM,KAAK,aAAa;AAAA,UACjC;AAAA,QACF;AACA;AAAA,MACF;AACE,mBAAW;AAAA,UACT,MAAM;AAAA,UACN,OAAO,8CAA8C,QAAQ,IAAI;AAAA,QACnE;AAAA,IACJ;AAEA,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC,UAAU,OAAO,eAAeJ,WAAU,MAAM;AACnD;AAAA,IACF;AACA,UAAM,QAAwB;AAAA,MAC5B,MAAM;AAAA,MACN,YAAY;AAAA,MACZ;AAAA,IACF;AACA,SAAK,UAAU,OAAO,MAAM;AAAA,EAC9B;AAAA,EAEQ,sBAAsB,UAAiC;AAC7D,UAAM,UAAU,SAAS,QAAQ;AACjC,UAAM,gBAAgB,SAAS,OAAO,SAAS;AAC/C,UAAM,qBACJ,SAAS,OAAO,SAAS,mBAAmB,SAAS,UAAU,SAAS;AAG1E,UAAM,oBACJ,SAAS,QAAQ,UAAU,YAAY,2BACvC,SAAS,QAAQ,UAAU,YAAY;AAIzC,QACE,KAAK,cAAc,OAAO,MACzB,iBAAiB,uBAClB,CAAC,mBACD;AAEA,YAAM,mBAAmB,KAAK,aAAa,gBAAgB,IAAI,SAAS,UAAU;AAElF,UAAI,kBAAkB;AACpB,aAAK,OAAO;AAAA,UACV,0CAA0C,SAAS,UAAU,SAAS,SAAS,OAAO,IAAI,SAAS,SAAS,OAAO,EAAE;AAAA,QACvH;AACA;AAAA,MACF;AAEA,WAAK,OAAO;AAAA,QACV,2BAA2B,SAAS,OAAO,IAAI,SAAS,SAAS,OAAO,EAAE,WAAW,SAAS,UAAU,IAAI,gBAAgB,SAAS,UAAU;AAAA,MACjJ;AAGA,WAAK,kBAAkB,SAAS;AAAA,QAC9B,MAAM;AAAA,QACN,WAAW,SAAS;AAAA,QACpB,MAAM,QAAQ;AAAA,QACd,UAAU,SAAS,OAAO;AAAA,QAC1B,YAAY,SAAS,OAAO;AAAA,MAC9B,CAAC;AACD;AAAA,IACF;AACA,UAAM,QAAS,QAA8B,QAAQ;AACrD,UAAM,UAAU,SAAS,QAAQ,UAAU;AAC3C,SAAK,OAAO;AAAA,MACV,kCAAkC,SAAS,OAAO,IAAI,sBAAsB,KAAK,UAAU,SAAS,UAAU,IAAI,GAAG,UAAU,cAAc,OAAO,KAAK,EAAE;AAAA,IAC7J;AAAA,EACF;AAAA,EAEQ,cACN,SAC8C;AAC9C,WAAO,OAAQ,QAA8C,SAAS;AAAA,EACxE;AAAA,EAEQ,kBAAkB,OAAmE;AAC3F,WAAQ,MAA0B,YAAY;AAAA,EAChD;AAAA,EAEQ,QAAQ,YAA0B;AACxC,QAAI,KAAK,gBAAgB,UAAU,gBAAgB;AACjD,WAAK,gBAAgB,MAAM;AAAA,IAC7B;AACA,SAAK,gBAAgB,KAAK,UAAU;AAAA,EACtC;AAAA,EAEQ,uBACN,SACM;AACN,QAAI,CAAC,KAAK,eAAe;AACvB,WAAK,OAAO,KAAK,qEAAqE;AACtF;AAAA,IACF;AACA,UAAM,QAAwB;AAAA,MAC5B,MAAM;AAAA,MACN,YAAY,QAAQ;AAAA,MACpB,iBAAiB,KAAK;AAAA,MACtB,cAAc;AAAA,MACd,mBAAmB,QAAQ,mBAAmB;AAAA,IAChD;AACA,QAAI,QAAQ,UAAU;AACpB,YAAM,WAAW,QAAQ;AAAA,IAC3B;AACA,SAAK,UAAU,KAAK;AAAA,EACtB;AAAA,EAEQ,aAAmB;AACzB,QAAI,CAAC,KAAK,MAAM,KAAK,GAAG,eAAeA,WAAU,MAAM;AACrD;AAAA,IACF;AACA,WAAO,KAAK,gBAAgB,SAAS,GAAG;AACtC,YAAM,UAAU,KAAK,gBAAgB,MAAM;AAC3C,UAAI,CAAC,SAAS;AACZ;AAAA,MACF;AACA,UAAI;AACF,aAAK,GAAG,KAAK,OAAO;AAAA,MACtB,SAAS,OAAO;AACd,QAAO,0BAAiB,KAAK;AAC7B,aAAK,OAAO,MAAM,gCAAgCE,qBAAoB,KAAK,CAAC,EAAE;AAC9E,aAAK,gBAAgB,QAAQ,OAAO;AACpC,aAAK,mBAAmB;AACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAAuB;AAC7B,QAAI,KAAK,WAAW;AAClB,oBAAc,KAAK,SAAS;AAAA,IAC9B;AACA,UAAM,WAAW,KAAK,IAAI,KAAK,qBAAqB,GAAK;AACzD,SAAK,YAAY,YAAY,MAAM;AACjC,YAAM,SAAS,KAAK;AACpB,UAAI,CAAC,UAAU,OAAO,eAAeF,WAAU,MAAM;AACnD;AAAA,MACF;AACA,YAAM,QAAwB;AAAA,QAC5B,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AACA,WAAK,UAAU,OAAO,MAAM;AAAA,IAC9B,GAAG,QAAQ;AAAA,EACb;AAAA,EAEQ,iBAAuB;AAC7B,QAAI,KAAK,iBAAiB;AACxB,WAAK,kBAAkB;AACvB,WAAK,OAAO,IAAI,4DAA4D;AAAA,IAC9E;AAAA,EACF;AAAA,EAEQ,qBAA2B;AACjC,QAAI,KAAK,MAAM,KAAK,GAAG,eAAeA,WAAU,MAAM;AACpD,WAAK,GAAG,MAAM,MAAM,cAAc;AAAA,IACpC;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,SAAiBK,QAAsB;AACrE,QAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,MAAI,WAAW,IAAI,aAAa,WAAW,SAAS;AACpD,MAAI,SAAS;AACb,MAAI,OAAO;AACX,MAAIA,OAAK,WAAW,GAAG,GAAG;AACxB,QAAI,WAAWA;AAAA,EACjB,OAAO;AACL,UAAM,WAAW,IAAI,SAAS,SAAS,GAAG,IAAI,IAAI,WAAW,GAAG,IAAI,QAAQ;AAC5E,QAAI,WAAW,GAAG,QAAQ,GAAGA,MAAI;AAAA,EACnC;AACA,SAAO,IAAI,SAAS;AACtB;AAEA,SAASJ,OAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,SAASC,qBAAoB,OAAwB;AACnD,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,aAAa,OAAyB;AAC7C,MAAI,EAAE,iBAAiB,QAAQ;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,OAAO,MAAM,MAAM,YAAY;AACrC,MAAI,SAAS,cAAc;AACzB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,UAAU,MAAM,QAAQ,YAAY,IAAI;AAC9D,SAAO,QAAQ,SAAS,qBAAqB;AAC/C;AAEA,IAAM,qBAAqB;AAE3B,SAAS,YAAY,IAA8B;AACjD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,QAA+B;AAEnC,UAAM,UAAU,MAAM;AACpB,UAAI,OAAO;AACT,qBAAa,KAAK;AAClB,gBAAQ;AAAA,MACV;AACA,SAAG,eAAe,QAAQ,MAAM;AAChC,SAAG,eAAe,SAAS,OAAO;AAAA,IACpC;AAEA,UAAM,SAAS,CAAC,UAAkB;AAChC,cAAQ;AACR,UAAI,OAAO;AACT,2BAAmB,EAAE;AACrB,eAAO,KAAK;AAAA,MACd,OAAO;AACL,gBAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,OAAO;AAC5B,UAAM,UAAU,CAAC,UAAiB,OAAO,KAAK;AAE9C,OAAG,KAAK,QAAQ,MAAM;AACtB,OAAG,KAAK,SAAS,OAAO;AAExB,YAAQ,WAAW,MAAM;AACvB,aAAO,IAAI,MAAM,gCAAgC,CAAC;AAAA,IACpD,GAAG,kBAAkB;AAAA,EACvB,CAAC;AACH;AAEA,SAAS,qBAAqB,OAA2C;AACvE,SACE,iBAAiB,qBAChB,MAAM,SAAS,yBAAyB,MAAM,SAAS;AAE5D;AAEA,SAAS,uBAAuB,OAAmC;AACjE,SAAO,iBAAiB,aAAa,MAAM,WAAW,OAAO,MAAM,WAAW;AAChF;;;AlB59BA,YAAYI,cAAY;AAWxB,eAAsB,qBAAqB,UAA+B,CAAC,GAAkB;AAC3F,QAAM,MAAM,wBAAwB;AACpC,QAAM,eAAe,MAAM,uBAAuB;AAAA,IAChD,cAAc,QAAQ;AAAA,EACxB,CAAC;AAED,QAAM,aAAa,kBAAkB,QAAQ,UAAU;AACvD,QAAM,cAAc,mBAAmB,QAAQ,WAAW;AAC1D,QAAM,cAAc,QAAQ,eAAe,QAAQ,IAAI,uBAAuB;AAC9E,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,QAAM,QAAQ,IAAI,iBAAiB;AACnC,QAAM,SAAS,IAAI,YAAY,cAAc;AAAA,IAC3C;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,QAAQ;AAAA,IACvB,gBAAgB,QAAQ;AAAA,EAC1B,CAAC;AAED,QAAM,OAAO,YAAY;AACvB,UAAM,OAAO,KAAK;AAClB,UAAM,aAAa,KAAK;AAAA,EAC1B;AAEA,QAAM,gBAAgB,oBAAoB,MAAM,GAAG;AACnD,UAAQ,GAAG,UAAU,cAAc,OAAO;AAC1C,UAAQ,GAAG,WAAW,cAAc,OAAO;AAE3C,MAAI;AACF,UAAM,OAAO,MAAM;AAAA,EACrB,SAAS,OAAO;AACd,IAAO,0BAAiB,KAAK;AAC7B,QAAI,MAAM,kCAAkC,oBAAoB,KAAK,CAAC,EAAE;AACxE,YAAQ,WAAW,QAAQ,YAAY;AAAA,EACzC,UAAE;AACA,UAAM,KAAK;AACX,UAAM,IAAI,QAAQ;AAClB,kBAAc,OAAO;AAAA,EACvB;AACF;AAEA,SAAS,oBAAoB,QAA6B,KAAa;AACrE,MAAI,WAAW;AAEf,QAAM,UAAU,CAAC,WAA2B;AAC1C,QAAI,UAAU;AACZ;AAAA,IACF;AACA,eAAW;AACX,QAAI,UAAU;AAAA,WAAc,MAAM,uCAAuC;AACzE,SAAK,OAAO,EAAE,MAAM,CAAC,UAAU;AAC7B,MAAO,0BAAiB,KAAK;AAC7B,UAAI,MAAM,iDAAiD,KAAK;AAAA,IAClE,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,MAAM;AACnB,YAAQ,eAAe,UAAU,OAAO;AACxC,YAAQ,eAAe,WAAW,OAAO;AAAA,EAC3C;AAEA,SAAO,EAAE,SAAS,OAAO;AAC3B;AAEA,SAAS,0BAAkC;AACzC,QAAM,iBAAiB,QAAQ,IAAI;AACnC,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AACA,QAAM,SAASC,IAAG,kBAAkB,gBAAgB,EAAE,OAAO,IAAI,CAAC;AAClE,SAAO,aAAa,eAAe;AAAA,IACjC,OAAO;AAAA,MACL,CAAC,UAAU,OAAO,MAAM,GAAG,MAAM,IAAI;AAAA,CAAI;AAAA,MACzC,CAAC,UAAU,QAAQ,IAAI,GAAI,MAAM,GAAiB;AAAA,IACpD;AAAA,IACA,SAAS;AAAA,MACP,MACE,IAAI,QAAc,CAAC,YAAY;AAC7B,eAAO,IAAI,OAAO;AAAA,MACpB,CAAC;AAAA,IACL;AAAA,IACA,aAAa;AAAA,EACf,CAAC;AACH;;;A0DxGA,SAAS,eAAe;AAIxB,YAAYC,cAAY;;;ACJxB,SAAS,SAAAC,QAAO,QAAQ,cAAc;AACtC,OAAOC,YAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,aAAAC,kBAAiB;;;ACH1B,OAAOC,WAAU;AACjB,YAAYC,cAAY;;;ACDxB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,YAAYC,cAAY;;;ACFxB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAIV,SAAS,eAAe,aAAuB;AACpD,QAAM,UAAU,cAAc,WAAW;AACzC,SAAO;AAAA,IACL;AAAA,IACA,YAAYC,MAAK,KAAK,SAAS,aAAa;AAAA,IAC5C,WAAWA,MAAK,KAAK,SAAS,mBAAmB;AAAA,IACjD,cAAcA,MAAK,KAAK,SAAS,QAAQ,QAAQ;AAAA,IACjD,oBAAoBA,MAAK,KAAK,SAAS,QAAQ,eAAe;AAAA,EAChE;AACF;AAEA,IAAM,gBAAgB,eAAe,SAAS,CAAC;AAExC,IAAM,kBAAkB,cAAc;AACtC,IAAM,qBAAqB,cAAc;AACzC,IAAM,oBAAoB,cAAc;AACxC,IAAM,iBAAiB,cAAc;AACrC,IAAM,wBAAwB,cAAc;AAE5C,IAAMC,oBAAmB;AACzB,IAAMC,qBAAoB;AAEjC,eAAsB,mBAAkC;AACtD,QAAMC,IAAG,MAAM,iBAAiB,EAAE,WAAW,MAAM,MAAMF,kBAAiB,CAAC;AAC7E;AAEA,eAAsB,gBAAgB,SAAgC;AACpE,QAAME,IAAG,MAAM,SAAS,EAAE,WAAW,MAAM,MAAMF,kBAAiB,CAAC;AACrE;;;ADnBO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,WAAmB,mBAAmB;AAAtC;AAAA,EAAuC;AAAA,EAEpE,MAAM,OAAwC;AAC5C,QAAI;AACF,YAAM,MAAM,MAAMG,IAAG,SAAS,KAAK,UAAU,MAAM;AACnD,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAIC,gBAAe,KAAK,GAAG;AACzB,eAAO;AAAA,MACT;AACA,MAAO,0BAAiB,KAAK;AAC7B,YAAM,IAAI;AAAA,QACR,oCAAoC,KAAK,QAAQ,KAAKC,qBAAoB,KAAK,CAAC;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,OAAuC;AAChD,UAAM,iBAAiB;AACvB,UAAMF,IAAG,MAAMG,MAAK,QAAQ,KAAK,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/D,UAAM,WAAW,GAAG,KAAK,QAAQ;AACjC,UAAMH,IAAG,UAAU,UAAU,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG;AAAA,MAC3D,MAAMI;AAAA,IACR,CAAC;AACD,UAAMJ,IAAG,MAAM,UAAUI,kBAAiB;AAC1C,UAAMJ,IAAG,OAAO,UAAU,KAAK,QAAQ;AAAA,EACzC;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI;AACF,YAAMA,IAAG,OAAO,KAAK,QAAQ;AAAA,IAC/B,SAAS,OAAO;AACd,UAAI,CAACC,gBAAe,KAAK,GAAG;AAC1B,QAAO,0BAAiB,KAAK;AAC7B,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAASA,gBAAe,OAAyB;AAC/C,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,UAAU,SACT,MAA4B,SAAS;AAAA,EAC1C;AACF;AAEA,SAASC,qBAAoB,OAAwB;AACnD,MAAI,iBAAiB,SAAS,MAAM,SAAS;AAC3C,WAAO,MAAM;AAAA,EACf;AACA,SAAO,OAAO,KAAK;AACrB;;;AD5DO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,aAA+B,IAAI,iBAAiB,GAAG;AAAvD;AAAA,EAAwD;AAAA,EAErF,MAAM,YAAiD;AACrD,UAAM,WAAW,MAAM,KAAK,YAAY;AACxC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,QAAI;AACF,aAAO,MAAM,KAAK,QAA6B,UAAU;AAAA,QACvD,QAAQ;AAAA,QACR,MAAM;AAAA,MACR,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,iBAAiB,KAAK,GAAG;AAC3B,cAAM,KAAK,WAAW,MAAM;AAC5B,eAAO;AAAA,MACT;AACA,MAAO,0BAAiB,KAAK;AAC7B,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,eACA,OACiE;AACjE,UAAM,WAAW,MAAM,KAAK,YAAY;AACxC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,QAAI;AACF,aAAO,MAAM,KAAK,QAAQ,UAAU;AAAA,QAClC,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,MAAM,EAAE,MAAM,eAAe,MAAM;AAAA,MACrC,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,iBAAiB,KAAK,GAAG;AAC3B,cAAM,KAAK,WAAW,MAAM;AAC5B,eAAO;AAAA,MACT;AACA,MAAO,0BAAiB,KAAK;AAC7B,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,KACJ,SAAgE,WAC9C;AAClB,UAAM,WAAW,MAAM,KAAK,YAAY;AACxC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AACA,QAAI;AACF,YAAM,KAAK,QAAQ,UAAU;AAAA,QAC3B,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,QACF;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,iBAAiB,KAAK,GAAG;AAC3B,cAAM,KAAK,WAAW,MAAM;AAC5B,eAAO;AAAA,MACT;AACA,MAAO,0BAAiB,KAAK;AAC7B,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,SAKsB;AACxC,UAAM,WAAW,MAAM,KAAK,YAAY;AACxC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AACA,QAAI;AACF,aAAO,MAAM,KAAK,QAA+B,UAAU;AAAA,QACzD,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,MAAM,QAAQ;AAAA,UACd,gBAAgB,QAAQ;AAAA,UACxB,iBAAiB,QAAQ;AAAA,UACzB,eAAe,QAAQ;AAAA,QACzB;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,iBAAiB,KAAK,GAAG;AAC3B,cAAM,KAAK,WAAW,MAAM;AAC5B,eAAO;AAAA,MACT;AACA,MAAO,0BAAiB,KAAK;AAC7B,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,cAA+C;AAC3D,UAAM,QAAQ,MAAM,KAAK,WAAW,KAAK;AACzC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,QAAI,CAACG,gBAAe,MAAM,GAAG,GAAG;AAC9B,YAAM,KAAK,WAAW,MAAM;AAC5B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,QACN,UACA,SACY;AACZ,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,UAAU,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAC9D,YAAM,MAAMC,MAAK;AAAA,QACf;AAAA,UACE,UAAU;AAAA,UACV,MAAM,SAAS;AAAA,UACf,QAAQ,QAAQ;AAAA,UAChB,MAAM,QAAQ;AAAA,UACd,SAAS;AAAA,YACP,eAAe,UAAU,SAAS,KAAK;AAAA,YACvC,GAAI,UACA;AAAA,cACE,gBAAgB;AAAA,cAChB,kBAAkB,OAAO,WAAW,OAAO,EAAE,SAAS;AAAA,YACxD,IACA,CAAC;AAAA,UACP;AAAA,QACF;AAAA,QACA,CAAC,QAAQ;AACP,gBAAM,SAAmB,CAAC;AAC1B,cAAI,GAAG,QAAQ,CAAC,UAAU,OAAO,KAAK,KAAK,CAAC;AAC5C,cAAI,GAAG,OAAO,MAAM;AAClB,kBAAM,MAAM,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AACjD,gBAAI,IAAI,cAAc,IAAI,cAAc,KAAK;AAC3C;AAAA,gBACE,IAAI;AAAA,kBACF,8BAA8B,IAAI,UAAU,KAAK,GAAG;AAAA,kBACpD,IAAI,cAAc;AAAA,kBAClB;AAAA,gBACF;AAAA,cACF;AACA;AAAA,YACF;AACA,gBAAI;AACF,sBAAQ,MAAO,KAAK,MAAM,GAAG,IAAW,CAAC,CAAO;AAAA,YAClD,SAAS,OAAO;AACd,qBAAO,KAAK;AAAA,YACd;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,GAAG,SAAS,MAAM;AAEtB,UAAI,SAAS;AACX,YAAI,MAAM,OAAO;AAAA,MACnB;AACA,UAAI,IAAI;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAEA,SAASD,gBAAe,KAAsB;AAC5C,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAIE,SAAQ,OAAO,OAAO,GAAG;AAC3B,aAAO;AAAA,IACT;AACA,QAAIA,SAAQ,OAAO,OAAO,GAAG;AAC3B,aAAO;AAAA,IACT;AACA,IAAO,0BAAiB,KAAK;AAC7B,WAAO;AAAA,EACT;AACF;AAEA,SAASA,SAAQ,OAAgB,MAAuB;AACtD,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,UAAU,SACT,MAA4B,SAAS;AAAA,EAC1C;AACF;AAEA,SAAS,iBAAiB,OAAyB;AACjD,MAAI,iBAAiB,aAAa,MAAM,eAAe,KAAK;AAC1D,WAAO;AAAA,EACT;AACA,SAAO,kBAAkB,KAAK;AAChC;AAEA,SAAS,kBAAkB,OAAyB;AAClD,QAAM,QAAQ,oBAAI,IAAI,CAAC,gBAAgB,cAAc,QAAQ,CAAC;AAC9D,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,UAAU,SACV,OAAQ,MAA6B,SAAS,YAC9C,MAAM,IAAK,MAA2B,IAAI;AAAA,EAC9C;AACF;AAEO,IAAM,YAAN,cAAwB,MAAM;AAAA,EACnC,YACE,SACgB,YACA,MAChB;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;;;AG9OA,OAAOC,SAAQ;AACf,OAAOC,YAAU;AACjB,YAAYC,cAAY;;;ACFxB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,cAAAC,mBAAkB;AAC3B,YAAYC,cAAY;AA+BxB,IAAM,iBAAmC;AAAA,EACvC,aAAa,CAAC;AAAA,EACd,UAAU,CAAC;AACb;AAEO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,WAAmB,oBAAoB;AAAvC;AAAA,EAAwC;AAAA,EAErE,MAAM,OAAkC;AACtC,QAAI;AACF,YAAM,MAAM,MAAMC,IAAG,SAAS,KAAK,UAAU,MAAM;AACnD,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,aAAO,gBAAgB,MAAM;AAAA,IAC/B,SAAS,OAAO;AACd,UAAIC,gBAAe,KAAK,GAAG;AACzB,eAAO,YAAY,cAAc;AAAA,MACnC;AACA,MAAO,0BAAiB,KAAK;AAC7B,YAAM,IAAI;AAAA,QACR,qCAAqC,KAAK,QAAQ,KAAKC,qBAAoB,KAAK,CAAC;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,QAAyC;AAClD,UAAM,UAAU,gBAAgB,MAAM;AACtC,UAAM,iBAAiB;AACvB,UAAMF,IAAG,MAAMG,MAAK,QAAQ,KAAK,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAE/D,UAAM,WAAW,GAAG,KAAK,QAAQ;AACjC,UAAMH,IAAG,UAAU,UAAU,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG;AAAA,MAC7D,MAAMI;AAAA,IACR,CAAC;AACD,UAAMJ,IAAG,MAAM,UAAUI,kBAAiB;AAC1C,UAAMJ,IAAG,OAAO,UAAU,KAAK,QAAQ;AAAA,EACzC;AAAA,EAEA,MAAM,OACJ,QAC2B;AAC3B,UAAM,UAAU,MAAM,KAAK,KAAK;AAChC,UAAM,UAAU,YAAY,OAAO;AACnC,UAAM,SAAS,OAAO,OAAO,KAAK;AAClC,UAAM,KAAK,KAAK,MAAM;AACtB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBACJ,cACA,UAA+C,CAAC,GACM;AACtD,UAAM,eAAe,gBAAgB,YAAY;AACjD,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,UAAM,SAAS,MAAM,KAAK,OAAO,CAAC,YAAY;AAC5C,UAAIK,SAAQ,QAAQ,YAAY,KAAK,CAAC,QAAQ,gBAAgB,IAAI,IAAI,MAAM,YAAY;AAExF,UAAI,CAACA,QAAO;AACV,QAAAA,SAAQ;AAAA,UACN,IAAIC,YAAW;AAAA,UACf,MAAM;AAAA,UACN,OAAO,QAAQ;AAAA,UACf,SAAS;AAAA,UACT,YAAY,QAAQ,QAAQ,MAAM;AAAA,QACpC;AACA,gBAAQ,cAAc,CAAC,GAAG,QAAQ,aAAaD,MAAK;AACpD;AAAA,MACF;AAEA,UAAI,QAAQ,SAAS,QAAQ,UAAUA,OAAM,OAAO;AAClD,QAAAA,OAAM,QAAQ,QAAQ;AAAA,MACxB;AAEA,UAAI,QAAQ,OAAO;AACjB,QAAAA,OAAM,aAAa;AAAA,MACrB;AAAA,IACF,CAAC;AAED,UAAM,QAAQ,OAAO,YAAY,KAAK,CAAC,QAAQ,gBAAgB,IAAI,IAAI,MAAM,YAAY;AAEzF,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AAEA,UAAM,UAAU,MAAM,YAAY;AAClC,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AACF;AAEA,SAAS,gBAAgB,QAAiE;AACxF,QAAM,cAAc,MAAM,QAAQ,QAAQ,WAAW,IACjD,OAAQ,YACL;AAAA,IAAO,CAAC,SACP;AAAA,MACE,QAAQ,OAAO,SAAS,YAAY,UAAU,QAAQ,OAAO,KAAK,SAAS;AAAA,IAC7E;AAAA,EACF,EACC,IAAI,CAAC,SAAS;AAAA,IACb,IAAI,IAAI,MAAMC,YAAW;AAAA,IACzB,MAAM,gBAAgB,IAAI,IAAI;AAAA,IAC9B,OAAO,IAAI;AAAA,IACX,SAAS,IAAI,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC/C,YAAY,IAAI;AAAA,EAClB,EAAE,IACJ,CAAC;AAEL,SAAO;AAAA,IACL,SAAS,QAAQ,WAAW,eAAe;AAAA,IAC3C;AAAA,IACA,UAAU,QAAQ,YAAY,CAAC;AAAA,EACjC;AACF;AAEA,SAAS,YAAY,QAA4C;AAC/D,SAAO,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC;AAC1C;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,SAAOH,MAAK,QAAQ,KAAK;AAC3B;AAEA,SAASF,gBAAe,OAAyB;AAC/C,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,UAAU,SACT,MAA4B,SAAS;AAAA,EAC1C;AACF;AAEA,SAASC,qBAAoB,OAAwB;AACnD,MAAI,iBAAiB,SAAS,MAAM,SAAS;AAC3C,WAAO,MAAM;AAAA,EACf;AACA,SAAO,OAAO,KAAK;AACrB;;;AD7JO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,QAA2B,IAAI,kBAAkB,GAAG;AAApD;AAAA,EAAqD;AAAA,EAElF,MAAM,OAAkC;AACtC,UAAM,SAAS,MAAM,KAAK,MAAM,KAAK;AACrC,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,SAAS,eAAuD;AACpE,UAAM,aAAaK,OAAK,QAAQ,aAAa;AAC7C,UAAM,cAAc,MAAM,KAAK,KAAK;AACpC,WAAO,YAAY,KAAK,CAAC,QAAQA,OAAK,QAAQ,IAAI,IAAI,MAAM,UAAU,KAAK;AAAA,EAC7E;AAAA,EAEA,MAAM,gBACJ,eACA,UAAkC,CAAC,GACmB;AACtD,UAAM,WAAWA,OAAK,QAAQ,aAAa;AAC3C,QAAI,CAAC,QAAQ,gBAAgB;AAC3B,YAAM,KAAK,gBAAgB,QAAQ;AAAA,IACrC;AAEA,WAAO,KAAK,MAAM,gBAAgB,UAAU;AAAA,MAC1C,OAAO,QAAQ;AAAA,MACf,OAAO,QAAQ,kBAAkB;AAAA,IACnC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,gBAAgB,eAAsC;AAClE,QAAI;AACF,YAAM,QAAQ,MAAMC,IAAG,KAAK,aAAa;AACzC,UAAI,CAAC,MAAM,YAAY,GAAG;AACxB,cAAM,IAAI,MAAM,yBAAyB;AAAA,MAC3C;AAAA,IACF,SAAS,OAAO;AACd,MAAO,0BAAiB,KAAK;AAC7B,YAAM,IAAI;AAAA,QACR,aAAa,aAAa,uBAAuBC,qBAAoB,KAAK,CAAC;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAASA,qBAAoB,OAAwB;AACnD,MAAI,iBAAiB,SAAS,MAAM,SAAS;AAC3C,WAAO,MAAM;AAAA,EACf;AACA,SAAO,OAAO,KAAK;AACrB;;;AJhDA,OAAOC,YAAW;;;AMblB,OAAOC,UAAQ;AACf,OAAOC,YAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,YAAYC,cAAY;AAIxB,IAAM,gBAAgBC,OAAK,KAAK,iBAAiB,wBAAwB;AACzE,IAAM,YAAY,GAAG,aAAa;AAClC,IAAM,gBAAgB,UAAU,QAAQ;AACxC,IAAM,0BAA0B;AAYhC,eAAe,YAAY,UAAU,IAAI,UAAU,IAA4B;AAC7E,WAAS,UAAU,GAAG,UAAU,SAAS,WAAW,GAAG;AACrD,QAAI;AACF,YAAM,SAAS,MAAMC,KAAG,KAAK,WAAW,IAAI;AAC5C,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS,UAAU;AACtD,QAAO,0BAAiB,KAAK;AAC7B,cAAM;AAAA,MACR;AACA,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,IAC7D;AAAA,EACF;AACA,QAAM,IAAI,MAAM,yCAAyC;AAC3D;AAEA,eAAe,YAAY,QAAsC;AAC/D,QAAM,OAAO,MAAM;AACnB,QAAMA,KAAG,OAAO,SAAS,EAAE,MAAM,MAAM,MAAS;AAClD;AAEA,eAAe,eAAyC;AACtD,MAAI;AACF,UAAM,MAAM,MAAMA,KAAG,SAAS,eAAe,MAAM;AACnD,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAM,aAA8B,CAAC;AACrC,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACvD,UAAI,OAAO,UAAU,UAAU;AAE7B,mBAAW,SAAS,IAAI;AAAA,UACtB,KAAK;AAAA,QACP;AACA;AAAA,MACF;AACA,UAAI,SAAS,OAAO,MAAM,QAAQ,UAAU;AAC1C,mBAAW,SAAS,IAAI;AAAA,UACtB,KAAK,MAAM;AAAA,UACX,WAAW,OAAO,MAAM,cAAc,WAAW,MAAM,YAAY;AAAA,UACnE,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO,CAAC;AAAA,IACV;AACA,IAAO,0BAAiB,KAAK;AAC7B,UAAM;AAAA,EACR;AACF;AAEA,eAAe,cAAc,UAA0C;AACrE,QAAMA,KAAG,UAAU,eAAe,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG;AAAA,IACnE,MAAMC;AAAA,EACR,CAAC;AACH;AAEA,eAAsB,oBACpB,IACY;AACZ,QAAM,aAAa,MAAM,YAAY;AACrC,MAAI;AACF,UAAM,UAAU,MAAM,aAAa;AACnC,UAAM,CAAC,SAAS,MAAM,IAAI,MAAM,GAAG,OAAO;AAC1C,UAAM,cAAc,OAAO;AAC3B,WAAO;AAAA,EACT,UAAE;AACA,UAAM,YAAY,UAAU;AAAA,EAC9B;AACF;AAEA,eAAsBC,gBAAe,KAA+B;AAClE,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAS;AACrD,aAAO;AAAA,IACT;AACA,IAAO,0BAAiB,KAAK;AAC7B,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,sBAAsB,QAAyC;AACnF,QAAM,QAAQ,MAAMA,gBAAe,OAAO,GAAG;AAC7C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,MAAM,uBAAuB,OAAO,GAAG;AAC3D,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,MAAM,iBAAiB,OAAO,KAAK,OAAO,SAAS;AACrE,MAAI,OAAO,aAAa,CAAC,WAAW;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAe,uBAAuB,KAA+B;AACnE,MAAIC,IAAG,SAAS,MAAM,SAAS;AAE7B,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,cAAc,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,MAAM,UAAU,CAAC;AAClF,UAAM,UAAU,OAAO,KAAK,EAAE,YAAY;AAC1C,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,QAAI,CAAC,QAAQ,SAAS,QAAQ,KAAK,CAAC,QAAQ,SAAS,oBAAoB,GAAG;AAC1E,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,iBAAiB,KAAa,mBAA8C;AACzF,MAAIA,IAAG,SAAS,MAAM,SAAS;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,CAAC,mBAAmB;AACtB,WAAO;AAAA,EACT;AACA,QAAM,aAAa,KAAK,MAAM,iBAAiB;AAC/C,MAAI,OAAO,MAAM,UAAU,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,cAAc,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,MAAM,SAAS,CAAC;AACjF,UAAM,UAAU,OAAO,KAAK;AAC5B,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,UAAM,SAAS,IAAI,KAAK,OAAO;AAC/B,QAAI,OAAO,MAAM,OAAO,QAAQ,CAAC,GAAG;AAClC,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,KAAK,IAAI,OAAO,QAAQ,IAAI,UAAU;AACpD,WAAO,SAAS;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AN5JA,IAAM,OAAOC,WAAU,MAAM;AAE7B,IAAM,kBAAkB;AA+BxB,eAAsB,uBAAuB,UAA+B,CAAC,GAAkB;AAC7F,QAAMC,UAAS,QAAQ,UAAU;AACjC,QAAM,SAAS,IAAI,aAAa;AAChC,QAAM,cAAc,IAAI,kBAAkB;AAE1C,QAAM,SAAS,MAAM,OAAO,UAAU;AACtC,MAAI,CAAC,QAAQ;AACX,UAAM,4BAA4B,aAAaA,OAAM;AACrD,UAAM,YAAY;AAAA,MAChB,cAAc;AAAA,MACd,QAAQ,QAAQ,UAAU;AAAA,MAC1B,YAAY,QAAQ;AAAA,MACpB,aAAa,QAAQ;AAAA,MACrB,QAAAA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,KAAK;AACf,UAAM,kBAAkB,QAAQ,KAAK;AAAA,MACnC,OAAO,QAAQ;AAAA,MACf,QAAAA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,4BACpB,aACAA,SACiB;AACjB,QAAM,UAAU,QAAQ,IAAI,qBAAqB,KAAK;AACtD,MAAI,SAAS;AACX,UAAM,YAAY,OAAO,CAAC,QAAQ;AAChC,UAAI,YAAY,CAAC;AACjB,UAAI,QAAQ,OAAO;AAAA,IACrB,CAAC;AACD,IAAAA,QAAO,KAAK,uBAAuB,OAAO,4BAA4B;AACtE,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,YAAY,KAAK;AACtC,MAAI,OAAO,SAAS,MAAM;AACxB,YAAQ,IAAI,sBAAsB,OAAO,QAAQ;AACjD,WAAO,OAAO,QAAQ;AAAA,EACxB;AAEA,QAAM,cAAcC,IAAG,SAAS;AAChC,MAAI,cAAc;AAClB,MAAI,QAAQ,MAAM,SAAS,QAAQ,OAAO,OAAO;AAC/C,UAAM,UACJ,MAAM,OAAOC,OAAM,KAAK,kCAAkC,WAAW,KAAK,CAAC,GAC3E,KAAK;AACP,QAAI,QAAQ;AACV,oBAAc;AAAA,IAChB;AAAA,EACF,OAAO;AACL,IAAAF,QAAO,KAAK,+CAA+C,WAAW,GAAG;AAAA,EAC3E;AAEA,QAAM,YAAY,OAAO,CAAC,QAAQ;AAChC,QAAI,YAAY,CAAC;AACjB,QAAI,QAAQ,OAAO;AAAA,EACrB,CAAC;AACD,UAAQ,IAAI,sBAAsB;AAClC,EAAAA,QAAO,KAAK,uBAAuB,WAAW,GAAG;AACjD,SAAO;AACT;AAEA,eAAsB,YAAY,UAA8B,CAAC,GAAqB;AACpF,QAAM,SAAS,IAAI,aAAa;AAChC,QAAMA,UAAS,QAAQ,UAAU;AACjC,QAAM,UAAU,MAAM,OAAO,UAAU;AACvC,MAAI,SAAS;AACX,IAAAA,QAAO,KAAK,mCAAmC;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM;AAAA,IACJ;AAAA,MACE,QAAQ,QAAQ;AAAA,MAChB,YAAY,QAAQ;AAAA,MACpB,aAAa,QAAQ;AAAA,IACvB;AAAA,IACAA;AAAA,EACF;AAEA,MAAI,QAAQ,gBAAgB,MAAM;AAChC,UAAM,QAAQ,MAAM,aAAa,QAAQ,EAAE,QAAAA,QAAO,CAAC;AACnD,QAAI,CAAC,OAAO;AACV,MAAAA,QAAO,KAAK,6CAA6C;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,WAAW,UAA6B,CAAC,GAAqB;AAClF,QAAM,SAAS,IAAI,aAAa;AAChC,QAAMA,UAAS,QAAQ,UAAU;AACjC,QAAM,UAAU,MAAM,OAAO,KAAK;AAClC,MAAI,SAAS;AACX,IAAAA,QAAO,QAAQ,+BAA+B;AAC9C,WAAO;AAAA,EACT;AACA,EAAAA,QAAO,KAAK,8BAA8B;AAC1C,SAAO;AACT;AAEA,eAAsB,iBAAiB,UAAyB,CAAC,GAAkB;AACjF,QAAM,SAAS,IAAI,aAAa;AAChC,QAAMA,UAAS,QAAQ,UAAU;AACjC,QAAM,SAAS,MAAM,OAAO,UAAU;AACtC,MAAI,CAAC,QAAQ;AACX,IAAAA,QAAO,KAAK,wBAAwB;AACpC;AAAA,EACF;AAEA,EAAAA,QAAO,KAAK,gBAAgB;AAC5B,EAAAA,QAAO,KAAK,UAAU,OAAO,GAAG,EAAE;AAClC,EAAAA,QAAO,KAAK,cAAc,OAAO,SAAS,EAAE;AAC5C,EAAAA,QAAO,KAAK,kBAAkB,OAAO,YAAY,MAAM,EAAE;AAC3D;AAEA,eAAsB,uBAAuB,UAA0B,CAAC,GAAkB;AAExF,QAAMA,UAAS,QAAQ,UAAU;AACjC,QAAM,WAAW,CAAC,QAAQ,KAAK;AAE/B,aAAW,WAAW,UAAU;AAC9B,UAAM,eAAe,YAAY;AACjC,UAAM,WAAW,eAAe,gBAAgB;AAChD,IAAAA,QAAO,KAAK,WAAW,QAAQ,sBAAsB;AAErD,UAAM,QAAQ,eAAe,YAAY;AACzC,UAAM,aAAa,IAAI,iBAAiB,MAAM,SAAS;AACvD,UAAM,UAAoB,CAAC;AAE3B,QAAI;AAEF,YAAM,QAAQ,MAAM,WAAW,KAAK;AACpC,UAAI,SAAS,MAAM,KAAK;AACtB,YAAI;AACF,kBAAQ,KAAK,MAAM,KAAK,CAAC;AACzB,kBAAQ,KAAK,MAAM,GAAG;AACtB,UAAAA,QAAO,MAAM,SAAS,QAAQ,gCAAgC,MAAM,GAAG,EAAE;AAAA,QAC3E,QAAQ;AACN,UAAAA,QAAO,MAAM,cAAc,MAAM,GAAG,iCAAiC;AAAA,QACvE;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,sBAAsB;AAC3C,iBAAW,OAAO,QAAQ;AACxB,YAAI,CAAC,QAAQ,SAAS,GAAG,KAAK,QAAQ,QAAQ,KAAK;AACjD,kBAAQ,KAAK,GAAG;AAAA,QAClB;AAAA,MACF;AAEA,UAAI,QAAQ,WAAW,GAAG;AACxB,QAAAA,QAAO,KAAK,MAAM,QAAQ,iCAAiC;AAC3D;AAAA,MACF;AAEA,MAAAA,QAAO,KAAK,SAAS,QAAQ,MAAM,2BAA2B,QAAQ,OAAO;AAE7E,iBAAW,OAAO,SAAS;AACzB,YAAI;AACF,kBAAQ,KAAK,KAAK,SAAS;AAC3B,UAAAA,QAAO,QAAQ,kBAAkB,GAAG,EAAE;AAAA,QACxC,SAAS,OAAO;AACd,UAAAA,QAAO,KAAK,kBAAkB,GAAG,KAAKG,qBAAoB,KAAK,CAAC,EAAE;AAAA,QACpE;AAAA,MACF;AAEA,YAAM,WAAW,MAAM;AACvB,MAAAH,QAAO,MAAM,WAAW,QAAQ,oBAAoB;AAAA,IACtD,SAAS,OAAO;AACd,MAAAA,QAAO,MAAM,kBAAkB,QAAQ,sBAAsBG,qBAAoB,KAAK,CAAC,EAAE;AAAA,IAC3F;AAAA,EACF;AACF;AAEA,eAAsB,kBACpB,UAA8C,CAAC,GAChC;AACf,QAAMH,UAAS,QAAQ,UAAU;AACjC,QAAM,QAAQ,eAAe,QAAQ,GAAG;AACxC,QAAM,aAAa,IAAI,iBAAiB,MAAM,SAAS;AACvD,QAAM,QAAQ,MAAM,WAAW,KAAK;AACpC,MAAI,CAAC,OAAO,KAAK;AACf,IAAAA,QAAO,KAAK,gCAAgC;AAC5C;AAAA,EACF;AACA,MAAI;AACF,YAAQ,KAAK,MAAM,KAAK,SAAS;AACjC,IAAAA,QAAO,QAAQ,yBAAyB,MAAM,GAAG,EAAE;AAAA,EACrD,SAAS,OAAO;AACd,IAAAA,QAAO,KAAK,yBAAyB,MAAM,GAAG,KAAKG,qBAAoB,KAAK,CAAC,EAAE;AAAA,EACjF;AACA,QAAM,WAAW,MAAM;AACzB;AAEA,eAAsB,uBAAuB,UAA+B,CAAC,GAAkB;AAC7F,QAAMH,UAAS,QAAQ,UAAU;AACjC,MAAI;AACF,UAAM,oBAAoB,OAAO,aAAa;AAC5C,iBAAW,UAAU,OAAO,OAAO,QAAQ,GAAG;AAC5C,YAAI,CAAC,UAAU,CAAC,OAAO,SAAS,OAAO,GAAG,GAAG;AAC3C;AAAA,QACF;AACA,cAAM,QAAQ,MAAM,sBAAsB,MAAM;AAChD,YAAI,CAAC,OAAO;AACV;AAAA,QACF;AACA,YAAI;AACF,kBAAQ,KAAK,OAAO,KAAK,SAAS;AAClC,UAAAA,QAAO,QAAQ,0BAA0B,OAAO,GAAG,EAAE;AAAA,QACvD,SAAS,OAAO;AACd,UAAAA,QAAO,KAAK,0BAA0B,OAAO,GAAG,KAAKG,qBAAoB,KAAK,CAAC,EAAE;AAAA,QACnF;AAAA,MACF;AAEA,aAAO,CAAC,CAAC,GAAG,MAAS;AAAA,IACvB,CAAC;AAAA,EACH,SAAS,OAAO;AACd,IAAAH,QAAO,KAAK,yCAAyCG,qBAAoB,KAAK,CAAC,EAAE;AAAA,EACnF;AACF;AAEA,eAAe,wBAA2C;AACxD,QAAM,OAAiB,CAAC;AACxB,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,uBAAuB;AACrD,eAAW,QAAQ,OAAO,MAAM,IAAI,GAAG;AACrC,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,SAAS;AACZ;AAAA,MACF;AACA,YAAM,CAAC,QAAQ,GAAG,QAAQ,IAAI,QAAQ,MAAM,KAAK;AACjD,YAAM,MAAM,OAAO,MAAM;AACzB,UAAI,CAAC,OAAO,SAAS,GAAG,KAAK,QAAQ,QAAQ,KAAK;AAChD;AAAA,MACF;AACA,YAAM,UAAU,SAAS,KAAK,GAAG;AACjC,UACE,QAAQ,SAAS,QAAQ,MACxB,QAAQ,SAAS,oBAAoB,KAAK,QAAQ,SAAS,oBAAoB,MAChF,MACA;AACA,aAAK,KAAK,GAAG;AAAA,MACf;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,eAAe,kBACb,eACA,SACe;AACf,QAAM,aAAaC,OAAK,QAAQ,aAAa;AAC7C,MAAI;AACF,UAAM,SAAS,MAAM,QAAQ,OAAO,aAAa,YAAY,QAAQ,KAAK;AAC1E,QAAI,QAAQ;AACV,cAAQ,OAAO,MAAM,cAAc,UAAU,cAAc;AAC3D;AAAA,IACF;AACA,YAAQ,OAAO,KAAK,oDAAoD;AAAA,EAC1E,SAAS,OAAO;AACd,YAAQ,OAAO;AAAA,MACb,sBAAsB,UAAU,iBAAiBD,qBAAoB,KAAK,CAAC;AAAA,IAC7E;AAAA,EACF;AAEA,QAAM,WAAW,IAAI,kBAAkB;AACvC,QAAM,SAAS,gBAAgB,YAAY,EAAE,OAAO,QAAQ,OAAO,gBAAgB,KAAK,CAAC;AAC3F;AAEA,eAAe,mBACb,SACAH,SACe;AACf,QAAM,OAAO,aAAa,CAAC,UAAU,aAAa,CAAC;AACnD,QAAM,WAAW,kBAAkB;AAEnC,EAAAA,QAAO,KAAK,2BAA2B;AACvC,EAAAA,QAAO,MAAM,oBAAoB,QAAQ,IAAI,KAAK,KAAK,GAAG,CAAC,EAAE;AAE7D,QAAM,QAAQK,OAAM,UAAU,MAAM;AAAA,IAClC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,2BAA2B,QAAQ,UAAU;AAAA,MAC7C,GAAI,QAAQ,aAAa,EAAE,oBAAoB,QAAQ,WAAW,IAAI,CAAC;AAAA,MACvE,GAAI,QAAQ,cAAc,EAAE,qBAAqB,QAAQ,YAAY,IAAI,CAAC;AAAA,IAC5E;AAAA,EACF,CAAC;AACD,QAAM,MAAM;AACd;AAEA,eAAe,aACb,QACA,UAAmD,CAAC,GACf;AACrC,QAAM,UAAU,QAAQ,aAAa;AACrC,QAAML,UAAS,QAAQ,UAAU;AACjC,QAAM,QAAQ,KAAK,IAAI;AAEvB,SAAO,KAAK,IAAI,IAAI,QAAQ,SAAS;AACnC,UAAM,SAAS,MAAM,OAAO,UAAU;AACtC,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AACA,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAAA,EACzD;AAEA,EAAAA,QAAO,KAAK,yCAAyC;AACrD,SAAO;AACT;AAEA,SAASG,qBAAoB,OAAwB;AACnD,MAAI,iBAAiB,SAAS,MAAM,SAAS;AAC3C,WAAO,MAAM;AAAA,EACf;AACA,SAAO,OAAO,KAAK;AACrB;;;AD5WO,SAAS,mBAA4B;AAC1C,QAAM,OAAO,IAAI,QAAQ,MAAM,EAAE,YAAY,8BAA8B;AAE3E,OACG,QAAQ,OAAO,EACf,YAAY,uDAAuD,EACnE,OAAO,YAAY;AAClB,UAAM,QAAQ,IAAI,iBAAiB;AACnC,UAAM,aAAa,kBAAkB;AAErC,QAAI;AACF,YAAM,cAAc,IAAI,kBAAkB;AAC1C,YAAM,4BAA4B,aAAa,MAAM;AACrD,YAAM,yBAAyB;AAAA,QAC7B,kBAAkB;AAAA,QAClB,mBAAmB,mBAAmB;AAAA,QACtC;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,MAAO,0BAAiB,KAAK;AAC7B,UAAI,iBAAiB,UAAU;AAC7B,gBAAQ,MAAM;AAAA,uBAA0B,MAAM,MAAM,MAAM,MAAM,OAAO,EAAE;AAAA,MAC3E,OAAO;AACL,gBAAQ,MAAM;AAAA,gBAAmBG,sBAAoB,KAAK,CAAC,EAAE;AAAA,MAC/D;AACA,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF,CAAC;AAEH,OACG,QAAQ,QAAQ,EAChB,YAAY,gCAAgC,EAC5C,OAAO,YAAY;AAClB,UAAM,QAAQ,IAAI,iBAAiB;AACnC,UAAM,MAAM,MAAM;AAClB,YAAQ,IAAI,sBAAsB;AAAA,EACpC,CAAC;AAEH,OACG,QAAQ,QAAQ,EAChB,YAAY,qCAAqC,EACjD,OAAO,YAAY;AAClB,UAAM,QAAQ,IAAI,iBAAiB;AACnC,UAAM,cAAc,MAAM,MAAM,KAAK;AACrC,QAAI,CAAC,aAAa;AAChB,cAAQ,IAAI,wBAAwB;AACpC;AAAA,IACF;AAEA,gBAAY,WAAW;AAAA,EACzB,CAAC;AAEH,SAAO;AACT;AAEA,SAAS,YAAY,aAAsC;AACzD,MAAI,YAAY,KAAK;AACnB,YAAQ,IAAI,4BAA4B;AACxC;AAAA,EACF;AAEA,UAAQ,IAAI,gCAAgC;AAC9C;AAEA,SAASA,sBAAoB,OAAwB;AACnD,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,SAAO,OAAO,KAAK;AACrB;;;AQnFA,SAAS,WAAAC,gBAAe;AACxB,YAAYC,cAAY;;;ACDxB,YAAYC,cAAY;;;ACCxB,YAAYC,cAAY;;;ACDxB,OAAOC,WAAU;AACjB,SAAS,eAAAC,oBAAmB;AAC5B,SAAS,OAAAC,YAAW;AACpB,YAAYC,cAAY;AAQxB,IAAM,WAAW;AACjB,IAAM,WAAW;AACjB,IAAM,eAAe;AA2CrB,eAAsB,wBACpB,SACmC;AACnC,QAAM,QAAQC,aAAY,EAAE,EAAE,SAAS,KAAK;AAC5C,QAAM,UAAU,qBAAqB;AAAA,IACnC;AAAA,IACA,mBAAmB,QAAQ;AAAA,IAC3B,WAAW,QAAQ;AAAA,IACnB,iBAAiB,QAAQ;AAAA,IACzB,mBAAmB,QAAQ;AAAA,IAC3B,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,QAAM,EAAE,QAAQ,KAAK,IAAI,MAAM,kBAAkB,OAAO;AACxD,UAAQ,QAAQ,KAAK,gDAAgD,IAAI,EAAE;AAE3E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,QAAQ;AACZ,YAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,eAAO,MAAM,CAAC,UAAU;AACtB,cAAI,OAAO;AACT,mBAAO,KAAK;AAAA,UACd,OAAO;AACL,oBAAQ;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAaA,SAAS,qBAAqB,SAAgC;AAC5D,SAAO,OAAO,KAA2B,QAA4C;AACnF,QAAI;AACF,YAAM,MAAM,IAAIC,KAAI,IAAI,OAAO,KAAK,kBAAkB;AACtD,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,YAAY;AACvD,iBAAS,KAAK,KAAK,EAAE,QAAQ,KAAK,CAAC;AACnC;AAAA,MACF;AAEA,UAAI,CAAC,UAAU,KAAK,QAAQ,KAAK,GAAG;AAClC,iBAAS,KAAK,KAAK,EAAE,OAAO,eAAe,CAAC;AAC5C;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,WAAW;AACtD,cAAM,UAAU,MAAM,QAAQ,UAAU;AACxC,iBAAS,KAAK,KAAK,OAAO;AAC1B;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,gBAAgB;AAC3D,cAAM,cAAc,MAAM,QAAQ,kBAAkB,KAAK;AACzD,iBAAS,KAAK,KAAK,EAAE,YAAY,CAAC;AAClC;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,IAAI,aAAa,gBAAgB;AAC5D,cAAM,OAAO,MAAM,aAAgD,GAAG;AACtE,YAAI,CAAC,MAAM,MAAM;AACf,mBAAS,KAAK,KAAK,EAAE,OAAO,qBAAqB,CAAC;AAClD;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,SAAS,MAAM,QAAQ,kBAAkB,gBAAgB,KAAK,MAAM;AAAA,YACxE,OAAO,KAAK;AAAA,YACZ,gBAAgB;AAAA,UAClB,CAAC;AAED,mBAAS,KAAK,KAAK,EAAE,WAAW,OAAO,OAAO,SAAS,OAAO,QAAQ,CAAC;AAAA,QACzE,SAAS,OAAO;AACd,UAAO,0BAAiB,KAAK;AAC7B,mBAAS,KAAK,KAAK,EAAE,OAAOC,sBAAoB,KAAK,EAAE,CAAC;AAAA,QAC1D;AACA;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,IAAI,aAAa,WAAW;AACvD,YAAI,CAAC,QAAQ,mBAAmB;AAC9B,mBAAS,KAAK,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACpD;AAAA,QACF;AACA,cAAM,OAAO,MAAM,aAKhB,GAAG;AACN,YAAI,CAAC,MAAM,MAAM;AACf,mBAAS,KAAK,KAAK,EAAE,OAAO,qBAAqB,CAAC;AAClD;AAAA,QACF;AACA,YAAI;AACF,gBAAM,SAAS,MAAM,QAAQ,kBAAkB;AAAA,YAC7C,MAAM,KAAK;AAAA,YACX,eAAe,KAAK,kBAAkB;AAAA,YACtC,eAAe,KAAK,mBAAmB;AAAA,YACvC,cAAc,KAAK,iBAAiB;AAAA,UACtC,CAAC;AACD,mBAAS,KAAK,KAAK,MAAM;AAAA,QAC3B,SAAS,OAAO;AACd,cAAI,iBAAiB,sBAAsB;AACzC,qBAAS,KAAK,KAAK;AAAA,cACjB,OAAO,MAAM;AAAA,YACf,CAAC;AACD;AAAA,UACF;AACA,UAAO,0BAAiB,KAAK;AAC7B,mBAAS,KAAK,KAAK,EAAE,OAAOA,sBAAoB,KAAK,EAAE,CAAC;AAAA,QAC1D;AACA;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,IAAI,aAAa,SAAS;AACrD,cAAM,OAAO,MAAM,aAEhB,GAAG;AACN,iBAAS,KAAK,KAAK,EAAE,QAAQ,WAAW,CAAC;AACzC,gBAAQ,QAAQ,EACb,KAAK,MAAM,QAAQ,gBAAgB,MAAM,UAAU,SAAS,CAAC,EAC7D,MAAM,CAAC,UAAU;AAChB,UAAO,0BAAiB,KAAK;AAC7B,kBAAQ,QAAQ,MAAM,0BAA0B,KAAK;AAAA,QACvD,CAAC;AACH;AAAA,MACF;AAEA,eAAS,KAAK,KAAK,EAAE,OAAO,YAAY,CAAC;AAAA,IAC3C,SAAS,OAAO;AACd,MAAO,0BAAiB,KAAK;AAC7B,cAAQ,QAAQ,MAAM,yBAAyB,KAAK;AACpD,UAAI,CAAC,IAAI,aAAa;AACpB,iBAAS,KAAK,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAA,MAChD,OAAO;AACL,YAAI,IAAI;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,kBACb,SACgD;AAChD,MAAI,UAAU;AACd,MAAI,OAAO,gBAAgB;AAE3B,SAAO,UAAU,cAAc;AAC7B,UAAM,SAASC,MAAK,aAAa,CAAC,KAAK,QAAQ;AAC7C,WAAK,QAAQ,KAAK,GAAG;AAAA,IACvB,CAAC;AAED,QAAI;AACF,YAAM,OAAO,QAAQ,IAAI;AACzB,aAAO,EAAE,QAAQ,KAAK;AAAA,IACxB,SAAS,OAAO;AACd,aAAO,MAAM;AACb,UAAI,YAAY,KAAK,GAAG;AACtB,mBAAW;AACX,eAAO,SAAS,IAAI;AACpB;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,4DAA4D;AAC9E;AAEA,SAAS,OAAO,QAAqB,MAA6B;AAChE,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAO,KAAK,SAAS,MAAM;AAC3B,WAAO,OAAO,MAAM,aAAa,MAAM;AACrC,aAAO,IAAI,SAAS,MAAM;AAC1B,cAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,kBAA0B;AACjC,QAAM,OAAO,WAAW;AACxB,SAAO,WAAW,KAAK,MAAM,KAAK,OAAO,IAAI,IAAI;AACnD;AAEA,SAAS,SAAS,SAAyB;AACzC,QAAM,OAAO,UAAU;AACvB,MAAI,OAAO,UAAU;AACnB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,UAAU,KAA2B,OAAwB;AACpE,QAAM,SAAS,IAAI,QAAQ;AAC3B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,QAAQ,KAAK,IAAI,OAAO,MAAM,GAAG;AACxC,SAAO,OAAO,YAAY,MAAM,YAAY,UAAU;AACxD;AAEA,eAAe,aAAgB,KAA8C;AAC3E,QAAM,SAAmB,CAAC;AAC1B,mBAAiB,SAAS,KAAK;AAC7B,WAAO,KAAK,OAAO,UAAU,WAAW,OAAO,KAAK,KAAK,IAAI,KAAK;AAAA,EACpE;AACA,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,MAAM,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,CAAC;AAAA,EAC1D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,SAAS,KAA0B,YAAoB,SAAwB;AACtF,QAAM,OAAO,KAAK,UAAU,OAAO;AACnC,MAAI,UAAU,YAAY;AAAA,IACxB,gBAAgB;AAAA,IAChB,kBAAkB,OAAO,WAAW,IAAI;AAAA,EAC1C,CAAC;AACD,MAAI,IAAI,IAAI;AACd;AAEA,SAAS,YAAY,OAAyB;AAC5C,SACE;AAAA,IACE,SACE,OAAO,UAAU,YACjB,UAAU,SACT,MAA4B,SAAS;AAAA,EAC1C,KAAK;AAET;AAEA,SAASD,sBAAoB,OAAwB;AACnD,MAAI,iBAAiB,SAAS,MAAM,SAAS;AAC3C,WAAO,MAAM;AAAA,EACf;AACA,SAAO,OAAO,KAAK;AACrB;;;ACvTA,SAAS,cAAAE,mBAAkB;AAC3B,OAAOC,SAAQ;AACf,SAAS,cAAcC,cAAa;AACpC,OAAOC,gBAAe;AACtB,YAAYC,cAAY;;;ACJxB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA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",
|
|
6
|
-
"names": ["path", "Command", "Sentry", "fs", "randomUUID", "Sentry", "query", "prompt", "query", "simpleGit", "query", "input", "output", "randomUUID", "query", "prompt", "randomUUID", "prompt", "randomUUID", "fs", "path", "Sentry", "fs", "delay", "os", "path", "Sentry", "path", "path", "fs", "extractErrorMessage", "delay", "os", "fs", "path", "output", "z", "query", "path", "Sentry", "query", "aName", "bName", "aDepth", "bDepth", "logger", "output", "randomUUID", "simpleGit", "input", "randomUUID", "WebSocket", "simpleGit", "Sentry", "Sentry", "path", "extractErrorMessage", "Sentry", "Sentry", "input", "randomBytes", "Sentry", "base64UrlEncode", "input", "Sentry", "chalk", "input", "extractErrorMessage", "chalk", "WebSocket", "delay", "extractErrorMessage", "randomUUID", "simpleGit", "path", "Sentry", "fs", "Sentry", "spawn", "path", "os", "promisify", "http", "Sentry", "fs", "path", "Sentry", "fs", "path", "path", "DEFAULT_DIR_MODE", "DEFAULT_FILE_MODE", "fs", "fs", "isFileNotFound", "extractErrorMessage", "path", "DEFAULT_FILE_MODE", "isProcessAlive", "http", "isErrno", "fs", "path", "Sentry", "fs", "path", "randomUUID", "Sentry", "fs", "isFileNotFound", "extractErrorMessage", "path", "DEFAULT_FILE_MODE", "entry", "randomUUID", "path", "fs", "extractErrorMessage", "chalk", "fs", "path", "os", "Sentry", "path", "fs", "DEFAULT_FILE_MODE", "isProcessAlive", "os", "promisify", "logger", "os", "chalk", "extractErrorMessage", "path", "spawn", "extractErrorMessage", "Command", "Sentry", "Sentry", "Sentry", "http", "randomBytes", "URL", "Sentry", "randomBytes", "URL", "extractErrorMessage", "http", "randomUUID", "os", "delay", "WebSocket", "Sentry", "spawn", "delay", "Sentry", "fs", "path", "delay", "isProcessAlive", "fs", "spawn", "path", "LOGIN_WAIT_DELAY_MS", "CONNECT_TIMEOUT_MS", "os", "isLoginRequiredError", "isUnauthorizedApiError", "delay", "WebSocket", "messageText", "randomUUID", "path", "fs", "path", "chalk", "execSync", "Sentry", "os", "execSync", "chalk", "chalk", "logger", "path", "fs", "DEFAULT_FILE_MODE", "Command", "Command", "Command", "chalk", "Command", "path", "chalk", "isConnectionError"]
|
|
7
|
-
}
|