@standardagents/builder 0.11.0-next.99fb790 → 0.11.0-next.a433660
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/built-in-routes.js +5708 -6
- package/dist/built-in-routes.js.map +1 -1
- package/dist/index.d.ts +15 -0
- package/dist/index.js +37 -2
- package/dist/index.js.map +1 -1
- package/dist/plugin.js +0 -2
- package/dist/plugin.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.mjs","../src/router/index.ts","../src/api/index.post.ts","../src/api/agents.get.ts","../src/utils/auth.ts","../src/middleware/auth.ts","../src/api/api-keys/index.get.ts","../src/api/api-keys/index.post.ts","../src/api/config.get.ts","../src/api/diagnostics.get.ts","../src/api/events.get.ts","../src/api/models.get.ts","../src/api/new-test.get.ts","../src/api/prompts.get.ts","../src/api/providers.get.ts","../src/api/threads/index.post.ts","../src/api/threads/index.ts","../src/api/tools.get.ts","../src/api/users/index.get.ts","../src/api/users/index.post.ts","../src/api/agents/%5Bname%5D.get.ts","../src/api/api-keys/%5Bid%5D.delete.ts","../src/api/prompts/%5Bname%5D.get.ts","../src/utils/permissions.ts","../src/api/threads/%5Bid%5D.delete.ts","../src/api/threads/%5Bid%5D.patch.ts","../src/api/threads/%5Bid%5D.ts","../src/api/tools/%5Bname%5D.get.ts","../src/api/users/%5Bid%5D.delete.ts","../src/api/users/%5Bid%5D.put.ts","../src/api/auth/config.get.ts","../src/api/auth/login.post.ts","../src/api/auth/logout.post.ts","../src/api/auth/me.get.ts","../src/api/models/available.post.ts","../src/api/models/endpoints.post.ts","../src/api/threads/%5Bid%5D/cost.get.ts","../src/api/threads/%5Bid%5D/fs/index.ts","../src/api/threads/%5Bid%5D/logs.get.ts","../src/api/threads/%5Bid%5D/messages.get.ts","../src/api/threads/%5Bid%5D/messages.post.ts","../src/api/threads/%5Bid%5D/rpc.post.ts","../src/api/threads/%5Bid%5D/stop.post.ts","../src/api/threads/%5Bid%5D/stream.ts","../src/api/threads/%5Bid%5D/fs/%5B...path%5D.ts","../src/api/threads/%5Bid%5D/logs/%5BlogId%5D.get.ts","../src/api/threads/%5Bid%5D/messages/%5BmessageId%5D.delete.ts","../src/api/threads/%5Bid%5D/messages/%5BmessageId%5D.patch.ts","../src/built-in-routes.ts"],"names":["index_post_default","toJSONSchema","z","result","index_get_default","loader","normalizePromptContent","name_get_default","id_delete_default","resolveIconUrl","config_get_default","token","durableId","stub","binary","bytes"],"mappings":"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","file":"built-in-routes.js","sourcesContent":["const NullProtoObj = /* @__PURE__ */ (() => {\n\tconst e = function() {};\n\treturn e.prototype = Object.create(null), Object.freeze(e.prototype), e;\n})();\n\n/**\n* Create a new router context.\n*/\nfunction createRouter() {\n\treturn {\n\t\troot: { key: \"\" },\n\t\tstatic: new NullProtoObj()\n\t};\n}\n\nfunction splitPath(path) {\n\tconst [_, ...s] = path.split(\"/\");\n\treturn s[s.length - 1] === \"\" ? s.slice(0, -1) : s;\n}\nfunction getMatchParams(segments, paramsMap) {\n\tconst params = new NullProtoObj();\n\tfor (const [index, name] of paramsMap) {\n\t\tconst segment = index < 0 ? segments.slice(-1 * index).join(\"/\") : segments[index];\n\t\tif (typeof name === \"string\") params[name] = segment;\n\t\telse {\n\t\t\tconst match = segment.match(name);\n\t\t\tif (match) for (const key in match.groups) params[key] = match.groups[key];\n\t\t}\n\t}\n\treturn params;\n}\n\n/**\n* Add a route to the router context.\n*/\nfunction addRoute(ctx, method = \"\", path, data) {\n\tmethod = method.toUpperCase();\n\tif (path.charCodeAt(0) !== 47) path = `/${path}`;\n\tconst segments = splitPath(path);\n\tlet node = ctx.root;\n\tlet _unnamedParamIndex = 0;\n\tconst paramsMap = [];\n\tconst paramsRegexp = [];\n\tfor (let i = 0; i < segments.length; i++) {\n\t\tconst segment = segments[i];\n\t\tif (segment.startsWith(\"**\")) {\n\t\t\tif (!node.wildcard) node.wildcard = { key: \"**\" };\n\t\t\tnode = node.wildcard;\n\t\t\tparamsMap.push([\n\t\t\t\t-i,\n\t\t\t\tsegment.split(\":\")[1] || \"_\",\n\t\t\t\tsegment.length === 2\n\t\t\t]);\n\t\t\tbreak;\n\t\t}\n\t\tif (segment === \"*\" || segment.includes(\":\")) {\n\t\t\tif (!node.param) node.param = { key: \"*\" };\n\t\t\tnode = node.param;\n\t\t\tif (segment === \"*\") paramsMap.push([\n\t\t\t\ti,\n\t\t\t\t`_${_unnamedParamIndex++}`,\n\t\t\t\ttrue\n\t\t\t]);\n\t\t\telse if (segment.includes(\":\", 1)) {\n\t\t\t\tconst regexp = getParamRegexp(segment);\n\t\t\t\tparamsRegexp[i] = regexp;\n\t\t\t\tnode.hasRegexParam = true;\n\t\t\t\tparamsMap.push([\n\t\t\t\t\ti,\n\t\t\t\t\tregexp,\n\t\t\t\t\tfalse\n\t\t\t\t]);\n\t\t\t} else paramsMap.push([\n\t\t\t\ti,\n\t\t\t\tsegment.slice(1),\n\t\t\t\tfalse\n\t\t\t]);\n\t\t\tcontinue;\n\t\t}\n\t\tconst child = node.static?.[segment];\n\t\tif (child) node = child;\n\t\telse {\n\t\t\tconst staticNode = { key: segment };\n\t\t\tif (!node.static) node.static = new NullProtoObj();\n\t\t\tnode.static[segment] = staticNode;\n\t\t\tnode = staticNode;\n\t\t}\n\t}\n\tconst hasParams = paramsMap.length > 0;\n\tif (!node.methods) node.methods = new NullProtoObj();\n\tnode.methods[method] ??= [];\n\tnode.methods[method].push({\n\t\tdata: data || null,\n\t\tparamsRegexp,\n\t\tparamsMap: hasParams ? paramsMap : void 0\n\t});\n\tif (!hasParams) ctx.static[path] = node;\n}\nfunction getParamRegexp(segment) {\n\tconst regex = segment.replace(/:(\\w+)/g, (_, id) => `(?<${id}>[^/]+)`).replace(/\\./g, \"\\\\.\");\n\treturn /* @__PURE__ */ new RegExp(`^${regex}$`);\n}\n\n/**\n* Find a route by path.\n*/\nfunction findRoute(ctx, method = \"\", path, opts) {\n\tif (path.charCodeAt(path.length - 1) === 47) path = path.slice(0, -1);\n\tconst staticNode = ctx.static[path];\n\tif (staticNode && staticNode.methods) {\n\t\tconst staticMatch = staticNode.methods[method] || staticNode.methods[\"\"];\n\t\tif (staticMatch !== void 0) return staticMatch[0];\n\t}\n\tconst segments = splitPath(path);\n\tconst match = _lookupTree(ctx, ctx.root, method, segments, 0)?.[0];\n\tif (match === void 0) return;\n\tif (opts?.params === false) return match;\n\treturn {\n\t\tdata: match.data,\n\t\tparams: match.paramsMap ? getMatchParams(segments, match.paramsMap) : void 0\n\t};\n}\nfunction _lookupTree(ctx, node, method, segments, index) {\n\tif (index === segments.length) {\n\t\tif (node.methods) {\n\t\t\tconst match = node.methods[method] || node.methods[\"\"];\n\t\t\tif (match) return match;\n\t\t}\n\t\tif (node.param && node.param.methods) {\n\t\t\tconst match = node.param.methods[method] || node.param.methods[\"\"];\n\t\t\tif (match) {\n\t\t\t\tconst pMap = match[0].paramsMap;\n\t\t\t\tif (pMap?.[pMap?.length - 1]?.[2]) return match;\n\t\t\t}\n\t\t}\n\t\tif (node.wildcard && node.wildcard.methods) {\n\t\t\tconst match = node.wildcard.methods[method] || node.wildcard.methods[\"\"];\n\t\t\tif (match) {\n\t\t\t\tconst pMap = match[0].paramsMap;\n\t\t\t\tif (pMap?.[pMap?.length - 1]?.[2]) return match;\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\tconst segment = segments[index];\n\tif (node.static) {\n\t\tconst staticChild = node.static[segment];\n\t\tif (staticChild) {\n\t\t\tconst match = _lookupTree(ctx, staticChild, method, segments, index + 1);\n\t\t\tif (match) return match;\n\t\t}\n\t}\n\tif (node.param) {\n\t\tconst match = _lookupTree(ctx, node.param, method, segments, index + 1);\n\t\tif (match) {\n\t\t\tif (node.param.hasRegexParam) {\n\t\t\t\tconst exactMatch = match.find((m) => m.paramsRegexp[index]?.test(segment)) || match.find((m) => !m.paramsRegexp[index]);\n\t\t\t\treturn exactMatch ? [exactMatch] : void 0;\n\t\t\t}\n\t\t\treturn match;\n\t\t}\n\t}\n\tif (node.wildcard && node.wildcard.methods) return node.wildcard.methods[method] || node.wildcard.methods[\"\"];\n}\n\n/**\n* Remove a route from the router context.\n*/\nfunction removeRoute(ctx, method, path) {\n\tconst segments = splitPath(path);\n\treturn _remove(ctx.root, method || \"\", segments, 0);\n}\nfunction _remove(node, method, segments, index) {\n\tif (index === segments.length) {\n\t\tif (node.methods && method in node.methods) {\n\t\t\tdelete node.methods[method];\n\t\t\tif (Object.keys(node.methods).length === 0) node.methods = void 0;\n\t\t}\n\t\treturn;\n\t}\n\tconst segment = segments[index];\n\tif (segment === \"*\") {\n\t\tif (node.param) {\n\t\t\t_remove(node.param, method, segments, index + 1);\n\t\t\tif (_isEmptyNode(node.param)) node.param = void 0;\n\t\t}\n\t\treturn;\n\t}\n\tif (segment.startsWith(\"**\")) {\n\t\tif (node.wildcard) {\n\t\t\t_remove(node.wildcard, method, segments, index + 1);\n\t\t\tif (_isEmptyNode(node.wildcard)) node.wildcard = void 0;\n\t\t}\n\t\treturn;\n\t}\n\tconst childNode = node.static?.[segment];\n\tif (childNode) {\n\t\t_remove(childNode, method, segments, index + 1);\n\t\tif (_isEmptyNode(childNode)) {\n\t\t\tdelete node.static[segment];\n\t\t\tif (Object.keys(node.static).length === 0) node.static = void 0;\n\t\t}\n\t}\n}\nfunction _isEmptyNode(node) {\n\treturn node.methods === void 0 && node.static === void 0 && node.param === void 0 && node.wildcard === void 0;\n}\n\n/**\n* Find all route patterns that match the given path.\n*/\nfunction findAllRoutes(ctx, method = \"\", path, opts) {\n\tif (path.charCodeAt(path.length - 1) === 47) path = path.slice(0, -1);\n\tconst segments = splitPath(path);\n\tconst matches = _findAll(ctx, ctx.root, method, segments, 0);\n\tif (opts?.params === false) return matches;\n\treturn matches.map((m) => {\n\t\treturn {\n\t\t\tdata: m.data,\n\t\t\tparams: m.paramsMap ? getMatchParams(segments, m.paramsMap) : void 0\n\t\t};\n\t});\n}\nfunction _findAll(ctx, node, method, segments, index, matches = []) {\n\tconst segment = segments[index];\n\tif (node.wildcard && node.wildcard.methods) {\n\t\tconst match = node.wildcard.methods[method] || node.wildcard.methods[\"\"];\n\t\tif (match) matches.push(...match);\n\t}\n\tif (node.param) {\n\t\t_findAll(ctx, node.param, method, segments, index + 1, matches);\n\t\tif (index === segments.length && node.param.methods) {\n\t\t\tconst match = node.param.methods[method] || node.param.methods[\"\"];\n\t\t\tif (match) {\n\t\t\t\tconst pMap = match[0].paramsMap;\n\t\t\t\tif (pMap?.[pMap?.length - 1]?.[2]) matches.push(...match);\n\t\t\t}\n\t\t}\n\t}\n\tconst staticChild = node.static?.[segment];\n\tif (staticChild) _findAll(ctx, staticChild, method, segments, index + 1, matches);\n\tif (index === segments.length && node.methods) {\n\t\tconst match = node.methods[method] || node.methods[\"\"];\n\t\tif (match) matches.push(...match);\n\t}\n\treturn matches;\n}\n\nfunction routeToRegExp(route = \"/\") {\n\tconst reSegments = [];\n\tlet idCtr = 0;\n\tfor (const segment of route.split(\"/\")) {\n\t\tif (!segment) continue;\n\t\tif (segment === \"*\") reSegments.push(`(?<_${idCtr++}>[^/]*)`);\n\t\telse if (segment.startsWith(\"**\")) reSegments.push(segment === \"**\" ? \"?(?<_>.*)\" : `?(?<${segment.slice(3)}>.+)`);\n\t\telse if (segment.includes(\":\")) reSegments.push(segment.replace(/:(\\w+)/g, (_, id) => `(?<${id}>[^/]+)`).replace(/\\./g, \"\\\\.\"));\n\t\telse reSegments.push(segment);\n\t}\n\treturn /* @__PURE__ */ new RegExp(`^/${reSegments.join(\"/\")}/?$`);\n}\n\nexport { NullProtoObj, addRoute, createRouter, findAllRoutes, findRoute, removeRoute, routeToRegExp };","/**\n * Router and endpoint definition module for AgentBuilder.\n *\n * This module re-exports endpoint types from @standardagents/spec and provides\n * the runtime router implementation for handling HTTP requests.\n *\n * @module\n */\n\nimport { createRouter, findRoute } from \"rou3\";\nimport type { ThreadInstance, ThreadMetadata } from \"../agents/types.js\";\nimport { ThreadStateImpl } from \"../agents/ThreadStateImpl.js\";\n\n// Re-export types from spec package (for external users)\nexport {\n type VirtualModuleLoader,\n type VirtualModuleRegistry,\n type ControllerReturn,\n type ThreadEndpointHandler,\n defineThreadEndpoint,\n} from '@standardagents/spec';\n\n// Import spec's defineController for external users who want the abstract version\nimport { defineController as specDefineController } from '@standardagents/spec';\nexport { specDefineController };\n\n// Import types for use in this module\nimport type {\n ControllerContext as SpecControllerContext,\n Controller as SpecController,\n} from '@standardagents/spec';\n\n// ============================================================================\n// Cloudflare-Specific Types (Builder Implementation)\n// ============================================================================\n\n/**\n * Durable Object namespace interface.\n * This is Cloudflare-specific and used by the builder runtime.\n */\nexport interface DurableObjectNamespace<T = unknown> {\n idFromName(name: string): DurableObjectId;\n idFromString(id: string): DurableObjectId;\n newUniqueId(): DurableObjectId;\n get(id: DurableObjectId): DurableObjectStub<T>;\n}\n\n/**\n * Durable Object ID interface.\n */\nexport interface DurableObjectId {\n toString(): string;\n equals(other: DurableObjectId): boolean;\n}\n\n/**\n * Durable Object stub interface.\n * The generic type T represents the RPC methods available on the stub.\n */\nexport type DurableObjectStub<T = unknown> = {\n id: DurableObjectId;\n name?: string;\n fetch(request: Request | string, requestInitr?: RequestInit): Promise<Response>;\n} & T;\n\n/**\n * Log entry from DurableThread.getLogs()\n */\nexport interface LogEntry {\n id: string;\n message_id: string;\n provider: string;\n model: string;\n model_name: string | null;\n prompt_name: string | null;\n tools_called: string | null;\n parent_log_id: string | null;\n retry_of_log_id: string | null;\n error: string | null;\n cost_total: number | null;\n is_complete: number;\n created_at: number;\n request_body: string | null;\n}\n\n/**\n * Agent definition returned from loadAgent()\n */\nexport interface AgentDefinition {\n name: string;\n title?: string;\n type?: string;\n description?: string;\n icon?: string;\n defaultPrompt?: string;\n defaultModel?: string;\n tools?: string[];\n [key: string]: unknown;\n}\n\n/**\n * Response from getThreadMeta()\n */\nexport interface ThreadMetaResponse {\n thread: ThreadRegistryEntry;\n agent: AgentDefinition | null;\n stats: {\n messageCount: number;\n logCount: number;\n lastActivity: number | null;\n };\n}\n\n/**\n * RPC methods exposed by DurableThread for external callers.\n */\nexport interface DurableThreadRpc {\n stop(): Promise<Response>;\n getMessages(\n limit?: number,\n offset?: number,\n order?: \"ASC\" | \"DESC\",\n includeSilent?: boolean,\n maxDepth?: number\n ): Promise<{ messages: unknown[]; total: number; hasMore: boolean }>;\n deleteMessage(messageId: string): Promise<{ success: boolean; error?: string }>;\n updateMessageContent(messageId: string, content: string): Promise<{ success: boolean; error?: string }>;\n getLogs(\n limit?: number,\n offset?: number,\n order?: \"ASC\" | \"DESC\"\n ): Promise<{ logs: LogEntry[]; total: number; hasMore: boolean }>;\n getLogDetails(logId: string): Promise<unknown>;\n getThreadMeta(threadId: string): Promise<ThreadMetaResponse | null>;\n deleteThread(): Promise<void>;\n}\n\n/**\n * Thread registry entry from DurableAgentBuilder.\n */\nexport interface ThreadRegistryEntry {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n created_at: number;\n}\n\n/**\n * RPC methods exposed by DurableAgentBuilder for external callers.\n */\nexport interface DurableAgentBuilderRpc {\n createThread(params: { agent_name: string; user_id?: string; tags?: string[] }): Promise<ThreadRegistryEntry>;\n getThread(threadId: string): Promise<ThreadRegistryEntry | null>;\n listThreads(params?: {\n agent_name?: string;\n user_id?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ threads: ThreadRegistryEntry[]; total: number }>;\n deleteThread(threadId: string): Promise<void>;\n getUserByUsername(username: string): Promise<unknown>;\n createSession(session: { user_id: string; token_hash: string; expires_at: number }): Promise<void>;\n loadAgent(name: string): Promise<AgentDefinition>;\n}\n\n/**\n * Minimum required environment bindings for thread endpoints.\n * User's Env interface should extend this.\n *\n * This is Cloudflare-specific and used by the builder runtime.\n */\nexport interface ThreadEnv {\n AGENT_BUILDER_THREAD: DurableObjectNamespace<DurableThreadRpc>;\n AGENT_BUILDER: DurableObjectNamespace<DurableAgentBuilderRpc>;\n [key: string]: unknown;\n}\n\n/**\n * Builder-specific controller context with typed env.\n *\n * This extends the spec's ControllerContext with proper typing for\n * Cloudflare environment bindings.\n */\nexport interface BuilderControllerContext<Env extends ThreadEnv = ThreadEnv>\n extends Omit<SpecControllerContext, 'env'> {\n env: Env;\n}\n\n/**\n * Builder-specific controller type with typed env.\n */\nexport type BuilderController<Env extends ThreadEnv = ThreadEnv> = (\n context: BuilderControllerContext<Env>\n) => ReturnType<SpecController>;\n\n/**\n * Thread endpoint context with access to thread instance and metadata.\n */\nexport interface ThreadEndpointContext {\n req: Request;\n thread: {\n instance: ThreadInstance;\n metadata: ThreadMetadata;\n };\n}\n\n// Export builder-specific types as the default types for internal use\n// (these are what internal API files use when they import from this module)\nexport type { BuilderControllerContext as ControllerContext };\nexport type { BuilderController as Controller };\n\n// ============================================================================\n// Builder Controller Helpers\n// ============================================================================\n\n/**\n * Define a controller with typed Cloudflare environment bindings.\n *\n * This is the builder's version of defineController that provides\n * proper typing for AGENT_BUILDER_THREAD and other CF bindings.\n *\n * @example\n * ```typescript\n * import { defineController } from '../router/index.js';\n *\n * export default defineController(async ({ req, env }) => {\n * const stub = env.AGENT_BUILDER.get(env.AGENT_BUILDER.idFromName('singleton'));\n * // ...\n * });\n * ```\n */\nexport function defineController<Env extends ThreadEnv = ThreadEnv>(\n controller: BuilderController<Env>\n): BuilderController<Env> {\n return controller;\n}\n\n// ============================================================================\n// Router Implementation\n// ============================================================================\n\nexport async function route<Env extends ThreadEnv = ThreadEnv>(\n url: URL,\n request: Request,\n env: Env\n): Promise<Response | null> {\n const router = createRouter<() => Promise<SpecController>>();\n // @ts-ignore-next-line\n const routesLoader = await import(\"virtual:@standardagents-routes\");\n routesLoader.default(router);\n\n // Check for API routes first\n const route = findRoute<() => Promise<SpecController>>(\n router,\n request.method.toUpperCase(),\n url.pathname\n );\n\n if (route) {\n const controller = await route.data();\n const context: BuilderControllerContext<Env> = {\n req: request,\n params: route.params || {},\n env: env,\n url: url,\n };\n const result = await controller(context as SpecControllerContext);\n\n if (result instanceof Response) {\n return result;\n }\n if (typeof result === \"string\") {\n return new Response(result, {\n headers: {\n \"Content-Type\": \"text/plain\",\n },\n });\n }\n return Response.json(result);\n }\n\n // No API route found - not handled by this router\n // Static assets and SPA routing are handled by Cloudflare Workers Assets binding\n // configured in wrangler.jsonc\n return null;\n}\n\n// ============================================================================\n// Thread Endpoint Runtime\n// ============================================================================\n\n/**\n * Runtime implementation for defineThreadEndpoint.\n *\n * This wraps the spec's defineThreadEndpoint to provide the actual\n * thread lookup and ThreadState creation at runtime.\n *\n * @param handler - Function that receives the request and ThreadState\n * @returns A Controller that can be used with the router\n *\n * @example\n * // agentbuilder/api/threads/[id]/status.get.ts\n * import { defineThreadEndpoint } from '@standardagents/spec';\n *\n * export default defineThreadEndpoint(async (req, state) => {\n * const { messages } = await state.getMessages({ limit: 1 });\n * return Response.json({ status: \"ok\", messageCount: messages.length });\n * });\n */\nexport function createThreadEndpointHandler<Env extends ThreadEnv = ThreadEnv>(\n handler: (\n req: Request,\n context: ThreadEndpointContext[\"thread\"]\n ) => Response | Promise<Response>\n): BuilderController<Env> {\n return (async ({ req, params, env }: BuilderControllerContext<Env>) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Get thread metadata from DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const metadata = await agentBuilder.getThread(threadId) as ThreadMetadata | null;\n\n if (!metadata) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Create ThreadInstance reference\n // Note: We can't access ctx and env directly, but we can call RPC methods\n const instance = stub as unknown as ThreadInstance;\n\n // Call handler with thread context\n return await handler(req, {\n instance,\n metadata,\n });\n } catch (error: any) {\n console.error(`Error in thread endpoint for ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Internal server error\" },\n { status: 500 }\n );\n }\n }) as BuilderController<Env>;\n}\n","import { defineController } from \"../router/index\";\n\nexport default defineController(() => {\n const stream = new ReadableStream({\n start(controller) {\n const text = \"hello world\";\n let index = 0;\n const next = () => {\n if (index < text.length) {\n controller.enqueue(new TextEncoder().encode(text[index]));\n index++;\n setTimeout(next, 100);\n } else {\n controller.close();\n }\n };\n next();\n },\n });\n return new Response(stream);\n});\n","import { defineController } from '../router/index.js';\nimport type { AgentDefinition } from '../sdk/defineAgent.js';\n\n/**\n * GET /api/agents\n *\n * List all defined agents from the agentbuilder/agents directory.\n * Returns agent configuration data loaded from TypeScript files.\n *\n * Returns:\n * - HTTP 200: { agents: Array<{ id, title, type, sideA, sideB, ... }> }\n */\nexport default defineController(async ({ agents, agentNames, prompts, promptNames }) => {\n if (!agents || !agentNames) {\n return Response.json({ agents: [] });\n }\n\n // Build a map of prompts for quick lookup\n const promptMap: Record<string, any> = {};\n if (prompts && promptNames) {\n await Promise.all(\n promptNames.map(async (name: string) => {\n try {\n const loader = prompts[name];\n if (loader) {\n promptMap[name] = await loader();\n }\n } catch (error) {\n // Skip failed prompts\n }\n })\n );\n }\n\n const agentList = await Promise.all(\n agentNames.map(async (name: string) => {\n try {\n const loader = agents[name];\n if (!loader) {\n return null;\n }\n const definition = await loader() as AgentDefinition;\n\n // Get prompt names for sides\n const sideAPrompt = promptMap[definition.sideA?.prompt];\n const sideBPrompt = definition.sideB\n ? promptMap[definition.sideB?.prompt]\n : null;\n\n return {\n id: definition.name,\n name: definition.name,\n title: definition.title,\n type: definition.type || 'ai_human',\n\n // Side A configuration\n side_a_label: definition.sideA?.label || null,\n side_a_agent_prompt: definition.sideA?.prompt,\n side_a_agent_prompt_name: sideAPrompt?.name || definition.sideA?.prompt,\n side_a_stop_on_response:\n definition.sideA?.stopOnResponse !== undefined\n ? definition.sideA.stopOnResponse\n : true,\n side_a_stop_tool: definition.sideA?.stopTool || null,\n side_a_stop_tool_response_property:\n definition.sideA?.stopToolResponseProperty || null,\n side_a_max_steps: definition.sideA?.maxSteps || null,\n side_a_end_session_tool:\n definition.sideA?.endSessionTool || null,\n side_a_manual_stop_condition:\n definition.sideA?.manualStopCondition || false,\n\n // Side B configuration (if dual_ai)\n side_b_label: definition.sideB?.label || null,\n side_b_agent_prompt: definition.sideB?.prompt || null,\n side_b_agent_prompt_name: sideBPrompt?.name || definition.sideB?.prompt || null,\n side_b_stop_on_response:\n definition.sideB?.stopOnResponse !== undefined\n ? definition.sideB.stopOnResponse\n : true,\n side_b_stop_tool: definition.sideB?.stopTool || null,\n side_b_stop_tool_response_property:\n definition.sideB?.stopToolResponseProperty || null,\n side_b_max_steps: definition.sideB?.maxSteps || null,\n side_b_end_session_tool:\n definition.sideB?.endSessionTool || null,\n side_b_manual_stop_condition:\n definition.sideB?.manualStopCondition || false,\n\n // Session configuration\n max_session_turns: definition.maxSessionTurns || null,\n\n // Tool exposure\n expose_as_tool: definition.exposeAsTool || false,\n tool_description: definition.toolDescription || null,\n\n created_at: Math.floor(Date.now() / 1000),\n };\n } catch (error) {\n console.error(`Error loading agent ${name}:`, error);\n return null;\n }\n })\n );\n\n // Filter out any null entries from failed loads\n const validAgents = agentList.filter(Boolean);\n\n return Response.json({ agents: validAgents });\n});\n","/**\n * Authentication utilities for user sessions, API keys, and password hashing\n */\n\n/**\n * Generate a cryptographically secure random string\n */\nexport function generateSecureToken(length: number = 32): string {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Generate a user session token with prefix\n */\nexport function generateUserToken(): string {\n return `agtuser_${generateSecureToken(32)}`;\n}\n\n/**\n * Generate an API key with prefix\n */\nexport function generateApiKey(): string {\n return `agtbldr_${generateSecureToken(32)}`;\n}\n\n/**\n * Hash a password using PBKDF2\n */\nexport async function hashPassword(password: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(password);\n\n // Generate a random salt\n const salt = crypto.getRandomValues(new Uint8Array(16));\n\n // Import the password as a key\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n data,\n { name: 'PBKDF2' },\n false,\n ['deriveBits']\n );\n\n // Derive bits using PBKDF2\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt: salt,\n iterations: 100000,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n );\n\n // Combine salt and hash\n const hashArray = new Uint8Array(derivedBits);\n const combined = new Uint8Array(salt.length + hashArray.length);\n combined.set(salt);\n combined.set(hashArray, salt.length);\n\n // Return as base64\n return bufferToBase64(combined);\n}\n\n/**\n * Verify a password against its hash\n */\nexport async function verifyPassword(password: string, hash: string): Promise<boolean> {\n try {\n const combined = base64ToBuffer(hash);\n\n // Extract salt and hash\n const salt = combined.slice(0, 16);\n const storedHash = combined.slice(16);\n\n const encoder = new TextEncoder();\n const data = encoder.encode(password);\n\n // Import the password as a key\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n data,\n { name: 'PBKDF2' },\n false,\n ['deriveBits']\n );\n\n // Derive bits using the same salt\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt: salt,\n iterations: 100000,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n );\n\n const derivedHash = new Uint8Array(derivedBits);\n\n // Compare hashes\n if (derivedHash.length !== storedHash.length) {\n return false;\n }\n\n let matches = true;\n for (let i = 0; i < derivedHash.length; i++) {\n if (derivedHash[i] !== storedHash[i]) {\n matches = false;\n }\n }\n\n return matches;\n } catch (error) {\n console.error('Error verifying password:', error);\n return false;\n }\n}\n\n/**\n * Hash a token or API key using SHA-256\n */\nexport async function hashToken(token: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(token);\n\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = new Uint8Array(hashBuffer);\n\n return Array.from(hashArray, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Extract the last N characters from a string\n */\nexport function getLastChars(str: string, count: number = 5): string {\n return str.slice(-count);\n}\n\n/**\n * Extract the prefix from a token (e.g., \"agtuser_\" or \"agtbldr_\")\n */\nexport function getTokenPrefix(token: string): string {\n const match = token.match(/^([^_]+_)/);\n return match ? match[1] : '';\n}\n\n/**\n * Validate token format\n */\nexport function isValidUserToken(token: string): boolean {\n return token.startsWith('agtuser_') && token.length > 10;\n}\n\n/**\n * Validate API key format\n */\nexport function isValidApiKey(key: string): boolean {\n return key.startsWith('agtbldr_') && key.length > 10;\n}\n\n/**\n * Generate a UUID v4\n */\nexport function generateId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Sign a token payload using HMAC-SHA256 with the encryption key\n * Returns a signed token in the format: base64(payload).base64(signature)\n */\nexport async function signToken(payload: string, encryptionKey: string): Promise<string> {\n const encoder = new TextEncoder();\n\n // Import the encryption key for HMAC\n const keyData = encoder.encode(encryptionKey);\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n // Sign the payload\n const payloadData = encoder.encode(payload);\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, payloadData);\n\n // Convert to base64\n const payloadB64 = bufferToBase64(new Uint8Array(payloadData));\n const signatureB64 = bufferToBase64(new Uint8Array(signature));\n\n return `${payloadB64}.${signatureB64}`;\n}\n\n/**\n * Verify a signed token and extract its payload\n * Returns the payload if valid, null if invalid\n */\nexport async function verifySignedToken(signedToken: string, encryptionKey: string): Promise<string | null> {\n try {\n const parts = signedToken.split('.');\n if (parts.length !== 2) {\n return null;\n }\n\n const [payloadB64, signatureB64] = parts;\n const encoder = new TextEncoder();\n\n // Import the encryption key for HMAC\n const keyData = encoder.encode(encryptionKey);\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify']\n );\n\n // Decode the payload and signature\n const payloadData = base64ToBuffer(payloadB64);\n const signature = base64ToBuffer(signatureB64);\n\n // Verify the signature\n const isValid = await crypto.subtle.verify('HMAC', cryptoKey, signature, payloadData);\n\n if (!isValid) {\n return null;\n }\n\n // Decode payload to string\n const decoder = new TextDecoder();\n return decoder.decode(payloadData);\n } catch (error) {\n console.error('Error verifying signed token:', error);\n return null;\n }\n}\n\n/**\n * Generate a signed super admin token\n * Payload format: super_admin:timestamp:nonce\n */\nexport async function generateSuperAdminToken(encryptionKey: string): Promise<string> {\n const timestamp = Date.now();\n const nonce = generateSecureToken(16);\n const payload = `super_admin:${timestamp}:${nonce}`;\n return await signToken(payload, encryptionKey);\n}\n\n/**\n * Verify a super admin token\n * Returns true if valid, false otherwise\n */\nexport async function verifySuperAdminToken(token: string, encryptionKey: string): Promise<boolean> {\n const payload = await verifySignedToken(token, encryptionKey);\n if (!payload) {\n return false;\n }\n\n // Check payload format\n const parts = payload.split(':');\n if (parts.length !== 3 || parts[0] !== 'super_admin') {\n return false;\n }\n\n // Optionally check timestamp for expiration (30 days)\n const timestamp = parseInt(parts[1], 10);\n const age = Date.now() - timestamp;\n const maxAge = 30 * 24 * 60 * 60 * 1000; // 30 days\n\n if (age > maxAge) {\n return false;\n }\n\n return true;\n}\n\n// Helper functions\nfunction bufferToBase64(buffer: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < buffer.byteLength; i++) {\n binary += String.fromCharCode(buffer[i]);\n }\n return btoa(binary);\n}\n\nfunction base64ToBuffer(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","/**\n * Authentication middleware for protecting API routes\n *\n * Supports multiple authentication types:\n * - Super admin token (signed with ENCRYPTION_KEY)\n * - User session token (validated against DurableAgentBuilder)\n * - API key (validated against DurableAgentBuilder)\n */\n\nimport {\n verifySuperAdminToken,\n hashToken,\n isValidUserToken,\n isValidApiKey,\n} from '../utils/auth.js';\n\nexport interface AuthUser {\n id: string;\n username: string;\n role: string;\n}\n\nexport interface AuthContext {\n user: AuthUser;\n authType: 'super_admin' | 'session' | 'api_key';\n}\n\n/**\n * Extract bearer token from Authorization header or query parameter (for WebSockets)\n */\nfunction extractBearerToken(request: Request): string | null {\n // First try Authorization header\n const authHeader = request.headers.get('Authorization');\n if (authHeader && authHeader.startsWith('Bearer ')) {\n return authHeader.substring(7);\n }\n\n // For WebSocket upgrade requests, check query parameter\n const isWebSocket =\n request.headers.get('upgrade')?.toLowerCase() === 'websocket';\n if (isWebSocket) {\n try {\n const url = new URL(request.url);\n const token = url.searchParams.get('token');\n if (token) {\n return token;\n }\n } catch (err) {\n // Invalid URL, continue\n }\n }\n\n return null;\n}\n\n/**\n * Get DurableAgentBuilder singleton stub\n */\nfunction getAgentBuilder(env: any): any {\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n return env.AGENT_BUILDER.get(agentBuilderId);\n}\n\n/**\n * Authenticate a request using various token types\n */\nexport async function authenticate(\n request: Request,\n env: any\n): Promise<AuthContext | null> {\n const token = extractBearerToken(request);\n\n if (!token) {\n return null;\n }\n\n // Check if it's a signed super admin token (if super admin is configured)\n if (env.SUPER_ADMIN_PASSWORD && env.ENCRYPTION_KEY) {\n // Token contains a dot, might be a signed token\n if (token.includes('.')) {\n const isValidSuperAdmin = await verifySuperAdminToken(\n token,\n env.ENCRYPTION_KEY\n );\n if (isValidSuperAdmin) {\n return {\n user: {\n id: 'super_admin',\n username: 'admin',\n role: 'admin',\n },\n authType: 'super_admin',\n };\n }\n }\n }\n\n // Check if it's a user session token\n if (isValidUserToken(token)) {\n const tokenHash = await hashToken(token);\n const agentBuilder = getAgentBuilder(env);\n\n const session = await agentBuilder.validateSession(tokenHash);\n if (session) {\n // Get user details\n const user = await agentBuilder.getUserById(session.user_id);\n if (user) {\n return {\n user: {\n id: user.id,\n username: user.username,\n role: user.role,\n },\n authType: 'session',\n };\n }\n }\n }\n\n // Check if it's an API key\n if (isValidApiKey(token)) {\n const keyHash = await hashToken(token);\n const agentBuilder = getAgentBuilder(env);\n\n const apiKey = await agentBuilder.validateApiKey(keyHash);\n if (apiKey) {\n // Get user details\n const user = await agentBuilder.getUserById(apiKey.user_id);\n if (user) {\n return {\n user: {\n id: user.id,\n username: user.username,\n role: user.role,\n },\n authType: 'api_key',\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Middleware to require authentication\n * Returns 401 if not authenticated\n */\nexport async function requireAuth(\n request: Request,\n env: any\n): Promise<AuthContext | Response> {\n const authContext = await authenticate(request, env);\n\n if (!authContext) {\n return new Response(JSON.stringify({ error: 'Unauthorized' }), {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n return authContext;\n}\n\n/**\n * Middleware to require admin role\n * Returns 401 if not authenticated, 403 if not admin\n */\nexport async function requireAdmin(\n request: Request,\n env: any\n): Promise<AuthContext | Response> {\n const result = await requireAuth(request, env);\n\n if (result instanceof Response) {\n return result;\n }\n\n if (result.user.role !== 'admin') {\n return new Response(\n JSON.stringify({ error: 'Forbidden: Admin access required' }),\n {\n status: 403,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n }\n\n return result;\n}\n","import { defineController } from '../../router/index.js';\nimport { requireAuth } from '../../middleware/auth.js';\n\n/**\n * GET /api/api-keys\n *\n * List API keys for the authenticated user.\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Returns:\n * - HTTP 200: { keys: [{ id, name, key_prefix, last_five, created_at, last_used_at }] }\n * - HTTP 401: Not authenticated\n */\nexport default defineController(async ({ req, env }) => {\n try {\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n\n // Super admin has no API keys - they need to create a user first\n if (authResult.authType === 'super_admin') {\n return Response.json({ keys: [], message: 'Super admin has no API keys. Create a user account to manage API keys.' });\n }\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n const keys = await agentBuilder.listApiKeys(authResult.user.id);\n\n return Response.json({ keys });\n } catch (error: any) {\n console.error('List API keys error:', error);\n return Response.json(\n { error: error.message || 'Failed to list API keys' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { requireAuth } from '../../middleware/auth.js';\nimport { generateApiKey, hashToken, getLastChars, getTokenPrefix } from '../../utils/auth.js';\n\n/**\n * POST /api/api-keys\n *\n * Create a new API key for the authenticated user.\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Body:\n * - name: string (name/description for the API key)\n *\n * Returns:\n * - HTTP 201: { key: <full_api_key>, id, name, key_prefix, last_five, created_at }\n * NOTE: The full key is only returned once on creation\n * - HTTP 400: Missing required fields\n * - HTTP 401: Not authenticated\n */\nexport default defineController(async ({ req, env }) => {\n try {\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n\n // Super admin cannot create API keys - they need to create a user first\n if (authResult.authType === 'super_admin') {\n return Response.json(\n { error: 'Super admin cannot create API keys. Please create a user account first.' },\n { status: 400 }\n );\n }\n\n const body = await req.json() as { name?: string };\n const { name } = body;\n\n if (!name || typeof name !== 'string') {\n return Response.json(\n { error: 'Name is required' },\n { status: 400 }\n );\n }\n\n if (name.length < 1 || name.length > 100) {\n return Response.json(\n { error: 'Name must be between 1 and 100 characters' },\n { status: 400 }\n );\n }\n\n // Generate the API key\n const apiKey = generateApiKey();\n const keyHash = await hashToken(apiKey);\n const keyPrefix = getTokenPrefix(apiKey);\n const lastFive = getLastChars(apiKey, 5);\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n const id = await agentBuilder.createApiKey({\n name,\n key_hash: keyHash,\n key_prefix: keyPrefix,\n last_five: lastFive,\n user_id: authResult.user.id,\n });\n\n const now = Math.floor(Date.now() / 1000);\n\n return Response.json({\n key: apiKey, // Only returned once on creation\n id,\n name,\n key_prefix: keyPrefix,\n last_five: lastFive,\n created_at: now,\n }, { status: 201 });\n } catch (error: any) {\n console.error('Create API key error:', error);\n return Response.json(\n { error: error.message || 'Failed to create API key' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../router/index\";\n\nexport default defineController(async ({ config }) => {\n return Response.json(config);\n});\n","import { defineController } from '../router/index.js';\nimport type { AgentDefinition } from '../sdk/defineAgent.js';\n\n/**\n * GET /api/diagnostics\n *\n * Returns diagnostic warnings about the current configuration.\n * This includes:\n * - Duplicate tool names (filesystem tools, prompts, agents with same name)\n *\n * Returns:\n * - HTTP 200: { warnings: Array<{ type, message, details }> }\n */\nexport default defineController(async ({ tools, prompts, promptNames, agents, agentNames }) => {\n const warnings: Array<{ type: string; message: string; details: any }> = [];\n\n // Track tool names and their sources\n const toolNameSources = new Map<string, Set<string>>();\n\n // Check filesystem tools\n if (tools) {\n const toolNames = Object.keys(tools);\n for (const name of toolNames) {\n const sources = toolNameSources.get(name) || new Set();\n sources.add('native tool');\n toolNameSources.set(name, sources);\n }\n }\n\n // Check prompts (all prompts are exposed as tools)\n if (prompts && promptNames) {\n for (const name of promptNames) {\n const sources = toolNameSources.get(name) || new Set();\n sources.add('prompt');\n toolNameSources.set(name, sources);\n }\n }\n\n // Check agents exposed as tools\n if (agents && agentNames) {\n for (const name of agentNames) {\n try {\n const loader = agents[name];\n if (loader) {\n const definition = await loader() as AgentDefinition;\n if (definition.exposeAsTool) {\n const sources = toolNameSources.get(name) || new Set();\n sources.add('agent');\n toolNameSources.set(name, sources);\n }\n }\n } catch {\n // Skip agents that fail to load\n }\n }\n }\n\n // Find duplicates\n for (const [name, sources] of toolNameSources) {\n if (sources.size > 1) {\n warnings.push({\n type: 'duplicate_tool_name',\n message: `Duplicate tool name \"${name}\" detected`,\n details: {\n name,\n sources: [...sources],\n },\n });\n }\n }\n\n return Response.json({ warnings });\n});\n","import { defineController } from '../router/index.js';\n\n/**\n * GET /api/events\n *\n * WebSocket endpoint for real-time events from the AgentBuilder system.\n *\n * Events:\n * - thread_created: { type: 'thread_created', thread: ThreadRegistryEntry }\n * - thread_deleted: { type: 'thread_deleted', threadId: string }\n *\n * Usage:\n * Connect via WebSocket to receive real-time updates when threads are\n * created or deleted in the system.\n */\nexport default defineController(async ({ req, env }) => {\n // Only handle WebSocket upgrade requests\n if (req.headers.get('upgrade')?.toLowerCase() !== 'websocket') {\n return Response.json(\n { error: 'This endpoint requires a WebSocket connection' },\n { status: 400 }\n );\n }\n\n try {\n // Forward the WebSocket upgrade to the DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const stub = env.AGENT_BUILDER.get(agentBuilderId);\n return await stub.fetch(req);\n } catch (error: any) {\n console.error('Error establishing events WebSocket:', error);\n return Response.json(\n { error: error.message || 'Failed to establish WebSocket connection' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../router/index.js';\nimport type { ModelDefinition } from '../sdk/defineModel.js';\n\n/**\n * GET /api/models\n *\n * List all defined models from the agentbuilder/models directory.\n * Returns model configuration data loaded from TypeScript files.\n *\n * Returns:\n * - HTTP 200: { models: Array<{ id, name, provider, model, fallbacks, ... }> }\n */\nexport default defineController(async ({ models, modelNames }) => {\n if (!models || !modelNames) {\n return Response.json({ models: [] });\n }\n\n const modelList = await Promise.all(\n modelNames.map(async (name: string) => {\n try {\n const loader = models[name];\n if (!loader) {\n return null;\n }\n const definition = await loader() as ModelDefinition;\n\n // Build fallback objects for display\n const fallbackObjects = (definition.fallbacks || []).map(\n (fallbackName: string, index: number) => ({\n id: fallbackName,\n name: fallbackName,\n order: index,\n })\n );\n\n return {\n id: definition.name,\n name: definition.name,\n provider: definition.provider,\n model: definition.model,\n input_price: definition.inputPrice,\n output_price: definition.outputPrice,\n cached_price: definition.cachedPrice,\n included_providers: definition.includedProviders,\n fallbacks: fallbackObjects,\n created_at: Math.floor(Date.now() / 1000), // Not persisted, use current time\n };\n } catch (error) {\n console.error(`Error loading model ${name}:`, error);\n return null;\n }\n })\n );\n\n // Filter out any null entries from failed loads\n const validModels = modelList.filter(Boolean);\n\n return Response.json({ models: validModels });\n});\n","import { defineController } from '../router'\n\nexport default defineController(async ({ req, params, env }) => {\n return { message: 'Modified new test API route', timestamp: new Date().toISOString() }\n})","import { defineController } from '../router/index.js';\nimport { z } from 'zod';\nimport type { PromptDefinition } from '../sdk/definePrompt.js';\n\n/**\n * Convert a Zod schema to JSON Schema format\n */\nfunction toJSONSchema(schema: any): any {\n if (!schema) return null;\n // If it's a Zod schema, convert it\n if (schema && typeof schema === 'object' && ('~standard' in schema || '_def' in schema)) {\n return z.toJSONSchema(schema);\n }\n // Already JSON Schema or plain object\n return schema;\n}\n\n/**\n * Normalize prompt content for API response.\n * - Arrays (StructuredPrompt) are serialized to JSON strings for backward compatibility\n * - Plain strings are returned as-is\n */\nfunction normalizePromptContent(prompt: string | any[] | undefined): string {\n if (!prompt) return '';\n // If it's an array (StructuredPrompt), serialize to JSON\n if (Array.isArray(prompt)) {\n return JSON.stringify(prompt);\n }\n // Plain string, return as-is\n return prompt;\n}\n\n/**\n * GET /api/prompts\n *\n * List all defined prompts from the agentbuilder/prompts directory.\n * Returns prompt configuration data loaded from TypeScript files.\n *\n * Returns:\n * - HTTP 200: { prompts: Array<{ id, name, tool_description, prompt, model, ... }> }\n */\nexport default defineController(async ({ prompts, promptNames, models, modelNames }) => {\n if (!prompts || !promptNames) {\n return Response.json({ prompts: [] });\n }\n\n // Build a map of models for quick lookup\n const modelMap: Record<string, any> = {};\n if (models && modelNames) {\n await Promise.all(\n modelNames.map(async (name: string) => {\n try {\n const loader = models[name];\n if (loader) {\n modelMap[name] = await loader();\n }\n } catch (error) {\n // Skip failed models\n }\n })\n );\n }\n\n const promptList = await Promise.all(\n promptNames.map(async (name: string) => {\n try {\n const loader = prompts[name];\n if (!loader) {\n return null;\n }\n const definition = await loader() as PromptDefinition;\n const modelDef = modelMap[definition.model];\n\n // Extract tool names from tools array\n const tools = (definition.tools || []).map((tool: string | { name: string }) =>\n typeof tool === 'string' ? tool : tool.name\n );\n\n return {\n id: definition.name,\n name: definition.name,\n tool_description: definition.toolDescription,\n prompt: normalizePromptContent(definition.prompt),\n required_schema: toJSONSchema(definition.requiredSchema),\n model_id: definition.model,\n model_name: modelDef?.name || definition.model,\n model_provider: modelDef?.provider || 'unknown',\n include_chat: definition.includeChat || false,\n include_past_tools: definition.includePastTools || false,\n parallel_tool_calls: definition.parallelToolCalls || false,\n tool_choice: definition.toolChoice || 'auto',\n tools: tools,\n reasoning: definition.reasoning || null,\n created_at: Math.floor(Date.now() / 1000),\n };\n } catch (error) {\n console.error(`Error loading prompt ${name}:`, error);\n return null;\n }\n })\n );\n\n // Filter out any null entries from failed loads\n const validPrompts = promptList.filter(Boolean);\n\n return Response.json({ prompts: validPrompts });\n});\n","import { defineController } from '../router/index.js';\n\n/**\n * Supported provider configurations.\n * Each provider has specific SDK type and API key environment variable.\n */\nconst SUPPORTED_PROVIDERS = [\n {\n name: 'openai',\n sdk: 'openai',\n label: 'OpenAI',\n envKey: 'OPENAI_API_KEY',\n },\n {\n name: 'openrouter',\n sdk: 'openrouter',\n label: 'OpenRouter',\n envKey: 'OPENROUTER_API_KEY',\n },\n];\n\n/**\n * GET /api/providers\n *\n * List all supported providers and their configuration status.\n * Providers are detected based on environment variables.\n *\n * Returns:\n * - HTTP 200: { providers: Array<{ name, sdk, hasApiKey }> }\n */\nexport default defineController(async ({ env }) => {\n const providers = SUPPORTED_PROVIDERS.map((provider) => ({\n name: provider.name,\n sdk: provider.sdk,\n label: provider.label,\n hasApiKey: Boolean(env[provider.envKey]),\n }));\n\n return Response.json({ providers });\n});\n","import { defineController } from \"../../router/index\";\nimport type { Message, Env } from \"../../agents/types\";\nimport { requireAuth } from \"../../middleware/auth\";\n\n/**\n * POST /api/threads\n *\n * Create a new thread and start execution\n *\n * Request body:\n * {\n * agent_id: string, // Required: Agent name (from TypeScript config)\n * initial_messages: Message[], // Optional: Initial conversation messages\n * data?: Record<string, any>, // Optional: Additional context data\n * tags?: string[] // Optional: Tags for searching/filtering threads\n * }\n *\n * Note: user_id is automatically set based on authentication:\n * - super_admin: user_id = null\n * - regular user: user_id = authenticated user's ID\n *\n * Returns:\n * - HTTP 200: Thread created successfully\n * - HTTP 400: Validation error\n * - HTTP 401: Unauthorized\n * - HTTP 404: Agent not found\n * - HTTP 500: Execution error\n *\n * WebSocket upgrade available for real-time telemetry\n */\nexport default defineController<Env>(async ({ req, env }) => {\n // Require authentication\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n const auth = authResult;\n // Parse request body\n let body: {\n agent_id?: string;\n initial_messages?: Message[];\n data?: Record<string, any>;\n tags?: string[];\n };\n\n try {\n body = await req.json();\n } catch (error) {\n return Response.json(\n { error: \"Invalid JSON in request body\" },\n { status: 400 }\n );\n }\n\n const { agent_id, initial_messages, data, tags } = body;\n\n // Determine user_id based on auth context\n // - super_admin: user_id = null (not associated with any user)\n // - regular user: user_id = their own user ID\n const user_id = auth.authType === 'super_admin' ? null : auth.user.id;\n\n // Validate required fields\n if (!agent_id) {\n return Response.json(\n { error: \"Missing required field: agent_id\" },\n { status: 400 }\n );\n }\n\n // initial_messages is now optional - if not provided, thread starts with no messages\n if (initial_messages !== undefined && initial_messages !== null) {\n if (!Array.isArray(initial_messages)) {\n return Response.json(\n { error: \"initial_messages must be an array\" },\n { status: 400 }\n );\n }\n }\n\n // Validate tags if provided\n if (tags !== undefined && tags !== null) {\n if (!Array.isArray(tags)) {\n return Response.json(\n { error: \"tags must be an array of strings\" },\n { status: 400 }\n );\n }\n if (!tags.every((tag) => typeof tag === \"string\")) {\n return Response.json(\n { error: \"All tags must be strings\" },\n { status: 400 }\n );\n }\n }\n\n // Get the root AgentBuilder DO\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId);\n\n // Validate agent exists by trying to load it\n try {\n await agentBuilder.loadAgent(agent_id);\n } catch (error) {\n return Response.json(\n { error: `Agent not found: ${agent_id}` },\n { status: 404 }\n );\n }\n\n try {\n // Create thread in DurableAgentBuilder\n const thread = await agentBuilder.createThread({\n agent_name: agent_id,\n user_id: user_id ?? undefined,\n tags: tags,\n });\n\n // Return thread ID immediately\n // Note: initial_messages and data are accepted but not stored here\n // They will be stored when execution is triggered (e.g., via POST /api/threads/:id/execute)\n return Response.json({\n threadId: thread.id,\n agent_id: thread.agent_name,\n message: \"Thread created successfully\",\n });\n } catch (error: any) {\n console.error(`Error creating thread:`, error);\n\n return Response.json(\n {\n error: error.message || \"Failed to create thread\",\n },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../router/index\";\nimport type { Env } from \"../../agents/types\";\nimport { requireAuth } from \"../../middleware/auth\";\n\n/**\n * Resolve an icon path to a full URL if it's an absolute path.\n * URLs are returned as-is, absolute paths get the origin prepended.\n */\nfunction resolveIconUrl(icon: string | undefined, origin: string): string | undefined {\n if (!icon) return undefined;\n // If it's already a URL (http/https), return as-is\n if (icon.startsWith('http://') || icon.startsWith('https://')) {\n return icon;\n }\n // If it's an absolute path, prepend the origin\n if (icon.startsWith('/')) {\n return `${origin}${icon}`;\n }\n // Otherwise return as-is (shouldn't happen with valid input)\n return icon;\n}\n\n/**\n * GET /api/threads\n * List all threads with optional filtering\n *\n * Query parameters:\n * - limit: number (default: 50)\n * - offset: number (default: 0)\n * - agent_id: string (optional filter by agent name)\n *\n * Note: Non-admin users only see their own threads.\n * Admins can see all threads.\n *\n * Returns:\n * - HTTP 200: List of threads with metadata\n * - HTTP 401: Unauthorized\n * - HTTP 500: Server error\n */\nexport default defineController<Env>(async ({ req, env }) => {\n if (req.method !== \"GET\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n\n // Require authentication\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n const auth = authResult;\n\n try {\n const url = new URL(req.url);\n const origin = url.origin;\n const limit = parseInt(url.searchParams.get(\"limit\") || \"50\", 10);\n const offset = parseInt(url.searchParams.get(\"offset\") || \"0\", 10);\n const agentName = url.searchParams.get(\"agent_id\");\n\n // Determine user_id filter based on role\n // Admin can see all threads, others only see their own\n const userId = auth.user.role === 'admin' ? undefined : auth.user.id;\n\n // Get the root AgentBuilder DO\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId);\n\n // List threads from DurableAgentBuilder\n const result = await agentBuilder.listThreads({\n agent_name: agentName || undefined,\n user_id: userId || undefined,\n limit,\n offset,\n });\n\n // Enrich with agent details from TypeScript definitions\n const threads = await Promise.all(\n result.threads.map(async (thread) => {\n let agentDetails: {\n name: string;\n title: string;\n type: string;\n description?: string;\n icon?: string;\n } | null = null;\n try {\n const agentDef = await agentBuilder.loadAgent(thread.agent_name);\n agentDetails = {\n name: thread.agent_name,\n title: agentDef.title || thread.agent_name,\n type: agentDef.type || 'ai_human',\n description: agentDef.description,\n icon: resolveIconUrl(agentDef.icon, origin),\n };\n } catch {\n // Agent definition might have been removed\n agentDetails = { name: thread.agent_name, title: thread.agent_name, type: 'unknown' };\n }\n\n return {\n id: thread.id,\n agent_id: thread.agent_name,\n user_id: thread.user_id,\n tags: thread.tags || [],\n created_at: thread.created_at,\n agent: agentDetails,\n };\n })\n );\n\n return Response.json({\n threads,\n total: result.total,\n hasMore: offset + threads.length < result.total,\n });\n } catch (error: any) {\n console.error(\"Error fetching threads:\", error);\n return Response.json(\n { error: error.message || \"Failed to fetch threads\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../router/index.js';\nimport { z } from 'zod';\nimport type { PromptDefinition } from '../sdk/definePrompt.js';\nimport type { AgentDefinition } from '../sdk/defineAgent.js';\n\n/**\n * Convert a Zod schema to JSON Schema format\n */\nfunction toJSONSchema(schema: any): any {\n if (!schema) return null;\n try {\n // If it's a Zod schema, convert it\n if (schema && typeof schema === 'object' && ('~standard' in schema || schema._def)) {\n return z.toJSONSchema(schema);\n }\n // Already JSON Schema or plain object\n return schema;\n } catch {\n return null;\n }\n}\n\n/**\n * GET /api/tools\n *\n * List all available tools including filesystem tools, prompts (all prompts are tools), and MCP tools.\n *\n * Query Parameters:\n * - type: 'tools' (default, includes all) | 'prompts' | 'agents'\n * - schema: 'true' to include schema data\n *\n * Returns:\n * - HTTP 200: { [name]: { description, schema?, hasError?, error?, type?, model? } }\n */\nexport default defineController(async ({ url, tools, prompts, promptNames, agents, agentNames, models, modelNames }) => {\n const type = url.searchParams.get('type');\n const includeSchema = url.searchParams.get('schema') === 'true';\n\n // Build a map of models for quick lookup\n const modelMap: Record<string, any> = {};\n if (models && modelNames) {\n await Promise.all(\n modelNames.map(async (name: string) => {\n try {\n const loader = models[name];\n if (loader) {\n modelMap[name] = await loader();\n }\n } catch (error) {\n // Skip failed models\n }\n })\n );\n }\n\n if (type === 'prompts') {\n // Return all prompts (all prompts are exposed as tools)\n if (!prompts || !promptNames) {\n return Response.json({});\n }\n\n const result: Record<string, any> = {};\n\n await Promise.all(\n promptNames.map(async (name: string) => {\n try {\n const loader = prompts[name];\n if (!loader) return;\n\n const definition = await loader() as PromptDefinition;\n const modelDef = modelMap[definition.model];\n\n result[name] = {\n description: definition.toolDescription || '',\n schema: includeSchema && definition.requiredSchema\n ? toJSONSchema(definition.requiredSchema)\n : null,\n hasError: false,\n type: 'prompt',\n model: modelDef?.name || definition.model,\n };\n } catch (error) {\n console.error(`Error loading prompt ${name}:`, error);\n }\n })\n );\n\n return Response.json(result);\n }\n\n if (type === 'agents') {\n // Return agents that are exposed as tools\n if (!agents || !agentNames) {\n return Response.json({});\n }\n\n const result: Record<string, any> = {};\n\n await Promise.all(\n agentNames.map(async (name: string) => {\n try {\n const loader = agents[name];\n if (!loader) return;\n\n const definition = await loader() as AgentDefinition;\n\n // Only include agents exposed as tools\n if (!definition.exposeAsTool) return;\n\n result[name] = {\n description: definition.toolDescription || definition.title || '',\n schema: null, // Agents don't have schemas\n hasError: false,\n type: 'agent',\n };\n } catch (error) {\n console.error(`Error loading agent ${name}:`, error);\n }\n })\n );\n\n return Response.json(result);\n }\n\n // Default: return all tools (filesystem tools + prompts)\n const result: Record<string, any> = {};\n\n // Add filesystem tools\n if (tools) {\n const toolNames = Object.keys(tools);\n\n await Promise.all(\n toolNames.map(async (name: string) => {\n try {\n const loader = tools[name];\n if (!loader) return;\n\n // Tool loaders return [description, schema, handler] tuple\n const toolResult = await loader() as [string, unknown, unknown];\n\n // Handle error case where result is an error array\n if (Array.isArray(toolResult) && typeof toolResult[0] === 'string' && toolResult[0].includes('error')) {\n result[name] = {\n description: '',\n schema: null,\n hasError: true,\n error: toolResult[0],\n type: 'tool',\n };\n return;\n }\n\n // Normal case: [description, schema, handler]\n const [description, schema] = toolResult;\n\n result[name] = {\n description: description || '',\n schema: includeSchema && schema ? toJSONSchema(schema) : null,\n hasError: false,\n type: 'tool',\n };\n } catch (error) {\n console.error(`Error loading tool ${name}:`, error);\n result[name] = {\n description: '',\n schema: null,\n hasError: true,\n error: `Error loading tool: ${error}`,\n type: 'tool',\n };\n }\n })\n );\n }\n\n // Add all prompts as tools (all prompts are exposed as tools)\n if (prompts && promptNames) {\n await Promise.all(\n promptNames.map(async (name: string) => {\n try {\n const loader = prompts[name];\n if (!loader) return;\n\n const definition = await loader() as PromptDefinition;\n const modelDef = modelMap[definition.model];\n\n result[name] = {\n description: definition.toolDescription || '',\n schema: includeSchema && definition.requiredSchema\n ? toJSONSchema(definition.requiredSchema)\n : null,\n hasError: false,\n type: 'prompt',\n model: modelDef?.name || definition.model,\n };\n } catch (error) {\n console.error(`Error loading prompt ${name}:`, error);\n }\n })\n );\n }\n\n return Response.json(result);\n});\n","import { defineController } from '../../router/index.js';\nimport { requireAdmin } from '../../middleware/auth.js';\n\n/**\n * GET /api/users\n *\n * List all users (admin only).\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Returns:\n * - HTTP 200: { users: [{ id, username, role, created_at, updated_at }] }\n * - HTTP 401: Not authenticated\n * - HTTP 403: Not admin\n */\nexport default defineController(async ({ req, env }) => {\n try {\n const authResult = await requireAdmin(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n const users = await agentBuilder.listUsers();\n\n return Response.json({ users });\n } catch (error: any) {\n console.error('List users error:', error);\n return Response.json(\n { error: error.message || 'Failed to list users' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { requireAdmin } from '../../middleware/auth.js';\nimport { hashPassword } from '../../utils/auth.js';\n\n// Valid user roles\nconst VALID_ROLES = ['admin', 'user'] as const;\ntype UserRole = typeof VALID_ROLES[number];\n\n/**\n * POST /api/users\n *\n * Create a new user (admin only).\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Body:\n * - username: string\n * - password: string\n * - role?: 'admin' | 'user' (defaults to 'user')\n *\n * Returns:\n * - HTTP 201: { user: { id, username, role, created_at, updated_at } }\n * - HTTP 400: Missing required fields, invalid role, or user already exists\n * - HTTP 401: Not authenticated\n * - HTTP 403: Not admin\n */\nexport default defineController(async ({ req, env }) => {\n try {\n const authResult = await requireAdmin(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n\n const body = await req.json() as { username?: string; password?: string; role?: string };\n const { username, password, role = 'user' } = body;\n\n if (!username || !password) {\n return Response.json(\n { error: 'Username and password are required' },\n { status: 400 }\n );\n }\n\n // Validate username format\n if (!/^[a-zA-Z0-9_-]+$/.test(username)) {\n return Response.json(\n { error: 'Username can only contain letters, numbers, underscores, and hyphens' },\n { status: 400 }\n );\n }\n\n if (username.length < 3 || username.length > 50) {\n return Response.json(\n { error: 'Username must be between 3 and 50 characters' },\n { status: 400 }\n );\n }\n\n if (password.length < 8) {\n return Response.json(\n { error: 'Password must be at least 8 characters' },\n { status: 400 }\n );\n }\n\n // Validate role\n if (!VALID_ROLES.includes(role as UserRole)) {\n return Response.json(\n { error: `Invalid role. Must be one of: ${VALID_ROLES.join(', ')}` },\n { status: 400 }\n );\n }\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n // Check if username already exists\n const existingUser = await agentBuilder.getUserByUsername(username);\n if (existingUser) {\n return Response.json(\n { error: 'Username already exists' },\n { status: 400 }\n );\n }\n\n // Hash the password\n const password_hash = await hashPassword(password);\n\n // Create the user\n const user = await agentBuilder.createUser({\n username,\n password_hash,\n role,\n });\n\n // Return user without password hash\n return Response.json({\n user: {\n id: user.id,\n username: user.username,\n role: user.role,\n created_at: user.created_at,\n updated_at: user.updated_at,\n },\n }, { status: 201 });\n } catch (error: any) {\n console.error('Create user error:', error);\n return Response.json(\n { error: error.message || 'Failed to create user' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport type { AgentDefinition } from '../../sdk/defineAgent.js';\n\n/**\n * GET /api/agents/:name\n *\n * Get details for a specific agent.\n *\n * Returns:\n * - HTTP 200: { agent: { id, name, type, sideA, sideB, ... } }\n * - HTTP 404: Agent not found\n */\nexport default defineController(async ({ params, agents, prompts, promptNames }) => {\n const { name } = params;\n\n if (!agents || !agents[name]) {\n return Response.json({ error: 'Agent not found' }, { status: 404 });\n }\n\n try {\n // Build a map of prompts for quick lookup\n const promptMap: Record<string, any> = {};\n if (prompts && promptNames) {\n await Promise.all(\n promptNames.map(async (promptName: string) => {\n try {\n const loader = prompts[promptName];\n if (loader) {\n promptMap[promptName] = await loader();\n }\n } catch (error) {\n // Skip failed prompts\n }\n })\n );\n }\n\n const loader = agents[name];\n const definition = await loader() as AgentDefinition;\n\n // Get prompt names for sides\n const sideAPrompt = promptMap[definition.sideA?.prompt];\n const sideBPrompt = definition.sideB\n ? promptMap[definition.sideB?.prompt]\n : null;\n\n const agent = {\n id: definition.name,\n name: definition.name,\n // title is deprecated - include for backward compatibility but prefer name\n title: definition.title || definition.name,\n type: definition.type || 'ai_human',\n\n // Side A configuration\n side_a_label: definition.sideA?.label || null,\n side_a_agent_prompt: definition.sideA?.prompt,\n side_a_agent_prompt_name: sideAPrompt?.name || definition.sideA?.prompt,\n side_a_stop_on_response:\n definition.sideA?.stopOnResponse !== undefined\n ? definition.sideA.stopOnResponse\n : true,\n side_a_stop_tool: definition.sideA?.stopTool || null,\n side_a_stop_tool_response_property:\n definition.sideA?.stopToolResponseProperty || null,\n side_a_max_steps: definition.sideA?.maxSteps || null,\n side_a_end_session_tool:\n definition.sideA?.endSessionTool || null,\n side_a_manual_stop_condition:\n definition.sideA?.manualStopCondition || false,\n\n // Side B configuration (if dual_ai)\n side_b_label: definition.sideB?.label || null,\n side_b_agent_prompt: definition.sideB?.prompt || null,\n side_b_agent_prompt_name: sideBPrompt?.name || definition.sideB?.prompt || null,\n side_b_stop_on_response:\n definition.sideB?.stopOnResponse !== undefined\n ? definition.sideB.stopOnResponse\n : true,\n side_b_stop_tool: definition.sideB?.stopTool || null,\n side_b_stop_tool_response_property:\n definition.sideB?.stopToolResponseProperty || null,\n side_b_max_steps: definition.sideB?.maxSteps || null,\n side_b_end_session_tool:\n definition.sideB?.endSessionTool || null,\n side_b_manual_stop_condition:\n definition.sideB?.manualStopCondition || false,\n\n // Session configuration\n max_session_turns: definition.maxSessionTurns || null,\n\n // Tool exposure\n expose_as_tool: definition.exposeAsTool || false,\n tool_description: definition.toolDescription || null,\n\n created_at: Math.floor(Date.now() / 1000),\n };\n\n return Response.json({ agent });\n } catch (error) {\n console.error(`Error loading agent ${name}:`, error);\n return Response.json(\n { error: `Error loading agent: ${error}` },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { requireAuth } from '../../middleware/auth.js';\n\n/**\n * DELETE /api/api-keys/:id\n *\n * Delete an API key for the authenticated user.\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Returns:\n * - HTTP 200: { success: true }\n * - HTTP 401: Not authenticated\n * - HTTP 404: API key not found\n */\nexport default defineController(async ({ req, env, params }) => {\n try {\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n\n // Super admin has no API keys\n if (authResult.authType === 'super_admin') {\n return Response.json(\n { error: 'Super admin has no API keys to delete.' },\n { status: 400 }\n );\n }\n\n const keyId = params.id;\n if (!keyId) {\n return Response.json(\n { error: 'API key ID is required' },\n { status: 400 }\n );\n }\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n await agentBuilder.deleteApiKey(keyId, authResult.user.id);\n\n return Response.json({ success: true });\n } catch (error: any) {\n console.error('Delete API key error:', error);\n return Response.json(\n { error: error.message || 'Failed to delete API key' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { z } from 'zod';\nimport type { PromptDefinition } from '../../sdk/definePrompt.js';\n\n/**\n * Convert a Zod schema to JSON Schema format\n */\nfunction toJSONSchema(schema: any): any {\n if (!schema) return null;\n // If it's a Zod schema, convert it\n if (schema && typeof schema === 'object' && ('~standard' in schema || '_def' in schema)) {\n return z.toJSONSchema(schema);\n }\n // Already JSON Schema or plain object\n return schema;\n}\n\n/**\n * Normalize prompt content for API response.\n * - Arrays (StructuredPrompt) are serialized to JSON strings for backward compatibility\n * - Plain strings are returned as-is\n */\nfunction normalizePromptContent(prompt: string | any[] | undefined): string {\n if (!prompt) return '';\n // If it's an array (StructuredPrompt), serialize to JSON\n if (Array.isArray(prompt)) {\n return JSON.stringify(prompt);\n }\n // Plain string, return as-is\n return prompt;\n}\n\n/**\n * GET /api/prompts/:name\n *\n * Get details for a specific prompt.\n *\n * Returns:\n * - HTTP 200: { prompt: { id, name, tool_description, prompt, model, ... } }\n * - HTTP 404: Prompt not found\n */\nexport default defineController(async ({ params, prompts, models, modelNames }) => {\n const { name } = params;\n\n if (!prompts || !prompts[name]) {\n return Response.json({ error: 'Prompt not found' }, { status: 404 });\n }\n\n try {\n // Build a map of models for quick lookup\n const modelMap: Record<string, any> = {};\n if (models && modelNames) {\n await Promise.all(\n modelNames.map(async (modelName: string) => {\n try {\n const loader = models[modelName];\n if (loader) {\n modelMap[modelName] = await loader();\n }\n } catch (error) {\n // Skip failed models\n }\n })\n );\n }\n\n const loader = prompts[name];\n const definition = await loader() as PromptDefinition;\n const modelDef = modelMap[definition.model];\n\n // Extract tools with their full config (convert camelCase to snake_case for UI)\n const tools = (definition.tools || []).map((tool: string | Record<string, any>) => {\n if (typeof tool === 'string') {\n // Simple tool name - return with default options\n return {\n name: tool,\n include_text_response: true,\n include_tool_calls: true,\n include_errors: true,\n init_user_message_property: null\n };\n }\n // Tool config object - convert camelCase to snake_case\n return {\n name: tool.name,\n include_text_response: tool.includeTextResponse !== undefined ? tool.includeTextResponse : true,\n include_tool_calls: tool.includeToolCalls !== undefined ? tool.includeToolCalls : true,\n include_errors: tool.includeErrors !== undefined ? tool.includeErrors : true,\n init_user_message_property: tool.initUserMessageProperty || null\n };\n });\n\n const prompt = {\n id: definition.name,\n name: definition.name,\n tool_description: definition.toolDescription,\n prompt: normalizePromptContent(definition.prompt),\n required_schema: toJSONSchema(definition.requiredSchema),\n model_id: definition.model,\n model_name: modelDef?.name || definition.model,\n model_provider: modelDef?.provider || 'unknown',\n include_chat: definition.includeChat || false,\n include_past_tools: definition.includePastTools || false,\n parallel_tool_calls: definition.parallelToolCalls || false,\n tool_choice: definition.toolChoice || 'auto',\n tools: tools,\n reasoning: definition.reasoning || null,\n created_at: Math.floor(Date.now() / 1000),\n };\n\n return Response.json({ prompt });\n } catch (error) {\n console.error(`Error loading prompt ${name}:`, error);\n return Response.json(\n { error: `Error loading prompt: ${error}` },\n { status: 500 }\n );\n }\n});\n","/**\n * Permissions utility for role-based access control\n *\n * Current behavior:\n * - Admin role can do everything (early return true)\n * - Other roles only get baseline access (own threads)\n *\n * The `can()` function checks arbitrary permission strings.\n * Currently, non-admin users have no explicit permissions,\n * meaning they rely on ownership checks for access.\n */\n\nimport type { AuthContext } from '../middleware/auth.js';\n\n/**\n * Check if a user has a specific permission\n *\n * @param auth - The authenticated user context\n * @param permission - The permission string to check (e.g., \"access_all_threads\")\n * @returns true if the user has the permission\n */\nexport function can(auth: AuthContext, permission: string): boolean {\n // Admin can do everything\n if (auth.user.role === 'admin') {\n return true;\n }\n\n // For now, non-admin users have no special permissions\n // They only get baseline access (own threads)\n // Future: look up permissions from a role→permissions mapping\n return false;\n}\n\n/**\n * Check if a user can access a specific thread\n *\n * @param auth - The authenticated user context\n * @param thread - The thread to check access for (must have user_id)\n * @returns true if the user can access the thread\n */\nexport function canAccessThread(\n auth: AuthContext,\n thread: { user_id: string | null }\n): boolean {\n // Admin can access all threads\n if (auth.user.role === 'admin') {\n return true;\n }\n\n // Users can only access their own threads\n // Threads with null user_id (created by super_admin) are admin-only\n if (thread.user_id === null) {\n return false;\n }\n\n return thread.user_id === auth.user.id;\n}\n","import { defineController } from \"../../router/index\";\nimport type { Env } from \"../../agents/types\";\nimport { requireAuth } from \"../../middleware/auth\";\nimport { canAccessThread } from \"../../utils/permissions\";\n\n/**\n * DELETE /api/threads/:id\n *\n * Delete a thread and all its associated data\n *\n * Returns:\n * - HTTP 200: { success: true, threadId: string }\n * - HTTP 401: Unauthorized\n * - HTTP 403: Forbidden (not owner)\n * - HTTP 404: Thread not found\n * - HTTP 500: Deletion error\n *\n * Note: This deletes:\n * - Thread record from DurableAgentBuilder\n * - All messages, tool calls, and logs from DurableThread storage\n * - The DurableThread instance itself is marked for deletion\n */\nexport default defineController<Env>(async ({ req, env, params }) => {\n // Require authentication\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n const auth = authResult;\n\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Missing thread ID\" }, { status: 400 });\n }\n\n // Get the root AgentBuilder DO\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId);\n\n // Check if thread exists\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Check access permission\n if (!canAccessThread(auth, thread)) {\n return Response.json(\n { error: \"Forbidden: You don't have access to this thread\" },\n { status: 403 }\n );\n }\n\n try {\n // Delete thread record from DurableAgentBuilder\n await agentBuilder.deleteThread(threadId);\n\n // Get DurableThread instance and call via RPC to delete its data\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method to delete DurableObject data\n await stub.deleteThread();\n\n return Response.json({\n success: true,\n threadId,\n message: \"Thread deleted successfully\",\n });\n } catch (error: any) {\n console.error(`Error deleting thread ${threadId}:`, error);\n\n return Response.json(\n {\n error: error.message || \"Failed to delete thread\",\n threadId,\n },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../router/index\";\nimport { requireAuth } from \"../../middleware/auth\";\nimport { canAccessThread } from \"../../utils/permissions\";\n\n/**\n * PATCH /api/threads/:id\n * Update thread metadata (e.g., tags, agent assignment)\n *\n * Returns:\n * - HTTP 200: Updated thread\n * - HTTP 400: Validation error\n * - HTTP 401: Unauthorized\n * - HTTP 403: Forbidden (not owner)\n * - HTTP 404: Thread not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, env, params }) => {\n if (req.method !== \"PATCH\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n\n // Require authentication\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n const auth = authResult;\n\n const threadId = params?.id as string;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n const body = await req.json() as { tags?: string[]; agent_id?: string };\n const { tags, agent_id } = body;\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n // Check if thread exists\n const existingThread = await agentBuilder.getThread(threadId);\n if (!existingThread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Check access permission\n if (!canAccessThread(auth, existingThread)) {\n return Response.json(\n { error: \"Forbidden: You don't have access to this thread\" },\n { status: 403 }\n );\n }\n\n // Build update data\n const updates: Record<string, any> = {};\n\n if (tags !== undefined) {\n if (!Array.isArray(tags)) {\n return Response.json(\n { error: \"tags must be an array of strings\" },\n { status: 400 }\n );\n }\n\n // Verify all tags are strings\n if (!tags.every((tag) => typeof tag === \"string\")) {\n return Response.json(\n { error: \"All tags must be strings\" },\n { status: 400 }\n );\n }\n\n updates.tags = tags;\n }\n\n if (agent_id !== undefined) {\n if (typeof agent_id !== \"string\") {\n return Response.json(\n { error: \"agent_id must be a string\" },\n { status: 400 }\n );\n }\n\n // Verify agent exists in TypeScript config via DurableThread\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId) as any;\n\n try {\n const agentDef = await stub.loadAgent(agent_id);\n if (!agentDef) {\n return Response.json(\n { error: `Agent not found: ${agent_id}` },\n { status: 404 }\n );\n }\n\n if (agentDef.type !== \"ai_human\") {\n return Response.json(\n { error: \"Only ai_human agents can be assigned to threads\" },\n { status: 400 }\n );\n }\n } catch (e) {\n return Response.json(\n { error: `Agent not found: ${agent_id}` },\n { status: 404 }\n );\n }\n\n updates.agent_name = agent_id;\n }\n\n if (Object.keys(updates).length === 0) {\n return Response.json(\n { error: \"No valid fields to update\" },\n { status: 400 }\n );\n }\n\n // Update thread in DurableAgentBuilder\n const updatedThread = await agentBuilder.updateThread(threadId, updates);\n\n return Response.json({\n id: updatedThread.id,\n agent_id: updatedThread.agent_name, // Map agent_name back to agent_id for API compat\n user_id: updatedThread.user_id,\n tags: updatedThread.tags || [],\n created_at: updatedThread.created_at,\n });\n } catch (error: any) {\n console.error(\"Error updating thread:\", error);\n return Response.json(\n { error: error.message || \"Failed to update thread\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../router/index\";\nimport { requireAuth } from \"../../middleware/auth\";\nimport { canAccessThread } from \"../../utils/permissions\";\nimport type { Env } from \"../../agents/types\";\n\n/**\n * Resolve an icon path to a full URL if it's an absolute path.\n * URLs are returned as-is, absolute paths get the origin prepended.\n */\nfunction resolveIconUrl(icon: string | undefined, origin: string): string | undefined {\n if (!icon) return undefined;\n // If it's already a URL (http/https), return as-is\n if (icon.startsWith('http://') || icon.startsWith('https://')) {\n return icon;\n }\n // If it's an absolute path, prepend the origin\n if (icon.startsWith('/')) {\n return `${origin}${icon}`;\n }\n // Otherwise return as-is (shouldn't happen with valid input)\n return icon;\n}\n\n/**\n * GET /api/threads/:id\n *\n * Get thread metadata from DurableAgentBuilder and stats from DurableObject\n *\n * Returns:\n * - HTTP 200: { thread, agent, stats }\n * - HTTP 401: Unauthorized\n * - HTTP 403: Forbidden (not owner)\n * - HTTP 404: Thread not found\n * - HTTP 500: Server error\n */\nexport default defineController<Env>(async ({ req, params, env }) => {\n // Require authentication\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n const auth = authResult;\n\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // First, get thread from registry to check ownership\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId);\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Check access permission\n if (!canAccessThread(auth, thread)) {\n return Response.json(\n { error: \"Forbidden: You don't have access to this thread\" },\n { status: 403 }\n );\n }\n\n // Get DurableObject instance and call via RPC\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method directly - getThreadMeta already returns thread, agent, and stats\n const doData = await stub.getThreadMeta(threadId);\n\n if (!doData) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Resolve agent icon URL if it's an absolute path\n if (doData.agent?.icon) {\n const origin = new URL(req.url).origin;\n doData.agent.icon = resolveIconUrl(doData.agent.icon, origin);\n }\n\n return Response.json(doData);\n } catch (error: any) {\n console.error(`Error fetching thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to fetch thread\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { z } from 'zod';\n\n/**\n * Convert a Zod schema to JSON Schema format\n */\nfunction toJSONSchema(schema: any): any {\n if (!schema) return null;\n try {\n // If it's a Zod schema, convert it\n if (schema && typeof schema === 'object' && ('~standard' in schema || schema._def)) {\n return z.toJSONSchema(schema);\n }\n // Already JSON Schema or plain object\n return schema;\n } catch {\n return null;\n }\n}\n\n/**\n * GET /api/tools/:name\n *\n * Get details and schema for a specific tool.\n *\n * Returns:\n * - HTTP 200: { name, description, schema }\n * - HTTP 404: Tool not found\n */\nexport default defineController(async ({ params, tools }) => {\n const { name } = params;\n\n if (!tools || !tools[name]) {\n return Response.json({ error: 'Tool not found' }, { status: 404 });\n }\n\n try {\n const loader = tools[name];\n const toolResult = await loader() as [string, unknown, unknown];\n\n // Handle error case\n if (Array.isArray(toolResult) && typeof toolResult[0] === 'string' && toolResult[0].includes('error')) {\n return Response.json({\n name,\n description: '',\n schema: null,\n hasError: true,\n error: toolResult[0],\n });\n }\n\n // Normal case: [description, schema, handler]\n const [description, schema] = toolResult;\n\n return Response.json({\n name,\n description: description || '',\n schema: toJSONSchema(schema),\n hasError: false,\n });\n } catch (error) {\n console.error(`Error loading tool ${name}:`, error);\n return Response.json({\n name,\n description: '',\n schema: null,\n hasError: true,\n error: `Error loading tool: ${error}`,\n });\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { requireAdmin } from '../../middleware/auth.js';\n\n/**\n * DELETE /api/users/:id\n *\n * Delete a user (admin only).\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Returns:\n * - HTTP 200: { success: true }\n * - HTTP 401: Not authenticated\n * - HTTP 403: Not admin\n * - HTTP 404: User not found\n */\nexport default defineController(async ({ req, env, params }) => {\n try {\n const authResult = await requireAdmin(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n\n const { id } = params;\n\n if (!id) {\n return Response.json({ error: 'User ID is required' }, { status: 400 });\n }\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n // Check if user exists\n const user = await agentBuilder.getUserById(id);\n if (!user) {\n return Response.json({ error: 'User not found' }, { status: 404 });\n }\n\n await agentBuilder.deleteUser(id);\n\n return Response.json({ success: true });\n } catch (error: any) {\n console.error('Delete user error:', error);\n return Response.json(\n { error: error.message || 'Failed to delete user' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { requireAdmin } from '../../middleware/auth.js';\nimport { hashPassword } from '../../utils/auth.js';\n\n/**\n * PUT /api/users/:id\n *\n * Update a user (admin only).\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Body:\n * - username?: string\n * - password?: string (will be hashed)\n * - role?: string\n *\n * Returns:\n * - HTTP 200: { user: { id, username, role, created_at, updated_at } }\n * - HTTP 401: Not authenticated\n * - HTTP 403: Not admin\n * - HTTP 404: User not found\n * - HTTP 409: Username already taken\n */\nexport default defineController(async ({ req, env, params }) => {\n try {\n const authResult = await requireAdmin(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n\n const { id } = params;\n\n if (!id) {\n return Response.json({ error: 'User ID is required' }, { status: 400 });\n }\n\n const body = await req.json() as { username?: string; password?: string; role?: string };\n const { username, password, role } = body;\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n // Check if user exists\n const existingUser = await agentBuilder.getUserById(id);\n if (!existingUser) {\n return Response.json({ error: 'User not found' }, { status: 404 });\n }\n\n // If changing username, check it's not taken by another user\n if (username && username !== existingUser.username) {\n const userWithUsername = await agentBuilder.getUserByUsername(username);\n if (userWithUsername && userWithUsername.id !== id) {\n return Response.json(\n { error: 'Username already taken' },\n { status: 409 }\n );\n }\n }\n\n // Build update params\n const updateParams: {\n username?: string;\n password_hash?: string;\n role?: 'admin';\n } = {};\n\n if (username) {\n updateParams.username = username;\n }\n if (password) {\n updateParams.password_hash = await hashPassword(password);\n }\n if (role) {\n updateParams.role = role as 'admin';\n }\n\n const updatedUser = await agentBuilder.updateUser(id, updateParams);\n\n return Response.json({\n user: {\n id: updatedUser.id,\n username: updatedUser.username,\n role: updatedUser.role,\n created_at: updatedUser.created_at,\n updated_at: updatedUser.updated_at,\n },\n });\n } catch (error: any) {\n console.error('Update user error:', error);\n return Response.json(\n { error: error.message || 'Failed to update user' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router';\n\n/**\n * GET /api/auth/config\n * Returns which authentication providers are configured\n */\nexport default defineController(async ({ env }) => {\n // Check which OAuth providers are configured by looking for their env vars\n const githubConfigured = !!(env.GITHUB_CLIENT_ID && env.GITHUB_CLIENT_SECRET);\n const googleConfigured = !!(env.GOOGLE_CLIENT_ID && env.GOOGLE_CLIENT_SECRET);\n\n return {\n github: githubConfigured,\n google: googleConfigured,\n };\n});\n","import { defineController } from '../../router/index.js';\nimport type { Env } from '../../agents/types.js';\nimport {\n verifyPassword,\n generateUserToken,\n hashToken,\n generateSuperAdminToken,\n} from '../../utils/auth.js';\n\n/**\n * POST /api/auth/login\n *\n * Authenticate a user with username/password or super admin password.\n *\n * Body:\n * - username: string (optional if using super admin)\n * - password: string\n *\n * Returns:\n * - HTTP 200: { token, user: { id, username, role } }\n * - HTTP 401: Invalid credentials\n * - HTTP 400: Missing required fields\n */\nexport default defineController<Env>(async ({ req, env }) => {\n try {\n const body = await req.json() as { username?: string; password?: string };\n const { username, password } = body;\n\n if (!password) {\n return Response.json(\n { error: 'Password is required' },\n { status: 400 }\n );\n }\n\n // Check for super admin login (requires username \"admin\" + SUPER_ADMIN_PASSWORD)\n if (env.SUPER_ADMIN_PASSWORD && username === 'admin' && password === env.SUPER_ADMIN_PASSWORD) {\n // Generate a signed super admin token\n if (!env.ENCRYPTION_KEY) {\n return Response.json(\n { error: 'Server misconfigured: ENCRYPTION_KEY required for super admin' },\n { status: 500 }\n );\n }\n\n const token = await generateSuperAdminToken(env.ENCRYPTION_KEY);\n\n return Response.json({\n token,\n user: {\n id: 'super_admin',\n username: 'admin',\n role: 'admin',\n },\n });\n }\n\n // Regular user login requires username\n if (!username) {\n return Response.json(\n { error: 'Username is required' },\n { status: 400 }\n );\n }\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n // Look up user\n const user = await agentBuilder.getUserByUsername(username);\n\n if (!user) {\n return Response.json(\n { error: 'Invalid username or password' },\n { status: 401 }\n );\n }\n\n // Verify password\n const isValid = await verifyPassword(password, user.password_hash);\n\n if (!isValid) {\n return Response.json(\n { error: 'Invalid username or password' },\n { status: 401 }\n );\n }\n\n // Generate session token\n const token = generateUserToken();\n const tokenHash = await hashToken(token);\n\n // Create session (expires in 30 days)\n const expiresAt = Math.floor(Date.now() / 1000) + 30 * 24 * 60 * 60;\n await agentBuilder.createSession({\n user_id: user.id,\n token_hash: tokenHash,\n expires_at: expiresAt,\n });\n\n return Response.json({\n token,\n user: {\n id: user.id,\n username: user.username,\n role: user.role,\n },\n });\n } catch (error: any) {\n console.error('Login error:', error);\n return Response.json(\n { error: error.message || 'Login failed' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { hashToken, isValidUserToken } from '../../utils/auth.js';\n\n/**\n * POST /api/auth/logout\n *\n * Log out the current user by invalidating their session.\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Returns:\n * - HTTP 200: { success: true }\n * - HTTP 401: Invalid or missing token\n */\nexport default defineController(async ({ req, env }) => {\n try {\n const authHeader = req.headers.get('Authorization');\n\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n return Response.json({ error: 'Unauthorized' }, { status: 401 });\n }\n\n const token = authHeader.substring(7);\n\n // Super admin tokens don't have sessions to delete\n if (token.includes('.')) {\n // It's a signed token (super admin), just return success\n return Response.json({ success: true });\n }\n\n // Regular user token - delete session\n if (isValidUserToken(token)) {\n const tokenHash = await hashToken(token);\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n await agentBuilder.deleteSession(tokenHash);\n }\n\n return Response.json({ success: true });\n } catch (error: any) {\n console.error('Logout error:', error);\n return Response.json(\n { error: error.message || 'Logout failed' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { authenticate } from '../../middleware/auth.js';\n\n/**\n * GET /api/auth/me\n *\n * Get the current authenticated user's information.\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Returns:\n * - HTTP 200: { user: { id, username, role }, authType }\n * - HTTP 401: Not authenticated\n */\nexport default defineController(async ({ req, env }) => {\n try {\n const authContext = await authenticate(req, env);\n\n if (!authContext) {\n return Response.json({ error: 'Unauthorized' }, { status: 401 });\n }\n\n return Response.json({\n user: authContext.user,\n authType: authContext.authType,\n });\n } catch (error: any) {\n console.error('Auth check error:', error);\n return Response.json(\n { error: error.message || 'Authentication check failed' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\n\n/**\n * Provider configurations with their API endpoints\n */\nconst PROVIDER_CONFIGS: Record<\n string,\n {\n sdk: string;\n modelsEndpoint: string;\n envKey: string;\n headers: (apiKey: string) => Record<string, string>;\n parseResponse: (data: any) => Array<{\n value: string;\n label: string;\n description: string;\n slug?: string;\n iconId?: string;\n }>;\n }\n> = {\n openai: {\n sdk: 'openai',\n modelsEndpoint: 'https://api.openai.com/v1/models',\n envKey: 'OPENAI_API_KEY',\n headers: (apiKey) => ({\n Authorization: `Bearer ${apiKey}`,\n }),\n parseResponse: (data) => {\n // Filter to only include common chat models, not fine-tuned or deprecated ones\n const chatModelPrefixes = [\n 'gpt-4',\n 'gpt-3.5',\n 'o1',\n 'o3',\n 'chatgpt',\n ];\n\n return data.data\n .filter((model: any) => {\n const id = model.id.toLowerCase();\n return chatModelPrefixes.some((prefix) => id.startsWith(prefix));\n })\n .map((model: any) => ({\n value: model.id,\n label: model.id,\n description: `Owned by ${model.owned_by}`,\n iconId: 'openai',\n }))\n .sort((a: any, b: any) => a.label.localeCompare(b.label));\n },\n },\n openrouter: {\n sdk: 'openrouter',\n modelsEndpoint: 'https://openrouter.ai/api/v1/models',\n envKey: 'OPENROUTER_API_KEY',\n headers: () => ({}), // OpenRouter models endpoint doesn't require auth\n parseResponse: (data) => {\n return data.data\n .map((model: any) => ({\n value: model.id,\n label: model.name || model.id,\n description: model.description?.slice(0, 150) + (model.description?.length > 150 ? '...' : '') || '',\n slug: model.canonical_slug || model.id,\n iconId: model.id.split('/')[0], // e.g., \"anthropic\" from \"anthropic/claude-3\"\n }))\n .sort((a: any, b: any) => a.label.localeCompare(b.label));\n },\n },\n};\n\n/**\n * POST /api/models/available\n *\n * Fetch available models from a provider's API.\n *\n * Request body:\n * - provider: string - The provider name (e.g., \"openai\", \"openrouter\")\n *\n * Returns:\n * - HTTP 200: { models: Array<{ value, label, description, slug?, iconId? }> }\n * - HTTP 400: { error: string } - Missing or invalid provider\n * - HTTP 401: { error: string } - Missing API key for provider\n * - HTTP 500: { error: string } - Failed to fetch models\n */\nexport default defineController(async ({ req, env }) => {\n const body = await req.json().catch(() => ({}));\n const { provider } = body as { provider?: string };\n\n if (!provider) {\n return Response.json({ error: 'Provider is required' }, { status: 400 });\n }\n\n const config = PROVIDER_CONFIGS[provider];\n if (!config) {\n return Response.json(\n { error: `Unknown provider: ${provider}. Supported: ${Object.keys(PROVIDER_CONFIGS).join(', ')}` },\n { status: 400 }\n );\n }\n\n const apiKey = env[config.envKey] as string | undefined;\n\n // OpenRouter doesn't require API key for listing models\n if (!apiKey && config.sdk !== 'openrouter') {\n return Response.json(\n { error: `API key not configured for ${provider}. Set ${config.envKey} environment variable.` },\n { status: 401 }\n );\n }\n\n try {\n const response = await fetch(config.modelsEndpoint, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...config.headers(apiKey || ''),\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(`Failed to fetch models from ${provider}:`, errorText);\n return Response.json(\n { error: `Failed to fetch models from ${provider}: ${response.statusText}` },\n { status: response.status }\n );\n }\n\n const data = await response.json();\n const models = config.parseResponse(data);\n\n return Response.json({ models });\n } catch (error: any) {\n console.error(`Error fetching models from ${provider}:`, error);\n return Response.json(\n { error: `Failed to fetch models: ${error.message}` },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\n\n/**\n * POST /api/models/endpoints\n *\n * Fetch available provider endpoints for a specific OpenRouter model.\n * This allows users to select which providers can serve a particular model.\n *\n * Request body:\n * - provider: string - The provider name (must be OpenRouter)\n * - modelSlug: string - The model slug (e.g., \"anthropic/claude-3-opus\")\n *\n * Returns:\n * - HTTP 200: { endpoints: Array<{ id, name, pricing, quantization?, maxPromptTokens?, maxCompletionTokens? }> }\n * - HTTP 400: { error: string } - Missing parameters or non-OpenRouter provider\n * - HTTP 404: { error: string } - Model not found\n * - HTTP 500: { error: string } - Failed to fetch endpoints\n */\nexport default defineController(async ({ req, env }) => {\n const body = await req.json().catch(() => ({}));\n const { provider, modelSlug } = body as { provider?: string; modelSlug?: string };\n\n if (!provider || !modelSlug) {\n return Response.json(\n { error: 'Provider and modelSlug are required' },\n { status: 400 }\n );\n }\n\n // This endpoint only works for OpenRouter\n if (provider !== 'openrouter') {\n return Response.json(\n { error: 'Endpoints are only available for OpenRouter provider' },\n { status: 400 }\n );\n }\n\n // Parse the model slug into author/slug format\n // e.g., \"deepseek/deepseek-r1\" -> author: \"deepseek\", slug: \"deepseek-r1\"\n const slashIndex = modelSlug.indexOf('/');\n if (slashIndex === -1) {\n return Response.json(\n { error: `Invalid model slug format: ${modelSlug}. Expected format: author/model-name` },\n { status: 400 }\n );\n }\n\n const author = modelSlug.substring(0, slashIndex);\n const slug = modelSlug.substring(slashIndex + 1);\n\n try {\n // Fetch endpoints from OpenRouter using their dedicated endpoints API\n // GET /api/v1/models/:author/:slug/endpoints\n const response = await fetch(`https://openrouter.ai/api/v1/models/${author}/${slug}/endpoints`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n return Response.json(\n { error: `Model not found: ${modelSlug}` },\n { status: 404 }\n );\n }\n const errorText = await response.text();\n console.error(`Failed to fetch endpoints from OpenRouter:`, errorText);\n return Response.json(\n { error: `Failed to fetch endpoints: ${response.statusText}` },\n { status: response.status }\n );\n }\n\n const data = await response.json();\n\n // Parse the endpoint data from the response\n const endpoints = parseOpenRouterEndpoints(data);\n\n return Response.json({ endpoints });\n } catch (error: any) {\n console.error(`Error fetching endpoints for ${modelSlug}:`, error);\n return Response.json(\n { error: `Failed to fetch endpoints: ${error.message}` },\n { status: 500 }\n );\n }\n});\n\n/**\n * Parse OpenRouter endpoints response to extract provider information\n */\nfunction parseOpenRouterEndpoints(data: any): Array<{\n id: string;\n name: string;\n pricing: { prompt: number; completion: number };\n quantization?: string;\n maxPromptTokens?: number;\n maxCompletionTokens?: number;\n}> {\n // Response structure: { data: { endpoints: [...] } }\n const model = data.data || data;\n const endpointsArray = model.endpoints || [];\n\n if (!Array.isArray(endpointsArray) || endpointsArray.length === 0) {\n return [];\n }\n\n return endpointsArray.map((endpoint: any) => ({\n // Use 'tag' as the ID since it's the provider identifier used for routing\n id: endpoint.tag || endpoint.provider_name || endpoint.name,\n name: endpoint.name || endpoint.provider_name || endpoint.tag,\n pricing: {\n // Pricing values come as strings, convert to numbers\n prompt: parseFloat(endpoint.pricing?.prompt) || 0,\n completion: parseFloat(endpoint.pricing?.completion) || 0,\n },\n quantization: endpoint.quantization,\n maxPromptTokens: endpoint.max_prompt_tokens || endpoint.context_length,\n maxCompletionTokens: endpoint.max_completion_tokens,\n }));\n}\n","import { defineController } from \"../../../router/index\";\n\n/**\n * GET /api/threads/:id/cost\n *\n * Get cost breakdown for a thread, including:\n * - Total cost across all logs\n * - Cost breakdown by model\n * - Average cost per message\n * - Average cost per message per model\n *\n * Returns:\n * - HTTP 200: { totalCost, modelBreakdown, avgCostPerMessage, avgCostPerMessageByModel }\n * - HTTP 404: Thread not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Get all logs with cost data (no pagination)\n const logsResult = await stub.getLogs(10000, 0, \"ASC\");\n const logs = logsResult.logs || [];\n\n // Calculate total cost and group by model name\n let totalCost = 0;\n const modelCosts: Record<\n string,\n { totalCost: number; count: number }\n > = {};\n\n // Count unique messages for average calculation\n const uniqueMessages = new Set<string>();\n\n for (const log of logs) {\n const cost = log.cost_total;\n if (cost !== null && cost !== undefined && !isNaN(cost)) {\n totalCost += cost;\n\n // Track unique messages\n if (log.message_id) {\n uniqueMessages.add(log.message_id);\n }\n\n // Group by model name (not ID)\n const modelKey = log.model_name || log.model || \"unknown\";\n if (!modelCosts[modelKey]) {\n modelCosts[modelKey] = {\n totalCost: 0,\n count: 0,\n };\n }\n modelCosts[modelKey].totalCost += cost;\n modelCosts[modelKey].count += 1;\n }\n }\n\n // Calculate averages\n const messageCount = uniqueMessages.size;\n const avgCostPerMessage = messageCount > 0 ? totalCost / messageCount : 0;\n\n // Calculate average per message per model\n const avgCostPerMessageByModel: Record<\n string,\n { avgCost: number; messageCount: number }\n > = {};\n\n for (const [modelName, data] of Object.entries(modelCosts)) {\n avgCostPerMessageByModel[modelName] = {\n avgCost: data.count > 0 ? data.totalCost / data.count : 0,\n messageCount: data.count,\n };\n }\n\n // Format model breakdown for response\n const modelBreakdown = Object.entries(modelCosts).map(([modelName, data]) => ({\n modelName,\n totalCost: data.totalCost,\n requestCount: data.count,\n avgCostPerRequest: data.count > 0 ? data.totalCost / data.count : 0,\n }));\n\n return Response.json({\n totalCost,\n messageCount,\n avgCostPerMessage,\n modelBreakdown,\n avgCostPerMessageByModel,\n });\n } catch (error: any) {\n console.error(`Error calculating cost for thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to calculate costs\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../../router/index\";\n\n/**\n * File System Root API\n *\n * Routes:\n * - GET /api/threads/:id/fs?stats=1 - Get storage statistics\n * - GET /api/threads/:id/fs?grep=pattern - Search file contents\n * - GET /api/threads/:id/fs?find=pattern - Find files by path pattern\n * - GET /api/threads/:id/fs - List root directory\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n if (req.method !== \"GET\") {\n return Response.json(\n { error: `Method ${req.method} not allowed` },\n { status: 405 }\n );\n }\n\n const url = new URL(req.url);\n\n try {\n // Get DurableObject instance\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId) as any;\n\n // Storage stats\n if (url.searchParams.has(\"stats\")) {\n const result = await stub.getFileStats();\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 500 });\n }\n return Response.json(result.stats);\n }\n\n // Full-text search (grep)\n const grepPattern = url.searchParams.get(\"grep\");\n if (grepPattern) {\n const path = url.searchParams.get(\"path\") || undefined;\n const limit = parseInt(url.searchParams.get(\"limit\") || \"100\", 10);\n\n const result = await stub.grepFiles(grepPattern, { path, limit });\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 500 });\n }\n return Response.json({ results: result.results, pattern: grepPattern });\n }\n\n // Find by path pattern\n const findPattern = url.searchParams.get(\"find\");\n if (findPattern) {\n const type = url.searchParams.get(\"type\") as \"file\" | \"directory\" | \"all\" | null;\n const limit = parseInt(url.searchParams.get(\"limit\") || \"100\", 10);\n\n const result = await stub.findFiles(findPattern, {\n type: type || \"all\",\n limit,\n });\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 500 });\n }\n return Response.json({ files: result.files, pattern: findPattern });\n }\n\n // Default: list root directory\n const result = await stub.readdirFile(\"/\");\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 500 });\n }\n return Response.json({ files: result.files, path: \"/\" });\n } catch (error: any) {\n console.error(`Error in fs root API for thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"File operation failed\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../router/index\";\n\n/**\n * GET /api/threads/:id/logs\n *\n * Get logs from a thread's DurableObject\n *\n * Query parameters:\n * - limit: number (default: 100)\n * - offset: number (default: 0)\n * - order: \"asc\" | \"desc\" (default: \"desc\")\n *\n * Returns:\n * - HTTP 200: { logs: Log[], total: number, hasMore: boolean }\n * - HTTP 404: Thread not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, params, env }) => {\n const url = new URL(req.url);\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Parse query parameters\n const limit = parseInt(url.searchParams.get(\"limit\") || \"100\", 10);\n const offset = parseInt(url.searchParams.get(\"offset\") || \"0\", 10);\n const order = url.searchParams.get(\"order\") === \"desc\" ? \"DESC\" : \"ASC\";\n\n // WebSocket upgrade for live log streaming\n if (req.headers.get(\"upgrade\")?.toLowerCase() === \"websocket\") {\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n // Forward the original upgrade request to the DurableObject\n return await stub.fetch(req);\n }\n\n // Get DurableObject instance and call via RPC for initial logs\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method directly\n const result = await stub.getLogs(limit, offset, order);\n\n return Response.json(result);\n } catch (error: any) {\n console.error(`Error fetching logs for thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to fetch logs\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../router/index\";\n\n/**\n * GET /api/threads/:id/messages\n *\n * Get messages from a thread's DurableObject\n *\n * By default, returns the newest messages (when truncating) in chronological order\n * (oldest first in array, newest last). This is ideal for chat UIs where you append\n * messages and scroll to the bottom.\n *\n * Query parameters:\n * - limit: number (default: 100) - Number of messages to return\n * - offset: number (default: 0) - Number of newest messages to skip (for scrolling up)\n * - order: \"asc\" | \"desc\" (default: \"desc\") - Internal fetch order (affects truncation)\n * - includeSilent: \"true\" | \"false\" (default: \"false\") - Include silent messages (UI-only)\n * - depth: number (default: 0) - Maximum depth to include (0 = top-level only, 1+ = include sub-prompts)\n *\n * Examples:\n * - GET /api/threads/:id/messages?limit=10\n * Returns newest 10 messages in chronological order [oldest...newest]\n *\n * - GET /api/threads/:id/messages?limit=10&offset=10\n * Skips newest 10, returns next 10 older messages in chronological order\n * (for scrolling up to view history)\n *\n * - GET /api/threads/:id/messages?order=asc\n * Returns oldest messages first (different truncation behavior)\n *\n * - GET /api/threads/:id/messages?includeSilent=true\n * Includes silent messages (hidden from LLM, visible in UI)\n *\n * - GET /api/threads/:id/messages?depth=1\n * Includes messages up to depth 1 (top-level + first level of sub-prompts)\n *\n * Returns:\n * - HTTP 200: { messages: Message[], total: number, hasMore: boolean }\n * - HTTP 404: Thread not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, params, env }) => {\n const url = new URL(req.url);\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Parse query parameters\n const limit = parseInt(url.searchParams.get(\"limit\") || \"100\", 10);\n const offset = parseInt(url.searchParams.get(\"offset\") || \"0\", 10);\n const order = url.searchParams.get(\"order\") === \"asc\" ? \"ASC\" : \"DESC\";\n const includeSilent = url.searchParams.get(\"includeSilent\") === \"true\";\n const maxDepth = parseInt(url.searchParams.get(\"depth\") || \"0\", 10);\n\n // Get DurableObject instance and call via RPC\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method directly\n const result = await stub.getMessages(\n limit,\n offset,\n order,\n includeSilent,\n maxDepth\n );\n\n return Response.json(result);\n } catch (error: any) {\n console.error(`Error fetching messages for thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to fetch messages\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../router/index\";\nimport type { AttachmentRef } from \"../../../agents/types\";\n\n// Helper to check if image needs processing (>2MB or unsupported format)\nfunction needsProcessing(base64Data: string, mimeType: string): boolean {\n // Estimate binary size from base64 (base64 is ~4/3 of binary size)\n const binarySize = Math.ceil(base64Data.length * 3 / 4);\n const MAX_SIZE = 2 * 1024 * 1024; // 2MB\n\n // Process if over 2MB\n if (binarySize > MAX_SIZE) {\n return true;\n }\n\n // Process if not JPEG or PNG (convert to JPEG)\n if (mimeType !== \"image/jpeg\" && mimeType !== \"image/png\") {\n return true;\n }\n\n return false;\n}\n\n/**\n * Attachment in request body\n */\ninterface AttachmentPayload {\n name: string;\n mimeType: string;\n data: string; // base64 encoded\n width?: number; // For images\n height?: number; // For images\n thumbnail?: string; // base64 encoded thumbnail\n}\n\n/**\n * Request body type\n */\ninterface MessagePayload {\n content: string;\n role: \"user\" | \"assistant\" | \"system\";\n attachments?: AttachmentPayload[];\n silent?: boolean;\n}\n\n/**\n * POST /api/threads/:id/messages\n *\n * Send a new message to the thread and trigger agent execution\n *\n * Body:\n * - content: string (message content)\n * - role: \"user\" | \"assistant\" | \"system\" (which side is sending)\n * - attachments?: Array of file attachments\n * - name: string (filename)\n * - mimeType: string\n * - data: string (base64 encoded)\n * - width?: number (for images)\n * - height?: number (for images)\n * - thumbnail?: string (base64 encoded thumbnail)\n * - silent?: boolean (hide from LLM context)\n *\n * Returns:\n * - HTTP 202: Message queued for processing\n * - HTTP 404: Thread not found\n * - HTTP 400: Invalid request\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Parse request body\n const body = (await req.json()) as MessagePayload;\n const { content = \"\", role, attachments, silent } = body;\n\n // Require either content or attachments\n const hasContent = content && typeof content === \"string\" && content.trim().length > 0;\n const hasAttachments = attachments && Array.isArray(attachments) && attachments.length > 0;\n\n if (!hasContent && !hasAttachments) {\n return Response.json(\n { error: \"Message content or attachments required\" },\n { status: 400 }\n );\n }\n\n // Get DurableObject instance\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId) as any;\n\n // Process attachments if present\n let attachmentRefs: AttachmentRef[] | undefined;\n\n if (attachments && attachments.length > 0) {\n attachmentRefs = [];\n\n for (const attachment of attachments) {\n // Generate unique ID and path for attachment\n const attachmentId = crypto.randomUUID();\n const timestamp = Date.now();\n\n // Start with original values\n let fileData = attachment.data;\n let mimeType = attachment.mimeType;\n let width = attachment.width;\n let height = attachment.height;\n\n // Process images if needed (>2MB or unsupported format)\n // Processing happens inside the DurableObject where WASM is initialized\n if (mimeType.startsWith(\"image/\") && needsProcessing(fileData, mimeType)) {\n try {\n const originalSize = Math.ceil(fileData.length * 3 / 4);\n const processed = await stub.processImage(fileData, mimeType);\n\n if (processed.success && processed.data) {\n fileData = processed.data;\n mimeType = processed.mimeType!;\n width = processed.width;\n height = processed.height;\n\n const newSize = Math.ceil(fileData.length * 3 / 4);\n console.log(\n `[image-processing] Processed ${attachment.name}: ` +\n `${(originalSize / 1024 / 1024).toFixed(2)}MB → ${(newSize / 1024 / 1024).toFixed(2)}MB, ` +\n `${processed.width}x${processed.height}, ${processed.mimeType}`\n );\n } else {\n console.error(`[image-processing] Failed to process ${attachment.name}:`, processed.error);\n // Continue with original data if processing fails\n }\n } catch (err) {\n console.error(`[image-processing] Failed to process ${attachment.name}:`, err);\n // Continue with original data if processing fails\n }\n }\n\n // Determine file extension based on (potentially updated) mimeType\n const ext = mimeType === \"image/png\" ? \"png\" :\n mimeType === \"image/jpeg\" ? \"jpg\" :\n attachment.name.split(\".\").pop() || \"bin\";\n const path = `/attachments/${timestamp}-${attachmentId}.${ext}`;\n\n // Store file in thread's file system\n const base64Size = fileData.length;\n const binarySize = Math.ceil(base64Size * 3 / 4);\n console.log(`[writeFile] Storing ${attachment.name}: ${(binarySize / 1024 / 1024).toFixed(2)}MB binary (${(base64Size / 1024 / 1024).toFixed(2)}MB base64) to ${path}`);\n\n const result = await stub.writeFile(\n path,\n fileData,\n mimeType,\n {\n thumbnail: attachment.thumbnail,\n width,\n height,\n }\n );\n\n console.log(`[writeFile] Result:`, result.success ? 'success' : result.error);\n\n if (!result.success) {\n console.error(`Failed to store attachment ${attachment.name}:`, result.error);\n continue;\n }\n\n // Create attachment reference\n const ref: AttachmentRef = {\n id: attachmentId,\n type: \"file\",\n path,\n name: attachment.name,\n mimeType: mimeType,\n };\n\n if (width) ref.width = width;\n if (height) ref.height = height;\n\n attachmentRefs.push(ref);\n }\n }\n\n // Send message with attachments\n const attachmentsJson = attachmentRefs && attachmentRefs.length > 0\n ? JSON.stringify(attachmentRefs)\n : undefined;\n return await stub.sendMessage(threadId, content, role, attachmentsJson);\n } catch (error: any) {\n console.error(`Error sending message to thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to send message\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../router/index\";\n\n/**\n * RPC endpoint for calling DurableThread methods\n * Used primarily for testing\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n // Parse request body\n const body = await req.json() as { method?: string; args?: unknown[] };\n const { method, args = [] } = body;\n\n if (!method) {\n return Response.json({ error: \"Method required\" }, { status: 400 });\n }\n\n try {\n // Get the DurableThread instance\n const id = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const thread = env.AGENT_BUILDER_THREAD.get(id);\n\n // Call the method via RPC\n // @ts-ignore - Dynamic RPC call\n const result = await thread[method](...args);\n\n // If result is a Response, return it directly\n if (result instanceof Response) {\n return result;\n }\n\n // Otherwise wrap in JSON response\n return Response.json(result);\n } catch (error: any) {\n console.error(`RPC call to ${method} failed:`, error);\n return Response.json(\n { error: error.message || \"RPC call failed\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../router/index\";\n\n/**\n * POST /api/threads/:id/stop\n *\n * Stop the currently executing thread\n *\n * Returns:\n * - HTTP 200: Thread stopped successfully or not currently running\n * - HTTP 404: Thread not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ params, env }) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance and call via RPC\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method directly\n return await stub.stop();\n } catch (error: any) {\n console.error(`Error stopping thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to stop thread\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../router/index\";\n\n/**\n * GET /api/threads/:id/stream\n *\n * WebSocket endpoint for real-time message streaming\n *\n * This endpoint is specifically for message updates and should be used\n * by applications that want to receive real-time message data without\n * getting internal log/telemetry information.\n *\n * Returns:\n * - HTTP 101: WebSocket upgrade for message streaming\n * - HTTP 400: Not a WebSocket upgrade request\n * - HTTP 404: Thread not found\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n // Only handle WebSocket upgrades\n if (req.headers.get(\"upgrade\")?.toLowerCase() !== \"websocket\") {\n return Response.json(\n { error: \"This endpoint only supports WebSocket connections\" },\n { status: 400 }\n );\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Forward WebSocket upgrade to DurableObject\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n return await stub.fetch(req);\n } catch (error: any) {\n console.error(`Error handling message stream for thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to establish message stream\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../../router/index\";\nimport type { FileRecord } from \"../../../../agents/types.js\";\n\n// Must match CHUNK_SIZE in files.ts\nconst CHUNK_SIZE = 1.75 * 1024 * 1024; // 1.75MB\n\n/**\n * Convert FileRecord to AttachmentRef format for client consumption\n */\nfunction toAttachmentRef(file: FileRecord): {\n id: string;\n type: \"file\";\n path: string;\n name: string;\n mimeType: string;\n size: number;\n width?: number;\n height?: number;\n} {\n // Use direct width/height columns, fall back to metadata for backwards compatibility\n const metadata = file.metadata as { width?: number; height?: number } | null;\n const width = file.width ?? metadata?.width;\n const height = file.height ?? metadata?.height;\n\n return {\n id: file.path, // Use path as unique ID\n type: \"file\",\n path: file.path,\n name: file.name,\n mimeType: file.mimeType,\n size: file.size,\n ...(width && { width }),\n ...(height && { height }),\n };\n}\n\n/**\n * File System API for DurableThread\n *\n * Routes:\n * - GET /api/threads/:id/fs/*path - Get file data or list directory\n * - GET /api/threads/:id/fs/*path?thumbnail=1 - Get thumbnail (images only)\n * - GET /api/threads/:id/fs?stats=1 - Get storage stats\n * - POST /api/threads/:id/fs/*path - Write file (auto-chunks large files)\n * - DELETE /api/threads/:id/fs/*path - Delete file or empty directory\n *\n * Path is a catch-all parameter, e.g.:\n * - /api/threads/abc/fs/images/photo.jpg -> path = \"images/photo.jpg\"\n * - /api/threads/abc/fs/docs/2024/report.pdf -> path = \"docs/2024/report.pdf\"\n */\nexport default defineController(async ({ req, params, env }) => {\n console.log('[fs] params received:', JSON.stringify(params));\n\n const threadId = params.id;\n // rou3 uses \"_\" for catch-all wildcard params, or check for \"path\" or \"*\"\n const pathParam = params._ || params.path || params['*'] || '';\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n console.log('[fs] threadId:', threadId, 'pathParam:', pathParam);\n\n // Normalize path - ensure it starts with /\n const path = pathParam ? `/${pathParam}` : \"/\";\n const url = new URL(req.url);\n\n try {\n // Get DurableObject instance\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId) as any;\n\n // Check for chunked upload routes\n // Pattern: /path/to/file/upload/start, /path/to/file/upload/chunk/0, /path/to/file/upload/complete\n const uploadMatch = path.match(/^(.+)\\/upload\\/(start|complete|chunk\\/(\\d+))$/);\n if (uploadMatch) {\n const filePath = uploadMatch[1];\n const action = uploadMatch[2];\n const chunkIndex = uploadMatch[3] ? parseInt(uploadMatch[3], 10) : undefined;\n\n if (action === \"start\" && req.method === \"POST\") {\n return handleChunkedUploadStart(stub, filePath, req);\n }\n if (action === \"complete\" && req.method === \"POST\") {\n return handleChunkedUploadComplete(stub, filePath, req);\n }\n if (action.startsWith(\"chunk/\") && req.method === \"PUT\" && chunkIndex !== undefined) {\n return handleChunkedUploadChunk(stub, filePath, chunkIndex, req);\n }\n\n return Response.json(\n { error: `Invalid upload action: ${action} with method ${req.method}` },\n { status: 400 }\n );\n }\n\n // Handle based on HTTP method\n switch (req.method) {\n case \"GET\":\n return handleGet(stub, path, url);\n case \"POST\":\n return handlePost(stub, path, req);\n case \"DELETE\":\n return handleDelete(stub, path);\n default:\n return Response.json(\n { error: `Method ${req.method} not allowed` },\n { status: 405 }\n );\n }\n } catch (error: any) {\n console.error(`Error in fs API for thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"File operation failed\" },\n { status: 500 }\n );\n }\n});\n\n/**\n * Handle GET requests - fetch file data, directory listing, or stats\n */\nasync function handleGet(stub: any, path: string, url: URL): Promise<Response> {\n // Check for stats request\n if (url.searchParams.has(\"stats\")) {\n const result = await stub.getFileStats();\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 500 });\n }\n return Response.json(result.stats);\n }\n\n // Check for thumbnail request\n if (url.searchParams.has(\"thumbnail\")) {\n const result = await stub.getFileThumbnail(path);\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 404 });\n }\n\n // Return binary thumbnail data\n const binary = atob(result.data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n return new Response(bytes, {\n headers: {\n \"Content-Type\": \"image/jpeg\", // Thumbnails are typically JPEG\n \"Cache-Control\": \"public, max-age=31536000\", // Cache for 1 year\n },\n });\n }\n\n // Get file info first\n const statResult = await stub.statFile(path);\n\n if (!statResult.success) {\n return Response.json({ error: \"Not found\" }, { status: 404 });\n }\n\n const file = statResult.file;\n\n // If it's a directory, list contents\n if (file.isDirectory) {\n const result = await stub.readdirFile(path);\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 500 });\n }\n return Response.json({ files: result.files, path });\n }\n\n // If it's an external file, return metadata only\n if (file.storage !== \"local\") {\n return Response.json({\n file,\n external: true,\n location: file.location,\n });\n }\n\n // For local files, check if client wants JSON metadata or raw data\n const acceptHeader = url.searchParams.get(\"format\") || \"auto\";\n\n if (acceptHeader === \"json\") {\n // Return file metadata as JSON\n return Response.json({ file });\n }\n\n // For chunked files, stream chunks directly to avoid memory issues\n if (file.isChunked && file.chunkCount) {\n return streamChunkedFile(stub, path, file);\n }\n\n // Return raw file data with appropriate content type\n const result = await stub.readFile(path);\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 404 });\n }\n\n // Convert base64 to binary\n const binary = atob(result.data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n return new Response(bytes, {\n headers: {\n \"Content-Type\": file.mimeType,\n \"Content-Length\": String(file.size),\n \"Content-Disposition\": `inline; filename=\"${file.name}\"`,\n },\n });\n}\n\n/**\n * Stream a chunked file directly to response, reading one chunk at a time.\n * This avoids loading the entire file into memory.\n */\nfunction streamChunkedFile(\n stub: any,\n path: string,\n file: { name: string; mimeType: string; size: number; chunkCount: number }\n): Response {\n const { readable, writable } = new TransformStream();\n const writer = writable.getWriter();\n\n // Stream chunks in background\n (async () => {\n try {\n for (let i = 0; i < file.chunkCount; i++) {\n const result = await stub.readFileChunk(path, i);\n if (!result.success) {\n console.error(`Failed to read chunk ${i}:`, result.error);\n break;\n }\n\n // Decode base64 to binary\n const binary = atob(result.data);\n const bytes = new Uint8Array(binary.length);\n for (let j = 0; j < binary.length; j++) {\n bytes[j] = binary.charCodeAt(j);\n }\n\n await writer.write(bytes);\n }\n } catch (error) {\n console.error(\"Error streaming chunked file:\", error);\n } finally {\n await writer.close();\n }\n })();\n\n return new Response(readable, {\n headers: {\n \"Content-Type\": file.mimeType,\n \"Content-Length\": String(file.size),\n \"Content-Disposition\": `inline; filename=\"${file.name}\"`,\n // Note: We set Content-Length, but also use chunked transfer internally\n },\n });\n}\n\n/**\n * Handle POST requests - write file or create directory\n */\nasync function handlePost(stub: any, path: string, req: Request): Promise<Response> {\n const contentType = req.headers.get(\"Content-Type\") || \"\";\n\n // Check if it's a directory creation request\n if (contentType.includes(\"application/json\")) {\n const body = await req.json() as any;\n\n // Directory creation\n if (body.type === \"directory\") {\n const result = await stub.mkdirFile(path);\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n return Response.json({ directory: result.directory }, { status: 201 });\n }\n\n // External file link\n if (body.location) {\n const result = await stub.linkFile(path, body.location, {\n mimeType: body.mimeType,\n size: body.size,\n metadata: body.metadata,\n });\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n return Response.json(toAttachmentRef(result.file), { status: 201 });\n }\n\n // File upload with base64 data\n if (body.data) {\n const result = await stub.writeFile(path, body.data, body.mimeType || \"application/octet-stream\", {\n metadata: body.metadata,\n thumbnail: body.thumbnail,\n });\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n return Response.json(toAttachmentRef(result.file), { status: 201 });\n }\n\n return Response.json({ error: \"Invalid request body\" }, { status: 400 });\n }\n\n // Handle raw binary upload\n const mimeType = contentType.split(\";\")[0].trim() || \"application/octet-stream\";\n const contentLength = parseInt(req.headers.get(\"Content-Length\") || \"0\", 10);\n\n // For large files, stream and chunk server-side (transparent to client)\n if (contentLength > CHUNK_SIZE && req.body) {\n return handleStreamingUpload(stub, path, mimeType, contentLength, req);\n }\n\n // Small file: load into memory and write directly\n const data = await req.arrayBuffer();\n\n // Convert to base64\n const bytes = new Uint8Array(data);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n const base64 = btoa(binary);\n\n const result = await stub.writeFile(path, base64, mimeType, {});\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n\n // Return AttachmentRef format for client consumption\n return Response.json(toAttachmentRef(result.file), { status: 201 });\n}\n\n/**\n * Handle large file uploads by streaming the request body and chunking server-side.\n * This makes chunking transparent to the client - they just send a normal PUT.\n */\nasync function handleStreamingUpload(\n stub: any,\n path: string,\n mimeType: string,\n totalSize: number,\n req: Request\n): Promise<Response> {\n // Start chunked upload session\n const startResult = await stub.startChunkedUpload(path, totalSize, mimeType, {});\n if (!startResult.success) {\n return Response.json({ error: startResult.error }, { status: 400 });\n }\n\n const reader = req.body!.getReader();\n let chunkIndex = 0;\n let buffer = new Uint8Array(0);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (value) {\n // Append incoming data to buffer\n const newBuffer = new Uint8Array(buffer.length + value.length);\n newBuffer.set(buffer);\n newBuffer.set(value, buffer.length);\n buffer = newBuffer;\n\n // Write complete chunks as we accumulate them\n while (buffer.length >= CHUNK_SIZE) {\n const chunk = buffer.slice(0, CHUNK_SIZE);\n const base64 = arrayBufferToBase64(chunk);\n\n const chunkResult = await stub.writeFileChunk(path, chunkIndex, base64);\n if (!chunkResult.success) {\n return Response.json({ error: chunkResult.error }, { status: 400 });\n }\n\n chunkIndex++;\n buffer = buffer.slice(CHUNK_SIZE);\n }\n }\n\n if (done) {\n // Write any remaining data as the final chunk\n if (buffer.length > 0) {\n const base64 = arrayBufferToBase64(buffer);\n const chunkResult = await stub.writeFileChunk(path, chunkIndex, base64);\n if (!chunkResult.success) {\n return Response.json({ error: chunkResult.error }, { status: 400 });\n }\n chunkIndex++;\n }\n break;\n }\n }\n\n // Complete the upload\n const completeResult = await stub.completeChunkedUpload(path, chunkIndex, {});\n if (!completeResult.success) {\n return Response.json({ error: completeResult.error }, { status: 400 });\n }\n\n return Response.json(toAttachmentRef(completeResult.file), { status: 201 });\n } catch (error: any) {\n console.error(\"Streaming upload failed:\", error);\n return Response.json({ error: error.message || \"Upload failed\" }, { status: 500 });\n }\n}\n\n/**\n * Convert Uint8Array to base64 string (handles large arrays)\n */\nfunction arrayBufferToBase64(bytes: Uint8Array): string {\n // Process in smaller batches to avoid call stack limits\n const BATCH_SIZE = 32768;\n let binary = \"\";\n for (let i = 0; i < bytes.length; i += BATCH_SIZE) {\n const slice = bytes.subarray(i, Math.min(i + BATCH_SIZE, bytes.length));\n binary += String.fromCharCode.apply(null, slice as unknown as number[]);\n }\n return btoa(binary);\n}\n\n/**\n * Handle DELETE requests - remove file or empty directory\n */\nasync function handleDelete(stub: any, path: string): Promise<Response> {\n // Try to get file info first\n const statResult = await stub.statFile(path);\n\n if (!statResult.success) {\n return Response.json({ error: \"Not found\" }, { status: 404 });\n }\n\n const file = statResult.file;\n\n if (file.isDirectory) {\n // Remove directory\n const result = await stub.rmdirFile(path);\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n } else {\n // Remove file\n const result = await stub.unlinkFile(path);\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n }\n\n return new Response(null, { status: 204 });\n}\n\n// ============================================================\n// Chunked Upload Handlers (for files > 1.75MB)\n// ============================================================\n\n/**\n * Handle POST /fs/*path/upload/start\n * Initializes a chunked upload session\n */\nasync function handleChunkedUploadStart(\n stub: any,\n filePath: string,\n req: Request\n): Promise<Response> {\n const body = await req.json() as {\n totalSize: number;\n mimeType: string;\n metadata?: Record<string, unknown>;\n width?: number;\n height?: number;\n };\n\n if (!body.totalSize || !body.mimeType) {\n return Response.json(\n { error: \"totalSize and mimeType are required\" },\n { status: 400 }\n );\n }\n\n const result = await stub.startChunkedUpload(filePath, body.totalSize, body.mimeType, {\n metadata: body.metadata,\n width: body.width,\n height: body.height,\n });\n\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n\n return Response.json({\n chunkSize: result.chunkSize,\n expectedChunks: result.expectedChunks,\n path: filePath,\n });\n}\n\n/**\n * Handle PUT /fs/*path/upload/chunk/:index\n * Writes a single chunk of the file\n */\nasync function handleChunkedUploadChunk(\n stub: any,\n filePath: string,\n chunkIndex: number,\n req: Request\n): Promise<Response> {\n // Accept raw binary data\n const data = await req.arrayBuffer();\n\n // Convert to base64 for RPC transport\n const bytes = new Uint8Array(data);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n const base64 = btoa(binary);\n\n const result = await stub.writeFileChunk(filePath, chunkIndex, base64);\n\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n\n return Response.json({\n chunkIndex,\n received: data.byteLength,\n });\n}\n\n/**\n * Handle POST /fs/*path/upload/complete\n * Finalizes the chunked upload and validates all chunks\n */\nasync function handleChunkedUploadComplete(\n stub: any,\n filePath: string,\n req: Request\n): Promise<Response> {\n const body = await req.json() as {\n expectedChunks: number;\n thumbnail?: string; // base64 encoded\n };\n\n if (typeof body.expectedChunks !== \"number\") {\n return Response.json(\n { error: \"expectedChunks is required\" },\n { status: 400 }\n );\n }\n\n const result = await stub.completeChunkedUpload(filePath, body.expectedChunks, {\n thumbnail: body.thumbnail,\n });\n\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n\n // Return AttachmentRef format\n return Response.json(toAttachmentRef(result.file), { status: 201 });\n}\n","import { defineController } from \"../../../../router/index\";\n\n/**\n * GET /api/threads/:id/logs/:logId\n *\n * Get detailed information for a single log from a thread's DurableObject\n *\n * Returns:\n * - HTTP 200: Full log details object\n * - HTTP 404: Thread or log not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n const logId = params.logId;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n if (!logId) {\n return Response.json({ error: \"Log ID required\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance and call RPC method\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method directly\n const logDetails = await stub.getLogDetails(logId);\n\n return Response.json(logDetails);\n } catch (error: any) {\n console.error(`Error fetching log details for ${logId}:`, error);\n\n if (error.message?.includes(\"not found\")) {\n return Response.json(\n { error: error.message },\n { status: 404 }\n );\n }\n\n return Response.json(\n { error: error.message || \"Failed to fetch log details\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../../router/index\";\n\n/**\n * DELETE /api/threads/:id/messages/:messageId\n *\n * Delete a message from a thread's DurableObject\n *\n * Returns:\n * - HTTP 200: { success: true }\n * - HTTP 404: Thread or message not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n const messageId = params.messageId;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n if (!messageId) {\n return Response.json({ error: \"Message ID required\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance and call via RPC\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method directly\n const result = await stub.deleteMessage(messageId);\n\n if (!result.success) {\n return Response.json(\n { error: result.error || \"Failed to delete message\" },\n { status: 404 }\n );\n }\n\n return Response.json({ success: true });\n } catch (error: any) {\n console.error(`Error deleting message ${messageId} from thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to delete message\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../../router/index\";\n\n/**\n * PATCH /api/threads/:id/messages/:messageId\n *\n * Update a message's content in a thread's DurableObject\n *\n * Body:\n * - content: string (required) - The new message content\n *\n * Returns:\n * - HTTP 200: { success: true }\n * - HTTP 400: Missing required fields\n * - HTTP 404: Thread or message not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n const messageId = params.messageId;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n if (!messageId) {\n return Response.json({ error: \"Message ID required\" }, { status: 400 });\n }\n\n // Parse request body\n let body: { content?: string };\n try {\n body = await req.json();\n } catch {\n return Response.json({ error: \"Invalid JSON body\" }, { status: 400 });\n }\n\n if (typeof body.content !== \"string\") {\n return Response.json({ error: \"Content is required and must be a string\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance and call via RPC\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method directly\n const result = await stub.updateMessageContent(messageId, body.content);\n\n if (!result.success) {\n return Response.json(\n { error: result.error || \"Failed to update message\" },\n { status: 404 }\n );\n }\n\n return Response.json({ success: true });\n } catch (error: any) {\n console.error(`Error updating message ${messageId} in thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to update message\" },\n { status: 500 }\n );\n }\n});\n","// Auto-generated file - do not edit manually\n// Generated by scripts/generate-built-in-routes.ts\n\nimport { addRoute } from 'rou3';\n\n// Import all route handlers\nimport handler0 from './api/index.post';\nimport handler1 from './api/agents.get';\nimport handler2 from './api/api-keys/index.get';\nimport handler3 from './api/api-keys/index.post';\nimport handler4 from './api/config.get';\nimport handler5 from './api/diagnostics.get';\nimport handler6 from './api/events.get';\nimport handler7 from './api/models.get';\nimport handler8 from './api/new-test.get';\nimport handler9 from './api/prompts.get';\nimport handler10 from './api/providers.get';\nimport handler11 from './api/threads/index.post';\nimport handler12 from './api/threads/index';\nimport handler13 from './api/tools.get';\nimport handler14 from './api/users/index.get';\nimport handler15 from './api/users/index.post';\nimport handler16 from './api/agents/[name].get';\nimport handler17 from './api/api-keys/[id].delete';\nimport handler18 from './api/prompts/[name].get';\nimport handler19 from './api/threads/[id].delete';\nimport handler20 from './api/threads/[id].patch';\nimport handler21 from './api/threads/[id]';\nimport handler22 from './api/tools/[name].get';\nimport handler23 from './api/users/[id].delete';\nimport handler24 from './api/users/[id].put';\nimport handler25 from './api/auth/config.get';\nimport handler26 from './api/auth/login.post';\nimport handler27 from './api/auth/logout.post';\nimport handler28 from './api/auth/me.get';\nimport handler29 from './api/models/available.post';\nimport handler30 from './api/models/endpoints.post';\nimport handler31 from './api/threads/[id]/cost.get';\nimport handler32 from './api/threads/[id]/fs/index';\nimport handler33 from './api/threads/[id]/logs.get';\nimport handler34 from './api/threads/[id]/messages.get';\nimport handler35 from './api/threads/[id]/messages.post';\nimport handler36 from './api/threads/[id]/rpc.post';\nimport handler37 from './api/threads/[id]/stop.post';\nimport handler38 from './api/threads/[id]/stream';\nimport handler39 from './api/threads/[id]/fs/[...path].delete';\nimport handler40 from './api/threads/[id]/fs/[...path].post';\nimport handler41 from './api/threads/[id]/fs/[...path]';\nimport handler42 from './api/threads/[id]/logs/[logId].get';\nimport handler43 from './api/threads/[id]/messages/[messageId].delete';\nimport handler44 from './api/threads/[id]/messages/[messageId].patch';\n\nconst routeHandlers: Record<string, any> = {\n 'POST:/': handler0,\n 'GET:/agents': handler1,\n 'GET:/api-keys': handler2,\n 'POST:/api-keys': handler3,\n 'GET:/config': handler4,\n 'GET:/diagnostics': handler5,\n 'GET:/events': handler6,\n 'GET:/models': handler7,\n 'GET:/new-test': handler8,\n 'GET:/prompts': handler9,\n 'GET:/providers': handler10,\n 'POST:/threads': handler11,\n 'GET:/threads': handler12,\n 'GET:/tools': handler13,\n 'GET:/users': handler14,\n 'POST:/users': handler15,\n 'GET:/agents/:name': handler16,\n 'DELETE:/api-keys/:id': handler17,\n 'GET:/prompts/:name': handler18,\n 'DELETE:/threads/:id': handler19,\n 'PATCH:/threads/:id': handler20,\n 'GET:/threads/:id': handler21,\n 'GET:/tools/:name': handler22,\n 'DELETE:/users/:id': handler23,\n 'PUT:/users/:id': handler24,\n 'GET:/auth/config': handler25,\n 'POST:/auth/login': handler26,\n 'POST:/auth/logout': handler27,\n 'GET:/auth/me': handler28,\n 'POST:/models/available': handler29,\n 'POST:/models/endpoints': handler30,\n 'GET:/threads/:id/cost': handler31,\n 'GET:/threads/:id/fs': handler32,\n 'GET:/threads/:id/logs': handler33,\n 'GET:/threads/:id/messages': handler34,\n 'POST:/threads/:id/messages': handler35,\n 'POST:/threads/:id/rpc': handler36,\n 'POST:/threads/:id/stop': handler37,\n 'GET:/threads/:id/stream': handler38,\n 'DELETE:/threads/:id/fs/**': handler39,\n 'POST:/threads/:id/fs/**': handler40,\n 'GET:/threads/:id/fs/**': handler41,\n 'GET:/threads/:id/logs/:logId': handler42,\n 'DELETE:/threads/:id/messages/:messageId': handler43,\n 'PATCH:/threads/:id/messages/:messageId': handler44,\n};\n\nexport interface RuntimeData {\n config?: any;\n tools?: any;\n models?: Record<string, () => Promise<any>>;\n modelNames?: string[];\n prompts?: Record<string, () => Promise<any>>;\n promptNames?: string[];\n agents?: Record<string, () => Promise<any>>;\n agentNames?: string[];\n}\n\nexport function registerBuiltInRoutes(router: any, runtimeData?: RuntimeData) {\n for (const [key, handler] of Object.entries(routeHandlers)) {\n const [method, ...routeParts] = key.split(':');\n const route = routeParts.join(':');\n const apiRoute = `/api${route}`;\n // Wrap handler to inject runtime data into context\n const wrappedHandler = async (context: any) => {\n // Add runtime data to context if provided\n const enhancedContext = {\n ...context,\n ...(runtimeData?.config && { config: runtimeData.config }),\n ...(runtimeData?.tools && { tools: runtimeData.tools }),\n ...(runtimeData?.models && { models: runtimeData.models }),\n ...(runtimeData?.modelNames && { modelNames: runtimeData.modelNames }),\n ...(runtimeData?.prompts && { prompts: runtimeData.prompts }),\n ...(runtimeData?.promptNames && { promptNames: runtimeData.promptNames }),\n ...(runtimeData?.agents && { agents: runtimeData.agents }),\n ...(runtimeData?.agentNames && { agentNames: runtimeData.agentNames }),\n };\n return handler(enhancedContext);\n };\n addRoute(router, method, apiRoute, async () => wrappedHandler);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/agents/types.ts","../src/agents/StreamManager.ts","../src/agents/providers/types.ts","../src/agents/providers/BaseProvider.ts","../src/agents/providers/OpenAIProvider.ts","../src/agents/providers/OpenRouterProvider.ts","../src/agents/providers/TestScript.ts","../src/agents/providers/TestProvider.ts","../src/agents/providers/ProviderRegistry.ts","../src/agents/providers/index.ts","../src/agents/LLMRequest.ts","../src/durable-objects/files.ts","../src/agents/ToolExecutor.ts","../src/agents/context.ts","../src/agents/FlowEngine.ts","../src/agents/utilities.ts","../src/agents/ThreadStateImpl.ts","../../../node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.mjs","../src/router/index.ts","../src/api/index.post.ts","../src/api/agents.get.ts","../src/utils/auth.ts","../src/middleware/auth.ts","../src/api/api-keys/index.get.ts","../src/api/api-keys/index.post.ts","../src/api/config.get.ts","../src/api/diagnostics.get.ts","../src/api/events.get.ts","../src/api/models.get.ts","../src/api/new-test.get.ts","../src/api/prompts.get.ts","../src/api/providers.get.ts","../src/api/threads/index.post.ts","../src/api/threads/index.ts","../src/api/tools.get.ts","../src/api/users/index.get.ts","../src/api/users/index.post.ts","../src/api/agents/%5Bname%5D.get.ts","../src/api/api-keys/%5Bid%5D.delete.ts","../src/api/prompts/%5Bname%5D.get.ts","../src/utils/permissions.ts","../src/api/threads/%5Bid%5D.delete.ts","../src/api/threads/%5Bid%5D.patch.ts","../src/api/threads/%5Bid%5D.ts","../src/api/tools/%5Bname%5D.get.ts","../src/api/users/%5Bid%5D.delete.ts","../src/api/users/%5Bid%5D.put.ts","../src/api/auth/config.get.ts","../src/api/auth/login.post.ts","../src/api/auth/logout.post.ts","../src/api/auth/me.get.ts","../src/api/models/available.post.ts","../src/api/models/endpoints.post.ts","../src/api/threads/%5Bid%5D/cost.get.ts","../src/api/threads/%5Bid%5D/fs/index.ts","../src/api/threads/%5Bid%5D/logs.get.ts","../src/api/threads/%5Bid%5D/messages.get.ts","../src/api/threads/%5Bid%5D/messages.post.ts","../src/api/threads/%5Bid%5D/rpc.post.ts","../src/api/threads/%5Bid%5D/stop.post.ts","../src/api/threads/%5Bid%5D/stream.ts","../src/api/threads/%5Bid%5D/fs/%5B...path%5D.ts","../src/api/threads/%5Bid%5D/logs/%5BlogId%5D.get.ts","../src/api/threads/%5Bid%5D/messages/%5BmessageId%5D.delete.ts","../src/api/threads/%5Bid%5D/messages/%5BmessageId%5D.patch.ts","../src/built-in-routes.ts"],"names":["init_types","error","ProviderRegistry","CHUNK_SIZE","result","FlowEngine","tools","text","FileStorage","toolCalls","z","nonImageFiles","index_post_default","toJSONSchema","index_get_default","loader","normalizePromptContent","name_get_default","id_delete_default","resolveIconUrl","config_get_default","token","durableId","stub","binary","bytes"],"mappings":";;;;;;;;;;;;;;AAAA,IA2vBa,SAAA,EACA,qBAAA,EACA,oBAAA,EACA,eAAA,EACA,YAAA;AA/vBb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qBAAA,GAAA;AA2vBO,IAAM,SAAA,GAAY,GAAA;AAClB,IAAM,qBAAA,GAAwB,CAAA;AAC9B,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,YAAA,GAAe,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/vB5B,IAqBa,aAAA;AArBb,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6BAAA,GAAA;AAAA,IAAA,UAAA,EAAA;AAqBO,IAAM,gBAAN,MAAoB;AAAA;AAAA;AAAA;AAAA,MAIjB,cAAA;AAAA;AAAA;AAAA;AAAA,MAKD,UAAA;AAAA;AAAA;AAAA;AAAA,MAKA,cAAA,GAAyB,CAAA;AAAA;AAAA;AAAA;AAAA,MAKxB,mBAAkC,EAAC;AAAA;AAAA;AAAA;AAAA,MAKpC,YAAA,GAAwB,KAAA;AAAA;AAAA;AAAA;AAAA,MAKvB,OAAA;AAAA;AAAA;AAAA;AAAA,MAKD,IAAA;AAAA;AAAA;AAAA;AAAA,MAKC,WAAuB,MAAM;AAAA,MAAC,CAAA;AAAA;AAAA;AAAA;AAAA,MAK9B,MAAA,GAAkB,KAAA;AAAA,MAE1B,WAAA,CAAY,WAAA,GAA2C,EAAC,EAAG;AACzD,QAAA,IAAA,CAAK,OAAA,GAAU,IAAI,WAAA,EAAY;AAG/B,QAAA,IAAA,CAAK,UAAA,GAAa,IAAI,cAAA,CAA2B;AAAA,UAC/C,KAAA,EAAO,CAAC,UAAA,KAAe;AACrB,YAAA,IAAA,CAAK,cAAA,GAAiB,UAAA;AAAA,UACxB;AAAA,SACD,CAAA;AAGD,QAAA,IAAA,CAAK,mBAAmB,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAC7C,WAAA,GACA,CAAC,WAAW,CAAA;AAGhB,QAAA,IAAA,CAAK,IAAA,GAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AACnC,UAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,QAClB,CAAC,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,YAAY,KAAA,EAAqB;AAC/B,QAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,MAAA,EAAQ;AACvC,UAAA,OAAA,CAAQ,KAAK,0DAA0D,CAAA;AACvE,UAAA;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACxD,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AAAA,QACrD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,eAAe,IAAA,EAAyC;AACtD,QAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,GAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,CAAC,IAAI,CAAE,CAAA;AAAA,MACrE;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,QAAQ,QAAA,EAAqD;AACjE,QAAA,IAAA,CAAK,cAAA,EAAA;AAEL,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,EAAS;AAAA,QACjB,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,UAAA,MAAM,KAAA;AAAA,QACR,CAAA,SAAE;AACA,UAAA,IAAA,CAAK,YAAA,EAAa;AAAA,QACpB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,YAAA,GAAqB;AACnB,QAAA,IAAA,CAAK,cAAA,EAAA;AAEL,QAAA,IAAI,IAAA,CAAK,kBAAkB,CAAA,IAAK,CAAC,KAAK,YAAA,IAAgB,CAAC,KAAK,MAAA,EAAQ;AAElE,UAAA,UAAA,CAAW,YAAY;AACrB,YAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,CAAA,IAAK,CAAC,KAAK,MAAA,EAAQ;AAC5C,cAAA,MAAM,KAAK,KAAA,EAAM;AAAA,YACnB;AAAA,UACF,GAAG,eAAe,CAAA;AAAA,QACpB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,KAAA,GAAuB;AAC3B,QAAA,IAAI,KAAK,MAAA,EAAQ;AACf,UAAA;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAEd,QAAA,IAAI;AAEF,UAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,YACZ,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,OAAO,IAAA,KAAS;AACxC,cAAA,IAAI;AACF,gBAAA,MAAM,IAAA,EAAK;AAAA,cACb,SAAS,KAAA,EAAO;AACd,gBAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,cACnD;AAAA,YACF,CAAC;AAAA,WACH;AAGA,UAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,YAAA,IAAI;AACF,cAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,YAC5B,SAAS,KAAA,EAAO;AACd,cAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,YACnD;AAAA,UACF;AAGA,UAAA,IAAA,CAAK,QAAA,EAAS;AAAA,QAChB,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,UAAA,IAAA,CAAK,QAAA,EAAS;AAAA,QAChB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,UAAA,GAAmB;AACjB,QAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,QAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AACtB,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9LA,IAAAA,WAAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAgBsB,YAAA;AAhBtB,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sCAAA,GAAA;AAgBO,IAAe,eAAf,MAAmD;AAAA,MAC9C,MAAA;AAAA,MAEV,YAAY,MAAA,EAAwB;AAClC,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAkBU,aAAA,CAAc,OAAe,KAAA,EAAwB;AAC7D,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,KAAA,CAAM,MAAA,CAAO,YAAY,KAAK,CAAA;AAAA,QAChC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMU,kBAAA,CAAmB,OAAe,KAAA,EAAwB;AAClE,QAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,QAAA,MAAM,mBAAoB,KAAA,CAAc,gBAAA;AAExC,QAAA,MAAM,mBAAoB,KAAA,CAAc,gBAAA;AAExC,QAAA,IAAI,oBAAoB,gBAAA,EAAkB;AACxC,UAAA,gBAAA,CAAiB,kBAAkB,KAAK,CAAA;AAAA,QAC1C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMU,kBAAA,CACR,YAAA,EACA,KAAA,EACA,KAAA,EACM;AACN,QAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG;AAC5B,UAAA,YAAA,CAAa,IAAI,KAAA,EAAO;AAAA,YACtB,EAAA,EAAI,EAAA;AAAA,YACJ,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU,EAAE,IAAA,EAAM,EAAA,EAAI,WAAW,EAAA;AAAG,WACrC,CAAA;AAAA,QACH;AAEA,QAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA;AAEvC,QAAA,IAAI,MAAM,EAAA,EAAI;AACZ,UAAA,QAAA,CAAS,KAAK,KAAA,CAAM,EAAA;AAAA,QACtB;AAEA,QAAA,IAAI,MAAM,IAAA,EAAM;AACd,UAAA,QAAA,CAAS,OAAO,KAAA,CAAM,IAAA;AAAA,QACxB;AAEA,QAAA,IAAI,MAAM,QAAA,EAAU;AAClB,UAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACvB,YAAA,QAAA,CAAS,QAAA,CAAU,IAAA,IAAQ,KAAA,CAAM,QAAA,CAAS,IAAA;AAAA,UAC5C;AACA,UAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,YAAA,QAAA,CAAS,QAAA,CAAU,SAAA,IAAa,KAAA,CAAM,QAAA,CAAS,SAAA;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKU,kBACR,YAAA,EACY;AACZ,QAAA,MAAM,YAAwB,EAAC;AAE/B,QAAA,KAAA,MAAW,CAAC,QAAQ,WAAW,CAAA,IAAK,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,CAAA,CAAE,IAAA;AAAA,UACrE,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,CAAC,CAAA,GAAI,EAAE,CAAC;AAAA,SACtB,EAAG;AACD,UAAA,IAAI,WAAA,CAAY,EAAA,IAAM,WAAA,CAAY,QAAA,EAAU,IAAA,EAAM;AAChD,YAAA,SAAA,CAAU,KAAK,WAAuB,CAAA;AAAA,UACxC;AAAA,QACF;AAEA,QAAA,OAAO,SAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYA,MAAgB,gBAAA,CACd,OAAA,EACA,KAAA,EACA,KAAA,EACe;AACf,QAAA,IAAI;AAGF,UAAA,IAAI,WAAA,GAAc,KAAA;AAClB,UAAA,MAAO,KAAA,CAAM,MAAA,CAAe,OAAA,CAAQ,YAAY;AAC9C,YAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,cACrC,CAAA,uEAAA,CAAA;AAAA,cACA;AAAA,aACF;AACA,YAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,YAAA,WAAA,GAAc,KAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,CAAC,EAAE,GAAA,GAAM,CAAA;AAAA,UACjD,CAAC,CAAA;AAGD,UAAA,IAAI,CAAC,WAAA,EAAa;AAChB,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAE1C,UAAA,MAAO,KAAA,CAAM,MAAA,CAAe,OAAA,CAAQ,YAAY;AAC9C,YAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,cACtB,CAAA,+CAAA,CAAA;AAAA,cACA,WAAA;AAAA,cACA;AAAA,aACF;AAAA,UACF,CAAC,CAAA;AAGD,UAAA,MAAM,UAAW,KAAA,CAAc,OAAA;AAC/B,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,OAAA,CAAQ;AAAA,cACN,IAAA,EAAM,UAAA;AAAA,cACN,MAAA,EAAQ,KAAA;AAAA,cACR,IAAA,EAAM;AAAA,gBACJ,EAAA,EAAI,KAAA;AAAA,gBACJ,YAAA,EAAc;AAAA;AAChB,aACD,CAAA;AAAA,UACH;AAAA,QACF,SAAS,KAAA,EAAO;AAEd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,mCAAmC,KAAK,CAAA;AAAA,QACrE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAgB,QAAA,CACd,KAAA,EACA,KAAA,EACA,OAAA,EACe;AACf,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,QAAA,MAAM,UAAA,GAAa,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,MAAA;AAE1D,QAAA,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,OAAO,KAAK,YAAY,CAAA;AAExD,QAAA,IAAI;AACF,UAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,UAAA,MAAM,GAAA,GAAM;AAAA,YACV,EAAA;AAAA,YACA,UAAA,EAAa,MAAc,aAAA,IAAiB,sCAAA;AAAA,YAC5C,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,KAAA,EAAO,OAAA;AAAA,YACP,KAAA,EAAO,CAAA,EAAG,YAAY,CAAA,EAAG,UAAA,GAAa;;AAAA;AAAA,EAAqB,UAAU,KAAK,EAAE,CAAA,CAAA;AAAA,YAC5E,UAAA,EAAY,gBAAA;AAAA,YACZ,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,WAC3B;AAEA,UAAA,MAAO,KAAA,CAAM,MAAA,CAAe,OAAA,CAAQ,YAAY;AAC9C,YAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,cACtB,CAAA;AAAA;AAAA;AAAA,+CAAA,CAAA;AAAA,cAIA,GAAA,CAAI,EAAA;AAAA,cACJ,GAAA,CAAI,UAAA;AAAA,cACJ,GAAA,CAAI,QAAA;AAAA,cACJ,GAAA,CAAI,KAAA;AAAA,cACJ,GAAA,CAAI,KAAA;AAAA,cACJ,GAAA,CAAI,UAAA;AAAA,cACJ,GAAA,CAAI;AAAA,aACN;AAAA,UACF,CAAC,CAAA;AAED,UAAA,MAAM,UAAW,KAAA,CAAc,OAAA;AAC/B,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,OAAA,CAAQ;AAAA,cACN,IAAA,EAAM,UAAA;AAAA,cACN,QAAQ,GAAA,CAAI,EAAA;AAAA,cACZ,IAAA,EAAM;AAAA,aACP,CAAA;AAAA,UACH;AAAA,QACF,SAAS,QAAA,EAAU;AACjB,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,0BAA0B,QAAQ,CAAA;AAAA,QAC/D;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKU,gBAAgB,QAAA,EAA2B;AACnD,QAAA,OAAO,QAAA,CAAS,WAAW,QAAQ,CAAA;AAAA,MACrC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMU,sBAAA,CACR,UAAA,EACA,QAAA,EACA,MAAA,GAAkC,MAAA,EAChB;AAElB,QAAA,MAAM,OAAA,GAAU,CAAA,KAAA,EAAQ,QAAQ,CAAA,QAAA,EAAW,UAAU,CAAA,CAAA;AACrD,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,WAAA;AAAA,UACN,SAAA,EAAW;AAAA,YACT,GAAA,EAAK,OAAA;AAAA,YACL;AAAA;AACF,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKU,sBAAsB,IAAA,EAA+B;AAC7D,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,MAAA;AAAA,UACN;AAAA,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUU,sBAAA,CACR,aACA,WAAA,EACgB;AAEhB,QAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAC5C,UAAA,OAAO,WAAA,IAAe,EAAA;AAAA,QACxB;AAGA,QAAA,MAAM,mBAAmB,WAAA,CAAY,MAAA;AAAA,UAAO,CAAC,CAAA,KAC3C,IAAA,CAAK,eAAA,CAAgB,CAAA,CAAE,IAAI,QAAQ;AAAA,SACrC;AAEA,QAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACjC,UAAA,OAAO,WAAA,IAAe,EAAA;AAAA,QACxB;AAGA,QAAA,MAAM,QAA2B,EAAC;AAGlC,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,qBAAA,CAAsB,WAAW,CAAC,CAAA;AAAA,QACpD;AAGA,QAAA,KAAA,MAAW,cAAc,gBAAA,EAAkB;AACzC,UAAA,KAAA,CAAM,IAAA;AAAA,YACJ,KAAK,sBAAA,CAAuB,UAAA,CAAW,MAAA,EAAQ,UAAA,CAAW,IAAI,QAAQ;AAAA,WACxE;AAAA,QACF;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMU,gBAAgB,OAAA,EAA6C;AACrE,QAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AACrB,QAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AAExC,QAAA,MAAM,QAAkB,EAAC;AACzB,QAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,UAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,YAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,UACtB,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,WAAA,EAAa;AACpC,YAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,UACtB;AAAA,QACF;AACA,QAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,MACvB;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3UA,IASa,cAAA;AATb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAAA,IAAA,iBAAA,EAAA;AASO,IAAM,cAAA,GAAN,cAA6B,YAAA,CAAa;AAAA,MAC/C,IAAI,IAAA,GAAe;AACjB,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MAEA,cAAc,OAAA,EAA0B;AACtC,QAAA,OACE,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,IACzB,OAAA,CAAQ,WAAW,KAAK,CAAA,IACxB,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA;AAAA,MAE5B;AAAA,MAEA,MAAM,IAAA,CACJ,OAAA,EACA,SACA,KAAA,EACA,KAAA,EACA,QACA,WAAA,EACsB;AACtB,QAAA,IAAI;AAEF,UAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,MAAM,OAAO,QAAQ,CAAA;AAEjD,UAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO;AAAA,YACxB,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,WACrB,CAAA;AAGD,UAAA,MAAM,OAAA,GAA2D;AAAA,YAC/D,KAAA,EAAO,OAAA;AAAA,YACP,UAAU,OAAA,CAAQ,QAAA;AAAA,YAClB,MAAA,EAAQ,IAAA;AAAA;AAAA,YAER,GAAI,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAA,IAAK;AAAA,cAC/C,OAAO,OAAA,CAAQ,KAAA;AAAA,cACf,GAAI,OAAA,CAAQ,mBAAA,KAAwB,KAAA,CAAA,IAAa;AAAA,gBAC/C,qBAAqB,OAAA,CAAQ;AAAA,eAC/B;AAAA,cACA,GAAI,QAAQ,WAAA,IAAe;AAAA,gBACzB,aAAa,OAAA,CAAQ;AAAA;AACvB,aACF;AAAA;AAAA,YAEA,GAAI,OAAA,CAAQ,SAAA,EAAW,UAAA,IAAc;AAAA,cACnC,qBAAA,EAAuB,QAAQ,SAAA,CAAU;AAAA;AAC3C,WACF;AAIA,UAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,KAAA,EAAO,KAAK,CAAA;AAGjD,UAAA,MAAM,SAAS,MAAM,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,OAAO,OAAA,EAAS;AAAA,YAC3D;AAAA,WACD,CAAA;AAGD,UAAA,IAAI,OAAA,GAAU,EAAA;AACd,UAAA,MAAM,YAAA,uBAAmB,GAAA,EAA+B;AACxD,UAAA,IAAI,YAAA,GAAe,EAAA;AACnB,UAAA,IAAI,UAAA,GAAa,EAAA;AACjB,UAAA,IAAI,KAAA;AACJ,UAAA,IAAI,SAA6B,EAAC;AAElC,UAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAGhC,YAAA,IAAI,QAAQ,OAAA,IAAY,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,YAAW,EAAI;AACjE,cAAA;AAAA,YACF;AAEA,YAAA,UAAA,GAAa,KAAA,CAAM,EAAA;AAEnB,YAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAC9B,YAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,YAAA,IAAI,MAAA,CAAO,OAAO,OAAA,EAAS;AACzB,cAAA,OAAA,IAAW,OAAO,KAAA,CAAM,OAAA;AACxB,cAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA;AAC9C,cAAA,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA;AAAA,YACrD;AAGA,YAAA,IAAI,MAAA,CAAO,OAAO,UAAA,EAAY;AAC5B,cAAA,KAAA,MAAW,aAAA,IAAiB,MAAA,CAAO,KAAA,CAAM,UAAA,EAAY;AACnD,gBAAA,IAAI,aAAA,CAAc,UAAU,KAAA,CAAA,EAAW;AACrC,kBAAA,IAAA,CAAK,kBAAA;AAAA,oBACH,YAAA;AAAA,oBACA,aAAA,CAAc,KAAA;AAAA,oBACd;AAAA,mBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAIA,YAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,YAAA,IAAI,OAAO,MAAA,IAAU,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,EAAG;AAChD,cAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,MAAM,CAAA;AAAA,YAC7B;AAEA,YAAA,MAAM,UAAW,MAAA,CAAe,OAAA;AAChC,YAAA,IAAI,SAAS,MAAA,IAAU,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AACpD,cAAA,MAAA,CAAO,IAAA,CAAK,GAAG,OAAA,CAAQ,MAAM,CAAA;AAAA,YAC/B;AAGA,YAAA,IAAI,OAAO,aAAA,EAAe;AACxB,cAAA,YAAA,GAAe,MAAA,CAAO,aAAA;AAAA,YACxB;AAGA,YAAA,IAAI,MAAM,KAAA,EAAO;AACf,cAAA,KAAA,GAAQ;AAAA,gBACN,aAAA,EAAe,KAAA,CAAM,KAAA,CAAM,aAAA,IAAiB,CAAA;AAAA,gBAC5C,iBAAA,EAAmB,KAAA,CAAM,KAAA,CAAM,iBAAA,IAAqB,CAAA;AAAA,gBACpD,YAAA,EAAc,KAAA,CAAM,KAAA,CAAM,YAAA,IAAgB,CAAA;AAAA,gBAC1C,qBAAA,EAAuB,KAAA,CAAM,KAAA,CAAM,qBAAA,GAC/B;AAAA,kBACE,aAAA,EACE,KAAA,CAAM,KAAA,CAAM,qBAAA,CAAsB,aAAA,IAAiB;AAAA,iBACvD,GACA,KAAA;AAAA,eACN;AAAA,YACF;AAAA,UACF;AAGA,UAAA,MAAM,YACJ,YAAA,CAAa,IAAA,GAAO,IAAI,IAAA,CAAK,iBAAA,CAAkB,YAAY,CAAA,GAAI,KAAA,CAAA;AAGjE,UAAA,OAAO;AAAA,YACL,EAAA,EAAI,UAAA;AAAA,YACJ,KAAA,EAAO,OAAA;AAAA,YACP,SAAS,OAAA,IAAW,IAAA;AAAA,YACpB,UAAA,EAAY,SAAA;AAAA,YACZ,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,KAAA,CAAA;AAAA,YACrC,eAAe,YAAA,IAAgB,MAAA;AAAA,YAC/B,OAAO,KAAA,IAAS;AAAA,cACd,aAAA,EAAe,CAAA;AAAA,cACf,iBAAA,EAAmB,CAAA;AAAA,cACnB,YAAA,EAAc;AAAA;AAChB,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,KAAK,QAAA,CAAS,KAAA,EAAO,KAAA,EAAO,CAAA,wBAAA,EAA2B,OAAO,CAAA,CAAE,CAAA;AACtE,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpKA,IA+Ea,kBAAA;AA/Eb,IAAA,uBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4CAAA,GAAA;AAAA,IAAA,iBAAA,EAAA;AA+EO,IAAM,kBAAA,GAAN,cAAiC,YAAA,CAAa;AAAA,MACnD,IAAI,IAAA,GAAe;AACjB,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,MAEA,cAAc,OAAA,EAA0B;AAItC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MAEA,MAAM,IAAA,CACJ,OAAA,EACA,SACA,KAAA,EACA,KAAA,EACA,QACA,WAAA,EACsB;AACtB,QAAA,IAAI;AAEF,UAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,MAAM,OAAO,QAAQ,CAAA;AAEjD,UAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO;AAAA,YACxB,MAAA,EAAQ,KAAK,MAAA,CAAO,OAAA;AAAA,YACpB,OAAA,EAAS;AAAA,WACV,CAAA;AAGD,UAAA,IAAI,eAAA;AACJ,UAAA,IAAI,aAAa,kBAAA,EAAoB;AACnC,YAAA,IAAI;AACF,cAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,kBAAkB,CAAA;AAC3D,cAAA,IAAI,MAAM,OAAA,CAAQ,SAAS,CAAA,IAAK,SAAA,CAAU,SAAS,CAAA,EAAG;AACpD,gBAAA,eAAA,GAAkB,EAAE,MAAM,SAAA,EAAU;AAAA,cACtC;AAAA,YACF,SAAS,KAAA,EAAO;AACd,cAAA,OAAA,CAAQ,KAAA,CAAM,oDAAoD,KAAK,CAAA;AAAA,YACzE;AAAA,UACF;AAIA,UAAA,IAAI,eAAA;AACJ,UAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,YAAA,eAAA,GAAkB,EAAC;AACnB,YAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAQ;AAC5B,cAAA,eAAA,CAAgB,MAAA,GAAS,QAAQ,SAAA,CAAU,MAAA;AAAA,YAC7C;AACA,YAAA,IAAI,OAAA,CAAQ,UAAU,UAAA,EAAY;AAChC,cAAA,eAAA,CAAgB,UAAA,GAAa,QAAQ,SAAA,CAAU,UAAA;AAAA,YACjD;AACA,YAAA,IAAI,OAAA,CAAQ,UAAU,OAAA,EAAS;AAC7B,cAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,YAC5B;AAAA,UACF;AAGA,UAAA,MAAM,OAAA,GAAsC;AAAA,YAC1C,KAAA,EAAO,OAAA;AAAA,YACP,UAAU,OAAA,CAAQ,QAAA;AAAA,YAClB,MAAA,EAAQ,IAAA;AAAA;AAAA;AAAA,YAGR,KAAA,EAAO,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA;AAAA,YAEvB,GAAI,eAAA,IAAmB,EAAE,QAAA,EAAU,eAAA,EAAgB;AAAA;AAAA,YAEnD,GAAI,eAAA,IAAmB,EAAE,SAAA,EAAW,eAAA,EAAgB;AAAA;AAAA,YAEpD,GAAI,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAA,IAAK;AAAA,cAC/C,OAAO,OAAA,CAAQ,KAAA;AAAA,cACf,GAAI,OAAA,CAAQ,mBAAA,KAAwB,KAAA,CAAA,IAAa;AAAA,gBAC/C,qBAAqB,OAAA,CAAQ;AAAA,eAC/B;AAAA,cACA,GAAI,QAAQ,WAAA,IAAe;AAAA,gBACzB,aAAa,OAAA,CAAQ;AAAA;AACvB;AACF,WACF;AAIA,UAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,KAAA,EAAO,KAAK,CAAA;AAIjD,UAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,MAAA;AAAA,YAC3C,OAAA;AAAA,YACA,EAAE,MAAA;AAAO,WACX;AAGA,UAAA,IAAI,OAAA,GAAU,EAAA;AACd,UAAA,IAAI,iBAAA,GAAoB,EAAA;AACxB,UAAA,IAAI,oBAAuC,EAAC;AAC5C,UAAA,MAAM,YAAA,uBAAmB,GAAA,EAA+B;AACxD,UAAA,IAAI,YAAA,GAAe,EAAA;AACnB,UAAA,IAAI,UAAA,GAAa,EAAA;AACjB,UAAA,IAAI,KAAA;AACJ,UAAA,IAAI,IAAA;AACJ,UAAA,IAAI,cAAA;AACJ,UAAA,MAAM,YAA+B,EAAC;AACtC,UAAA,IAAI,SAA6B,EAAC;AAElC,UAAA,IAAI;AACF,YAAA,WAAA,MAAiB,YAAY,MAAA,EAAQ;AAEnC,cAAA,MAAM,KAAA,GAAQ,QAAA;AAId,cAAA,IAAI,QAAQ,OAAA,IAAY,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,YAAW,EAAI;AACjE,gBAAA;AAAA,cACF;AAGA,cAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AAEpB,cAAA,UAAA,GAAa,KAAA,CAAM,EAAA;AAEnB,cAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAC9B,cAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,cAAA,IAAI,MAAA,CAAO,OAAO,OAAA,EAAS;AACzB,gBAAA,OAAA,IAAW,OAAO,KAAA,CAAM,OAAA;AACxB,gBAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA;AAC9C,gBAAA,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA;AAAA,cACrD;AAGA,cAAA,IAAI,MAAA,CAAO,OAAO,SAAA,EAAW;AAC3B,gBAAA,iBAAA,IAAqB,OAAO,KAAA,CAAM,SAAA;AAAA,cAEpC;AAIA,cAAA,IAAI,MAAA,CAAO,OAAO,iBAAA,EAAmB;AACnC,gBAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,iBAAA;AAE7B,gBAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,kBAAA,IAAI,IAAA,CAAK,SAAS,gBAAA,EAAkB;AAElC,oBAAA,iBAAA,IAAqB,KAAK,IAAA,IAAQ,EAAA;AAAA,kBACpC,CAAA,MAAO;AAEL,oBAAA,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAAA,kBAC7B;AAAA,gBACF;AAAA,cACF;AAGA,cAAA,IAAI,MAAA,CAAO,OAAO,UAAA,EAAY;AAC5B,gBAAA,KAAA,MAAW,aAAA,IAAiB,MAAA,CAAO,KAAA,CAAM,UAAA,EAAY;AACnD,kBAAA,IAAI,aAAA,CAAc,UAAU,KAAA,CAAA,EAAW;AACrC,oBAAA,IAAA,CAAK,kBAAA;AAAA,sBACH,YAAA;AAAA,sBACA,aAAA,CAAc,KAAA;AAAA,sBACd;AAAA,qBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAIA,cAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,cAAA,IAAI,OAAO,MAAA,IAAU,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,EAAG;AAChD,gBAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,MAAM,CAAA;AAAA,cAC7B;AAEA,cAAA,MAAM,UAAW,MAAA,CAAe,OAAA;AAChC,cAAA,IAAI,SAAS,MAAA,IAAU,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AACpD,gBAAA,MAAA,CAAO,IAAA,CAAK,GAAG,OAAA,CAAQ,MAAM,CAAA;AAAA,cAC/B;AAGA,cAAA,IAAI,OAAO,aAAA,EAAe;AACxB,gBAAA,YAAA,GAAe,MAAA,CAAO,aAAA;AAAA,cACxB;AAGA,cAAA,IAAI,KAAA,CAAM,aAAa,KAAA,CAAA,EAAW;AAChC,gBAAA,cAAA,GAAiB,KAAA,CAAM,QAAA;AAAA,cACzB;AAGA,cAAA,IAAI,MAAM,KAAA,EAAO;AACf,gBAAA,KAAA,GAAQ;AAAA,kBACN,aAAA,EAAe,KAAA,CAAM,KAAA,CAAM,aAAA,IAAiB,CAAA;AAAA,kBAC5C,iBAAA,EAAmB,KAAA,CAAM,KAAA,CAAM,iBAAA,IAAqB,CAAA;AAAA,kBACpD,YAAA,EAAc,KAAA,CAAM,KAAA,CAAM,YAAA,IAAgB,CAAA;AAAA,kBAC1C,qBAAA,EAAuB,KAAA,CAAM,KAAA,CAAM,qBAAA,GAC/B;AAAA,oBACE,aAAA,EACE,KAAA,CAAM,KAAA,CAAM,qBAAA,CAAsB,aAAA,IAAiB;AAAA,mBACvD,GACA,KAAA,CAAA;AAAA,kBACJ,yBAAA,EAA2B,KAAA,CAAM,KAAA,CAAM,yBAAA,GACnC;AAAA,oBACE,gBAAA,EACE,KAAA,CAAM,KAAA,CAAM,yBAAA,CAA0B,gBAAA,IAAoB;AAAA,mBAC9D,GACA,KAAA;AAAA,iBACN;AAIA,gBAAA,IAAI,MAAM,KAAA,CAAM,OAAA,IAAW,MAAM,KAAA,CAAM,YAAA,EAAc,4BAA4B,KAAA,CAAA,EAAW;AAC1F,kBAAA,IAAA,GAAO,KAAA,CAAM,MAAM,YAAA,CAAa,uBAAA;AAAA,gBAClC,CAAA,MAAA,IAAW,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,KAAA,CAAA,EAAW;AACzC,kBAAA,IAAA,GAAO,MAAM,KAAA,CAAM,IAAA;AAAA,gBACrB;AAAA,cACF;AAAA,YACF;AAAA,UACF,SAAS,WAAA,EAAsB;AAE7B,YAAA,MAAM,GAAA,GAAM,WAAA;AACZ,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAuC,OAAO,CAAA,CAAA,CAAA,EAAK;AAAA,cAC/D,KAAA,EAAO,WAAA;AAAA,cACP,MAAM,GAAA,CAAI,IAAA;AAAA,cACV,QAAQ,GAAA,CAAI,MAAA;AAAA,cACZ,SAAS,GAAA,CAAI,OAAA;AAAA,cACb,MAAM,GAAA,CAAI;AAAA,aACX,CAAA;AACD,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,iBAAiB,GAAA,CAAI,OAAA,IAAW,eAAe,CAAA,QAAA,EAAW,GAAA,CAAI,QAAQ,SAAS,CAAA,CAAA;AAAA,aACjF;AAAA,UACF;AAGA,UAAA,MAAM,aAAA,GAAgB,KAAA;AACtB,UAAA,IAAI,aAAA,IAAiB,SAAS,KAAA,CAAA,EAAW;AACvC,YAAA,aAAA,CAAc,IAAA,GAAO,IAAA;AAAA,UACvB;AACA,UAAA,IAAI,aAAA,IAAiB,mBAAmB,KAAA,CAAA,EAAW;AACjD,YAAA,aAAA,CAAc,QAAA,GAAW,cAAA;AAAA,UAC3B;AAGA,UAAA,MAAM,YACJ,YAAA,CAAa,IAAA,GAAO,IAAI,IAAA,CAAK,iBAAA,CAAkB,YAAY,CAAA,GAAI,KAAA,CAAA;AAGjE,UAAA,MAAM,iBAAA,GAAoB;AAAA,YACxB,EAAA,EAAI,UAAA;AAAA,YACJ,MAAA,EAAQ,iBAAA;AAAA,YACR,OAAA,EAAS,SAAA,CAAU,CAAC,CAAA,EAAG,OAAA,IAAW,KAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAA;AAAA,YAC9D,KAAA,EAAO,OAAA;AAAA,YACP,UAAU,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,EAAG,QAAA;AAAA,YAC7C,OAAA,EAAS;AAAA,cACP;AAAA,gBACE,KAAA,EAAO,CAAA;AAAA,gBACP,OAAA,EAAS;AAAA,kBACP,IAAA,EAAM,WAAA;AAAA,kBACN,SAAS,OAAA,IAAW,IAAA;AAAA,kBACpB,YAAY,SAAA,IAAa,KAAA,CAAA;AAAA,kBACzB,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,KAAA;AAAA,iBACvC;AAAA,gBACA,eAAe,YAAA,IAAgB;AAAA;AACjC,aACF;AAAA,YACA,OAAO,aAAA,IAAiB;AAAA,cACtB,aAAA,EAAe,CAAA;AAAA,cACf,iBAAA,EAAmB,CAAA;AAAA,cACnB,YAAA,EAAc;AAAA,aAChB;AAAA;AAAA,YAEA,aAAa,SAAA,CAAU;AAAA,WACzB;AAIA,UAAA,MAAM,wBAAwB,iBAAA,IAAqB,IAAA;AACnD,UAAA,MAAM,qBAAA,GAAuD,iBAAA,CAAkB,MAAA,GAAS,CAAA,GAAI,iBAAA,GAAoB,KAAA,CAAA;AAGhH,UAAA,OAAO;AAAA,YACL,EAAA,EAAI,UAAA;AAAA,YACJ,KAAA,EAAO,OAAA;AAAA,YACP,SAAS,OAAA,IAAW,IAAA;AAAA,YACpB,iBAAA,EAAmB,qBAAA;AAAA,YACnB,iBAAA,EAAmB,qBAAA;AAAA,YACnB,UAAA,EAAY,SAAA;AAAA,YACZ,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,KAAA,CAAA;AAAA,YACrC,eAAe,YAAA,IAAgB,MAAA;AAAA,YAC/B,OAAO,KAAA,IAAS;AAAA,cACd,aAAA,EAAe,CAAA;AAAA,cACf,iBAAA,EAAmB,CAAA;AAAA,cACnB,YAAA,EAAc;AAAA,aAChB;AAAA;AAAA,YAEA,mBAAA,EAAqB;AAAA,WACvB;AAAA,QACF,SAAS,KAAA,EAAO;AAGd,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9XA,IAyGa,UAAA;AAzGb,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AAyGO,IAAM,UAAA,GAAN,MAAM,WAAA,CAAW;AAAA,MACd,YAAgC,EAAC;AAAA,MACjC,eAAA;AAAA;AAAA;AAAA;AAAA,MAKR,OAAO,MAAA,GAAqB;AAC1B,QAAA,OAAO,IAAI,WAAA,EAAW;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,YAAY,QAAA,EAAkC;AAC5C,QAAA,IAAA,CAAK,SAAA,CAAU,KAAK,QAAQ,CAAA;AAC5B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,eAAA,CAAgB,SAAiB,OAAA,EAA2C;AAC1E,QAAA,OAAO,KAAK,WAAA,CAAY;AAAA,UACtB,OAAA;AAAA,UACA,YAAA,EAAc,MAAA;AAAA,UACd,GAAG;AAAA,SACJ,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,mBAAA,CACE,SAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,QAAA,OAAO,KAAK,WAAA,CAAY;AAAA,UACtB,SAAS,OAAA,IAAW,IAAA;AAAA,UACpB,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,YAChC,EAAA,EAAI,EAAA,CAAG,EAAA,IAAM,CAAA,KAAA,EAAQ,MAAA,CAAO,YAAW,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,YACxD,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU;AAAA,cACR,MAAM,EAAA,CAAG,IAAA;AAAA,cACT,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,SAAS;AAAA;AACxC,WACF,CAAE,CAAA;AAAA,UACF,YAAA,EAAc,YAAA;AAAA,UACd,GAAG;AAAA,SACJ,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAA,CACE,OAAA,EACA,IAAA,EACA,MAAA,EACA,OAAA,EACM;AACN,QAAA,OAAO,KAAK,WAAA,CAAY;AAAA,UACtB,KAAA,EAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAO;AAAA,UAC/B,GAAG;AAAA,SACJ,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,oBAAA,CACE,OAAA,EACA,gBAAA,EACA,OAAA,EACM;AACN,QAAA,OAAO,KAAK,WAAA,CAAY;AAAA,UACtB,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,YAAA,EAAc,MAAA;AAAA,UACd,GAAG;AAAA,SACJ,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAwB,MAAA,EAA+B;AACrD,QAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AACvB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,YAAA,GAAmC;AACjC,QAAA,OAAO,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA;AAAA,MAC3B;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAA,GAAkD;AAChD,QAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,MAAA,GAAiB;AACnB,QAAA,OAAO,KAAK,SAAA,CAAU,MAAA;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,OAAA,GAAmB;AACjB,QAAA,OAAO,IAAA,CAAK,UAAU,MAAA,KAAW,CAAA;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA,MAKA,KAAA,GAAoB;AAClB,QAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAW;AAC9B,QAAA,MAAA,CAAO,SAAA,GAAY,CAAC,GAAG,IAAA,CAAK,SAAS,CAAA;AACrC,QAAA,MAAA,CAAO,kBAAkB,IAAA,CAAK,eAAA,GAC1B,EAAE,GAAG,IAAA,CAAK,iBAAgB,GAC1B,MAAA;AACJ,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC5MA,SAAS,gBAAgB,OAAA,EAAoD;AAC3E,EAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AACrB,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AAExC,EAAA,OAAO,OAAA,CACJ,MAAA,CAAO,CAAC,IAAA,KAAS,KAAK,IAAA,KAAS,MAAM,CAAA,CACrC,GAAA,CAAI,CAAC,IAAA,KAAU,IAAA,CAAwC,IAAI,CAAA,CAC3D,KAAK,GAAG,CAAA;AACb;AAxCA,IAkEa,YAAA;AAlEb,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sCAAA,GAAA;AAuBA,IAAA,iBAAA,EAAA;AAGA,IAAA,eAAA,EAAA;AAwCO,IAAM,YAAA,GAAN,cAA2B,YAAA,CAAa;AAAA,MACrC,MAAA;AAAA,MACA,aAAA,GAAwB,CAAA;AAAA,MACxB,cAAA;AAAA,MACA,QAAA;AAAA,MACA,aAA+B,EAAC;AAAA,MAChC,kBAAA;AAAA,MAER,YAAY,MAAA,EAA4B;AACtC,QAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,QAAA,IAAA,CAAK,kBAAA,GAAqB,CAAC,MAAA,CAAO,MAAA;AAClC,QAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA,IAAU,WAAW,MAAA,EAAO,CAAE,gBAAgB,yBAAyB,CAAA;AAC5F,QAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,cAAA,IAAkB,KAAA;AAC/C,QAAA,IAAA,CAAK,QAAA,GAAW,OAAO,QAAA,IAAY,KAAA;AAAA,MACrC;AAAA,MAEA,IAAI,IAAA,GAAe;AACjB,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,QAAA,EAA2B;AACvC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,IAAA,CACJ,OAAA,EACA,SACA,KAAA,EACA,KAAA,EACA,QACA,YAAA,EACsB;AAEtB,QAAA,IAAI,KAAK,QAAA,EAAU;AACjB,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uBAAA,EAA0B,IAAA,CAAK,aAAA,GAAgB,CAAC,CAAA,CAAA,CAAA,EAAK;AAAA,YAC/D,YAAA,EAAc,QAAQ,QAAA,CAAS,MAAA;AAAA,YAC/B,aAAa,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,EAAE,EAAE,CAAC;AAAA,WAC1C,CAAA;AAAA,QACH;AACA,QAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,EAAE,GAAG,SAAS,CAAA;AAGnC,QAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,UAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,QACnC;AAGA,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AAC3C,QAAA,IAAI,QAAA;AAEJ,QAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,SAAA,CAAU,MAAA,EAAQ;AAC1C,UAAA,IAAI,KAAK,kBAAA,EAAoB;AAE3B,YAAA,QAAA,GAAW,UAAU,CAAC,CAAA;AAAA,UACxB,CAAA,MAAO;AACL,YAAA,MAAM,cAAc,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,EAAE,EAAE,CAAC,CAAA;AAChD,YAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,WAAA,EAAa,OAAO,CAAA;AACxD,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,wCAAwC,IAAA,CAAK,aAAa,wBAC5C,SAAA,CAAU,MAAM,0CACH,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,+BAAA,EACzB,aAAa,IAAI,CAAA,aAAA,EAC3B,YAAY,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAA,IAAA;AAAA,aAC9C;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,QAAA,GAAW,SAAA,CAAU,KAAK,aAAa,CAAA;AAAA,QACzC;AAEA,QAAA,IAAA,CAAK,aAAA,EAAA;AAGL,QAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,QAAA,CAAS,WAAA,EAAa;AAC/C,UAAA,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,QAAA,CAAS,WAAW,CAAA;AAAA,QAClD;AAGA,QAAA,IAAI,SAAS,OAAA,EAAS;AACpB,UAAA,MAAM,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA;AAAA,QACnC;AAGA,QAAA,IAAI,SAAS,KAAA,EAAO;AAClB,UAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,OAAO,CAAA;AAC9C,UAAA,KAAA,CAAM,IAAA,GAAO,SAAS,KAAA,CAAM,IAAA;AAC5B,UAAA,KAAA,CAAM,MAAA,GAAS,SAAS,KAAA,CAAM,MAAA;AAC9B,UAAA,MAAM,KAAK,QAAA,CAAS,KAAA,EAAO,KAAA,EAAO,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAE,CAAA;AAC5D,UAAA,MAAM,KAAA;AAAA,QACR;AAGA,QAAA,MAAM,IAAA,CAAK,gBAAA;AAAA,UACT,EAAE,OAAO,OAAA,EAAS,QAAA,EAAU,QAAQ,QAAA,EAAU,KAAA,EAAO,QAAQ,KAAA,EAAM;AAAA,UACnE,KAAA;AAAA,UACA;AAAA,SACF;AAGA,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,kBAAA,EAAmB;AACvD,QAAA,IAAI,eAAA,IAAmB,SAAS,OAAA,EAAS;AACvC,UAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,QAAA,CAAS,OAAA,EAAS,iBAAiB,KAAK,CAAA;AAAA,QACvE,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAE3B,UAAA,IAAA,CAAK,aAAA,CAAc,QAAA,CAAS,OAAA,EAAS,KAAK,CAAA;AAC1C,UAAA,IAAA,CAAK,kBAAA,CAAmB,QAAA,CAAS,OAAA,EAAS,KAAK,CAAA;AAAA,QACjD;AAGA,QAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,CAAO,UAAA,GAAa,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAC/D,QAAA,MAAM,eACJ,QAAA,CAAS,KAAA,EAAO,gBAAgB,IAAA,CAAK,cAAA,CAAe,QAAQ,QAAQ,CAAA;AACtE,QAAA,MAAM,gBAAA,GACJ,QAAA,CAAS,KAAA,EAAO,gBAAA,IAChB,IAAA,CAAK,cAAA,CAAe,CAAC,EAAE,OAAA,EAAS,QAAA,CAAS,OAAA,EAAS,CAAC,CAAA;AACrD,QAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,KAAA,EAAO,eAAA,IAAmB,CAAA;AAE3D,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,UAAA;AAAA,UACJ,KAAA,EAAO,OAAA;AAAA,UACP,OAAA,EAAS,SAAS,OAAA,IAAW,IAAA;AAAA,UAC7B,iBAAA,EAAmB,SAAS,gBAAA,IAAoB,IAAA;AAAA,UAChD,mBAAmB,QAAA,CAAS,gBAAA;AAAA,UAC5B,YAAY,QAAA,CAAS,SAAA;AAAA,UACrB,aAAA,EAAe,SAAS,YAAA,IAAgB,MAAA;AAAA,UACxC,KAAA,EAAO;AAAA,YACL,aAAA,EAAe,YAAA;AAAA,YACf,iBAAA,EAAmB,gBAAA;AAAA,YACnB,cAAc,YAAA,GAAe,gBAAA;AAAA,YAC7B,yBAAA,EAA2B,eAAA,GACvB,EAAE,gBAAA,EAAkB,iBAAgB,GACpC;AAAA;AACN,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,iBAAA,CACZ,OAAA,EACA,MAAA,EACA,KAAA,EACe;AACf,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,QAAQ,MAAA,EAAQ,CAAA,IAAK,OAAO,SAAA,EAAW;AACzD,UAAA,MAAM,QAAQ,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,GAAI,OAAO,SAAS,CAAA;AACvD,UAAA,IAAA,CAAK,aAAA,CAAc,OAAO,KAAK,CAAA;AAC/B,UAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,KAAK,CAAA;AAEpC,UAAA,IAAI,MAAA,CAAO,eAAe,CAAA,EAAG;AAC3B,YAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,YAAY,CAAA;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAA,CACN,SACA,YAAA,EACM;AACN,QAAA,IAAI,YAAA,CAAa,iBAAiB,MAAA,EAAW;AAC3C,UAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAA,KAAW,YAAA,CAAa,YAAA,EAAc;AACzD,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,0BAA0B,YAAA,CAAa,YAAY,CAAA,eAAA,EAAkB,OAAA,CAAQ,SAAS,MAAM,CAAA;AAAA,aAC9F;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,aAAa,eAAA,EAAiB;AAChC,UAAA,MAAM,UAAU,YAAA,CAAa,eAAA;AAC7B,UAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM;AACzC,YAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,CAAA,CAAE,OAAO,CAAA;AACzC,YAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,YAAA,OAAO,OAAO,YAAY,QAAA,GACtB,OAAA,CAAQ,SAAS,OAAO,CAAA,GACxB,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAAA,UAC1B,CAAC,CAAA;AAED,UAAA,IAAI,CAAC,KAAA,EAAO;AACV,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,8CAA8C,OAAO,CAAA,WAAA;AAAA,aACvD;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,aAAa,kBAAA,EAAoB;AACnC,UAAA,MAAM,EAAE,QAAA,EAAU,cAAA,EAAe,GAAI,YAAA,CAAa,kBAAA;AAClD,UAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM;AACzC,YAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,KAAA;AAC9B,YAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,CAAA,CAAE,OAAO,CAAA;AACzC,YAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,YAAA,OAAO,CAAC,cAAA,IAAkB,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA;AAAA,UAC3D,CAAC,CAAA;AAED,UAAA,IAAI,CAAC,KAAA,EAAO;AACV,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,2CAA2C,QAAQ,CAAA,WAAA;AAAA,aACrD;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,aAAa,oBAAA,EAAsB;AACrC,UAAA,MAAM,UAAU,YAAA,CAAa,oBAAA;AAC7B,UAAA,MAAM,aAAA,GAAgB,QAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AACtE,UAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,aAAA,EAAe,OAAO,CAAA;AAC5D,UAAA,IAAI,CAAC,aAAA,EAAe;AAClB,YAAA,MAAM,IAAI,MAAM,CAAA,qCAAA,CAAuC,CAAA;AAAA,UACzD;AACA,UAAA,MAAM,OAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GACf,aAAA,CAAc,SAAS,OAAO,CAAA,GAC9B,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AAChC,UAAA,IAAI,CAAC,OAAA,EAAS;AACZ,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,iDAAiD,OAAO,CAAA,CAAA;AAAA,aAC1D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,eACN,QAAA,EACQ;AACR,QAAA,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM;AACjC,UAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,CAAA,CAAE,OAAO,CAAA;AAEzC,UAAA,OAAO,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,QAC3C,GAAG,CAAC,CAAA;AAAA,MACN;AAAA,MAEQ,MAAM,EAAA,EAA2B;AACvC,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,MACzD;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,aAAA,GAAkC;AAChC,QAAA,OAAO,CAAC,GAAG,IAAA,CAAK,UAAU,CAAA;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA,MAKA,cAAA,GAA6C;AAC3C,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,UAAA,CAAW,SAAS,CAAC,CAAA;AAAA,MACnD;AAAA;AAAA;AAAA;AAAA,MAKA,KAAA,GAAc;AACZ,QAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,QAAA,IAAA,CAAK,aAAa,EAAC;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKA,UAAU,MAAA,EAA0B;AAClC,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAA,GAA4B;AAC1B,QAAA,OAAO,IAAA,CAAK,aAAA,KAAkB,IAAA,CAAK,MAAA,CAAO,MAAA;AAAA,MAC5C;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAA,GAA6B;AAC3B,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,aAAA;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA,MAKA,eAAA,GAA0B;AACxB,QAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACd;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3WA,IAmBM,oBAAA,EAqKO,gBAAA;AAxLb,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0CAAA,GAAA;AAQA,IAAA,mBAAA,EAAA;AACA,IAAA,uBAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AASA,IAAM,uBAAN,MAAwD;AAAA,MAC9C,SAAA,uBAAgB,GAAA,EAA6B;AAAA,MAC7C,aAAA,uBAAoB,GAAA,EAAoF;AAAA,MAEhH,WAAA,GAAc;AAEZ,QAAA,IAAA,CAAK,wBAAA,EAAyB;AAAA,MAChC;AAAA,MAEQ,wBAAA,GAAiC;AAEvC,QAAA,IAAA,CAAK,SAAS,QAAA,EAAU,CAAC,WAAW,IAAI,cAAA,CAAe,MAAM,CAAC,CAAA;AAG9D,QAAA,IAAA,CAAK,SAAS,YAAA,EAAc,CAAC,WAAW,IAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAGtE,QAAA,IAAA,CAAK,SAAS,MAAA,EAAQ,CAAC,WAAW,IAAI,YAAA,CAAa,MAA4B,CAAC,CAAA;AAAA,MAClF;AAAA,MAEA,QAAA,CAAS,KAAa,OAAA,EAAgC;AACpD,QAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,WAAA,IAAe,OAAO,CAAA;AAAA,MAC/C;AAAA,MAEA,YAAY,GAAA,EAAsB;AAChC,QAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,aAAa,CAAA;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,MAAM,WAAA,CACJ,SAAA,EACA,GAAA,EACA,MAAA,EACiF;AAEjF,QAAA,MAAM,QAAA,GAAW,GAAG,SAAS,CAAA,CAAA;AAC7B,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAClD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,OAAO,UAAA;AAAA,QACT;AAGA,QAAA,MAAM,cAAc,MAAM,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,KAAK,MAAM,CAAA;AACpE,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAE,CAAA;AAAA,QACjD;AAGA,QAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,iBAAA;AAAA,UAChC,WAAA,CAAY,WAAA;AAAA,UACZ;AAAA,SACF;AACA,QAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,WAAA,CAAY,WAAW,CAAA,CAAE,CAAA;AAAA,QAClE;AAGA,QAAA,MAAM,UAAU,IAAA,CAAK,SAAA,CAAU,IAAI,cAAA,CAAe,GAAA,CAAI,aAAa,CAAA;AACnE,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,cAAA,CAAe,GAAG,CAAA,CAAE,CAAA;AAAA,QACzE;AAGA,QAAA,MAAM,QAAA,GAAW,QAAQ,cAAc,CAAA;AAGvC,QAAA,MAAM,SAAS,EAAE,QAAA,EAAU,SAAA,EAAW,WAAA,CAAY,MAAM,WAAA,EAAY;AACpE,QAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AAEvC,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,cAAA,CACZ,SAAA,EACA,GAAA,EACA,MAAA,EAC6B;AAC7B,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,QAC7D;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,SAAA,CAAU,SAAS,CAAA;AACjD,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,OAAO,IAAA;AAAA,UACT;AAGA,UAAA,OAAO;AAAA,YACL,EAAA,EAAI,SAAA;AAAA;AAAA,YACJ,MAAM,QAAA,CAAS,KAAA;AAAA;AAAA,YACf,aAAa,QAAA,CAAS,QAAA;AAAA;AAAA,YACtB,oBAAoB,QAAA,CAAS,iBAAA,GACzB,KAAK,SAAA,CAAU,QAAA,CAAS,iBAAiB,CAAA,GACzC,IAAA;AAAA,YACJ,WAAA,EAAa,SAAS,UAAA,IAAc,IAAA;AAAA,YACpC,YAAA,EAAc,SAAS,WAAA,IAAe,IAAA;AAAA,YACtC,YAAA,EAAc,SAAS,WAAA,IAAe;AAAA,WACxC;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAClD,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAc,iBAAA,CACZ,YAAA,EACA,GAAA,EACgC;AAEhC,QAAA,IAAI,YAAA,CAAa,WAAA,EAAY,KAAM,MAAA,EAAQ;AACzC,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,MAAA;AAAA,YACN,GAAA,EAAK,MAAA;AAAA,YACL,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,QACF;AAGA,QAAA,MAAM,eAAA,GAA0C;AAAA,UAC9C,MAAA,EAAQ,gBAAA;AAAA,UACR,UAAA,EAAY,oBAAA;AAAA,UACZ,SAAA,EAAW,mBAAA;AAAA,UACX,MAAA,EAAQ;AAAA,SACV;AAGA,QAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,YAAA,CAAa,WAAA,EAAa,CAAA;AACzD,QAAA,IAAI,MAAA,IAAW,GAAA,CAAY,MAAM,CAAA,EAAG;AAClC,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,YAAA;AAAA,YACN,GAAA,EAAK,YAAA;AAAA;AAAA,YACL,OAAA,EAAU,IAAY,MAAM;AAAA,WAC9B;AAAA,QACF;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,UAAA,GAAmB;AACjB,QAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,MAC3B;AAAA,KACF;AAKO,IAAM,gBAAA,GAAmB,IAAI,oBAAA,EAAqB;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACxLzD,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,UAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAiDA,IAAAA,WAAAA,EAAAA;AACA,IAAA,iBAAA,EAAA;AACA,IAAA,mBAAA,EAAA;AACA,IAAA,uBAAA,EAAA;AACA,IAAA,eAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AACA,IAAA,qBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACzCA,SAAS,uBAAA,CACP,UACA,YAAA,EAC4B;AAC5B,EAAA,IAAI,CAAC,YAAA,IAAgB,YAAA,CAAa,IAAA,KAAS,CAAA,EAAG;AAC5C,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,QAAA,CAAS,IAAI,CAAA,GAAA,KAAO;AAEzB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAC/B,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,GAAA;AAAA,MACH,OAAA,EAAS,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,KAAQ;AAE/B,QAAA,IACE,OAAO,IAAA,KAAS,QAAA,IAChB,IAAA,KAAS,QACT,MAAA,IAAU,IAAA,IACV,IAAA,CAAK,IAAA,KAAS,WAAA,IACd,WAAA,IAAe,IAAA,IACf,IAAA,CAAK,WAAW,GAAA,EAChB;AACA,UAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,UAAU,GAAG,CAAA;AAChD,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,OAAO;AAAA,cACL,GAAG,IAAA;AAAA,cACH,WAAW,EAAE,GAAG,IAAA,CAAK,SAAA,EAAW,KAAK,IAAA;AAAK,aAC5C;AAAA,UACF;AAAA,QACF;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC;AAAA,KACH;AAAA,EACF,CAAC,CAAA;AACH;AApDA,IAyDa,UAAA;AAzDb,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0BAAA,GAAA;AAQA,IAAA,UAAA,EAAA;AAiDO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgBtB,aAAa,OAAA,CACX,OAAA,EACA,KAAA,EAC6B;AAC7B,QAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,QAAA,IAAI,eAAA;AAGJ,QAAA,IAAI;AACF,UAAA,OAAO,MAAM,KAAK,QAAA,CAAS,OAAA,EAAS,OAAO,OAAA,CAAQ,KAAA,EAAO,WAAW,KAAA,CAAS,CAAA;AAAA,QAChF,SAAS,YAAA,EAAc;AACrB,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,cAAA,EAAiB,OAAA,CAAQ,KAAK,YAAY,YAAY,CAAA;AAGpE,UAAA,eAAA,GAAmB,YAAA,EAAsB,UAAA;AAGzC,UAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,YACpB,IAAA,EAAM,oBAAA;AAAA,YACN,MAAM,OAAA,CAAQ,KAAA;AAAA,YACd,EAAA,EAAI,oBAAA;AAAA,YACJ,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,YAAY,MAAM,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,OAAO,KAAK,CAAA;AAE9D,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI;AACF,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,oBAAA;AAAA,cACN,MAAM,OAAA,CAAQ,KAAA;AAAA,cACd,IAAI,QAAA,CAAS,iBAAA;AAAA,cACb,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAGD,YAAA,OAAO,MAAM,IAAA,CAAK,QAAA;AAAA,cAChB,OAAA;AAAA,cACA,KAAA;AAAA,cACA,QAAA,CAAS,iBAAA;AAAA,cACT,SAAA;AAAA,cACA;AAAA,aACF;AAAA,UACF,SAAS,aAAA,EAAe;AACtB,YAAA,OAAA,CAAQ,KAAA;AAAA,cACN,CAAA,eAAA,EAAkB,SAAS,iBAAiB,CAAA,QAAA,CAAA;AAAA,cAC5C;AAAA,aACF;AAGA,YAAA,eAAA,GAAmB,aAAA,EAAuB,UAAA;AAE1C,YAAA;AAAA,UACF;AAAA,QACF;AAGA,QAAA,MAAM,kBAAkB,IAAI,KAAA;AAAA,UAC1B,CAAA,uCAAA,EAA0C,OAAA,CAAQ,KAAK,CAAA,KAAA,EAAQ,UAAU,MAAM,CAAA,UAAA;AAAA,SACjF;AAGA,QAAA,MAAM,IAAA,CAAK,QAAA;AAAA,UACT,KAAA;AAAA,UACA,eAAA;AAAA,UACA,uBAAA;AAAA,UACA,OAAA,CAAQ,KAAA;AAAA,UACR;AAAA,SACF;AAEA,QAAA,MAAM,eAAA;AAAA,MACR;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,QAAA,CACnB,OAAA,EACA,KAAA,EACA,OAAA,EACA,WACA,kBAAA,EAC6B;AAC7B,QAAA,IAAI,QAAA,GAAW,CAAA;AACf,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,aAAA,GAAoC,kBAAA;AAExC,QAAA,OAAO,WAAW,qBAAA,EAAuB;AACvC,UAAA,QAAA,EAAA;AAEA,UAAA,IAAI;AAGF,YAAA,KAAA,GAAQ,MAAM,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,OAAA,EAAS,SAAS,aAAa,CAAA;AAGpE,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,aAAA;AAAA,cACN,KAAA,EAAO,OAAA;AAAA,cACP,OAAA,EAAS,QAAA;AAAA,cACT,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAGD,YAAA,MAAM,WAAW,MAAM,IAAA,CAAK,UAAU,OAAA,EAAS,OAAA,EAAS,OAAO,KAAK,CAAA;AAGpE,YAAA,MAAM,KAAK,UAAA,CAAW,QAAA,EAAU,OAAO,OAAA,EAAS,SAAA,EAAW,SAAS,KAAK,CAAA;AAEzE,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,cAAA;AAAA,cACN,MAAA,EAAQ,SAAS,KAAA,CAAM,YAAA;AAAA,cACvB,OAAA,EAAS,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,cACtB,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAED,YAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA,UAC3B,SAASC,MAAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA;AAAA,cACN,CAAA,cAAA,EAAiB,OAAO,CAAA,UAAA,EAAa,QAAQ,CAAA,EAAA,CAAA;AAAA,cAC7CA;AAAA,aACF;AAGA,YAAA,MAAM,IAAA,CAAK,QAAA;AAAA,cACT,KAAA;AAAA,cACAA,MAAAA;AAAA,cACA,WAAA;AAAA,cACA,OAAA;AAAA,cACA,SAAA;AAAA,cACA;AAAA,aACF;AAGA,YAAA,IAAI,WAAW,qBAAA,EAAuB;AACpC,cAAA,MAAM,YAAY,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAW,CAAC,CAAA;AACzD,cAAA,MAAM,IAAA,CAAK,MAAM,SAAS,CAAA;AAE1B,cAAA,aAAA,GAAgB,KAAA;AAChB,cAAA,KAAA,GAAQ,MAAA;AAAA,YACV,CAAA,MAAO;AAEL,cAAA,IAAIA,MAAAA,IAAS,OAAOA,MAAAA,KAAU,QAAA,EAAU;AACtC,gBAACA,OAAc,UAAA,GAAa,KAAA;AAAA,cAC9B;AACA,cAAA,MAAMA,MAAAA;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,QAAQ,IAAI,KAAA;AAAA,UAChB,CAAA,MAAA,EAAS,OAAO,CAAA,yBAAA,EAA4B,qBAAqB,CAAA,SAAA;AAAA,SACnE;AACA,QAAA,KAAA,CAAM,UAAA,GAAa,KAAA;AACnB,QAAA,MAAM,KAAA;AAAA,MACR;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,UAAA,CACnB,KAAA,EACA,OAAA,EACA,SACA,YAAA,EACiB;AACjB,QAAA,IAAI;AACF,UAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAG7B,UAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,UAAA,IAAI;AACF,YAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,OAAO,CAAA;AAC9D,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,SAAA,GAAY,QAAA,CAAS,KAAA;AAAA,YACvB;AAAA,UACF,SAAS,GAAA,EAAK;AACZ,YAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,GAAG,CAAA;AAAA,UAClD;AAIA,UAAA,MAAM,cAAA,GAAiB,uBAAA,CAAwB,OAAA,CAAQ,QAAA,EAAU,QAAQ,YAAY,CAAA;AAErF,UAAA,MAAM,cAAA,GAAiB;AAAA,YACrB,OAAO,SAAA,IAAa,OAAA;AAAA,YACpB,QAAA,EAAU,cAAA;AAAA,YACV,OAAO,OAAA,CAAQ,KAAA;AAAA,YACf,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,WAC5B;AACA,UAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA;AAEpD,UAAA,MAAM,OAAA,GAA6C;AAAA,YACjD,EAAA;AAAA,YACA,UAAA,EAAY,KAAA,CAAM,aAAA,IAAiB,MAAA,CAAO,UAAA,EAAW;AAAA,YACrD,QAAA,EAAU,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA;AAAA,YAC3C,KAAA,EAAO,OAAA;AAAA,YACP,YAAY,SAAA,IAAa,KAAA,CAAA;AAAA,YACzB,QAAA,EAAU,kBAAA;AAAA,YACV,YAAA,EAAc,cAAA;AAAA,YACd,eAAA,EAAiB,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,MAAM,MAAA,GAAS,CAAA;AAAA,YACxD,sBAAA,EAAwB,QAAQ,QAAA,CAAS,MAAA;AAAA,YACzC,WAAA,EAAa,QAAQ,UAAA,IAAc,KAAA,CAAA;AAAA,YACnC,aAAA,EAAe,QAAQ,WAAA,IAAe,KAAA,CAAA;AAAA,YACtC,iBAAiB,YAAA,IAAgB,KAAA,CAAA;AAAA,YACjC,cAAc,OAAA,CAAQ,KAAA,GAAQ,KAAK,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAA;AAAA,YAC9D,aAAA,EAAe,QAAQ,YAAA,IAAgB,KAAA,CAAA;AAAA,YACvC,WAAA,EAAa,KAAA;AAAA;AAAA,YACb,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,WAC3B;AAEA,UAAA,MAAO,KAAA,CAAM,MAAA,CAAe,OAAA,CAAQ,YAAY;AAC9C,YAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,cACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAAA,cAOA,OAAA,CAAQ,EAAA;AAAA,cACR,OAAA,CAAQ,UAAA;AAAA,cACR,OAAA,CAAQ,QAAA;AAAA,cACR,OAAA,CAAQ,KAAA;AAAA,cACR,OAAA,CAAQ,UAAA;AAAA,cACR,OAAA,CAAQ,QAAA;AAAA,cACR,OAAA,CAAQ,YAAA;AAAA,cACR,OAAA,CAAQ,eAAA;AAAA,cACR,OAAA,CAAQ,sBAAA;AAAA,cACR,OAAA,CAAQ,WAAA;AAAA,cACR,OAAA,CAAQ,aAAA;AAAA,cACR,OAAA,CAAQ,eAAA;AAAA,cACR,OAAA,CAAQ,YAAA;AAAA,cACR,OAAA,CAAQ,aAAA;AAAA,cACR,OAAA,CAAQ,cAAc,CAAA,GAAI,CAAA;AAAA,cAC1B,OAAA,CAAQ;AAAA,aACV;AAAA,UACF,CAAC,CAAA;AAGD,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,cACZ,IAAA,EAAM,UAAA;AAAA,cACN,QAAQ,OAAA,CAAQ,EAAA;AAAA,cAChB,IAAA,EAAM;AAAA,aACP,CAAA;AAAA,UACH;AAEA,UAAA,OAAO,EAAA;AAAA,QACT,SAAS,GAAA,EAAK;AACZ,UAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,GAAG,CAAA;AACvD,UAAA,OAAO,OAAO,UAAA,EAAW;AAAA,QAC3B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,SAAA,CACnB,OAAA,EACA,OAAA,EACA,OACA,KAAA,EACsB;AAEtB,QAAA,MAAM,EAAE,gBAAA,EAAAC,iBAAAA,EAAiB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,cAAA,EAAA,EAAA,iBAAA,CAAA,CAAA;AAInC,QAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,WAAA,EAAY,GAAI,MAAMA,iBAAAA,CAAiB,WAAA;AAAA,UAClE,OAAA;AAAA,UACA,KAAA,CAAM,GAAA;AAAA,UACN,MAAM,MAAA,CAAO;AAAA,SACf;AAMA,QAAA,IAAI,QAAA;AACJ,QAAA,MAAO,KAAA,CAAM,MAAA,CAAe,OAAA,CAAQ,YAAY;AAC9C,UAAA,QAAA,GAAW,MAAM,QAAA,CAAS,IAAA;AAAA,YACxB,SAAA;AAAA,YACA,OAAA;AAAA,YACA,KAAA;AAAA,YACA,KAAA;AAAA,YACA,MAAM,eAAA,EAAiB,MAAA;AAAA,YACvB;AAAA,WACF;AAAA,QACF,CAAC,CAAA;AAED,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,QACpD;AAEA,QAAA,OAAO,QAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,YAAA,CACnB,SAAA,EACA,KAAA,EAC0B;AAC1B,QAAA,IAAI;AACF,UAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,SAAS,CAAA;AAChE,UAAA,IAAI,YAAY,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA,EAAG;AAEnE,YAAA,OAAO,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,CAAC,cAAsB,GAAA,MAAiB;AAAA,cACpE,eAAA,EAAiB,SAAA;AAAA,cACjB,iBAAA,EAAmB,YAAA;AAAA,cACnB;AAAA,aACF,CAAE,CAAA;AAAA,UACJ;AACA,UAAA,OAAO,EAAC;AAAA,QACV,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,UAAA,CACnB,QAAA,EACA,OACA,OAAA,EACA,SAAA,EACA,SACA,KAAA,EACe;AACf,QAAA,IAAI;AAEF,UAAA,MAAM,WAAA,GAAc,QAAA,CAAS,UAAA,GACzB,IAAA,CAAK,UAAU,QAAA,CAAS,UAAA,CAAW,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,CAAG,QAAA,CAAS,IAAI,CAAC,CAAA,GAChE,IAAA;AAGJ,UAAA,MAAM,UAAA,GAA4B,SAAS,KAAA,CAAM,IAAA,GAC7C,WAAW,QAAA,CAAS,KAAA,CAAM,IAAW,CAAA,GACrC,IAAA;AAGJ,UAAA,MAAM,cAAA,GAAiC,QAAA,CAAS,KAAA,CAAc,QAAA,IAAY,IAAA;AAG1E,UAAA,MAAM,YAAA,GAAgB,QAAA,CAAiB,mBAAA,GACnC,IAAA,CAAK,SAAA,CAAW,SAAiB,mBAAmB,CAAA,GACpD,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAE3B,UAAA,MAAM,OAAA,GAA6C;AAAA,YACjD,EAAA,EAAI,KAAA;AAAA,YACJ,aAAA,EAAe,YAAA;AAAA,YACf,YAAA,EAAc,SAAS,KAAA,CAAM,aAAA;AAAA,YAC7B,aAAA,EAAe,QAAA,CAAS,KAAA,CAAM,qBAAA,EAAuB,aAAA,IAAiB,CAAA;AAAA,YACtE,aAAA,EAAe,SAAS,KAAA,CAAM,iBAAA;AAAA,YAC9B,gBAAA,EAAkB,QAAA,CAAS,KAAA,CAAM,yBAAA,EAA2B,gBAAA,IAAoB,CAAA;AAAA,YAChF,YAAA,EAAc,SAAS,KAAA,CAAM,YAAA;AAAA,YAC7B,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,YACzB,eAAe,QAAA,CAAS,aAAA;AAAA,YACxB,cAAc,WAAA,IAAe,KAAA,CAAA;AAAA,YAC7B,YAAY,UAAA,IAAc,KAAA,CAAA;AAAA,YAC1B,UAAU,cAAA,IAAkB,KAAA,CAAA;AAAA;AAAA,YAC5B,WAAA,EAAa,IAAA;AAAA;AAAA,YACb,iBAAA,EAAmB,SAAS,iBAAA,IAAqB,KAAA;AAAA;AAAA,WACnD;AAGA,UAAA,MAAO,KAAA,CAAM,MAAA,CAAe,OAAA,CAAQ,YAAY;AAE9C,YAAA,IAAI,mBAAmB,IAAA,EAAM;AAC3B,cAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,gBACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,gBAkBA,OAAA,CAAQ,aAAA;AAAA,gBACR,OAAA,CAAQ,YAAA;AAAA,gBACR,OAAA,CAAQ,aAAA;AAAA,gBACR,OAAA,CAAQ,aAAA;AAAA,gBACR,OAAA,CAAQ,gBAAA;AAAA,gBACR,OAAA,CAAQ,YAAA;AAAA,gBACR,OAAA,CAAQ,UAAA;AAAA,gBACR,OAAA,CAAQ,aAAA;AAAA,gBACR,OAAA,CAAQ,YAAA;AAAA,gBACR,OAAA,CAAQ,UAAA;AAAA,gBACR,OAAA,CAAQ,cAAc,CAAA,GAAI,CAAA;AAAA,gBAC1B,OAAA,CAAQ,iBAAA;AAAA,gBACR,cAAA;AAAA,gBACA;AAAA,eACF;AAAA,YACF,CAAA,MAAO;AACL,cAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,gBACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,gBAiBA,OAAA,CAAQ,aAAA;AAAA,gBACR,OAAA,CAAQ,YAAA;AAAA,gBACR,OAAA,CAAQ,aAAA;AAAA,gBACR,OAAA,CAAQ,aAAA;AAAA,gBACR,OAAA,CAAQ,gBAAA;AAAA,gBACR,OAAA,CAAQ,YAAA;AAAA,gBACR,OAAA,CAAQ,UAAA;AAAA,gBACR,OAAA,CAAQ,aAAA;AAAA,gBACR,OAAA,CAAQ,YAAA;AAAA,gBACR,OAAA,CAAQ,UAAA;AAAA,gBACR,OAAA,CAAQ,cAAc,CAAA,GAAI,CAAA;AAAA,gBAC1B,OAAA,CAAQ,iBAAA;AAAA,gBACR;AAAA,eACF;AAAA,YACF;AAAA,UACF,CAAC,CAAA;AAGD,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,cACZ,IAAA,EAAM,UAAA;AAAA,cACN,QAAQ,OAAA,CAAQ,EAAA;AAAA,cAChB,IAAA,EAAM;AAAA,aACP,CAAA;AAAA,UACH;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,mDAAmD,KAAK,CAAA;AAAA,QACxE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAe,qBAAqB,OAAA,EAAyB;AAC3D,QAAA,IAAI,QAAQ,UAAA,CAAW,MAAM,KAAK,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AAC3D,UAAA,OAAO,QAAA;AAAA,QACT;AACA,QAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,UAAA,OAAO,WAAA;AAAA,QACT;AACA,QAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,UAAA,OAAO,QAAA;AAAA,QACT;AACA,QAAA,OAAO,SAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,OAAe,MAAM,EAAA,EAA2B;AAC9C,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,MACzD;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAa,uBAAA,CACX,KAAA,EACA,KAAA,EACA,UACA,YAAA,EACe;AACf,QAAA,IAAI;AAEF,UAAA,MAAM,oBAAqB,QAAA,CAAiB,mBAAA;AAC5C,UAAA,IAAI,CAAC,iBAAA,EAAmB;AAGxB,UAAA,MAAM,sBAAsB,IAAA,CAAK,2BAAA;AAAA,YAC/B,iBAAA;AAAA,YACA;AAAA,WACF;AAGA,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB,CAAA,gDAAA,CAAA;AAAA,YACA,IAAA,CAAK,UAAU,mBAAmB,CAAA;AAAA,YAClC;AAAA,WACF;AAGA,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,cACZ,IAAA,EAAM,UAAA;AAAA,cACN,MAAA,EAAQ,KAAA;AAAA,cACR,IAAA,EAAM,EAAE,EAAA,EAAI,KAAA,EAAO,eAAe,IAAA,CAAK,SAAA,CAAU,mBAAmB,CAAA;AAAE,aACvE,CAAA;AAAA,UACH;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,sDAAsD,KAAK,CAAA;AAAA,QAC3E;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAe,2BAAA,CACb,YAAA,EACA,YAAA,EACK;AACL,QAAA,IAAI,CAAC,YAAA,EAAc,OAAA,GAAU,CAAC,CAAA,EAAG,SAAS,MAAA,EAAQ;AAChD,UAAA,OAAO,YAAA;AAAA,QACT;AAEA,QAAA,OAAO;AAAA,UACL,GAAG,YAAA;AAAA,UACH,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAiB;AAAA,YAClD,GAAG,MAAA;AAAA,YACH,OAAA,EAAS;AAAA,cACP,GAAG,MAAA,CAAO,OAAA;AAAA,cACV,QAAQ,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,GAAA,CAAI,CAAC,GAAA,KAAa;AAC/C,gBAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,WAAW,GAAG,CAAA;AAChD,gBAAA,IAAI,IAAA,EAAM;AACR,kBAAA,OAAO;AAAA,oBACL,GAAG,GAAA;AAAA,oBACH,WAAW,EAAE,GAAG,GAAA,CAAI,SAAA,EAAW,KAAK,IAAA;AAAK,mBAC3C;AAAA,gBACF;AACA,gBAAA,OAAO,GAAA;AAAA,cACT,CAAC;AAAA;AACH,WACF,CAAE;AAAA,SACJ;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,QAAA,CACnB,KAAA,EACA,OACA,SAAA,EACA,OAAA,EACA,WACA,aAAA,EAC6B;AAC7B,QAAA,IAAI;AACF,UAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,UAAA,MAAM,UAAA,GAAa,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAA;AAG1D,UAAA,IAAI,YAAA,GAAe,EAAA;AACnB,UAAA,MAAM,QAAA,GAAW,KAAA;AAGjB,UAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAE5C,YAAA,MAAM,cAAA,GAAiB;AAAA,cACrB,OAAA;AAAA;AAAA,cACA,MAAA;AAAA;AAAA,cACA,QAAA;AAAA;AAAA,cACA,UAAA;AAAA;AAAA,cACA,MAAA;AAAA;AAAA,cACA,OAAA;AAAA;AAAA,cACA,SAAA;AAAA;AAAA,cACA;AAAA;AAAA,aACF;AAEA,YAAA,MAAM,WAAgC,EAAC;AACvC,YAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,cAAA,IAAI,KAAA,IAAS,QAAA,IAAY,QAAA,CAAS,KAAK,MAAM,KAAA,CAAA,EAAW;AACtD,gBAAA,QAAA,CAAS,KAAK,CAAA,GAAI,QAAA,CAAS,KAAK,CAAA;AAAA,cAClC;AAAA,YACF;AAEA,YAAA,IAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AACpC,cAAA,YAAA,GAAe;;AAAA;AAAA,EAAuB,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC,CAAA,CAAA;AAAA,YACzE;AAAA,UACF;AAEA,UAAA,MAAM,SAAA,GAAY,CAAA,EAAG,YAAY,CAAA,EAAG,UAAA,GAAa;;AAAA;AAAA,EAAqB,UAAU,CAAA,CAAA,GAAK,EAAE,CAAA,EAAG,YAAY,CAAA,CAAA;AAGtG,UAAA,MAAM,YAAA,GAAe,iBAAiB,QAAA,EAAU,SAAA;AAEhD,UAAA,IAAI,YAAA,EAAc;AAEhB,YAAA,MAAO,KAAA,CAAM,MAAA,CAAe,OAAA,CAAQ,YAAY;AAE9C,cAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,gBACrC,CAAA,qCAAA,CAAA;AAAA,gBACA;AAAA,eACF;AACA,cAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,cAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,CAAC,CAAA,EAAG,MAAA;AAG/B,cAAA,IAAI,cAAyE,EAAC;AAC9E,cAAA,IAAI,aAAA,EAAe;AACjB,gBAAA,IAAI;AACF,kBAAA,WAAA,GAAc,IAAA,CAAK,MAAM,aAAa,CAAA;AAAA,gBACxC,SAAS,CAAA,EAAG;AACV,kBAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,CAAC,CAAA;AAAA,gBAC3D;AAAA,cACF;AAGA,cAAA,WAAA,CAAY,IAAA,CAAK;AAAA,gBACf,OAAA,EAAS,SAAA;AAAA,gBACT,IAAA,EAAM,SAAA;AAAA,gBACN,SAAA,EAAW,KAAK,GAAA;AAAI,eACrB,CAAA;AAGD,cAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,gBACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,gBASA,SAAA;AAAA;AAAA,gBACA,SAAA;AAAA;AAAA,gBACA,IAAA,CAAK,UAAU,WAAW,CAAA;AAAA;AAAA,gBAC1B,IAAA,CAAK,KAAI,GAAI,SAAA;AAAA,gBACb,CAAA;AAAA;AAAA,gBACA;AAAA,eACF;AAAA,YACF,CAAC,CAAA;AAED,YAAA,IAAI,MAAM,OAAA,EAAS;AACjB,cAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,gBACZ,IAAA,EAAM,UAAA;AAAA,gBACN,MAAA,EAAQ,YAAA;AAAA,gBACR,IAAA,EAAM;AAAA,kBACJ,EAAA,EAAI,YAAA;AAAA,kBACJ,KAAA,EAAO,SAAA;AAAA,kBACP,UAAA,EAAY,SAAA;AAAA,kBACZ,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,kBACzB,WAAA,EAAa;AAAA;AACf,eACD,CAAA;AAAA,YACH;AAGA,YAAA,IAAI,QAAA,IAAY,CAAC,QAAA,CAAS,SAAA,EAAW;AACnC,cAAA,QAAA,CAAS,SAAA,GAAY,YAAA;AAAA,YACvB;AAEA,YAAA,OAAO,YAAA;AAAA,UACT,CAAA,MAAO;AAEL,YAAA,MAAM,EAAA,GAAK,OAAO,UAAA,EAAW;AAC7B,YAAA,MAAM,OAAA,GAA6C;AAAA,cACjD,EAAA;AAAA,cACA,UAAA,EAAY,MAAM,aAAA,IAAiB,sCAAA;AAAA,cACnC,QAAA,EAAU,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA;AAAA,cAC3C,KAAA,EAAO,OAAA;AAAA,cACP,KAAA,EAAO,SAAA;AAAA,cACP,UAAA,EAAY,SAAA;AAAA,cACZ,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,cACzB,WAAA,EAAa,IAAA;AAAA,cACb,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,aAC3B;AAEA,YAAA,MAAO,KAAA,CAAM,MAAA,CAAe,OAAA,CAAQ,YAAY;AAC9C,cAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,gBACtB;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,gBAMA,OAAA,CAAQ,EAAA;AAAA,gBACR,OAAA,CAAQ,UAAA;AAAA,gBACR,OAAA,CAAQ,QAAA;AAAA,gBACR,OAAA,CAAQ,KAAA;AAAA,gBACR,OAAA,CAAQ,KAAA;AAAA,gBACR,OAAA,CAAQ,UAAA;AAAA,gBACR,OAAA,CAAQ,UAAA;AAAA,gBACR,CAAA;AAAA,gBACA,OAAA,CAAQ;AAAA,eACV;AAAA,YACF,CAAC,CAAA;AAED,YAAA,IAAI,MAAM,OAAA,EAAS;AACjB,cAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,gBACZ,IAAA,EAAM,UAAA;AAAA,gBACN,QAAQ,OAAA,CAAQ,EAAA;AAAA,gBAChB,IAAA,EAAM;AAAA,eACP,CAAA;AAAA,YACH;AAGA,YAAA,IAAI,QAAA,IAAY,CAAC,QAAA,CAAS,SAAA,EAAW;AACnC,cAAA,QAAA,CAAS,SAAA,GAAY,EAAA;AAAA,YACvB;AAEA,YAAA,OAAO,EAAA;AAAA,UACT;AAAA,QACF,SAAS,QAAA,EAAU;AAEjB,UAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,QAAQ,CAAA;AAAA,QAChE;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACryBA,IAAA,aAAA,GAAA,EAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,UAAA,EAAA,MAAAC,WAAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAkCO,SAAS,eAAe,QAAA,EAA2B;AACxD,EAAA,OAAO,gBAAgB,IAAA,CAAK,CAAC,WAAW,QAAA,CAAS,UAAA,CAAW,MAAM,CAAC,CAAA;AACrE;AAKO,SAAS,qBAAqB,QAAA,EAAkC;AACrE,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AACzC,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AACzC,EAAA,IAAI,SAAS,UAAA,CAAW,SAAS,CAAA,IAAK,QAAA,CAAS,WAAW,UAAU,CAAA;AAClE,IAAA,OAAO,KAAA;AACT,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,SAAS,IAAA,EAAsB;AAC7C,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAC5C,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AACpC;AAKO,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,IAAI,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AACzC,EAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,GAAG,CAAA,eAAgB,GAAA,GAAM,UAAA;AACpD,EAAA,IAAI,WAAW,MAAA,GAAS,CAAA,IAAK,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AACrD,IAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,UAAA;AACT;AAKO,SAAS,QAAQ,IAAA,EAAsB;AAC5C,EAAA,MAAM,UAAA,GAAa,cAAc,IAAI,CAAA;AACrC,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,WAAA,CAAY,GAAG,CAAA;AAC5C,EAAA,IAAI,SAAA,IAAa,GAAG,OAAO,GAAA;AAC3B,EAAA,OAAO,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AACtC;AAKO,SAAS,gBAAgB,GAAA,EAAsB;AACpD,EAAA,OAAO;AAAA,IACL,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,UAAU,GAAA,CAAI,QAAA,GAAW,KAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,GAAI,IAAA;AAAA,IACpD,WAAA,EAAa,IAAI,YAAA,KAAiB,CAAA;AAAA,IAClC,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,KAAA,EAAO,IAAI,KAAA,IAAS,IAAA;AAAA,IACpB,MAAA,EAAQ,IAAI,MAAA,IAAU,IAAA;AAAA,IACtB,SAAA,EAAW,IAAI,UAAA,KAAe,CAAA;AAAA,IAC9B,UAAA,EAAY,IAAI,WAAA,IAAe;AAAA,GACjC;AACF;AAupBA,SAAS,cAAc,QAAA,EAA0B;AAC/C,EAAA,MAAM,MAAM,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,IAAO,WAAA,EAAY;AAEnD,EAAA,MAAM,SAAA,GAAoC;AAAA;AAAA,IAExC,GAAA,EAAK,YAAA;AAAA,IACL,EAAA,EAAI,eAAA;AAAA,IACJ,IAAA,EAAM,WAAA;AAAA,IACN,GAAA,EAAK,UAAA;AAAA,IACL,GAAA,EAAK,UAAA;AAAA;AAAA,IAGL,EAAA,EAAI,wBAAA;AAAA,IACJ,EAAA,EAAI,wBAAA;AAAA,IACJ,IAAA,EAAM,kBAAA;AAAA,IACN,GAAA,EAAK,iBAAA;AAAA,IACL,IAAA,EAAM,kBAAA;AAAA,IACN,GAAA,EAAK,kBAAA;AAAA;AAAA,IAGL,GAAA,EAAK,YAAA;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,GAAA,EAAK,WAAA;AAAA,IACL,GAAA,EAAK,WAAA;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,GAAA,EAAK,eAAA;AAAA,IACL,GAAA,EAAK,cAAA;AAAA;AAAA,IAGL,GAAA,EAAK,iBAAA;AAAA;AAAA,IAGL,GAAA,EAAK,iBAAA;AAAA,IACL,GAAA,EAAK,mBAAA;AAAA,IACL,EAAA,EAAI;AAAA,GACN;AAEA,EAAA,OAAO,SAAA,CAAU,GAAA,IAAO,EAAE,CAAA,IAAK,0BAAA;AACjC;AA/xBA,IAgBaA,aAMP,eAAA,EAiFO,WAAA;AAvGb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AAgBO,IAAMA,WAAAA,GAAa,OAAO,IAAA,GAAO,IAAA;AAMxC,IAAM,eAAA,GAAkB;AAAA,MACtB,OAAA;AAAA,MACA,kBAAA;AAAA,MACA,wBAAA;AAAA,MACA,iBAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,KACF;AA0EO,IAAM,cAAN,MAAkB;AAAA,MACvB,YAAoB,GAAA,EAAkC;AAAlC,QAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,MAAmC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMvD,MAAM,SAAA,CACJ,IAAA,EACA,IAAA,EACA,UACA,OAAA,EAMqB;AACrB,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AACzC,QAAA,MAAM,IAAA,GAAO,SAAS,cAAc,CAAA;AACpC,QAAA,MAAM,MAAA,GAAS,eAAe,QAAQ,CAAA;AACtC,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,QAAA,IAAI,OAAA,GAAyB,IAAA;AAC7B,QAAA,IAAI,QAAA,GAA8B,IAAA;AAClC,QAAA,IAAI,IAAA;AAEJ,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,OAAA,GACE,OAAO,SAAS,QAAA,GACZ,IAAA,GACA,IAAI,WAAA,EAAY,CAAE,OAAO,IAAmB,CAAA;AAClD,UAAA,IAAA,GAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA;AAAA,QAC3C,CAAA,MAAO;AACL,UAAA,QAAA,GAAW,OAAO,IAAA,KAAS,QAAA,GACvB,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,CAAA,GAC7B,IAAI,UAAA,CAAW,IAAmB,CAAA;AACtC,UAAA,IAAA,GAAO,QAAA,CAAS,UAAA;AAAA,QAClB;AAEA,QAAA,MAAM,eAAe,OAAA,EAAS,QAAA,GAC1B,KAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA,GAC/B,IAAA;AAGJ,QAAA,MAAM,aAAA,GAAgB,CAAC,MAAA,IAAU,QAAA,IAAY,IAAA,GAAOA,WAAAA;AAEpD,QAAA,IAAI,aAAA,EAAe;AAEjB,UAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,YACV,cAAA;AAAA,YACA,IAAA;AAAA,YACA,QAAA;AAAA,YACA,QAAA;AAAA,YACA,IAAA;AAAA,YACA,GAAA;AAAA,YACA,YAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAIA,QAAA,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAA,2CAAA,CAAA,EAA+C,cAAc,CAAA;AAGjF,QAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,UACb,CAAA;AAAA,0EAAA,CAAA;AAAA,UAEA,cAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAA;AAAA,UACA,IAAA;AAAA,UACA,YAAA;AAAA,UACA,SAAS,SAAA,IAAa,IAAA;AAAA,UACtB,GAAA;AAAA,UACA,SAAS,KAAA,IAAS,IAAA;AAAA,UAClB,SAAS,MAAA,IAAU;AAAA,SACrB;AAGA,QAAA,MAAM,KAAK,WAAA,EAAY;AAEvB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,cAAA;AAAA,UACN,IAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAA,EAAS,OAAA;AAAA,UACT,QAAA,EAAU,IAAA;AAAA,UACV,IAAA;AAAA,UACA,QAAA,EAAU,SAAS,QAAA,IAAY,IAAA;AAAA,UAC/B,WAAA,EAAa,KAAA;AAAA,UACb,SAAA,EAAW,GAAA;AAAA,UACX,KAAA,EAAO,SAAS,KAAA,IAAS,IAAA;AAAA,UACzB,MAAA,EAAQ,SAAS,MAAA,IAAU,IAAA;AAAA,UAC3B,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAc,iBACZ,cAAA,EACA,IAAA,EACA,MACA,QAAA,EACA,IAAA,EACA,GAAA,EACA,YAAA,EACA,OAAA,EAMqB;AAErB,QAAA,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAA,2CAAA,CAAA,EAA+C,cAAc,CAAA;AAGjF,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,IAAA,GAAOA,WAAU,CAAA;AAG9C,QAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,UACb,CAAA;AAAA,6EAAA,CAAA;AAAA,UAEA,cAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,IAAA;AAAA,UACA,YAAA;AAAA,UACA,SAAS,SAAA,IAAa,IAAA;AAAA,UACtB,GAAA;AAAA,UACA,SAAS,KAAA,IAAS,IAAA;AAAA,UAClB,SAAS,MAAA,IAAU,IAAA;AAAA,UACnB;AAAA,SACF;AAGA,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,UAAA,MAAM,QAAQ,CAAA,GAAIA,WAAAA;AAClB,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQA,aAAY,IAAI,CAAA;AAC7C,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAEnC,UAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,YACb,CAAA,uEAAA,CAAA;AAAA,YACA,cAAA;AAAA,YACA,CAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAGA,QAAA,MAAM,KAAK,WAAA,EAAY;AAEvB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,cAAA;AAAA,UACN,IAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAA,EAAS,OAAA;AAAA,UACT,QAAA,EAAU,IAAA;AAAA,UACV,IAAA;AAAA,UACA,QAAA,EAAU,SAAS,QAAA,IAAY,IAAA;AAAA,UAC/B,WAAA,EAAa,KAAA;AAAA,UACb,SAAA,EAAW,GAAA;AAAA,UACX,KAAA,EAAO,SAAS,KAAA,IAAS,IAAA;AAAA,UACzB,MAAA,EAAQ,SAAS,MAAA,IAAU,IAAA;AAAA,UAC3B,SAAA,EAAW,IAAA;AAAA,UACX;AAAA,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,QAAA,CACJ,IAAA,EACA,QAAA,EACA,OAAA,EAKqB;AACrB,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AACzC,QAAA,MAAM,IAAA,GAAO,SAAS,cAAc,CAAA;AACpC,QAAA,MAAM,OAAA,GAAU,qBAAqB,QAAQ,CAAA;AAC7C,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,QAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,aAAA,CAAc,IAAI,CAAA;AAExD,QAAA,MAAM,eAAe,OAAA,EAAS,QAAA,GAC1B,KAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA,GAC/B,IAAA;AAEJ,QAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,UACb,CAAA;AAAA,2DAAA,CAAA;AAAA,UAEA,cAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAA;AAAA,UACA,QAAA;AAAA,UACA,SAAS,IAAA,IAAQ,CAAA;AAAA,UACjB,YAAA;AAAA,UACA;AAAA,SACF;AAGA,QAAA,MAAM,KAAK,WAAA,EAAY;AAEvB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,cAAA;AAAA,UACN,IAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAA;AAAA,UACA,QAAA;AAAA,UACA,IAAA,EAAM,SAAS,IAAA,IAAQ,CAAA;AAAA,UACvB,QAAA,EAAU,SAAS,QAAA,IAAY,IAAA;AAAA,UAC/B,WAAA,EAAa,KAAA;AAAA,UACb,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,MAAM,SAAS,IAAA,EAA2C;AACxD,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AAEzC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAO5B,CAAA,qGAAA,CAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,QAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAGlB,QAAA,IAAI,GAAA,CAAI,OAAA,KAAY,OAAA,EAAS,OAAO,IAAA;AAGpC,QAAA,IAAI,GAAA,CAAI,UAAA,KAAe,CAAA,IAAK,GAAA,CAAI,WAAA,EAAa;AAC3C,UAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,cAAA,EAAgB,GAAA,CAAI,WAAW,CAAA;AAAA,QAC7D;AAGA,QAAA,IAAI,GAAA,CAAI,YAAY,IAAA,EAAM;AACxB,UAAA,MAAM,UAAU,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,OAAO,CAAA;AACpD,UAAA,OAAO,OAAA,CAAQ,OAAO,KAAA,CAAM,OAAA,CAAQ,YAAY,OAAA,CAAQ,UAAA,GAAa,QAAQ,UAAU,CAAA;AAAA,QACzF;AAGA,QAAA,OAAO,GAAA,CAAI,IAAA;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAc,eAAA,CACZ,cAAA,EACA,UAAA,EACsB;AACtB,QAAA,MAAM,SAAuB,EAAC;AAC9B,QAAA,IAAI,SAAA,GAAY,CAAA;AAGhB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,YAC5B,CAAA,oEAAA,CAAA;AAAA,YACA,cAAA;AAAA,YACA;AAAA,WACF;AAEA,UAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,UAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,CAAC,CAAA,UAAA,EAAa,cAAc,CAAA,CAAE,CAAA;AAAA,UACjE;AAEA,UAAA,MAAM,QAAQ,IAAI,UAAA,CAAW,IAAA,CAAK,CAAC,EAAE,IAAI,CAAA;AACzC,UAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,UAAA,SAAA,IAAa,KAAA,CAAM,UAAA;AAAA,QACrB;AAGA,QAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,SAAS,CAAA;AACvC,QAAA,IAAI,MAAA,GAAS,CAAA;AACb,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,MAAA,CAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AACxB,UAAA,MAAA,IAAU,KAAA,CAAM,UAAA;AAAA,QAClB;AAEA,QAAA,OAAO,MAAA,CAAO,MAAA;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,OAAO,WAAW,IAAA,EAA2D;AAC3E,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AAEzC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAO5B,CAAA,qGAAA,CAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,QAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAEvB,QAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAGlB,QAAA,IAAI,GAAA,CAAI,YAAY,OAAA,EAAS;AAG7B,QAAA,IAAI,GAAA,CAAI,UAAA,KAAe,CAAA,IAAK,GAAA,CAAI,WAAA,EAAa;AAC3C,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,aAAa,CAAA,EAAA,EAAK;AACxC,YAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,cACjC,CAAA,oEAAA,CAAA;AAAA,cACA,cAAA;AAAA,cACA;AAAA,aACF;AAEA,YAAA,MAAM,SAAA,GAAY,YAAY,OAAA,EAAQ;AACtC,YAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,cAAA,MAAM,IAAI,UAAA,CAAW,SAAA,CAAU,CAAC,EAAE,IAAI,CAAA;AAAA,YACxC;AAAA,UACF;AACA,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,GAAA,CAAI,YAAY,IAAA,EAAM;AACxB,UAAA,MAAM,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,OAAO,CAAA;AAC1C,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,GAAA,CAAI,SAAS,IAAA,EAAM;AACrB,UAAA,MAAM,IAAI,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,aAAa,IAAA,EAAsC;AACvD,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AAEzC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAK5B,CAAA,4EAAA,CAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,QAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAGlB,QAAA,IAAI,GAAA,CAAI,OAAA,KAAY,OAAA,EAAS,OAAO,IAAA;AAGpC,QAAA,IAAI,GAAA,CAAI,OAAA,KAAY,IAAA,EAAM,OAAO,GAAA,CAAI,OAAA;AAGrC,QAAA,IAAI,GAAA,CAAI,SAAS,IAAA,EAAM;AACrB,UAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,IAAmB,CAAA;AAAA,QACzD;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,KAAK,IAAA,EAA0C;AACnD,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AAEzC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAC5B,CAAA;AAAA,gCAAA,CAAA;AAAA,UAEA;AAAA,SACF;AAEA,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,QAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,OAAO,IAAA,EAAgC;AAC3C,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AAEzC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAC5B,CAAA,kDAAA,CAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAO,MAAA,CAAO,GAAA,EAAI,CAAE,KAAA,GAAQ,CAAA;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,OAAO,IAAA,EAA6B;AACxC,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AAEzC,QAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,UACb,CAAA,qDAAA,CAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,MAAM,KAAK,WAAA,EAAY;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,MAAM,IAAA,EAAmC;AAC7C,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AACzC,QAAA,MAAM,IAAA,GAAO,SAAS,cAAc,CAAA;AACpC,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,QAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,UACb,CAAA;AAAA,uFAAA,CAAA;AAAA,UAEA,cAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,cAAA;AAAA,UACN,IAAA;AAAA,UACA,QAAA,EAAU,iBAAA;AAAA,UACV,OAAA,EAAS,OAAA;AAAA,UACT,QAAA,EAAU,IAAA;AAAA,UACV,IAAA,EAAM,CAAA;AAAA,UACN,QAAA,EAAU,IAAA;AAAA,UACV,WAAA,EAAa,IAAA;AAAA,UACb,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,QAAQ,IAAA,EAAqC;AACjD,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AACzC,QAAA,MAAM,MAAA,GAAS,cAAA,KAAmB,GAAA,GAAM,GAAA,GAAM,cAAA,GAAiB,GAAA;AAG/D,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAC5B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAAA,CAAA;AAAA,UAMA,MAAA;AAAA,UACA,cAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAO,MAAA,CAAO,OAAA,EAAQ,CAAE,GAAA,CAAI,eAAe,CAAA;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,MAAM,IAAA,EAA6B;AACvC,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AACzC,QAAA,MAAM,SAAS,cAAA,GAAiB,GAAA;AAGhC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAC5B,CAAA,4DAAA,CAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAI,MAAA,CAAO,GAAA,EAAI,CAAE,KAAA,GAAQ,CAAA,EAAG;AAC1B,UAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,QACvC;AAEA,QAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AAAA,UACb,CAAA,qDAAA,CAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAA,GAAmC;AACvC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,KAG3B,CAAA,0DAAA,CAA4D,CAAA;AAE/D,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,QAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,UAAA,OAAO,EAAE,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAAA,QACtC;AAEA,QAAA,OAAO;AAAA,UACL,SAAA,EAAW,IAAA,CAAK,CAAC,CAAA,CAAE,UAAA;AAAA,UACnB,SAAA,EAAW,IAAA,CAAK,CAAC,CAAA,CAAE;AAAA,SACrB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,WAAA,GAA6B;AACzC,QAAA,MAAM,IAAA,CAAK,IAAI,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKnB,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,aAAa,IAAA,EAA2C;AAC5D,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AAEzC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAC5B,CAAA,+DAAA,CAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE9B,QAAA,OAAO,IAAA,CAAK,CAAC,CAAA,CAAE,SAAA;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,IAAA,CACJ,OAAA,EACA,OAAA,EAIiE;AACjE,QAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,GAAA;AAEhC,QAAA,IAAI,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAOZ,QAAA,MAAM,MAAA,GAAgB,CAAC,OAAO,CAAA;AAE9B,QAAA,IAAI,SAAS,IAAA,EAAM;AACjB,UAAA,KAAA,IAAS,CAAA,6BAAA,CAAA;AACT,UAAA,MAAA,CAAO,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,QACzC;AAEA,QAAA,KAAA,IAAS,CAAA,QAAA,CAAA;AACT,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAEjB,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAI,IAAA,CAI3B,KAAA,EAAO,GAAG,MAAM,CAAA;AAEnB,QAAA,OAAO,OAAO,OAAA,EAAQ;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,IAAA,CACJ,OAAA,EACA,OAAA,EAIuB;AACvB,QAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,GAAA;AAChC,QAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,KAAA;AAG9B,QAAA,IAAI,UAAA,GAAa,OAAA,CACd,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CACpB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAGrB,QAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/B,UAAA,UAAA,GAAa,GAAA,GAAM,UAAA;AAAA,QACrB;AAEA,QAAA,IAAI,UAAA,GAAa,EAAA;AACjB,QAAA,IAAI,IAAA,KAAS,QAAQ,UAAA,GAAa,uBAAA;AAClC,QAAA,IAAI,IAAA,KAAS,aAAa,UAAA,GAAa,uBAAA;AAEvC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,UAC5B,CAAA;AAAA;AAAA,wBAAA,EAEoB,UAAU;AAAA;AAAA,cAAA,CAAA;AAAA,UAG9B,UAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAO,MAAA,CAAO,OAAA,EAAQ,CAAE,GAAA,CAAI,eAAe,CAAA;AAAA,MAC7C;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpvBA,IAkBa,YAAA;AAlBb,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAWA,IAAA,UAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AAMO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKxB,aAAa,eAAA,CACX,KAAA,EACA,SAAA,EACe;AAEf,QAAA,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,GAAG,SAAS,CAAA;AACtC,QAAA,KAAA,CAAM,SAAS,UAAA,GAAa,IAAA;AAE5B,QAAA,OAAO,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAEtC,UAAA,IAAK,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,YAAW,IAAM,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS;AAEvF,YAAA,KAAA,CAAM,QAAA,CAAS,QAAQ,EAAC;AACxB,YAAA,KAAA,CAAM,SAAS,UAAA,GAAa,KAAA;AAC5B,YAAA,MAAM,IAAI,MAAM,SAAS,CAAA;AAAA,UAC3B;AAEA,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAA,EAAM;AAExC,UAAA,MAAM,aAAA,GAAgB,OAAO,UAAA,EAAW;AAExC,UAAA,IAAI;AAEF,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,cAAA;AAAA,cACN,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,cACpB,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAGD,YAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,KAAK,CAAA;AACzD,YAAA,IAAI,eAAA,EAAiB;AAEnB,cAAA,MAAMC,OAAAA,GAAqB;AAAA,gBACzB,MAAA,EAAQ,OAAA;AAAA,gBACR,KAAA,EAAO;AAAA,eACT;AAEA,cAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAMA,OAAAA,EAAQ,OAAO,aAAa,CAAA;AAE7D,cAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,gBACpB,IAAA,EAAM,gBAAA;AAAA,gBACN,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,gBACpB,MAAA,EAAQ,OAAA;AAAA,gBACR,SAAA,EAAW,KAAK,GAAA;AAAI,eACrB,CAAA;AAED,cAAA;AAAA,YACF;AAGA,YAAA,MAAM,SAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,OAAO,aAAa,CAAA;AAGpE,YAAA,IAAI,MAAA,CAAO,WAAW,OAAA,EAAS;AAC7B,cAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,SAAS,uBAAuB,CAAA;AAE/D,cAAA,IAAI,OAAO,KAAA,EAAO;AAChB,gBAAA,KAAA,CAAM,QAAQ,MAAA,CAAO,KAAA;AAAA,cACvB;AACA,cAAA,MAAM,KAAK,QAAA,CAAS,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,YACtD;AAIA,YAAA,MAAM,EAAE,UAAA,EAAAC,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAE7B,YAAA,MAAM,aAAa,MAAA,CAAO,MAAA,KAAW,SAAA,GACjC,MAAMA,YAAW,2BAAA,CAA4B,KAAA,EAAO,IAAA,EAAM,MAAM,IAChE,MAAMA,WAAAA,CAAW,2BAAA,CAA4B,KAAA,EAAO,MAAM,MAAM,CAAA;AAGpE,YAAA,IAAI,eAAe,IAAA,EAAM;AACb,cAAA,MAAM,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,KAAK,CAAA;AAC1D,cAAA;AAAA,YACF;AAIA,YAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,UAAA,EAAY,OAAO,aAAa,CAAA;AAGjE,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,gBAAA;AAAA,cACN,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,cACpB,QAAQ,UAAA,CAAW,MAAA;AAAA,cACnB,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAAA,UACH,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,MAAM,CAAA,qBAAA,EAAwB,IAAA,CAAK,QAAA,CAAS,IAAI,KAAK,KAAK,CAAA;AAGlE,YAAA,MAAM,KAAK,QAAA,CAAS,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,SAAS,IAAI,CAAA;AAGpD,YAAA,MAAM,WAAA,GAA0B;AAAA,cAC9B,MAAA,EAAQ,OAAA;AAAA,cACR,OAAQ,KAAA,CAAgB;AAAA,aAC1B;AAGA,YAAA,MAAM,EAAE,UAAA,EAAAA,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAC7B,YAAA,MAAM,aAAa,MAAMA,WAAAA,CAAW,2BAAA,CAA4B,KAAA,EAAO,MAAM,WAAW,CAAA;AAGxF,YAAA,IAAI,eAAe,IAAA,EAAM;AACb,cAAA,MAAM,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,KAAK,CAAA;AAC1D,cAAA;AAAA,YACF;AAGA,YAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,UAAA,EAAY,OAAO,aAAa,CAAA;AAGjE,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,gBAAA;AAAA,cACN,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,cACpB,MAAA,EAAQ,OAAA;AAAA,cACR,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,KAAA,CAAM,SAAS,UAAA,GAAa,KAAA;AAI5B,QAAA,IAAI,MAAM,gBAAA,EAAkB;AAC1B,UAAA,KAAA,CAAM,iBAAiB,KAAA,CAAM,gBAAA;AAC7B,UAAA,KAAA,CAAM,gBAAA,GAAmB,MAAA;AAAA,QAC3B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,eAAA,CACnB,IAAA,EACA,KAAA,EACA,aAAA,EACqB;AACrB,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,KAAK,CAAA;AAExD,QAAA,QAAQ,QAAA;AAAU,UAChB,KAAK,QAAA;AACH,YAAA,OAAO,MAAM,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,KAAK,CAAA;AAAA,UACjD,KAAK,QAAA;AACH,YAAA,OAAO,MAAM,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,OAAO,aAAa,CAAA;AAAA,UAChE,KAAK,OAAA;AACH,YAAA,OAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,KAAK,CAAA;AAAA,UAChD;AACE,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA;AAClE,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,OAAe,gBAAA,CACb,IAAA,EACA,KAAA,EACe;AAEf,QAAA,IAAI,CAAC,KAAA,CAAM,YAAA,IAAgB,IAAA,CAAK,UAAA,EAAY;AAC1C,UAAA,OAAO,IAAA;AAAA,QACT;AAGA,QAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,IAAA;AAAA,UACnC,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS,KAAK,QAAA,CAAS;AAAA,SACjD;AAEA,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,2GAAA,CAAA;AAAA,QACpC;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,gBAAA,CACnB,IAAA,EACA,KAAA,EACmB;AACnB,QAAA,MAAM,QAAA,GAAW,KAAK,QAAA,CAAS,IAAA;AAE/B,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAC1C,QAAA,IAAI,YAAY,KAAA,EAAO;AACrB,UAAA,OAAO,QAAA;AAAA,QACT;AAGA,QAAA,IAAI;AACF,UAAA,MAAM,YAAY,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,WAAW,QAAQ,CAAA;AACjE,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,OAAO,QAAA;AAAA,UACT;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAIA,QAAA,MAAM,cAAA,GAAiB,CAAC,SAAA,KAA+B;AACrD,UAAA,MAAMC,MAAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,MAAA,IAAU,EAAC;AACtC,UAAA,OAAOA,MAAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,OAAO,CAAA,KAAM,WAAW,CAAA,KAAM,SAAA,GAAY,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA;AAAA,QACvF,CAAA;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,QAAQ,CAAA;AAE/D,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,IAAI,KAAK,UAAA,EAAY;AAEnB,cAAA,IAAI,QAAA,CAAS,SAAS,UAAA,EAAY;AAChC,gBAAA,OAAO,OAAA;AAAA,cACT;AAAA,YACF,CAAA,MAAO;AAEL,cAAA,IAAI,QAAA,CAAS,YAAA,IAAgB,cAAA,CAAe,QAAQ,CAAA,EAAG;AACrD,gBAAA,OAAO,OAAA;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAGA,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,aAAA,EAAc;AACvD,QAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,UAAA,IAAI;AACF,YAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,IAAI,CAAA;AAC3D,YAAA,IAAI,QAAA,CAAS,UAAU,QAAA,EAAU;AAC/B,cAAA,IAAI,KAAK,UAAA,EAAY;AACnB,gBAAA,IAAI,QAAA,CAAS,SAAS,UAAA,EAAY;AAChC,kBAAA,OAAO,OAAA;AAAA,gBACT;AAAA,cACF,CAAA,MAAO;AACL,gBAAA,IAAI,QAAA,CAAS,YAAA,IAAgB,cAAA,CAAe,IAAI,CAAA,EAAG;AACjD,kBAAA,OAAO,OAAA;AAAA,gBACT;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAEA,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC/C;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,iBAAA,CACnB,IAAA,EACA,KAAA,EACqB;AACrB,QAAA,IAAI;AAEF,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAG1C,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAC3C,UAAA,IAAI,CAAC,UAAA,EAAY;AACf,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,UAChE;AAEA,UAAA,MAAM,UAAA,GAA+B,MAAM,UAAA,EAAW;AACtD,UAAA,MAAM,CAAC,WAAA,EAAa,UAAA,EAAY,MAAM,CAAA,GAAI,UAAA;AAG1C,UAAA,MAAM,IAAA,GAA4B,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,SAAS,CAAA;AAGpE,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,MAAM,UAAA,GAAa,UAAA,CAAW,SAAA,CAAU,IAAI,CAAA;AAC5C,YAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,cAAA,MAAM,eAAe,UAAA,CAAW,KAAA,CAAM,MAAA,CACnC,GAAA,CAAI,CAAC,KAAA,KAAU;AACd,gBAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AACxE,gBAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,cACnC,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,cAAA,OAAO;AAAA,gBACL,MAAA,EAAQ,OAAA;AAAA,gBACR,KAAA,EAAO,oCAAoC,YAAY,CAAA;AAAA,eACzD;AAAA,YACF;AAAA,UACF;AAGA,UAAA,KAAA,CAAM,MAAA,GAAS;AAAA,YACb,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,YACpB,IAAA;AAAA,YACA,OAAA,EAAS,CAAA;AAAA,YACT,SAAS;AAAC,WACZ;AAGA,UAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AAIvD,UAAA,MAAM,MAAA,GAAS,aACX,MAAO,MAAA,CAA8E,aAAa,IAAI,CAAA,GACtG,MAAO,MAAA,CAA+C,WAAW,CAAA;AAGrE,UAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,KAAW,OAAA,GAAU,OAAA,GAAU,SAAA;AAErD,UAAA,IAAI,UAAA;AACJ,UAAA,IAAI,SAAA;AAGJ,UAAA,MAAM,UAAW,MAAA,CAAe,OAAA;AAChC,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,YAAA,MAAM,YAAY,OAAA,CACf,MAAA;AAAA,cACC,CAAC,SACC,IAAA,IACA,IAAA,CAAK,SAAS,MAAA,IACd,OAAO,KAAK,IAAA,KAAS;AAAA,aACzB,CACC,GAAA,CAAI,CAAC,IAAA,KAAc,KAAK,IAAc,CAAA;AAEzC,YAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,cAAA,UAAA,GAAa,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,YAClC;AAAA,UACF;AAGA,UAAA,IAAI,CAAC,UAAA,IAAe,MAAA,CAAe,MAAA,KAAW,KAAA,CAAA,EAAW;AACvD,YAAA,MAAM,MAAO,MAAA,CAAe,MAAA;AAC5B,YAAA,UAAA,GACE,OAAO,QAAQ,QAAA,GAAW,GAAA,GAAM,KAAK,SAAA,CAAU,GAAA,EAAK,MAAM,CAAC,CAAA;AAAA,UAC/D;AAGA,UAAA,IAAI,OAAQ,MAAA,CAAe,KAAA,KAAU,QAAA,EAAU;AAC7C,YAAA,SAAA,GAAa,MAAA,CAAe,KAAA;AAAA,UAC9B;AAEA,UAAA,IAAI,MAAA,KAAW,OAAA,IAAW,CAAC,SAAA,EAAW;AAGpC,YAAA,SAAA,GAAY,UAAA;AAAA,UACd;AAEA,UAAA,OAAO;AAAA,YACL,MAAA;AAAA,YACA,MAAA,EAAQ,UAAA;AAAA,YACR,KAAA,EAAO,MAAA,KAAW,OAAA,GAAU,SAAA,GAAY,KAAA;AAAA,WAC1C;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,UAAA,MAAM,aAAa,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,KAAA,GAAQ,MAAM,KAAA,GAAQ,MAAA;AACzE,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAO,YAAA;AAAA,YACP,KAAA,EAAO;AAAA,WACT;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,aAAqB,iBAAA,CACnB,IAAA,EACA,KAAA,EACA,aAAA,EACqB;AAGrB,QAAA,OAAO,MAAM,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,OAAO,aAAa,CAAA;AAAA,MACxE;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,yBAAA,CACnB,IAAA,EACA,KAAA,EACA,aAAA,EACqB;AACrB,QAAA,IAAI;AAEF,UAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,MAAA,CAAO,SAAS,UAAA,CAAW,IAAA,CAAK,SAAS,IAAI,CAAA;AAE3E,UAAA,IAAI,CAAC,SAAA,EAAW;AACd,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,UAChE;AAGA,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,SAAS,CAAA;AAG/C,UAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,YAAA,MAAM,UAAA,GAAa,SAAA,CAAU,cAAA,CAAe,SAAA,CAAU,IAAI,CAAA;AAC1D,YAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,cAAA,MAAM,eAAe,UAAA,CAAW,KAAA,CAAM,OACnC,GAAA,CAAI,CAAC,UAAe,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA,CAChE,KAAK,IAAI,CAAA;AACZ,cAAA,OAAO;AAAA,gBACL,MAAA,EAAQ,OAAA;AAAA,gBACR,KAAA,EAAO,2CAA2C,YAAY,CAAA;AAAA,eAChE;AAAA,YACF;AAAA,UACF;AAGA,UAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,MAAA,CAAO,MAAA,IAAU,EAAC;AAClD,UAAA,MAAM,aAAa,iBAAA,CAAkB,IAAA;AAAA,YAAK,CAAC,CAAA,KACzC,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,IAAA,GAAO,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS;AAAA,WAC9E;AACA,UAAA,MAAM,uBAAA,GAA0B,OAAO,UAAA,KAAe,QAAA,GAClD,WAAW,uBAAA,GACX,IAAA;AAGJ,UAAA,MAAM,EAAE,UAAA,EAAAD,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAK7B,UAAA,MAAM,WAAA,GAAuC;AAAA,YAC3C,IAAI,SAAA,CAAU,IAAA;AAAA,YACd,OAAO,SAAA,CAAU,IAAA;AAAA,YACjB,IAAA,EAAM,UAAA;AAAA;AAAA,YACN,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA;AAAA,YAGrB,iBAAA,EAAmB,IAAA;AAAA;AAAA,YAGnB,YAAA,EAAc,IAAA;AAAA,YACd,qBAAqB,SAAA,CAAU,IAAA;AAAA;AAAA,YAC/B,uBAAA,EAAyB,IAAA;AAAA,YACzB,gBAAA,EAAkB,IAAA;AAAA,YAClB,kCAAA,EAAoC,IAAA;AAAA,YACpC,gBAAA,EAAkB,IAAA;AAAA,YAClB,uBAAA,EAAyB,IAAA;AAAA;AAAA,YAGzB,YAAA,EAAc,IAAA;AAAA,YACd,mBAAA,EAAqB,IAAA;AAAA,YACrB,uBAAA,EAAyB,IAAA;AAAA,YACzB,gBAAA,EAAkB,IAAA;AAAA,YAClB,kCAAA,EAAoC,IAAA;AAAA,YACpC,gBAAA,EAAkB,IAAA;AAAA,YAClB,uBAAA,EAAyB;AAAA,WAC3B;AAGA,UAAA,IAAI,kBAAA;AACJ,UAAA,IAAI,uBAAA,IAA2B,IAAA,CAAK,uBAAuB,CAAA,KAAM,KAAA,CAAA,EAAW;AAE1E,YAAA,MAAM,aAAA,GAAgB,KAAK,uBAAuB,CAAA;AAClD,YAAA,kBAAA,GAAqB,OAAO,aAAA,KAAkB,QAAA,GAC1C,aAAA,GACA,IAAA,CAAK,UAAU,aAAa,CAAA;AAAA,UAClC;AAGA,UAAA,MAAM,gBAA2B,CAAC,GAAI,KAAA,CAAM,aAAA,IAAiB,EAAG,CAAA;AAChE,UAAA,IAAI,kBAAA,EAAoB;AACtB,YAAA,aAAA,CAAc,IAAA,CAAK;AAAA,cACjB,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,cACtB,IAAA,EAAM,MAAA;AAAA,cACN,OAAA,EAAS,kBAAA;AAAA,cACT,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,aAC1B,CAAA;AAAA,UACH;AAMA,UAAA,MAAM,WAAA,GAAc,MAAM,YAAA,IAAgB,IAAA;AAC1C,UAAA,MAAM,qBAAA,GAAwB,KAAA,CAAM,gBAAA,IAAoB,KAAA,CAAM,aAAA,IAAiB,IAAA;AAE/E,UAAA,MAAM,MAAA,GAAS,MAAMA,WAAAA,CAAW,OAAA,CAAQ;AAAA,YACtC,WAAA,EAAa,WAAA;AAAA,YACb,SAAS,KAAA,CAAM,OAAA;AAAA,YACf,KAAK,KAAA,CAAM,GAAA;AAAA,YACX,UAAU,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,QAAA,EAAW,KAAK,EAAE,CAAA,CAAA;AAAA,YAC7C,QAAQ,KAAA,CAAM,MAAA;AAAA;AAAA,YACd,OAAA,EAAS;AAAA,cACP,GAAG,IAAA;AAAA;AAAA;AAAA,cAEH,kBAAA,EAAoB,UAAA;AAAA,cACpB,gBAAA,EAAkB,KAAK,QAAA,CAAS;AAAA,aAClC;AAAA;AAAA,YAEA,MAAA,EAAQ,CAAA,OAAA,EAAU,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA;AAAA;AAAA,YAGzB,SAAS,KAAA,CAAM,OAAA;AAAA,YACf,aAAa,KAAA,CAAM,WAAA;AAAA,YACnB,kBAAkB,KAAA,CAAM,gBAAA;AAAA;AAAA,YAExB,WAAA;AAAA;AAAA,YAEA,aAAA,EAAe,qBAAA;AAAA;AAAA,YAEf,WAAW,KAAA,CAAM,SAAA;AAAA;AAAA,YAEjB,eAAA,EAAiB,aAAA;AAAA;AAAA,YAEjB,KAAA,EAAO,MAAM,KAAA,GAAQ,CAAA;AAAA;AAAA,YAErB;AAAA,aACC,IAAI,CAAA;AAIP,UAAA,IAAI,mBAAA,GAAsB;AAAA,YACxB,qBAAA,EAAuB,IAAA;AAAA,YACvB,kBAAA,EAAoB,IAAA;AAAA,YACpB,cAAA,EAAgB;AAAA,WAClB;AAEA,UAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,UAAA,KAAe,IAAA,EAAM;AACzD,YAAA,mBAAA,GAAsB;AAAA,cACpB,qBAAA,EAAuB,WAAW,mBAAA,IAAuB,IAAA;AAAA,cACzD,kBAAA,EAAoB,WAAW,gBAAA,IAAoB,IAAA;AAAA,cACnD,cAAA,EAAgB,WAAW,aAAA,IAAiB;AAAA,aAC9C;AAAA,UACF;AAGA,UAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,SAAA,EAAU;AACvC,UAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,UAAA,IAAI,WAAA,GAAc,EAAA;AAElB,UAAA,IAAI;AACF,YAAA,OAAO,IAAA,EAAM;AACX,cAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,cAAA,IAAI,IAAA,EAAM;AACV,cAAA,WAAA,IAAe,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,YACvD;AAAA,UACF,CAAA,SAAE;AACA,YAAA,MAAA,CAAO,WAAA,EAAY;AAAA,UACrB;AAGA,UAAA,MAAM,uBAAA,GAA0B,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,YACtD,CAAA,iGAAA,CAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA,MAAM,aAAA,GAAgB,wBAAwB,OAAA,EAAQ;AAGtD,UAAA,MAAM,0BAAA,GAA6B,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,YACzD,CAAA,uGAAA,CAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA,MAAM,uBAAA,GAA0B,2BAA2B,OAAA,EAAQ;AAInE,UAAA,MAAM,uBAAwC,EAAC;AAC/C,UAAA,KAAA,MAAW,OAAO,uBAAA,EAAyB;AACzC,YAAA,IAAI,IAAI,WAAA,EAAa;AACnB,cAAA,IAAI;AACF,gBAAA,MAAM,IAAA,GAAwB,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAqB,CAAA;AAClE,gBAAA,oBAAA,CAAqB,IAAA,CAAK,GAAG,IAAI,CAAA;AAAA,cACnC,SAAS,CAAA,EAAG;AACV,gBAAA,OAAA,CAAQ,KAAA,CAAM,0DAA0D,CAAC,CAAA;AAAA,cAC3E;AAAA,YACF;AAAA,UACF;AAGA,UAAA,IAAI,aAAA,GAAqC,SAAA;AACzC,UAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,YAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,WAAqB,CAAA;AACnE,YAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KAAK,MAAM,OAAO,CAAA;AAGjD,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,aAAA,GAAgB,OAAA;AAAA,YAClB;AAAA,UACF;AAGA,UAAA,MAAM,gBAA0B,EAAC;AAGjC,UAAA,IAAI,mBAAA,CAAoB,yBAAyB,WAAA,EAAa;AAC5D,YAAA,aAAA,CAAc,KAAK,WAAW,CAAA;AAAA,UAChC;AAGA,UAAA,IAAI,mBAAA,CAAoB,kBAAA,IAAsB,mBAAA,CAAoB,cAAA,EAAgB;AAEhF,YAAA,MAAM,4BAAA,GAA+B,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,cAC3D,CAAA,yGAAA,CAAA;AAAA,cACA;AAAA,aACF;AACA,YAAA,MAAM,kBAAA,GAAqB,6BAA6B,OAAA,EAAQ;AAEhE,YAAA,MAAM,mBAA6B,EAAC;AAGpC,YAAA,IAAI,mBAAA,CAAoB,kBAAA,IAAsB,kBAAA,CAAmB,MAAA,GAAS,CAAA,EAAG;AAC3E,cAAA,KAAA,MAAW,OAAO,kBAAA,EAAoB;AACpC,gBAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAoB,CAAA;AACrD,gBAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,kBAAA,gBAAA,CAAiB,IAAA;AAAA,oBACf,cAAc,EAAA,CAAG,QAAA,CAAS,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,SAAS,SAAS,CAAA,CAAA;AAAA,mBACzD;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAGA,YAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,cAAA,MAAM,OAAA,GAAW,GAAA,CAAI,OAAA,EAAoB,UAAA,CAAW,SAAS,CAAA;AAG7D,cAAA,IAAK,WAAW,mBAAA,CAAoB,cAAA,IAC/B,CAAC,OAAA,IAAW,oBAAoB,kBAAA,EAAqB;AACxD,gBAAA,gBAAA,CAAiB,IAAA,CAAK,CAAA,eAAA,EAAkB,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,cACvD;AAAA,YACF;AAEA,YAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,cAAA,aAAA,CAAc,IAAA;AAAA,gBACZ,oBAAA,GAAuB,gBAAA,CAAiB,IAAA,CAAK,IAAI;AAAA,eACnD;AAAA,YACF;AAAA,UACF;AAEA,UAAA,MAAM,gBAAgB,aAAA,CAAc,MAAA,GAAS,IACzC,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA,GACzB,8BAAA;AAEJ,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,aAAA;AAAA,YACR,MAAA,EAAQ,aAAA,KAAkB,SAAA,GAAY,aAAA,GAAgB,KAAA,CAAA;AAAA,YACtD,KAAA,EAAO,aAAA,KAAkB,OAAA,GAAU,aAAA,GAAgB,KAAA,CAAA;AAAA,YACnD,WAAA,EAAa,oBAAA,CAAqB,MAAA,GAAS,CAAA,GAAI,oBAAA,GAAuB,KAAA;AAAA,WACxE;AAAA,QACF,SAAS,KAAA,EAAO;AAEd,UAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,MAAA,CAAO,MAAA,IAAU,EAAC;AAClD,UAAA,MAAM,aAAa,iBAAA,CAAkB,IAAA;AAAA,YAAK,CAAC,CAAA,KACzC,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,IAAA,GAAO,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS;AAAA,WAC9E;AAEA,UAAA,IAAI,aAAA,GAAgB,IAAA;AACpB,UAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,UAAA,KAAe,IAAA,EAAM;AACzD,YAAA,aAAA,GAAgB,WAAW,aAAA,IAAiB,IAAA;AAAA,UAC9C;AAEA,UAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,UAAA,MAAM,aAAa,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,KAAA,GAAQ,MAAM,KAAA,GAAQ,MAAA;AAGzE,UAAA,MAAM,cAAA,GAAiB,aAAA,GACnB,CAAA,OAAA,EAAU,YAAY,CAAA,CAAA,GACtB,8BAAA;AAEJ,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAO,cAAA;AAAA,YACP,KAAA,EAAO,gBAAgB,UAAA,GAAa;AAAA,WACtC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,aAAqB,gBAAA,CACnB,IAAA,EACA,KAAA,EACqB;AACrB,QAAA,IAAI;AAGF,UAAA,IAAI,QAAA,GAAgB,IAAA;AACpB,UAAA,IAAI,SAAA,GAAY,KAAK,QAAA,CAAS,IAAA;AAE9B,UAAA,IAAI;AACF,YAAA,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,SAAS,SAAA,CAAU,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,UACrE,CAAA,CAAA,MAAQ;AAEN,YAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,aAAA,EAAc;AACvD,YAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,cAAA,IAAI;AACF,gBAAA,MAAM,MAAM,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,IAAI,CAAA;AACtD,gBAAA,IAAI,GAAA,CAAI,KAAA,KAAU,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM;AACpC,kBAAA,QAAA,GAAW,GAAA;AACX,kBAAA,SAAA,GAAY,IAAA;AACZ,kBAAA;AAAA,gBACF;AAAA,cACF,CAAA,CAAA,MAAQ;AAAA,cAER;AAAA,YACF;AAAA,UACF;AAEA,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,UAC/D;AAEA,UAAA,MAAM,YAAY,QAAA,CAAS,IAAA;AAG3B,UAAA,IAAI,cAAc,UAAA,EAAY;AAG5B,YAAA,KAAA,CAAM,cAAA,GAAiB;AAAA,cACrB,OAAA,EAAS;AAAA,aACX;AACA,YAAA,MAAME,KAAAA,GAAO,kBAAA;AAGb,YAAA,OAAO;AAAA,cACL,MAAA,EAAQ,SAAA;AAAA,cACR,MAAA,EAAQA;AAAA,aACV;AAAA,UACF;AAGA,UAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,CAAA,kDAAA,EAAqD,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,iCAAA;AAAA,aACzE;AAAA,UACF;AAGA,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,SAAS,CAAA;AAG/C,UAAA,MAAM,aAAA,GAAgB,OAAO,UAAA,EAAW;AAGxC,UAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,GAAA,CAAI,aAAA,CAAc,WAAW,WAAW,CAAA;AACrE,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,GAAA,CAAI,aAAA,CAAc,IAAI,cAAc,CAAA;AAC/D,UAAA,MAAM,YAAA,CAAa,YAAA,CAAa,aAAA,EAAe,SAAA,EAAW,IAAI,CAAA;AAG9D,UAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,oBAAA,CAAqB,WAAW,aAAa,CAAA;AACzE,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,oBAAA,CAAqB,IAAI,SAAS,CAAA;AAGzD,UAAA,MAAM,eAAA,GAA6B;AAAA,YACjC;AAAA,cACE,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,cACtB,IAAA,EAAM,MAAA;AAAA,cACN,SAAS,OAAO,IAAA,KAAS,WAAW,IAAA,GAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,cAC9D,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA;AAC3B,WACF;AAGA,UAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA;AAAA,YAC1B,aAAA;AAAA,YACA,SAAA;AAAA;AAAA,YACA,eAAA;AAAA,YACA;AAAC,WACH;AAEA,UAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,sCAAsC,QAAA,CAAS,MAAM,KAAK,MAAM,QAAA,CAAS,MAAM,CAAA;AAAA,aACjF;AAAA,UACF;AAGA,UAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,UACzD;AAEA,UAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,UAAA,IAAI,OAAA,GAAU,EAAA;AAEd,UAAA,IAAI;AACF,YAAA,OAAO,IAAA,EAAM;AACX,cAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,cAAA,IAAI,IAAA,EAAM;AACV,cAAA,OAAA,IAAW,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,YACnD;AAAA,UACF,CAAA,SAAE;AACA,YAAA,MAAA,CAAO,WAAA,EAAY;AAAA,UACrB;AAEA,UAAA,MAAM,OAAO,OAAA,IAAW,6BAAA;AAExB,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,SAAA;AAAA,YACR,MAAA,EAAQ;AAAA,WACV;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,UAAA,MAAM,aAAa,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,KAAA,GAAQ,MAAM,KAAA,GAAQ,MAAA;AACzE,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAO,YAAA;AAAA,YACP,KAAA,EAAO;AAAA,WACT;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,eAAA,CACnB,IAAA,EACA,MAAA,EACA,OACA,aAAA,EACe;AACf,QAAA,IAAI;AAEF,UAAA,MAAM,EAAE,UAAA,EAAAF,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAG7B,UAAA,MAAM,eAAA,GAAkB,MAAMA,WAAAA,CAAW,4BAAA;AAAA,YACvC,KAAA;AAAA,YACA,IAAA;AAAA,YACA;AAAA,WACF;AAGA,UAAA,MAAM,SAAA,GAAY,aAAA;AAGlB,UAAA,IAAI,cAAA;AACJ,UAAA,IAAI,eAAA,CAAgB,WAAA,IAAe,eAAA,CAAgB,WAAA,CAAY,SAAS,CAAA,EAAG;AACzE,YAAA,MAAM,iBAAmC,EAAC;AAC1C,YAAA,MAAM,eAAgC,EAAC;AAEvC,YAAA,KAAA,MAAW,IAAA,IAAQ,gBAAgB,WAAA,EAAa;AAC9C,cAAA,IAAI,UAAU,IAAA,EAAM;AAElB,gBAAA,cAAA,CAAe,KAAK,IAAsB,CAAA;AAAA,cAC5C,CAAA,MAAO;AAEL,gBAAA,YAAA,CAAa,KAAK,IAAqB,CAAA;AAAA,cACzC;AAAA,YACF;AAEA,YAAA,cAAA,GAAiB,YAAA;AACjB,YAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,cAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,sBAAA,CAAuB,gBAAgB,KAAK,CAAA;AAC7E,cAAA,cAAA,GAAiB,CAAC,GAAG,cAAA,EAAgB,GAAG,aAAa,CAAA;AAAA,YACvD;AACA,YAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,cAAA,cAAA,GAAiB,KAAA,CAAA;AAAA,YACnB;AAAA,UACF;AAKA,UAAA,IAAI,OAAA;AACJ,UAAA,IAAI,eAAA,CAAgB,WAAW,SAAA,EAAW;AACxC,YAAA,OAAA,GACE,eAAA,CAAgB,MAAA,EAAQ,IAAA,EAAK,IAC7B,4BAAA;AAAA,UACJ,CAAA,MAAO;AACL,YAAA,MAAM,SAAA,GACJ,eAAA,CAAgB,KAAA,EAAO,IAAA,EAAK,IAC5B,uBAAA;AACF,YAAA,OAAA,GAAU,2BAA2B,SAAS,CAAA,CAAA;AAAA,UAChD;AAGA,UAAA,IAAI,KAAA,CAAM,eAAA,KAAoB,KAAA,CAAA,IAAa,eAAA,CAAgB,WAAW,OAAA,EAAS;AAE7E,YAAA,MAAM,gBAAA,GAAmB,MAAM,OAAA,CAAQ,kBAAA;AAGvC,YAAA,IAAI,aAAA,GAAgB,IAAA;AACpB,YAAA,IAAI,gBAAA,KAAqB,KAAA,CAAA,IAAa,gBAAA,KAAqB,IAAA,EAAM;AAC/D,cAAA,aAAA,GAAgB,iBAAiB,aAAA,IAAiB,IAAA;AAAA,YACpD;AAGA,YAAA,IAAI,aAAA,IAAiB,CAAC,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACnD,cAAA,OAAA,GAAU,UAAU,OAAO,CAAA,CAAA;AAAA,YAC7B;AAAA,UACF;AAGA,UAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,MAAA,KAAW,SAAA,GAAY,SAAA,GAAY,OAAA;AAEtE,UAAA,IAAI,OAAA,GAAmB;AAAA,YACrB,EAAA,EAAI,SAAA;AAAA,YACJ,IAAA,EAAM,MAAA;AAAA,YACN,OAAA;AAAA,YACA,cAAc,IAAA,CAAK,EAAA;AAAA,YACnB,UAAA,EAAY,CAAA;AAAA;AAAA,YACZ,WAAA,EAAa,UAAA;AAAA,YACb,SAAA,EAAW,MAAM,eAAA,IAAmB,IAAA;AAAA,YACpC,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,WAAA,EAAa,kBAAkB,cAAA,CAAe,MAAA,GAAS,IACnD,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA,GAC7B;AAAA,WACN;AAGA,UAAA,OAAA,GAAU,MAAMA,WAAAA,CAAW,0BAAA,CAA2B,KAAA,EAAO,OAAO,CAAA;AAGpE,UAAA,OAAA,CAAQ,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAGlC,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,YAIA,OAAA,CAAQ,EAAA;AAAA,YACR,OAAA,CAAQ,IAAA;AAAA,YACR,OAAA,CAAQ,OAAA;AAAA,YACR,OAAA,CAAQ,YAAA;AAAA,YACR,OAAA,CAAQ,UAAA;AAAA,YACR,OAAA,CAAQ,WAAA;AAAA,YACR,OAAA,CAAQ,SAAA;AAAA,YACR,OAAA,CAAQ,KAAA;AAAA,YACR,OAAA,CAAQ;AAAA,WACV;AAGA,UAAA,MAAMA,WAAAA,CAAW,yBAAA,CAA0B,KAAA,EAAO,OAAO,CAAA;AAGvD,UAAA,MAAM,WAAA,GAAc,MAAM,YAAA,IAAgB,IAAA;AAC1C,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,IAAI;AAEF,cAAA,MAAMD,OAAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,gBACrC,CAAA,2CAAA,CAAA;AAAA,gBACA;AAAA,eACF;AACA,cAAA,MAAM,IAAA,GAAOA,QAAO,OAAA,EAAQ;AAC5B,cAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,CAAC,CAAA,EAAG,YAAA;AAGpC,cAAA,IAAI,mBAMC,EAAC;AAEN,cAAA,IAAI,kBAAA,EAAoB;AACtB,gBAAA,IAAI;AACF,kBAAA,gBAAA,GAAmB,IAAA,CAAK,MAAM,kBAA4B,CAAA;AAAA,gBAC5D,CAAA,CAAA,MAAQ;AAAA,gBAER;AAAA,cACF;AAGA,cAAA,gBAAA,CAAiB,IAAA,CAAK;AAAA,gBACpB,cAAc,IAAA,CAAK,EAAA;AAAA,gBACnB,SAAA,EAAW,KAAK,QAAA,CAAS,IAAA;AAAA,gBACzB,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA;AAAA,gBACrC,QAAQ,eAAA,CAAgB,MAAA;AAAA,gBACxB,SAAA,EAAW,KAAK,GAAA;AAAI,eACrB,CAAA;AAGD,cAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,gBACtB,CAAA,+CAAA,CAAA;AAAA,gBACA,IAAA,CAAK,UAAU,gBAAgB,CAAA;AAAA,gBAC/B;AAAA,eACF;AAGA,cAAA,IAAI,MAAM,OAAA,EAAS;AACjB,gBAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,kBACZ,IAAA,EAAM,UAAA;AAAA,kBACN,MAAA,EAAQ,WAAA;AAAA,kBACR,IAAA,EAAM;AAAA,oBACJ,EAAA,EAAI,WAAA;AAAA,oBACJ,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,gBAAgB;AAAA;AAC/C,iBACD,CAAA;AAAA,cACH;AAAA,YACF,SAAS,QAAA,EAAU;AAEjB,cAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,QAAQ,CAAA;AAAA,YAClE;AAAA,UACF;AAGF,UAAA,IAAI,MAAM,WAAA,EAAa;AACrB,YAAA,KAAA,CAAM,YAAY,OAAO,CAAA;AAAA,UAC3B;AAGA,UAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,SAAA,IAAa,eAAA,CAAgB,MAAA,EAAQ;AAClE,YAAA,KAAA,CAAM,OAAO,WAAA,CAAY;AAAA,OAAA,EAAY,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAA,EAAK,gBAAgB,MAAM;AAAA,CAAI,CAAA;AAAA,UACxF;AAGA,UAAA,KAAA,CAAM,cAAA,CAAe,KAAK,OAAO,CAAA;AAAA,QACnC,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAEjD,UAAA,MAAM,IAAA,CAAK,SAAS,KAAA,EAAO,KAAA,EAAO,mBAAmB,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,QAC3E;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,sBAAA,CACnB,WAAA,EACA,KAAA,EAC0B;AAE1B,QAAA,MAAM,EAAE,WAAA,EAAAI,YAAAA,EAAY,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,UAAA,EAAA,EAAA,aAAA,CAAA,CAAA;AAC9B,QAAA,MAAM,EAAA,GAAK,IAAIA,YAAAA,CAAY,KAAA,CAAM,QAAQ,GAAG,CAAA;AAE5C,QAAA,MAAM,OAAwB,EAAC;AAE/B,QAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,UAAA,IAAI;AACF,YAAA,MAAM,YAAA,GAAe,OAAO,UAAA,EAAW;AACvC,YAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,YAAA,MAAM,GAAA,GAAM,WAAW,QAAA,KAAa,WAAA,GAAc,QACtC,UAAA,CAAW,QAAA,KAAa,YAAA,GAAe,KAAA,GACvC,UAAA,CAAW,QAAA,KAAa,cAAc,KAAA,GACtC,UAAA,CAAW,QAAA,KAAa,YAAA,GAAe,MAAA,GACvC,UAAA,CAAW,KAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,KAAA;AAEhD,YAAA,MAAM,OAAO,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAA,EAAI,YAAY,IAAI,GAAG,CAAA,CAAA;AAG7D,YAAA,MAAM,YAAA,GAAe,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AACzC,YAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AACrD,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,cAAA,UAAA,CAAW,CAAC,CAAA,GAAI,YAAA,CAAa,UAAA,CAAW,CAAC,CAAA;AAAA,YAC3C;AAIA,YAAA,MAAM,GAAG,SAAA,CAAU,IAAA,EAAM,UAAA,CAAW,MAAA,EAAuB,WAAW,QAAA,EAAU;AAAA,cAC9E,OAAO,UAAA,CAAW,KAAA;AAAA,cAClB,QAAQ,UAAA,CAAW;AAAA,aACpB,CAAA;AAGD,YAAA,MAAM,GAAA,GAAqB;AAAA,cACzB,EAAA,EAAI,YAAA;AAAA,cACJ,IAAA,EAAM,MAAA;AAAA,cACN,IAAA;AAAA,cACA,MAAM,UAAA,CAAW,IAAA;AAAA,cACjB,UAAU,UAAA,CAAW;AAAA,aACvB;AAEA,YAAA,IAAI,UAAA,CAAW,KAAA,EAAO,GAAA,CAAI,KAAA,GAAQ,UAAA,CAAW,KAAA;AAC7C,YAAA,IAAI,UAAA,CAAW,MAAA,EAAQ,GAAA,CAAI,MAAA,GAAS,UAAA,CAAW,MAAA;AAE/C,YAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,UACf,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAAmC,UAAA,CAAW,IAAI,KAAK,KAAK,CAAA;AAAA,UAE5E;AAAA,QACF;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,cAAA,CACnB,IAAA,EACA,KAAA,EACA,KAAA,EACe;AACf,QAAA,MAAM,aAAA,GAAgB,OAAO,UAAA,EAAW;AAExC,QAAA,MAAM,MAAA,GAAqB;AAAA,UACzB,MAAA,EAAQ,OAAA;AAAA,UACR,OAAO,KAAA,CAAM;AAAA,SACf;AAEA,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,MAAA,EAAQ,OAAO,aAAa,CAAA;AAAA,MAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,QAAA,CACnB,KAAA,EACA,KAAA,EACA,QAAA,EACe;AACf,QAAA,IAAI;AACF,UAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,UAAA,MAAM,UAAA,GAAa,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAA;AAG1D,UAAA,MAAM,WAAA,GAAc,MAAM,YAAA,IAAgB,IAAA;AAE1C,UAAA,IAAI,CAAC,WAAA,EAAa;AAEhB,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,YAAA,EAAe,QAAQ,CAAA,EAAA,CAAA,EAAM,YAAY,CAAA;AACvD,YAAA;AAAA,UACF;AAGA,UAAA,MAAM,YAAY,CAAA,MAAA,EAAS,QAAQ,CAAA,UAAA,EAAa,YAAY,GAAG,UAAA,GAAa;;AAAA;AAAA,EAAqB,UAAU,KAAK,EAAE,CAAA,CAAA;AAGlH,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,YAOA,SAAA;AAAA,YACA,sBAAA;AAAA,YACA;AAAA,WACF;AAGA,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,cACZ,IAAA,EAAM,UAAA;AAAA,cACN,MAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAM;AAAA,gBACJ,EAAA,EAAI,WAAA;AAAA,gBACJ,KAAA,EAAO,SAAA;AAAA,gBACP,UAAA,EAAY;AAAA;AACd,aACD,CAAA;AAAA,UACH;AAAA,QACF,SAAS,QAAA,EAAU;AAEjB,UAAA,OAAA,CAAQ,KAAA,CAAM,gDAAgD,QAAQ,CAAA;AAAA,QACxE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,OAAe,kBAAA,CACb,IAAA,EACA,MAAA,EACe;AAIf,QAAA,IAAI,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,UAAA,EAAY;AAEjD,UAAA,IAAI,OAAO,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AACrD,YAAA,KAAA,MAAW,KAAA,IAAS,OAAO,QAAA,EAAU;AACnC,cAAA,IAAI,EAAE,SAAS,IAAA,CAAA,EAAO;AACpB,gBAAA,OAAO,2BAA2B,KAAK,CAAA,CAAA;AAAA,cACzC;AAAA,YACF;AAAA,UACF;AAGA,UAAA,KAAA,MAAW,CAAC,GAAA,EAAK,UAAU,CAAA,IAAK,MAAA,CAAO,OAAA;AAAA,YACrC,MAAA,CAAO;AAAA,WACT,EAAG;AACD,YAAA,IAAI,OAAO,IAAA,EAAM;AACf,cAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,cAAA,MAAM,eAAe,UAAA,CAAW,IAAA;AAGhC,cAAA,IAAI,YAAA,KAAiB,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,EAAU;AAC1D,gBAAA,OAAO,SAAS,GAAG,CAAA,iBAAA,CAAA;AAAA,cACrB;AACA,cAAA,IAAI,YAAA,KAAiB,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,EAAU;AAC1D,gBAAA,OAAO,SAAS,GAAG,CAAA,iBAAA,CAAA;AAAA,cACrB;AACA,cAAA,IAAI,YAAA,KAAiB,SAAA,IAAa,OAAO,KAAA,KAAU,SAAA,EAAW;AAC5D,gBAAA,OAAO,SAAS,GAAG,CAAA,kBAAA,CAAA;AAAA,cACrB;AACA,cAAA,IAAI,iBAAiB,OAAA,IAAW,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,gBAAA,OAAO,SAAS,GAAG,CAAA,iBAAA,CAAA;AAAA,cACrB;AACA,cAAA,IACE,iBAAiB,QAAA,KAChB,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,CAAA,EACxC;AACA,gBAAA,OAAO,SAAS,GAAG,CAAA,kBAAA,CAAA;AAAA,cACrB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,aAAqB,iBAAA,CACnB,UAAA,EACA,IAAA,EACA,KAAA,EACiB;AACjB,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAOtC,UAAA,MAAM,UAAoB,EAAC;AAE3B,UAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,YAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAE7B,cAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,IAAS,EAAE,CAAA;AAAA,YAClC,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,UAAA,EAAY;AAEtC,cAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,KAAA,IAAS,EAAE,CAAA;AAC9C,cAAA,IAAI,kBAAkB,KAAA,CAAA,EAAW;AAC/B,gBAAA,OAAA,CAAQ,IAAA;AAAA,kBACN,OAAO,aAAA,KAAkB,QAAA,GACrB,aAAA,GACA,IAAA,CAAK,UAAU,aAAa;AAAA,iBAClC;AAAA,cACF,CAAA,MAAO;AAEL,gBAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAA,EAAK,OAAA,CAAQ,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,cACrC;AAAA,YACF,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,QAAA,EAAU;AAEpC,cAAA,IAAI;AACF,gBAAA,MAAM,aAAa,OAAA,CAAQ,EAAA;AAC3B,gBAAA,MAAM,YAAY,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,WAAW,UAAW,CAAA;AAEpE,gBAAA,IAAI,CAAC,SAAA,EAAW;AACd,kBAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6BAAA,EAAgC,UAAU,CAAA,CAAE,CAAA;AACzD,kBAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mBAAA,EAAsB,OAAA,CAAQ,KAAA,IAAS,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,gBACnE,CAAA,MAAO;AAIL,kBAAA,IAAI,aAAa,SAAA,CAAU,MAAA;AAG3B,kBAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,gBAAA,EAAkB,CAAC,OAAe,OAAA,KAAoB;AACpF,oBAAA,MAAM,KAAA,GAAQ,KAAK,OAAO,CAAA;AAC1B,oBAAA,IAAI,UAAU,KAAA,CAAA,EAAW;AACvB,sBAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,oBACjE;AACA,oBAAA,OAAO,KAAA;AAAA,kBACT,CAAC,CAAA;AAED,kBAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AAAA,gBACzB;AAAA,cACF,SAAS,KAAA,EAAO;AACd,gBAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,OAAA,CAAQ,EAAE,KAAK,KAAK,CAAA;AAC1D,gBAAA,OAAA,CAAQ,KAAK,CAAA,uBAAA,EAA0B,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,cACvE;AAAA,YACF;AAAA,UACF;AAEA,UAAA,OAAO,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,QACxB,SAAS,KAAA,EAAO;AAEd,UAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,UAAA,OAAO,UAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,yBAAA,CACnB,IAAA,EACA,KAAA,EACe;AACf,QAAA,IAAI;AAEF,UAAA,MAAM,YAAA,GAAe,MAAM,cAAA,CAAe,SAAA;AAAA,YACxC,CAAC,GAAA,KAAQ;AACP,cAAA,IAAI,CAAC,GAAA,CAAI,UAAA,EAAY,OAAO,KAAA;AAC5B,cAAA,IAAI;AACF,gBAAA,MAAMC,UAAAA,GAAY,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAC3C,gBAAA,OAAOA,WAAU,IAAA,CAAK,CAAC,OAAiB,EAAA,CAAG,EAAA,KAAO,KAAK,EAAE,CAAA;AAAA,cAC3D,CAAA,CAAA,MAAQ;AACN,gBAAA,OAAO,KAAA;AAAA,cACT;AAAA,YACF;AAAA,WACF;AAEA,UAAA,IAAI,iBAAiB,CAAA,CAAA,EAAI;AACvB,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,2DAAA,EAA8D,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AACpF,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,cAAA,CAAe,YAAY,CAAA;AACjD,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,UAAW,CAAA;AAGhD,UAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAE1B,YAAA,KAAA,CAAM,cAAA,CAAe,MAAA,CAAO,YAAA,EAAc,CAAC,CAAA;AAG3C,YAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,cACtB,CAAA,iCAAA,CAAA;AAAA,cACA,OAAA,CAAQ;AAAA,aACV;AAAA,UAEM,CAAA,MAAO;AAEb,YAAA,MAAM,gBAAA,GAAmB,UAAU,MAAA,CAAO,CAAC,OAAiB,EAAA,CAAG,EAAA,KAAO,KAAK,EAAE,CAAA;AAC7E,YAAA,OAAA,CAAQ,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,gBAAgB,CAAA;AAGpD,YAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,cACtB,CAAA,+CAAA,CAAA;AAAA,cACA,OAAA,CAAQ,UAAA;AAAA,cACR,OAAA,CAAQ;AAAA,aACV;AAAA,UAEM;AAAA,QACV,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,yDAAyD,KAAK,CAAA;AAAA,QAC9E;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACzwCO,SAAS,sBAAsB,UAAA,EAAmC;AACvE,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,OAAO,CAAA,QAAA,EAAW,UAAA,CAAW,IAAI,CAAA,EAAA,EAAK,WAAW,WAAW,CAAA,CAAA;AAAA,EAC9D;AAGA,EAAA,MAAM,UAAA,GACJ,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,MAAA,GAC3B,CAAA,EAAA,EAAK,UAAA,CAAW,KAAK,CAAA,CAAA,EAAI,UAAA,CAAW,MAAM,CAAA,CAAA,CAAA,GAC1C,EAAA;AACN,EAAA,OAAO,CAAA,QAAA,EAAW,UAAA,CAAW,IAAI,CAAA,EAAG,UAAU,CAAA,CAAA,CAAA;AAChD;AApGA,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uBAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,kBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,kBAAA,EAAA;AAAA,EAAA,UAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IA6Ba,UAAA;AA7Bb,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0BAAA,GAAA;AAiBA,IAAA,UAAA,EAAA;AACA,IAAA,kBAAA,EAAA;AACA,IAAA,eAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AACA,IAAA,YAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AAOO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWtB,aAAa,OAAA,CACX,UAAA,EAUA,eAAA,GAA2B,KAAA,EACN;AAGrB,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AAEnD,QAAA,IAAI,eAAA,EAAiB;AAEnB,UAAA,IAAI;AACF,YAAA,MAAM,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AAAA,UAC/C,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,YAAA,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,KAAA,EAAO,yBAAyB,yBAAyB,CAAA;AACpF,YAAA,MAAM,KAAA;AAAA,UACR;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,IAAA,CAAK,aAAa,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA,CAAE,KAAA,CAAM,OAAO,KAAA,KAAU;AAC9D,YAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,YAAA,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,KAAA,EAAO,yBAAyB,yBAAyB,CAAA;AAAA,UACtF,CAAC,CAAA;AAAA,QACH;AAGA,QAAA,OAAO;AAAA,UACL,UAAU,KAAA,CAAM,cAAA;AAAA,UAChB,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,MAAA,EAAQ,MAAM,MAAA,CAAO;AAAA,SACvB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,YAAA,CACnB,KAAA,EACA,QAAA,EACe;AAEf,QAAA,OAAO,KAAA,CAAM,SAAA,GAAY,SAAA,IAAa,CAAC,KAAA,CAAM,WAAW,CAAC,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS;AAE9F,UAAA,IAAI;AAEF,YAAA,IAAI,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS;AAEzC,cAAA,MAAM,qBAAA,GAAwB,OAAO,UAAA,EAAW;AAChD,cAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAG/B,cAAA,IAAI,mBAAA,GAA+B;AAAA,gBACjC,EAAA,EAAI,qBAAA;AAAA,gBACJ,IAAA,EAAM,QAAA;AAAA,gBACN,OAAA,EAAS,2BAAA;AAAA,gBACT,UAAA,EAAY,SAAA;AAAA,gBACZ,MAAA,EAAQ;AAAA,eACV;AAEA,cAAA,mBAAA,GAAsB,MAAM,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,mBAAmB,CAAA;AAEtF,cAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,gBACtB,CAAA,mFAAA,CAAA;AAAA,gBACA,mBAAA,CAAoB,EAAA;AAAA,gBACpB,mBAAA,CAAoB,IAAA;AAAA,gBACpB,mBAAA,CAAoB,OAAA;AAAA,gBACpB,mBAAA,CAAoB,UAAA;AAAA,gBACpB,mBAAA,CAAoB;AAAA,eACtB;AAGA,cAAA,MAAM,IAAA,CAAK,yBAAA,CAA0B,KAAA,EAAO,mBAAmB,CAAA;AAG/D,cAAA,IAAI,MAAM,WAAA,EAAa;AACrB,gBAAA,KAAA,CAAM,WAAA,CAAY;AAAA,kBAChB,IAAI,mBAAA,CAAoB,EAAA;AAAA,kBACxB,MAAM,mBAAA,CAAoB,IAAA;AAAA,kBAC1B,SAAS,mBAAA,CAAoB,OAAA;AAAA,kBAC7B,YAAY,mBAAA,CAAoB,UAAA;AAAA,kBAChC,QAAQ,mBAAA,CAAoB;AAAA,iBAC7B,CAAA;AAAA,cACH;AAEA,cAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,gBACpB,IAAA,EAAM,iBAAA;AAAA,gBACN,SAAA,EAAW,KAAK,GAAA;AAAI,eACrB,CAAA;AACD,cAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,cAAA;AAAA,YACF;AAEA,YAAA,MAAM,IAAA,CAAK,YAAY,KAAK,CAAA;AAC5B,YAAA,KAAA,CAAM,SAAA,EAAA;AAMN,YAAA,IAAI,KAAA,CAAM,oBAAoB,KAAA,CAAA,EAAW;AACvC,cAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,cAAA;AAAA,YACF;AAAA,UACF,SAAS,KAAA,EAAO;AAEd,YAAA,MAAM,YAAA,GAAe,iBAAiB,KAAA,KACnC,KAAA,CAAM,SAAS,YAAA,IAAgB,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,CAAA;AAElE,YAAA,IAAI,YAAA,EAAc;AAEhB,cAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,cAAA;AAAA,YACF;AAGA,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,cAAA,EAAiB,KAAA,CAAM,SAAS,KAAK,KAAK,CAAA;AAGxD,YAAA,MAAM,IAAA,CAAK,QAAA;AAAA,cACT,KAAA;AAAA,cACA,KAAA;AAAA,cACA,sBAAA;AAAA,cACA,CAAA,KAAA,EAAQ,KAAA,CAAM,SAAS,CAAA,OAAA,EAAU,MAAM,WAAW,CAAA;AAAA,aACpD;AAGA,YAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,YAAA,KAAA,CAAM,OAAO,WAAA,CAAY;;AAAA,QAAA,EAAe,YAAY;AAAA,CAAI,CAAA;AAGxD,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,SAAA;AAAA,cACN,MAAA,EAAQ,UAAU,YAAY,CAAA,CAAA;AAAA,cAC9B,MAAM,KAAA,CAAM,WAAA;AAAA,cACZ,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAGD,YAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,YAAA,KAAA,CAAM,YAAY,KAAA,CAAM,WAAA;AACxB,YAAA;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,KAAA,CAAM,SAAA,IAAa,SAAA,IAAa,CAAC,MAAM,OAAA,EAAS;AAClD,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,QAAQ,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAA,CAAG,CAAA;AAGtE,UAAA,MAAM,IAAA,CAAK,QAAA;AAAA,YACT,KAAA;AAAA,YACA,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,YACvD,mBAAA;AAAA,YACA,UAAU,QAAQ,CAAA;AAAA,WACpB;AAEA,UAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,YACpB,IAAA,EAAM,SAAA;AAAA,YACN,MAAA,EAAQ,uBAAA;AAAA,YACR,MAAM,KAAA,CAAM,WAAA;AAAA,YACZ,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,KAAA,CAAM,OAAO,KAAA,EAAM;AAAA,MAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,aAAqB,mBAAA,CACnB,WAAA,EACA,MAAA,EAKC;AAED,QAAA,MAAM,kBAAkB,WAAA,CAAY,mBAAA;AACpC,QAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,WAAA,CAAY,KAAK,CAAA,4BAAA,CAA8B,CAAA;AAAA,QAC1E;AAEA,QAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,QAAA,CAAS,WAAW,eAAe,CAAA;AAGvE,QAAA,MAAM,WAAA,GAA4C;AAAA,UAChD,EAAA,EAAI,eAAA;AAAA,UACJ,MAAM,cAAA,CAAe,IAAA;AAAA,UACrB,kBAAkB,cAAA,CAAe,eAAA;AAAA,UACjC,QAAQ,cAAA,CAAe,MAAA;AAAA,UACvB,OAAO,cAAA,CAAe,KAAA;AAAA,UACtB,YAAA,EAAc,eAAe,WAAA,IAAe,KAAA;AAAA,UAC5C,kBAAA,EAAoB,eAAe,gBAAA,IAAoB,KAAA;AAAA,UACvD,mBAAA,EAAqB,eAAe,iBAAA,IAAqB,KAAA;AAAA,UACzD,WAAA,EAAa,eAAe,UAAA,IAAc,MAAA;AAAA,UAC1C,gBAAA,EAAkB,cAAA,CAAe,SAAA,EAAW,MAAA,IAAU,IAAA;AAAA,UACtD,oBAAA,EAAsB,cAAA,CAAe,SAAA,EAAW,SAAA,IAAa,IAAA;AAAA,UAC7D,iBAAA,EAAmB,cAAA,CAAe,SAAA,EAAW,OAAA,IAAW,KAAA;AAAA,UACxD,iBAAA,EAAmB,cAAA,CAAe,SAAA,EAAW,OAAA,IAAW,KAAA;AAAA,UACxD,MAAA,EAAQ,cAAA,CAAe,KAAA,IAAS,EAAC;AAAA,UACjC,eAAA,EAAiB,eAAe,cAAA,IAAkB;AAAA,SACpD;AAGA,QAAA,IAAI,WAAA,GAAmD,IAAA;AACvD,QAAA,MAAM,kBAAkB,WAAA,CAAY,mBAAA;AACpC,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,QAAA,CAAS,WAAW,eAAe,CAAA;AAEvE,UAAA,WAAA,GAAc;AAAA,YACZ,EAAA,EAAI,eAAA;AAAA,YACJ,MAAM,cAAA,CAAe,IAAA;AAAA,YACrB,kBAAkB,cAAA,CAAe,eAAA;AAAA,YACjC,QAAQ,cAAA,CAAe,MAAA;AAAA,YACvB,OAAO,cAAA,CAAe,KAAA;AAAA,YACtB,YAAA,EAAc,eAAe,WAAA,IAAe,KAAA;AAAA,YAC5C,kBAAA,EAAoB,eAAe,gBAAA,IAAoB,KAAA;AAAA,YACvD,mBAAA,EAAqB,eAAe,iBAAA,IAAqB,KAAA;AAAA,YACzD,WAAA,EAAa,eAAe,UAAA,IAAc,MAAA;AAAA,YAC1C,gBAAA,EAAkB,cAAA,CAAe,SAAA,EAAW,MAAA,IAAU,IAAA;AAAA,YACtD,oBAAA,EAAsB,cAAA,CAAe,SAAA,EAAW,SAAA,IAAa,IAAA;AAAA,YAC7D,iBAAA,EAAmB,cAAA,CAAe,SAAA,EAAW,OAAA,IAAW,KAAA;AAAA,YACxD,iBAAA,EAAmB,cAAA,CAAe,SAAA,EAAW,OAAA,IAAW,KAAA;AAAA,YACxD,MAAA,EAAQ,cAAA,CAAe,KAAA,IAAS,EAAC;AAAA,YACjC,eAAA,EAAiB,eAAe,cAAA,IAAkB;AAAA,WACpD;AAAA,QACF;AAEA,QAAA,OAAO,EAAE,WAAA,EAAa,WAAA,EAAa,WAAA,EAAY;AAAA,MACjD;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,gBACnB,UAAA,EAUoB;AAEpB,QAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAY,GAAI,MAAM,IAAA,CAAK,mBAAA;AAAA,UAC9C,UAAA,CAAW,WAAA;AAAA,UACX,UAAA,CAAW;AAAA,SACb;AAGA,QAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,IAAU,IAAI,aAAA,EAAc;AAGtD,QAAA,MAAM,KAAA,GAAkE;AAAA,UACtE,UAAU,UAAA,CAAW,QAAA;AAAA,UACrB,MAAA,EAAQ,UAAA,CAAW,MAAA,IAAU,MAAA,CAAO,UAAA,EAAW;AAAA,UAC/C,QAAQ,UAAA,CAAW,MAAA;AAAA,UACnB,aAAa,UAAA,CAAW,WAAA;AAAA,UACxB,WAAA,EAAa,WAAW,WAAA,IAAe,GAAA;AAAA,UACvC,OAAA,EAAS;AAAA,YACP,KAAA,EAAO,WAAA;AAAA,YACP,KAAA,EAAO;AAAA,WACT;AAAA,UACA,SAAS,UAAA,CAAW,WAAA,IAAe,GAAA,MAAS,GAAA,GAAM,cAAe,WAAA,IAAe,WAAA;AAAA,UAChF,SAAA,EAAW,WAAW,SAAA,IAAa,CAAA;AAAA,UACnC,cAAA,EAAgB,WAAW,cAAA,IAAkB,CAAA;AAAA,UAC7C,cAAA,EAAgB,WAAW,cAAA,IAAkB,CAAA;AAAA,UAC7C,OAAA,EAAS,WAAW,OAAA,IAAW,KAAA;AAAA,UAC/B,WAAW,UAAA,CAAW,SAAA;AAAA,UACtB,gBAAgB,EAAC;AAAA,UACjB,QAAA,EAAU,WAAW,QAAA,IAAY;AAAA,YAC/B,OAAO,EAAC;AAAA,YACR,UAAA,EAAY;AAAA,WACd;AAAA,UACA,MAAA,EAAQ,WAAW,MAAA,IAAU;AAAA,YAC3B,IAAA,EAAM,EAAA;AAAA,YACN,MAAM,EAAC;AAAA,YACP,OAAA,EAAS,CAAA;AAAA,YACT,SAAS;AAAC,WACZ;AAAA,UACA,KAAA,EAAO,UAAA,CAAW,KAAA,IAAS,EAAC;AAAA,UAC5B,MAAA;AAAA,UACA,OAAA,EAAS,UAAA,CAAW,OAAA,IAAW,EAAC;AAAA,UAChC,UAAA,EAAY,WAAW,UAAA,IAAc,CAAA;AAAA,UACrC,aAAa,UAAA,CAAW,WAAA;AAAA,UACxB,SAAS,UAAA,CAAW,OAAA;AAAA,UACpB,KAAK,UAAA,CAAW,GAAA;AAAA;AAAA,UAEhB,SAAS,UAAA,CAAW,OAAA;AAAA,UACpB,aAAa,UAAA,CAAW,WAAA;AAAA,UACxB,kBAAkB,UAAA,CAAW,gBAAA;AAAA,UAC7B,eAAe,UAAA,CAAW,aAAA;AAAA,UAC1B,WAAW,UAAA,CAAW,SAAA;AAAA,UACtB,eAAe,UAAA,CAAW,aAAA;AAAA,UAC1B,aAAa,UAAA,CAAW,WAAA;AAAA,UACxB,cAAc,UAAA,CAAW,YAAA;AAAA,UACzB,iBAAiB,UAAA,CAAW,eAAA;AAAA,UAC5B,KAAA,EAAO,WAAW,KAAA,IAAS,CAAA;AAAA;AAAA,UAC3B,kBAAkB,UAAA,CAAW,gBAAA;AAAA,UAC7B,iBAAiB,UAAA,CAAW,eAAA;AAAA,UAC5B,cAAc,UAAA,CAAW,YAAA;AAAA,UACzB,aAAA,EAAe,UAAA,CAAW,aAAA,IAAiB;AAAC,SAC9C;AACA,QAAA,IAAI,WAAW,SAAA,EAAW;AACxB,UAAA,KAAA,CAAM,YAAY,UAAA,CAAW,SAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,SAAA,GAAY,KAAA;AAAA,QACpB;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,YAAY,KAAA,EAAiC;AAEhE,QAAA,IAAI,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,YAAW,EAAG;AAC5C,UAAA,MAAM,IAAI,MAAM,SAAS,CAAA;AAAA,QAC3B;AAGA,QAAA,IAAI,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS;AACzC,UAAA,MAAM,IAAI,MAAM,SAAS,CAAA;AAAA,QAC3B;AAGA,QAAA,MAAM,QAAA,GAAW,MAAM,WAAA,KAAgB,GAAA,GACnC,MAAM,WAAA,CAAY,gBAAA,GAClB,MAAM,WAAA,CAAY,gBAAA;AAEtB,QAAA,MAAM,uBAAuB,KAAA,CAAM,WAAA,KAAgB,GAAA,GAC/C,KAAA,CAAM,iBACN,KAAA,CAAM,cAAA;AAEV,QAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,oBAAA,IAAwB,QAAA,EAAU;AACzD,UAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,UAAA,KAAA,CAAM,YAAY,KAAA,CAAM,WAAA;AAExB,UAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,YACpB,IAAA,EAAM,SAAA;AAAA,YACN,MAAA,EAAQ,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAW,uBAAuB,QAAQ,CAAA,CAAA,CAAA;AAAA,YAChE,MAAM,KAAA,CAAM,WAAA;AAAA,YACZ,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AACD,UAAA;AAAA,QACF;AAGA,QAAA,IACE,MAAM,WAAA,CAAY,IAAA,KAAS,aAC3B,KAAA,CAAM,WAAA,CAAY,sBAAsB,IAAA,EACxC;AAEA,UAAA,MAAM,qBAAqB,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,cAAA,EAAgB,MAAM,cAAc,CAAA;AAE9E,UAAA,IAAI,kBAAA,IAAsB,KAAA,CAAM,WAAA,CAAY,iBAAA,EAAmB;AAC7D,YAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,YAAA,KAAA,CAAM,YAAY,KAAA,CAAM,WAAA;AAExB,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,SAAA;AAAA,cACN,MAAA,EAAQ,CAAA,2BAAA,EAA8B,KAAA,CAAM,WAAA,CAAY,iBAAiB,CAAA,WAAA,CAAA;AAAA,cACzE,MAAM,KAAA,CAAM,WAAA;AAAA,cACZ,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AACD,YAAA;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,KAAA,CAAM,gBAAgB,GAAA,EAAK;AAC7B,UAAA,KAAA,CAAM,cAAA,EAAA;AAAA,QACR,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,cAAA,EAAA;AAAA,QACR;AAGA,QAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,UACpB,IAAA,EAAM,cAAA;AAAA,UACN,MAAM,KAAA,CAAM,SAAA;AAAA,UACZ,MAAM,KAAA,CAAM,WAAA;AAAA,UACZ,SAAA,EAAW,KAAK,GAAA;AAAI,SACrB,CAAA;AAED,QAAA,KAAA,CAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAA;AAG1D,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAGhD,QAAA,KAAA,CAAM,eAAe,OAAA,CAAQ,KAAA;AAK7B,QAAA,OAAA,CAAQ,WAAW,MAAM,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,QAAQ,QAAQ,CAAA;AAGhF,QAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,oBAAA,CAAqB,KAAK,CAAA;AAG9D,QAAA,KAAA,CAAM,gBAAA,GAAmB,gBAAA;AAGzB,QAAA,IAAI,cAAA,GAAyC,WAAA;AAC7C,QAAA,IAAI,QAAA;AACJ,QAAA,IAAI,KAAA;AAEJ,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA,CAAQ,SAAS,KAAK,CAAA;AACtD,UAAA,QAAA,GAAW,MAAA,CAAO,QAAA;AAClB,UAAA,KAAA,GAAQ,MAAA,CAAO,KAAA;AAAA,QACjB,SAAS,KAAA,EAAO;AAEd,UAAA,cAAA,GAAiB,QAAA;AACjB,UAAA,MAAM,IAAA,CAAK,mBAAA,CAAoB,gBAAA,EAAkB,QAAA,EAAU,KAAK,CAAA;AAChE,UAAA,MAAM,KAAA;AAAA,QACR;AAGA,QAAA,IAAK,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,YAAW,IAAM,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS;AAGvF,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB,CAAA,iCAAA,CAAA;AAAA,YACA;AAAA,WACF;AAGA,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB,CAAA,sDAAA,CAAA;AAAA,YACA,qBAAA;AAAA,YACA,kBAAA;AAAA,YACA;AAAA,WACF;AAEA,UAAA,MAAM,IAAI,MAAM,SAAS,CAAA;AAAA,QAC3B;AAGA,QAAA,KAAA,CAAM,YAAA,GAAe,KAAA;AAGrB,QAAA,IAAA,CAAK,uBAAA,CAAwB,OAAO,QAAQ,CAAA;AAG5C,QAAA,MAAM,IAAA,CAAK,aAAA,CAAc,gBAAA,EAAkB,QAAA,EAAU,gBAAgB,KAAK,CAAA;AAG1E,QAAA,IAAI,QAAA,CAAS,UAAA,IAAc,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,EAAG;AACzD,UAAA,MAAM,YAAA,CAAa,eAAA,CAAgB,KAAA,EAAO,QAAA,CAAS,UAAU,CAAA;AAAA,QAC/D;AAGA,QAAA,IAAK,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,YAAW,IAAM,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS;AACvF,UAAA,MAAM,IAAI,MAAM,SAAS,CAAA;AAAA,QAC3B;AAGA,QAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,QAAQ,CAAA;AAGvC,QAAA,KAAA,CAAM,YAAA,GAAe,IAAA;AACrB,QAAA,KAAA,CAAM,gBAAA,GAAmB,MAAA;AAOzB,QAAA,IAAI,MAAM,cAAA,EAAgB;AAGxB,UAAA,MAAM,IAAA,CAAK,eAAe,KAAK,CAAA;AAG/B,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,cAAA,CAAe,SAAA,CAAU,CAAC,CAAA;AAGnD,UAAA,IAAI,KAAA,CAAM,WAAA,CAAY,IAAA,KAAS,UAAA,IAAc,eAAe,GAAA,EAAK;AAC/D,YAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,YAAA,KAAA,CAAM,SAAA,GAAY,GAAA;AAClB,YAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,cACpB,IAAA,EAAM,SAAA;AAAA,cACN,MAAA,EAAQ,+BAAA;AAAA,cACR,MAAM,KAAA,CAAM,WAAA;AAAA,cACZ,SAAA,EAAW,KAAK,GAAA;AAAI,aACrB,CAAA;AAAA,UACH,CAAA,MAAA,IAES,UAAA,KAAe,KAAA,CAAM,WAAA,EAAa;AACzC,YAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAChB,YAAA,KAAA,CAAM,SAAA,GAAY,MAAA;AAAA,UACpB,CAAA,MAEK;AACH,YAAA,KAAA,CAAM,WAAA,GAAc,UAAA;AACpB,YAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAGhB,YAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,GAAA,IAAO,KAAA,CAAM,QAAQ,KAAA,EAAO;AACpD,cAAA,KAAA,CAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA;AAAA,YAC/B,CAAA,MAAO;AACL,cAAA,KAAA,CAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA;AAAA,YAC/B;AAAA,UACF;AAGA,UAAA,KAAA,CAAM,cAAA,GAAiB,MAAA;AAGvB,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,KAAA,CAAM,eAAA,EAAiB,MAAA,CAAO,OAAA,EAAS;AACzC,UAAA,MAAM,IAAI,MAAM,SAAS,CAAA;AAAA,QAC3B;AAGA,QAAA,IAAI,MAAM,WAAA,CAAY,IAAA,KAAS,SAAA,IAAa,CAAC,MAAM,OAAA,EAAS;AAC1D,UAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,QACxB;AAGA,QAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,UACpB,IAAA,EAAM,gBAAA;AAAA,UACN,MAAM,KAAA,CAAM,SAAA;AAAA,UACZ,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,SAAA,EAAW,KAAK,GAAA;AAAI,SACrB,CAAA;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,eAAe,KAAA,EAAiC;AACnE,QAAA,IAAI,CAAC,MAAM,cAAA,EAAgB;AACzB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,YAAA,GAAe,MAAM,cAAA,CAAe,OAAA;AAE1C,QAAA,IAAI;AAEF,UAAA,MAAM,cAAc,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,YAAY,CAAA;AAGtE,UAAA,MAAM,WAAA,GAAqB;AAAA,YACzB,EAAA,EAAI,YAAA;AAAA,YACJ,KAAA,EAAO,YAAY,KAAA,IAAS,YAAA;AAAA,YAC5B,MAAM,WAAA,CAAY,IAAA;AAAA,YAClB,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA,YACrB,iBAAA,EAAmB,YAAY,eAAA,IAAmB,IAAA;AAAA,YAClD,YAAA,EAAc,WAAA,CAAY,KAAA,EAAO,KAAA,IAAS,IAAA;AAAA,YAC1C,mBAAA,EAAqB,WAAA,CAAY,KAAA,EAAO,MAAA,IAAU,IAAA;AAAA,YAClD,uBAAA,EAAyB,WAAA,CAAY,KAAA,EAAO,cAAA,IAAkB,KAAA;AAAA,YAC9D,gBAAA,EAAkB,WAAA,CAAY,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,YACjD,kCAAA,EAAoC,WAAA,CAAY,KAAA,EAAO,wBAAA,IAA4B,IAAA;AAAA,YACnF,gBAAA,EAAkB,WAAA,CAAY,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,YACjD,uBAAA,EAAyB,WAAA,CAAY,KAAA,EAAO,cAAA,IAAkB,IAAA;AAAA,YAC9D,YAAA,EAAc,WAAA,CAAY,KAAA,EAAO,KAAA,IAAS,IAAA;AAAA,YAC1C,mBAAA,EAAqB,WAAA,CAAY,KAAA,EAAO,MAAA,IAAU,IAAA;AAAA,YAClD,uBAAA,EAAyB,WAAA,CAAY,KAAA,EAAO,cAAA,IAAkB,KAAA;AAAA,YAC9D,gBAAA,EAAkB,WAAA,CAAY,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,YACjD,kCAAA,EAAoC,WAAA,CAAY,KAAA,EAAO,wBAAA,IAA4B,IAAA;AAAA,YACnF,gBAAA,EAAkB,WAAA,CAAY,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,YACjD,uBAAA,EAAyB,WAAA,CAAY,KAAA,EAAO,cAAA,IAAkB;AAAA,WAChE;AAGA,UAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAY,GAAI,MAAM,IAAA,CAAK,mBAAA;AAAA,YAC9C,WAAA;AAAA,YACA,KAAA,CAAM;AAAA,WACR;AAGA,UAAA,IAAI;AACF,YAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,GAAA,CAAI,aAAA,CAAc,GAAA;AAAA,cAC/C,KAAA,CAAM,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW;AAAA,aAChD;AACA,YAAA,MAAM,gBAAA,CAAiB,iBAAA,CAAkB,KAAA,CAAM,QAAA,EAAU,YAAY,CAAA;AAAA,UACvE,SAAS,YAAA,EAAc;AACrB,YAAA,OAAA,CAAQ,KAAA,CAAM,8CAA8C,YAAY,CAAA;AAAA,UAE1E;AAGA,UAAA,KAAA,CAAM,WAAA,GAAc,WAAA;AACpB,UAAA,KAAA,CAAM,QAAQ,KAAA,GAAQ,WAAA;AACtB,UAAA,KAAA,CAAM,QAAQ,KAAA,GAAQ,WAAA;AACtB,UAAA,KAAA,CAAM,gBAAgB,EAAC;AAGvB,UAAA,KAAA,CAAM,WAAA,GAAc,GAAA;AACpB,UAAA,KAAA,CAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA;AAG7B,UAAA,KAAA,CAAM,cAAA,GAAiB,KAAA,CAAA;AAGvB,UAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,YACpB,IAAA,EAAM,eAAA;AAAA,YACN,YAAA,EAAc,YAAA;AAAA,YACd,eAAA,EAAiB,MAAM,WAAA,CAAY,KAAA;AAAA,YACnC,SAAA,EAAW,KAAK,GAAA;AAAI,WACd,CAAA;AAAA,QACV,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,UAAA,MAAM,KAAK,QAAA,CAAS,KAAA,EAAO,OAAO,yBAAA,EAA2B,CAAA,iBAAA,EAAoB,YAAY,CAAA,CAAE,CAAA;AAC/F,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,gBACnB,KAAA,EACyB;AACzB,QAAA,MAAM,WAAuC,EAAC;AAE9C,QAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAG7C,QAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,KAAA;AAC3B,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,IAAA;AAChC,QAAA,MAAM,iBAAA,GAAoB,MAAM,MAAA,CAAO,mBAAA;AACvC,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,WAAA;AAChC,QAAA,MAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,gBAAA;AACrC,QAAA,MAAM,kBAAA,GAAqB,MAAM,MAAA,CAAO,oBAAA;AACxC,QAAA,MAAM,gBAAA,GAAmB,MAAM,MAAA,CAAO,iBAAA;AACtC,QAAA,MAAM,gBAAA,GAAmB,MAAM,MAAA,CAAO,iBAAA;AACtC,QAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,MAAA,CAAO,kBAAA,IAAsB,IAAA;AAG5D,QAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,iBAAA;AAAA,UAC/B,MAAM,MAAA,CAAO,MAAA;AAAA,UACb,KAAA,CAAM,WAAW,EAAC;AAAA,UAClB;AAAA,SACF;AAEA,QAAA,MAAM,gBAAA,GAAmB,aAAA;AAEzB,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACV,CAAA;AAGD,QAAA,MAAM,iBAAA,GAAoB,MAAM,cAAA,CAAe,MAAA;AAAA,UAC7C,CAAA,GAAA,KAAO,IAAI,MAAA,KAAW;AAAA,SACxB;AAGA,QAAA,MAAM,sBAAA,uBAA6B,GAAA,EAAY;AAC/C,QAAA,KAAA,MAAW,OAAO,iBAAA,EAAmB;AACnC,UAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,YAAA,EAAc;AAC3C,YAAA,sBAAA,CAAuB,GAAA,CAAI,IAAI,YAAY,CAAA;AAAA,UAC7C;AAAA,QACF;AAKA,QAAA,MAAM,sBAAA,GAAyB,KAAA,CAAM,MAAA,CAAO,oBAAA,IAAwB,EAAA;AACpE,QAAA,MAAM,mBAAA,GAAsB,kBAAkB,MAAA,GAAS,sBAAA;AAQvD,QAAA,IAAI,YAAA,GAAe,CAAA;AACnB,QAAA,KAAA,MAAW,OAAO,iBAAA,EAAmB;AAOnC,UAAA,IAAI,CAAC,gBAAA,IAAoB,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ;AAC5C,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,KAAA,CAAM,YAAY,IAAA,KAAS,SAAA,IAAa,IAAI,IAAA,KAAS,MAAA,IAAU,IAAI,YAAA,EAAc;AAEnF,YAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,IAAA,CAAK,CAAA,CAAA,KAAK;AAC5C,cAAA,IAAI,CAAC,CAAA,CAAE,UAAA,EAAY,OAAO,KAAA;AAC1B,cAAA,IAAI;AACF,gBAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,UAAU,CAAA;AACzC,gBAAA,OAAO,UAAU,IAAA,CAAK,CAAC,OAAY,EAAA,CAAG,EAAA,KAAO,IAAI,YAAY,CAAA;AAAA,cAC/D,CAAA,CAAA,MAAQ;AACN,gBAAA,OAAO,KAAA;AAAA,cACT;AAAA,YACF,CAAC,CAAA;AAED,YAAA,IAAI,SAAA,EAAW;AAIb,cAAA,MAAM,YAAA,GAAe,SAAA,CAAU,IAAA,KAAS,WAAA,GAAc,GAAA,GAAM,GAAA;AAG5D,cAAA,IAAI,YAAA,KAAiB,MAAM,WAAA,EAAa;AACtC,gBAAA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,UAAA,IAAI,OAAO,GAAA,CAAI,IAAA;AAGf,UAAA,IAAI,KAAA,CAAM,WAAA,CAAY,IAAA,KAAS,SAAA,EAAW;AACxC,YAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAE5B,cAAA,IAAA,GAAO,KAAA,CAAM,WAAA,KAAgB,GAAA,GAAM,WAAA,GAAc,MAAA;AAAA,YACnD,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ;AAE9B,cAAA,IAAA,GAAO,KAAA,CAAM,WAAA,KAAgB,GAAA,GAAM,MAAA,GAAS,WAAA;AAAA,YAC9C;AAAA,UAEF;AAKA,UAAA,IAAI,cAAA;AACJ,UAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,WAAA,KAAgB,IAAA;AAC9D,UAAA,MAAM,eAAe,YAAA,GAAe,mBAAA;AAEpC,UAAA,IAAI,cAAA,IAAkB,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ;AACzC,YAAA,MAAM,WAAA,GAA+B,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAY,CAAA;AAChE,YAAA,MAAM,mBAAmB,WAAA,CAAY,MAAA;AAAA,cAAO,CAAC,CAAA,KAC3C,CAAA,CAAE,QAAA,CAAS,WAAW,QAAQ;AAAA,aAChC;AAEA,YAAA,IAAI,YAAA,IAAgB,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AAE/C,cAAA,MAAM,oBAAoB,gBAAA,CACvB,GAAA,CAAI,qBAAqB,CAAA,CACzB,KAAK,IAAI,CAAA;AACZ,cAAA,MAAM,gBAAgB,WAAA,CACnB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAC,CAAA,CAC9C,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACpB,cAAA,MAAM,YAAA,GACJ,aAAA,CAAc,MAAA,GAAS,CAAA,GACnB;AAAA,cAAA,EAAmB,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAC3C,EAAA;AAEN,cAAA,cAAA,GAAiB,GAAA,CAAI,OAAA,GACjB,CAAA,EAAG,iBAAiB,GAAG,YAAY;;AAAA,EAAO,IAAI,OAAO,CAAA,CAAA,GACrD,CAAA,EAAG,iBAAiB,GAAG,YAAY,CAAA,CAAA;AAAA,YACzC,CAAA,MAAO;AAGL,cAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,gBAAA,cAAA,GAAiB,MAAM,IAAA,CAAK,2BAAA,CAA4B,GAAA,EAAK,OAAO,YAAY,CAAA;AAAA,cAClF,CAAA,MAAO;AAEL,gBAAA,MAAM,QAAA,GAAW,YAAY,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACzD,gBAAA,cAAA,GAAiB,GAAA,CAAI,OAAA,GACjB,CAAA,EAAG,GAAA,CAAI,OAAO;;AAAA,iBAAA,EAAwB,QAAQ,CAAA,CAAA,CAAA,GAC9C,CAAA,iBAAA,EAAoB,QAAQ,CAAA,CAAA,CAAA;AAAA,cAClC;AAAA,YACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,cAAA,GAAiB,IAAI,OAAA,IAAW,EAAA;AAAA,UAClC;AACA,UAAA,YAAA,EAAA;AAGA,UAAA,MAAM,YAAA,GAAoB;AAAA,YACxB,IAAA;AAAA,YACA,OAAA,EAAS,cAAA;AAAA,YACT,UAAA,EAAY,oBAAoB,GAAA,CAAI,UAAA,GAAa,KAAK,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA,GAAI,MAAA;AAAA,YAC9E,YAAA,EAAc,gBAAA,IAAoB,GAAA,CAAI,YAAA,GAAe,IAAI,YAAA,GAAe,MAAA;AAAA,YACxE,IAAA,EAAM,IAAI,IAAA,IAAQ;AAAA,WACpB;AAKA,UAAA,IAAI,gBAAA,EAAkB;AACpB,YAAA,MAAM,wBAA+B,EAAC;AAGtC,YAAA,IAAI,IAAI,iBAAA,EAAmB;AACzB,cAAA,qBAAA,CAAsB,IAAA,CAAK;AAAA,gBACzB,IAAA,EAAM,gBAAA;AAAA,gBACN,MAAM,GAAA,CAAI;AAAA,eACX,CAAA;AAAA,YACH;AAGA,YAAA,IAAI,IAAI,iBAAA,EAAmB;AACzB,cAAA,IAAI;AACF,gBAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,iBAAiB,CAAA;AACtD,gBAAA,qBAAA,CAAsB,IAAA,CAAK,GAAG,aAAa,CAAA;AAAA,cAC7C,SAAS,CAAA,EAAG;AACV,gBAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2DAAA,EAA8D,GAAA,CAAI,EAAE,KAAK,CAAC,CAAA;AAAA,cAC1F;AAAA,YACF;AAGA,YAAA,IAAI,qBAAA,CAAsB,SAAS,CAAA,EAAG;AACpC,cAAA,YAAA,CAAa,iBAAA,GAAoB,qBAAA;AAAA,YACnC;AAAA,UACF;AAKA,UAAA,IAAI,gBAAA,IAAoB,GAAA,CAAI,IAAA,KAAS,WAAA,IAAe,IAAI,UAAA,EAAY;AAClE,YAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAC3C,YAAA,MAAM,mBAAmB,SAAA,CAAU,MAAA;AAAA,cAAO,CAAC,QAAA,KACzC,sBAAA,CAAuB,GAAA,CAAI,SAAS,EAAE;AAAA,aACxC;AAGA,YAAA,IAAI,GAAA,CAAI,OAAA,IAAW,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AAE9C,cAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AAEjC,gBAAA,OAAO,YAAA,CAAa,UAAA;AAAA,cACtB,CAAA,MAAA,IAAW,gBAAA,CAAiB,MAAA,KAAW,SAAA,CAAU,MAAA,EAAQ;AAEvD,gBAAA,YAAA,CAAa,UAAA,GAAa,gBAAA;AAAA,cAC5B;AAGA,cAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAAA,YAC5B,CAAA,MAAO;AAEL,cAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wCAAA,EAA2C,GAAA,CAAI,EAAE,CAAA,8CAAA,CAAgD,CAAA;AAAA,YAChH;AAAA,UACF,CAAA,MAAO;AAEL,YAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAAA,UAC5B;AAAA,QACF;AAGA,QAAA,MAAM,QAAA,GAAW,MAAM,WAAA,KAAgB,GAAA,GACnC,MAAM,WAAA,CAAY,gBAAA,GAClB,MAAM,WAAA,CAAY,gBAAA;AAEtB,QAAA,IAAI,aAAa,IAAA,EAAM;AACrB,UAAA,MAAM,uBAAuB,KAAA,CAAM,WAAA,KAAgB,GAAA,GAC/C,KAAA,CAAM,iBACN,KAAA,CAAM,cAAA;AAEV,UAAA,MAAM,iBAAiB,QAAA,GAAW,oBAAA;AAGlC,UAAA,IAAI,aAAA;AAEJ,UAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,YAAA,aAAA,GAAgB,2HAAA;AAAA,UAClB,CAAA,MAAA,IAAW,mBAAmB,CAAA,EAAG;AAC/B,YAAA,aAAA,GAAgB,qIAAA;AAAA,UAClB,CAAA,MAAA,IAAW,kBAAkB,CAAA,EAAG;AAC9B,YAAA,aAAA,GAAgB,4CAAkC,cAAc,CAAA,sFAAA,CAAA;AAAA,UAClE,CAAA,MAAO;AACL,YAAA,aAAA,GAAgB,iBAAiB,cAAc,CAAA,oFAAA,CAAA;AAAA,UACjD;AAEA,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAA,EAAO,MAAM,MAAM,CAAA;AAG9D,QAAA,IAAI,eAAA;AACJ,QAAA,IAAI,UAAA,KAAe,UAAA,IAAc,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAEnD,UAAA,eAAA,GAAkB;AAAA,YAChB,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU;AAAA,cACR,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA,CAAS;AAAA;AAC1B,WACF;AAAA,QACF,CAAA,MAAA,IAAW,UAAA,IAAc,UAAA,KAAe,UAAA,EAAY;AAElD,UAAA,eAAA,GAAkB,UAAA;AAAA,QACpB;AAGA,QAAA,IAAI,SAAA;AACJ,QAAA,IAAI,mBAAmB,kBAAA,EAAoB;AACzC,UAAA,SAAA,GAAY;AAAA,YACV,QAAQ,eAAA,IAAmB,MAAA;AAAA;AAAA,YAC3B,YAAY,kBAAA,IAAsB,MAAA;AAAA,YAClC,OAAA,EAAS;AAAA,WACX;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,QAAA;AAAA,UACA,KAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAA,EAAQ,IAAA;AAAA,UACR,YAAA,EAAc,gBAAA;AAAA,UACd,UAAA;AAAA;AAAA,UAEA,WAAA,EAAa,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,YAAA,IAAgB,IAAA;AAAA;AAAA,UAExD,mBAAA,EAAqB,iBAAA;AAAA,UACrB,WAAA,EAAa,eAAA;AAAA,UACb,SAAA;AAAA,UACA,YAAA,EAAc,YAAA,CAAa,IAAA,GAAO,CAAA,GAAI,YAAA,GAAe;AAAA,SACvD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,aAAqB,iBAAA,CACnB,cAAA,EACA,OAAA,EACA,KAAA,EACiB;AAEjB,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,EAAG;AACjC,UAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,cAAA,EAAgB,OAAA,EAAS,KAAK,CAAA;AAAA,QAC/D;AAGA,QAAA,IAAI,OAAO,mBAAmB,QAAA,EAAU;AAEtC,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA;AACxC,YAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,cAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA;AAAA,YACvD;AAEA,YAAA,OAAO,cAAA;AAAA,UACT,CAAA,CAAA,MAAQ;AAEN,YAAA,OAAO,cAAA;AAAA,UACT;AAAA,QACF;AAGA,QAAA,OAAO,OAAO,cAAc,CAAA;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,kBAAA,CACnB,KAAA,EACA,OAAA,EACA,KAAA,EACiB;AACjB,QAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,UAC5B,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAAc;AAE7B,YAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,cAAA,OAAO,KAAK,OAAA,IAAW,EAAA;AAAA,YACzB,CAAA,MAAA,IAES,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW;AAChC,cAAA,MAAM,aAAa,IAAA,CAAK,MAAA;AACxB,cAAA,OAAO,MAAM,IAAA,CAAK,wBAAA,CAAyB,UAAA,EAAY,SAAS,KAAK,CAAA;AAAA,YACvE,CAAA,MAAA,IAES,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AAC/B,cAAA,OAAO,KAAK,KAAA,IAAS,EAAA;AAAA,YACvB,CAAA,MAAA,IAES,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACjC,cAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAChC,cAAA,IAAI,UAAU,MAAA,EAAW;AACvB,gBAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6BAAA,EAAgC,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AACzD,gBAAA,OAAO,CAAA,EAAA,EAAK,KAAK,KAAK,CAAA,EAAA,CAAA;AAAA,cACxB;AACA,cAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,YACjE,CAAA,MAAA,IAES,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AAC/B,cAAA,MAAM,aAAa,IAAA,CAAK,EAAA;AACxB,cAAA,OAAO,MAAM,IAAA,CAAK,wBAAA,CAAyB,YAAY,OAAA,EAAS,KAAA,EAAO,KAAK,KAAK,CAAA;AAAA,YACnF;AACA,YAAA,OAAO,EAAA;AAAA,UACT,CAAC;AAAA,SACH;AAEA,QAAA,OAAO,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,wBAAA,CACnB,UAAA,EACA,OAAA,EACA,OACA,KAAA,EACiB;AACjB,QAAA,IAAI;AACF,UAAA,MAAM,YAAY,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,WAAW,UAAU,CAAA;AAEnE,UAAA,IAAI,CAAC,SAAA,EAAW;AACd,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6BAAA,EAAgC,UAAU,CAAA,CAAE,CAAA;AACzD,YAAA,OAAO,CAAA,mBAAA,EAAsB,SAAS,UAAU,CAAA,CAAA,CAAA;AAAA,UAClD;AAGA,UAAA,OAAO,MAAM,IAAA,CAAK,iBAAA;AAAA,YAChB,SAAA,CAAU,MAAA;AAAA,YACV,OAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,UAAU,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC1D,UAAA,OAAO,CAAA,uBAAA,EAA0B,SAAS,UAAU,CAAA,CAAA,CAAA;AAAA,QACtD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,aAAqB,iBAAA,CACnB,KAAA,EACA,UAAA,EAC6C;AAC7C,QAAA,MAAM,QAA4C,EAAC;AAEnD,QAAA,IAAI;AAEF,UAAA,MAAM,WAAA,GAAc,UAAA,CAAW,MAAA,IAAU,EAAC;AAC1C,UAAA,MAAM,YAAY,WAAA,CAAY,GAAA;AAAA,YAAI,CAAC,CAAA,KACjC,OAAO,CAAA,KAAM,QAAA,GAAW,IAAI,CAAA,CAAE;AAAA,WAChC;AAEA,UAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAExB,YAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAGnD,YAAA,MAAM,gBAAgB,QAAA,CAAS,MAAA;AAAA,cAAO,CAAC,IAAA,KACrC,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,SAAS,IAAI;AAAA,aACvC;AACA,YAAA,KAAA,CAAM,IAAA,CAAK,GAAG,aAAa,CAAA;AAG3B,YAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,aAAA,CAAc,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA;AAGtE,YAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,cAAA,IAAI,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,EAAG;AAElC,cAAA,IAAI;AACF,gBAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,QAAQ,CAAA;AAC/D,gBAAA,IAAI,QAAA,IAAY,QAAA,CAAS,IAAA,KAAS,UAAA,EAAY;AAC5C,kBAAA,KAAA,CAAM,IAAA,CAAK;AAAA,oBACT,IAAA,EAAM,UAAA;AAAA,oBACN,QAAA,EAAU;AAAA,sBACR,IAAA,EAAM,SAAS,KAAA,IAAS,QAAA;AAAA,sBACxB,aAAa,QAAA,CAAS,eAAA,IAAmB,CAAA,yBAAA,EAA4B,QAAA,CAAS,SAAS,QAAQ,CAAA,MAAA,CAAA;AAAA,sBAC/F,UAAA,EAAY;AAAA,wBACV,IAAA,EAAM,QAAA;AAAA,wBACN,UAAA,EAAY;AAAA,0BACV,KAAA,EAAO;AAAA,4BACL,IAAA,EAAM,QAAA;AAAA,4BACN,WAAA,EAAa;AAAA;AACf,yBACF;AAAA,wBACA,QAAA,EAAU,CAAC,OAAO;AAAA;AACpB;AACF,mBACD,CAAA;AAAA,gBACH;AAAA,cACF,CAAA,CAAA,MAAQ;AAAA,cAER;AAAA,YACF;AAAA,UACF;AAEA,UAAA,OAAO,KAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,UAAA,MAAM,IAAA,CAAK,QAAA;AAAA,YACT,KAAA;AAAA,YACA,KAAA;AAAA,YACA,oBAAA;AAAA,YACA,CAAA,sCAAA,EAAyC,WAAW,IAAI,CAAA,CAAA;AAAA,WAC1D;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,kBACnB,KAAA,EAC6C;AAC7C,QAAA,MAAM,QAA4C,EAAC;AAEnD,QAAA,IAAI;AAEF,UAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AACpD,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,WAAW,CAAA;AAGzB,UAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AACpD,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,WAAW,CAAA;AAGzB,UAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAClD,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,UAAU,CAAA;AAGxB,UAAA,MAAM,eAAA,uBAAsB,GAAA,EAAyB;AAGrD,UAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,YAAA,MAAM,OAAA,GAAU,gBAAgB,GAAA,CAAI,IAAA,CAAK,SAAS,IAAI,CAAA,wBAAS,GAAA,EAAI;AACnE,YAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,YAAA,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAAA,UACjD;AACA,UAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,YAAA,MAAM,OAAA,GAAU,gBAAgB,GAAA,CAAI,IAAA,CAAK,SAAS,IAAI,CAAA,wBAAS,GAAA,EAAI;AACnE,YAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AACpB,YAAA,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAAA,UACjD;AACA,UAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,YAAA,MAAM,OAAA,GAAU,gBAAgB,GAAA,CAAI,IAAA,CAAK,SAAS,IAAI,CAAA,wBAAS,GAAA,EAAI;AACnE,YAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,YAAA,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAAA,UACjD;AAGA,UAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,CAAA,IAAK,eAAA,EAAiB;AAC7C,YAAA,IAAI,OAAA,CAAQ,OAAO,CAAA,EAAG;AACpB,cAAA,OAAA,CAAQ,IAAA;AAAA,gBACN,CAAA,oCAAA,EAAuC,IAAI,CAAA,qBAAA,EAAwB,CAAC,GAAG,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,qEAAA;AAAA,eAE5F;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,UAAA,MAAM,IAAA,CAAK,QAAA;AAAA,YACT,KAAA;AAAA,YACA,KAAA;AAAA,YACA,sBAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,gBACnB,KAAA,EAC6C;AAC7C,QAAA,MAAM,QAA4C,EAAC;AAEnD,QAAA,IAAI;AAEF,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AACjD,UAAA,MAAM,EAAE,CAAA,EAAAC,EAAAA,EAAE,GAAI,MAAM,OAAO,KAAK,CAAA;AAEhC,UAAA,KAAA,MAAW,CAAC,QAAA,EAAU,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACjE,YAAA,IAAI;AACF,cAAA,MAAM,CAAC,WAAA,EAAa,UAAA,EAAY,GAAG,CAAA,GAAI,MAAM,UAAA,EAAW;AAGxD,cAAA,IAAI,UAAA;AAEJ,cAAA,IAAI,UAAA,EAAY;AAEd,gBAAA,MAAM,UAAA,GAAaA,EAAAA,CAAE,YAAA,CAAa,UAAU,CAAA;AAE5C,gBAAA,UAAA,GAAa;AAAA,kBACX,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAa,UAAA,CAAmB,UAAA,IAAc,EAAC;AAAA,kBAC/C,QAAA,EAAW,UAAA,CAAmB,QAAA,IAAY;AAAC,iBAC7C;AAAA,cACF;AAEA,cAAA,KAAA,CAAM,IAAA,CAAK;AAAA,gBACT,IAAA,EAAM,UAAA;AAAA,gBACN,QAAA,EAAU;AAAA,kBACR,IAAA,EAAM,QAAA;AAAA,kBACN,WAAA;AAAA,kBACA;AAAA;AACF,eACD,CAAA;AAAA,YACH,SAAS,SAAA,EAAW;AAClB,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAQ,CAAA,CAAA,CAAA,EAAK,SAAS,CAAA;AAAA,YACnE;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAAA,QAC7D;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,gBACnB,KAAA,EAC6C;AAC7C,QAAA,MAAM,QAA4C,EAAC;AAEnD,QAAA,IAAI;AAEF,UAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,cAAA,EAAe;AACzD,UAAA,MAAM,EAAE,CAAA,EAAAA,EAAAA,EAAE,GAAI,MAAM,OAAO,KAAK,CAAA;AAEhC,UAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,YAAA,IAAI;AACF,cAAA,MAAM,YAAY,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,WAAW,IAAI,CAAA;AAG7D,cAAA,IAAI,UAAA;AAEJ,cAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,gBAAA,IAAI;AAEF,kBAAA,MAAM,UAAA,GAAaA,EAAAA,CAAE,YAAA,CAAa,SAAA,CAAU,cAAc,CAAA;AAE1D,kBAAA,UAAA,GAAa;AAAA,oBACX,IAAA,EAAM,QAAA;AAAA,oBACN,UAAA,EAAa,UAAA,CAAmB,UAAA,IAAc,EAAC;AAAA,oBAC/C,QAAA,EAAW,UAAA,CAAmB,QAAA,IAAY;AAAC,mBAC7C;AAAA,gBACF,SAAS,UAAA,EAAY;AACnB,kBAAA,OAAA,CAAQ,KAAA;AAAA,oBACN,sCAAsC,IAAI,CAAA,CAAA,CAAA;AAAA,oBAC1C;AAAA,mBACF;AAAA,gBACF;AAAA,cACF;AAEA,cAAA,KAAA,CAAM,IAAA,CAAK;AAAA,gBACT,IAAA,EAAM,UAAA;AAAA,gBACN,QAAA,EAAU;AAAA,kBACR,MAAM,SAAA,CAAU,IAAA;AAAA,kBAChB,aAAa,SAAA,CAAU,eAAA;AAAA,kBACvB;AAAA;AACF,eACD,CAAA;AAAA,YACH,SAAS,KAAA,EAAO;AACd,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,YACtD;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAAA,QACpD;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,eACnB,KAAA,EAC6C;AAC7C,QAAA,MAAM,QAA4C,EAAC;AAEnD,QAAA,IAAI;AAEF,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,aAAA,EAAc;AAEvD,UAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,YAAA,IAAI;AACF,cAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,UAAU,IAAI,CAAA;AAE3D,cAAA,IAAI,SAAS,YAAA,EAAc;AAEzB,gBAAA,KAAA,CAAM,IAAA,CAAK;AAAA,kBACT,IAAA,EAAM,UAAA;AAAA,kBACN,QAAA,EAAU;AAAA,oBACR,IAAA,EAAM,SAAS,KAAA,IAAS,IAAA;AAAA,oBACxB,aAAa,QAAA,CAAS,eAAA,IAAmB,CAAA,YAAA,EAAe,QAAA,CAAS,SAAS,IAAI,CAAA,MAAA,CAAA;AAAA,oBAC9E,UAAA,EAAY;AAAA,sBACV,IAAA,EAAM,QAAA;AAAA,sBACN,UAAA,EAAY;AAAA,wBACV,KAAA,EAAO;AAAA,0BACL,IAAA,EAAM,QAAA;AAAA,0BACN,WAAA,EAAa;AAAA;AACf,uBACF;AAAA,sBACA,QAAA,EAAU,CAAC,OAAO;AAAA;AACpB;AACF,iBACD,CAAA;AAAA,cACH;AAAA,YACF,SAAS,KAAA,EAAO;AACd,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,YACrD;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,QACnD;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,aAAqB,0BAAA,CACnB,KAAA,EACA,QAAA,EACgB;AAChB,QAAA,IAAI;AAEF,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAGlD,UAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,aAAA,CAAc,uBAAuB,CAAA,EAAG;AAC7D,YAAA,OAAO,QAAA;AAAA,UACT;AAGA,UAAA,MAAM,UAAA,GAAa,cAAc,uBAAuB,CAAA;AACxD,UAAA,MAAM,IAAA,GAAO,MAAM,UAAA,EAAW;AAE9B,UAAA,IAAI,CAAC,IAAA,EAAM;AACT,YAAA,OAAO,QAAA;AAAA,UACT;AAGA,UAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AACvD,UAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA;AAC1D,UAAA,OAAO,iBAAA;AAAA,QACT,SAAS,KAAA,EAAO;AAEd,UAAA,OAAA,CAAQ,KAAA,CAAM,4DAAuD,KAAK,CAAA;AAC1E,UAAA,OAAO,QAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,aAAoB,0BAAA,CAClB,KAAA,EACA,OAAA,EAC8B;AAC9B,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAClD,UAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,aAAA,CAAc,uBAAuB,CAAA,EAAG;AAC7D,YAAA,OAAO,OAAA;AAAA,UACT;AAEA,UAAA,MAAM,UAAA,GAAa,cAAc,uBAAuB,CAAA;AACxD,UAAA,MAAM,IAAA,GAAO,MAAM,UAAA,EAAW;AAC9B,UAAA,IAAI,CAAC,IAAA,EAAM;AACT,YAAA,OAAO,OAAA;AAAA,UACT;AAEA,UAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AACvD,UAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA;AACxD,UAAA,OAAO,gBAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,4DAAuD,KAAK,CAAA;AAC1E,UAAA,OAAO,OAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,aAAoB,yBAAA,CAClB,KAAA,EACA,OAAA,EACe;AACf,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAClD,UAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,aAAA,CAAc,sBAAsB,CAAA,EAAG;AAC5D,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,UAAA,GAAa,cAAc,sBAAsB,CAAA;AACvD,UAAA,MAAM,IAAA,GAAO,MAAM,UAAA,EAAW;AAC9B,UAAA,IAAI,CAAC,IAAA,EAAM;AACT,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AACvD,UAAA,MAAM,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,QACjC,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,2DAAsD,KAAK,CAAA;AAAA,QAC3E;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,aAAoB,0BAAA,CAClB,KAAA,EACA,SAAA,EACA,OAAA,EACY;AACZ,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAClD,UAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,aAAA,CAAc,uBAAuB,CAAA,EAAG;AAC7D,YAAA,OAAO,OAAA;AAAA,UACT;AAEA,UAAA,MAAM,UAAA,GAAa,cAAc,uBAAuB,CAAA;AACxD,UAAA,MAAM,IAAA,GAAO,MAAM,UAAA,EAAW;AAC9B,UAAA,IAAI,CAAC,IAAA,EAAM;AACT,YAAA,OAAO,OAAA;AAAA,UACT;AAEA,UAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AACvD,UAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,WAAA,EAAa,WAAW,OAAO,CAAA;AACnE,UAAA,OAAO,gBAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,4DAAuD,KAAK,CAAA;AAC1E,UAAA,OAAO,OAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,aAAoB,yBAAA,CAClB,KAAA,EACA,OAAA,EACe;AACf,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAClD,UAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,aAAA,CAAc,sBAAsB,CAAA,EAAG;AAC5D,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,UAAA,GAAa,cAAc,sBAAsB,CAAA;AACvD,UAAA,MAAM,IAAA,GAAO,MAAM,UAAA,EAAW;AAC9B,UAAA,IAAI,CAAC,IAAA,EAAM;AACT,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AACvD,UAAA,MAAM,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,QACjC,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,2DAAsD,KAAK,CAAA;AAAA,QAC3E;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,aAAoB,4BAAA,CAClB,KAAA,EACA,QAAA,EACA,UAAA,EAC8B;AAC9B,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAClD,UAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,aAAA,CAAc,0BAA0B,CAAA,EAAG;AAChE,YAAA,OAAO,UAAA;AAAA,UACT;AAEA,UAAA,MAAM,UAAA,GAAa,cAAc,0BAA0B,CAAA;AAC3D,UAAA,MAAM,IAAA,GAAO,MAAM,UAAA,EAAW;AAC9B,UAAA,IAAI,CAAC,IAAA,EAAM;AACT,YAAA,OAAO,UAAA;AAAA,UACT;AAEA,UAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AACvD,UAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,WAAA,EAAa,UAAU,UAAU,CAAA;AACpE,UAAA,OAAO,eAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,+DAA0D,KAAK,CAAA;AAC7E,UAAA,OAAO,UAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,aAAoB,2BAAA,CAClB,KAAA,EACA,QAAA,EACA,UAAA,EAC4B;AAC5B,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAClD,UAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,aAAA,CAAc,yBAAyB,CAAA,EAAG;AAC/D,YAAA,OAAO,UAAA;AAAA,UACT;AAEA,UAAA,MAAM,UAAA,GAAa,cAAc,yBAAyB,CAAA;AAC1D,UAAA,MAAM,IAAA,GAAO,MAAM,UAAA,EAAW;AAC9B,UAAA,IAAI,CAAC,IAAA,EAAM;AACT,YAAA,OAAO,UAAA;AAAA,UACT;AAEA,UAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AACvD,UAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,WAAA,EAAa,UAAU,UAAU,CAAA;AACpE,UAAA,OAAO,eAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,8DAAyD,KAAK,CAAA;AAC5E,UAAA,OAAO,UAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,aAAoB,2BAAA,CAClB,KAAA,EACA,QAAA,EACA,UAAA,EAC4B;AAC5B,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM;AAClD,UAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,aAAA,CAAc,yBAAyB,CAAA,EAAG;AAC/D,YAAA,OAAO,UAAA;AAAA,UACT;AAEA,UAAA,MAAM,UAAA,GAAa,cAAc,yBAAyB,CAAA;AAC1D,UAAA,MAAM,IAAA,GAAO,MAAM,UAAA,EAAW;AAC9B,UAAA,IAAI,CAAC,IAAA,EAAM;AACT,YAAA,OAAO,UAAA;AAAA,UACT;AAEA,UAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AACvD,UAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,WAAA,EAAa,UAAU,UAAU,CAAA;AACpE,UAAA,OAAO,eAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,8DAAyD,KAAK,CAAA;AAC5E,UAAA,OAAO,UAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,qBAAqB,KAAA,EAAmC;AAC3E,QAAA,MAAM,SAAA,GAAY,OAAO,UAAA,EAAW;AAGpC,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,KAAgB,GAAA,GAAM,WAAA,GAAc,MAAA;AAEvD,QAAA,IAAI,OAAA,GAAmB;AAAA,UACrB,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA;AAAA,UACA,OAAA,EAAS,IAAA;AAAA;AAAA,UACT,UAAA,EAAY,IAAA;AAAA,UACZ,MAAA,EAAQ,IAAA;AAAA,UACR,UAAA,EAAY,CAAA;AAAA;AAAA,UACZ,eAAA,EAAiB,CAAA;AAAA;AAAA,UACjB,qBAAA,EAAuB,IAAA;AAAA,UACvB,MAAA,EAAQ;AAAA,SACV;AAGA,QAAA,OAAA,GAAU,MAAM,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,OAAO,CAAA;AAG9D,QAAA,OAAA,CAAQ,SAAA,GAAY,MAAM,eAAA,IAAmB,IAAA;AAC7C,QAAA,OAAA,CAAQ,QAAQ,KAAA,CAAM,KAAA;AAGtB,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AACzB,QAAA,OAAA,CAAQ,UAAA,GAAa,GAAA;AACrB,QAAA,OAAA,CAAQ,eAAA,GAAkB,GAAA;AAG1B,QAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,UACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,UAOA,OAAA,CAAQ,EAAA;AAAA,UACR,OAAA,CAAQ,IAAA;AAAA,UACR,OAAA,CAAQ,OAAA;AAAA,UACR,OAAA,CAAQ,UAAA;AAAA,UACR,OAAA,CAAQ,MAAA;AAAA,UACR,OAAA,CAAQ,UAAA;AAAA,UACR,OAAA,CAAQ,eAAA;AAAA,UACR,OAAA,CAAQ,qBAAA;AAAA,UACR,OAAA,CAAQ,MAAA;AAAA,UACR,OAAA,CAAQ,SAAA;AAAA,UACR,OAAA,CAAQ,KAAA;AAAA,UACR;AAAA;AAAA,SACF;AAGA,QAAA,MAAM,IAAA,CAAK,yBAAA,CAA0B,KAAA,EAAO,OAAO,CAAA;AAGnD,QAAA,KAAA,CAAM,cAAA,CAAe,KAAK,OAAO,CAAA;AAGjC,QAAA,IAAI,MAAM,WAAA,EAAa;AACrB,UAAA,KAAA,CAAM,YAAY,OAAO,CAAA;AAAA,QAC3B;AAEA,QAAA,OAAO,SAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,mBAAA,CACnB,SAAA,EACA,MAAA,EACA,KAAA,EACe;AACf,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAGzB,QAAA,IAAI,OAAA,GAGA;AAAA,UACF,MAAA;AAAA,UACA,qBAAA,EAAuB;AAAA,SACzB;AAGA,QAAA,OAAA,GAAU,MAAM,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,WAAW,OAAO,CAAA;AAGzE,QAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,UACtB;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,UAKA,OAAA,CAAQ,MAAA;AAAA,UACR,OAAA,CAAQ,qBAAA;AAAA,UACR;AAAA,SACF;AAGA,QAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,SAAS,CAAA;AACnE,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ,MAAA;AACzB,UAAA,OAAA,CAAQ,wBAAwB,OAAA,CAAQ,qBAAA;AAGxC,UAAA,MAAM,IAAA,CAAK,yBAAA,CAA0B,KAAA,EAAO,OAAO,CAAA;AAGnD,UAAA,IAAI,MAAM,WAAA,EAAa;AACrB,YAAA,KAAA,CAAM,YAAY,OAAO,CAAA;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAqB,aAAA,CACnB,SAAA,EACA,QAAA,EACA,QACA,KAAA,EACe;AAEf,QAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,IAAgB,IAAA;AAGpC,QAAA,IAAI,UAAU,QAAA,CAAS,OAAA;AACvB,QAAA,MAAM,gBAAgB,QAAA,CAAS,UAAA,GAAa,KAAK,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,GAAI,IAAA;AAClF,QAAA,MAAM,gBAAA,GAAmB,SAAS,iBAAA,IAAqB,IAAA;AACvD,QAAA,MAAM,uBAAuB,QAAA,CAAS,iBAAA,GAAoB,KAAK,SAAA,CAAU,QAAA,CAAS,iBAAiB,CAAA,GAAI,IAAA;AAGvG,QAAA,IAAI,cAAA;AACJ,QAAA,IAAI,oBAAA;AACJ,QAAA,IAAI,QAAA,CAAS,MAAA,IAAU,QAAA,CAAS,MAAA,CAAO,SAAS,CAAA,EAAG;AACjD,UAAA,MAAM,SAAS,MAAM,IAAA,CAAK,qBAAA,CAAsB,QAAA,CAAS,QAAQ,KAAK,CAAA;AACtE,UAAA,cAAA,GAAiB,MAAA,CAAO,IAAA;AACxB,UAAA,oBAAA,GAAuB,MAAA,CAAO,YAAA;AAAA,QAChC;AACA,QAAA,MAAM,eAAA,GAAkB,kBAAkB,cAAA,CAAe,MAAA,GAAS,IAAI,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA,GAAI,IAAA;AAGvG,QAAA,IAAI,cAAA,GAA0B;AAAA,UAC5B,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA,EAAM,KAAA,CAAM,WAAA,KAAgB,GAAA,GAAM,WAAA,GAAc,MAAA;AAAA,UAChD,OAAA;AAAA,UACA,UAAA,EAAY,aAAA;AAAA,UACZ,MAAA,EAAQ,KAAA;AAAA,UACR,UAAA,EAAY,CAAA;AAAA;AAAA,UACZ,eAAA,EAAiB,CAAA;AAAA;AAAA,UACjB,qBAAA,EAAuB,CAAA;AAAA;AAAA,UACvB,MAAA;AAAA,UACA,iBAAA,EAAmB,gBAAA;AAAA,UACnB,WAAA,EAAa;AAAA,SACf;AAIA,QAAA,cAAA,GAAiB,MAAM,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,cAAc,CAAA;AAC5E,QAAA,OAAA,GAAU,cAAA,CAAe,OAAA;AAGzB,QAAA,IAAI,OAAA,GASA;AAAA,UACF,OAAA;AAAA,UACA,UAAA,EAAY,aAAA;AAAA,UACZ,MAAA,EAAQ,KAAA;AAAA,UACR,qBAAA,EAAuB,CAAA;AAAA;AAAA,UACvB,MAAA;AAAA,UACA,iBAAA,EAAmB,gBAAA;AAAA,UACnB,iBAAA,EAAmB,oBAAA;AAAA,UACnB,WAAA,EAAa;AAAA,SACf;AAGA,QAAA,OAAA,GAAU,MAAM,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,WAAW,OAAO,CAAA;AAGzE,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AACzB,QAAA,OAAA,CAAQ,qBAAA,GAAwB,GAAA;AAGhC,QAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,UACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,UAOA,OAAA,CAAQ,OAAA;AAAA,UACR,OAAA,CAAQ,UAAA;AAAA,UACR,OAAA,CAAQ,MAAA;AAAA,UACR,OAAA,CAAQ,qBAAA;AAAA,UACR,OAAA,CAAQ,MAAA;AAAA,UACR,OAAA,CAAQ,iBAAA;AAAA,UACR,OAAA,CAAQ,iBAAA;AAAA,UACR,OAAA,CAAQ,WAAA;AAAA,UACR;AAAA,SACF;AAGA,QAAA,IAAI,SAAS,UAAA,EAAY;AACvB,UAAA,KAAA,MAAW,QAAA,IAAY,SAAS,UAAA,EAAY;AAC1C,YAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,cACpB;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,cAKA,QAAA,CAAS,EAAA;AAAA,cACT,SAAA;AAAA,cACA,SAAS,IAAA,IAAQ,UAAA;AAAA,cACjB,SAAS,QAAA,CAAS,IAAA;AAAA,cAClB,SAAS,QAAA,CAAS,SAAA;AAAA,cAClB;AAAA,aACF;AAAA,UACJ;AAAA,QACF;AAGA,QAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,SAAS,CAAA;AACnE,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,OAAA,GAAU,OAAA;AAClB,UAAA,OAAA,CAAQ,UAAA,GAAa,aAAA;AACrB,UAAA,OAAA,CAAQ,MAAA,GAAS,KAAA;AACjB,UAAA,OAAA,CAAQ,qBAAA,GAAwB,GAAA;AAChC,UAAA,OAAA,CAAQ,MAAA,GAAS,MAAA;AACjB,UAAA,OAAA,CAAQ,iBAAA,GAAoB,gBAAA;AAC5B,UAAA,OAAA,CAAQ,WAAA,GAAc,eAAA;AAGtB,UAAA,MAAM,IAAA,CAAK,yBAAA,CAA0B,KAAA,EAAO,OAAO,CAAA;AAGnD,UAAA,IAAI,MAAM,WAAA,EAAa;AACrB,YAAA,KAAA,CAAM,YAAY,OAAO,CAAA;AAAA,UAC3B;AAAA,QACF;AAGA,QAAA,IAAI,oBAAA,IAAwB,oBAAA,CAAqB,IAAA,GAAO,CAAA,IAAK,KAAA,EAAO;AAClE,UAAA,MAAM,UAAA,CAAW,uBAAA;AAAA,YACf,KAAA;AAAA,YACA,KAAA;AAAA,YACA,QAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAAA,MAIF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,aAAqB,qBAAA,CACnB,MAAA,EACA,KAAA,EACuE;AACvE,QAAA,MAAM,OAAwB,EAAC;AAC/B,QAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAE7C,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,GAAA;AAGpC,UAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,4BAA4B,CAAA;AAC5D,UAAA,IAAI,CAAC,KAAA,EAAO;AACV,YAAA,OAAA,CAAQ,MAAM,sDAAsD,CAAA;AACpE,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,UAAA,MAAM,UAAA,GAAa,MAAM,CAAC,CAAA;AAC1B,UAAA,MAAM,MAAM,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,KAAA;AAEtC,UAAA,MAAM,YAAA,GAAe,OAAO,UAAA,EAAW;AACvC,UAAA,MAAM,IAAA,GAAO,gBAAgB,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,YAAY,IAAI,GAAG,CAAA,CAAA;AAE9D,UAAA,IAAI;AAGF,YAAA,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,IAAA,EAAM,YAAY,QAAQ,CAAA;AAGhE,YAAA,YAAA,CAAa,GAAA,CAAI,aAAa,IAAI,CAAA;AAElC,YAAA,IAAA,CAAK,IAAA,CAAK;AAAA,cACR,EAAA,EAAI,YAAA;AAAA,cACJ,IAAA,EAAM,MAAA;AAAA,cACN,IAAA;AAAA,cACA,IAAA,EAAM,CAAA,UAAA,EAAa,YAAY,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,cACtC;AAAA,aACD,CAAA;AAAA,UACH,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAAA,UAC9D;AAAA,QACF;AAEA,QAAA,OAAO,EAAE,MAAM,YAAA,EAAa;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,OAAe,uBAAA,CACb,KAAA,EACA,QAAA,EACM;AACN,QAAA,IAAI,CAAC,QAAA,CAAS,UAAA,IAAc,QAAA,CAAS,UAAA,CAAW,WAAW,CAAA,EAAG;AAC5D,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,QAAA,GACJ,MAAM,WAAA,KAAgB,GAAA,GAClB,MAAM,WAAA,CAAY,gBAAA,GAClB,MAAM,WAAA,CAAY,gBAAA;AAExB,QAAA,MAAM,wBAAA,GACJ,MAAM,WAAA,KAAgB,GAAA,GAClB,MAAM,WAAA,CAAY,kCAAA,GAClB,MAAM,WAAA,CAAY,kCAAA;AAGxB,QAAA,IAAI,CAAC,QAAA,IAAY,CAAC,wBAAA,EAA0B;AAC1C,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,YAAA,GAAe,SAAS,UAAA,CAAW,IAAA;AAAA,UACvC,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS;AAAA,SACnC;AAEA,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA;AAAA,QACF;AAGA,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,SAAS,SAAS,CAAA;AACvD,UAAA,MAAM,iBAAA,GAAoB,KAAK,wBAAwB,CAAA;AAEvD,UAAA,IAAI,iBAAA,IAAqB,OAAO,iBAAA,KAAsB,QAAA,EAAU;AAE9D,YAAA,QAAA,CAAS,OAAA,GAAU,iBAAA;AAGnB,YAAA,IAAI,KAAA,CAAM,gBAAA,IAAoB,KAAA,CAAM,gBAAA,EAAkB;AAGpD,cAAA,KAAA,CAAM,gBAAA,CAAiB,KAAA,CAAM,gBAAA,EAAkB,iBAAiB,CAAA;AAAA,YAClE;AAIA,YAAC,MAAc,aAAA,GAAgB,iBAAA;AAAA,UACjC;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,CAAA,qCAAA,EAAwC,wBAAwB,CAAA,kBAAA,EAAqB,QAAQ,CAAA,EAAA,CAAA;AAAA,YAC7F;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAe,kBAAA,CACb,KAAA,EACA,QAAA,EACM;AAEN,QAAA,MAAM,cAAA,GACJ,MAAM,WAAA,KAAgB,GAAA,GAClB,MAAM,WAAA,CAAY,uBAAA,GAClB,MAAM,WAAA,CAAY,uBAAA;AAExB,QAAA,IACE,cAAA,IACA,QAAA,CAAS,UAAA,EAAY,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS,cAAc,CAAA,EACzE;AACA,UAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,UAAA,KAAA,CAAM,YAAY,KAAA,CAAM,WAAA;AAExB,UAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,YACpB,IAAA,EAAM,SAAA;AAAA,YACN,MAAA,EAAQ,4BAA4B,cAAc,CAAA,CAAA;AAAA,YAClD,MAAM,KAAA,CAAM,WAAA;AAAA,YACZ,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AACD,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,cAAA,GACJ,MAAM,WAAA,KAAgB,GAAA,GAClB,MAAM,WAAA,CAAY,uBAAA,GAClB,MAAM,WAAA,CAAY,uBAAA;AAExB,QAAA,MAAM,QAAA,GACJ,MAAM,WAAA,KAAgB,GAAA,GAClB,MAAM,WAAA,CAAY,gBAAA,GAClB,MAAM,WAAA,CAAY,gBAAA;AAExB,QACE,MAAM,WAAA,KAAgB,GAAA,GAClB,MAAM,WAAA,CAAY,kCAAA,GAClB,MAAM,WAAA,CAAY;AAGxB,QAAA,IAAI,cAAA,IAAkB,QAAA,CAAS,OAAA,IAAW,CAAC,SAAS,UAAA,EAAY;AAC9D,UAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,UAAA,KAAA,CAAM,YAAY,KAAA,CAAM,WAAA;AAExB,UAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,YACpB,IAAA,EAAM,SAAA;AAAA,YACN,MAAA,EAAQ,iCAAA;AAAA,YACR,MAAM,KAAA,CAAM,WAAA;AAAA,YACZ,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AAAA,QACH;AAGA,QAAA,IACE,QAAA,IACA,QAAA,CAAS,UAAA,EAAY,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS,QAAQ,CAAA,EACnE;AACA,UAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,UAAA,KAAA,CAAM,YAAY,KAAA,CAAM,WAAA;AAKxB,UAAA,KAAA,CAAM,aAAA,GAAgB;AAAA,YACpB,IAAA,EAAM,SAAA;AAAA,YACN,MAAA,EAAQ,qBAAqB,QAAQ,CAAA,CAAA;AAAA,YACrC,MAAM,KAAA,CAAM,WAAA;AAAA,YACZ,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AAAA,QACH;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,YAAY,KAAA,EAAwB;AACzC,QAAA,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,WAAA,KAAgB,GAAA,GAAM,GAAA,GAAM,GAAA;AAItD,QAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,GAAA,IAAO,KAAA,CAAM,QAAQ,KAAA,EAAO;AACpD,UAAA,KAAA,CAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA;AAAA,QAC/B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,OAAe,wBAAwB,QAAA,EAAgC;AAErE,QAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,QAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,UAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,YAAA,EAAc;AAC3C,YAAA,aAAA,CAAc,GAAA,CAAI,IAAI,YAAY,CAAA;AAAA,UACpC;AAAA,QACF;AAGA,QAAA,MAAM,oBAAA,uBAA2B,GAAA,EAAY;AAC7C,QAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,UAAA,IAAI,GAAA,CAAI,IAAA,KAAS,WAAA,IAAe,GAAA,CAAI,UAAA,EAAY;AAC9C,YAAA,IAAI;AACF,cAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAC3C,cAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,gBAAA,IAAI,KAAK,EAAA,EAAI;AACX,kBAAA,oBAAA,CAAqB,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,gBAClC;AAAA,cACF;AAAA,YACF,SAAS,KAAA,EAAO;AACd,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,EAA0C,GAAA,CAAI,EAAE,KAAK,KAAK,CAAA;AAAA,YAC1E;AAAA,UACF;AAAA,QACF;AAGA,QAAA,MAAM,WAAsB,EAAC;AAC7B,QAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAE1B,UAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,YAAA,EAAc;AAC3C,YAAA,IAAI,CAAC,oBAAA,CAAqB,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA,EAAG;AAC/C,cAAA,OAAA,CAAQ,KAAK,CAAA,oDAAA,EAAuD,GAAA,CAAI,EAAE,CAAA,4BAAA,EAA+B,GAAA,CAAI,YAAY,CAAA,CAAE,CAAA;AAC3H,cAAA;AAAA,YACF;AAAA,UACF;AAGA,UAAA,IAAI,GAAA,CAAI,IAAA,KAAS,WAAA,IAAe,GAAA,CAAI,UAAA,EAAY;AAC9C,YAAA,IAAI;AACF,cAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAC3C,cAAA,MAAM,mBAAmB,SAAA,CAAU,MAAA;AAAA,gBAAO,CAAC,IAAA,KACzC,aAAA,CAAc,GAAA,CAAI,KAAK,EAAE;AAAA,eAC3B;AAGA,cAAA,IAAI,gBAAA,CAAiB,MAAA,KAAW,CAAA,IAAK,SAAA,CAAU,SAAS,CAAA,EAAG;AACzD,gBAAA,IAAI,IAAI,OAAA,EAAS;AAEf,kBAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+CAAA,EAAkD,GAAA,CAAI,EAAE,CAAA,2BAAA,CAA6B,CAAA;AAClG,kBAAA,QAAA,CAAS,IAAA,CAAK;AAAA,oBACZ,GAAG,GAAA;AAAA,oBACH,UAAA,EAAY;AAAA,mBACb,CAAA;AACD,kBAAA;AAAA,gBACF,CAAA,MAAO;AAEL,kBAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yCAAA,EAA4C,GAAA,CAAI,EAAE,CAAA,4CAAA,CAA8C,CAAA;AAC7G,kBAAA;AAAA,gBACF;AAAA,cACF;AAGA,cAAA,IAAI,gBAAA,CAAiB,MAAA,KAAW,SAAA,CAAU,MAAA,EAAQ;AAChD,gBAAA,OAAA,CAAQ,IAAA,CAAK,0BAA0B,SAAA,CAAU,MAAA,GAAS,iBAAiB,MAAM,CAAA,kCAAA,EAAqC,GAAA,CAAI,EAAE,CAAA,CAAE,CAAA;AAC9H,gBAAA,QAAA,CAAS,IAAA,CAAK;AAAA,kBACZ,GAAG,GAAA;AAAA,kBACH,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,gBAAgB;AAAA,iBAC5C,CAAA;AACD,gBAAA;AAAA,cACF;AAAA,YACF,SAAS,KAAA,EAAO;AACd,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,EAA0C,GAAA,CAAI,EAAE,KAAK,KAAK,CAAA;AAAA,YAC1E;AAAA,UACF;AAGA,UAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,QACnB;AAEA,QAAA,MAAM,YAAA,GAAe,QAAA,CAAS,MAAA,GAAS,QAAA,CAAS,MAAA;AAChD,QAAA,IAAI,eAAe,CAAA,EAAG;AACpB,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,sBAAA,EAAyB,YAAY,CAAA,mCAAA,CAAqC,CAAA;AAAA,QACzF;AAEA,QAAA,OAAO,QAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,aAAoB,mBAClB,KAAA,EACoB;AACpB,QAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,QAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,QAAA,MAAM,oBAAA,GAAuB,KAAA,CAAM,MAAA,CAAO,YAAA,IAAgB,IAAA;AAC1D,QAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,MAAA,CAAO,kBAAA,IAAsB,IAAA;AAE5D,QAAA,IAAI;AACF,UAAA,IAAI,OAAc,EAAC;AAGnB,UAAA,IAAI,oBAAA,EAAsB;AAQxB,YAAA,MAAM,OAAA,GAAU;AAAA,cACd,IAAA;AAAA,cAAM,MAAA;AAAA,cAAQ,SAAA;AAAA,cAAW,MAAA;AAAA,cAAQ,aAAA;AAAA,cACjC,GAAI,gBAAA,GAAmB,CAAC,cAAc,cAAA,EAAgB,aAAa,IAAI,EAAC;AAAA,cACxE,QAAA;AAAA,cAAU,YAAA;AAAA,cAAc,iBAAA;AAAA,cAAmB,uBAAA;AAAA,cAC3C,QAAA;AAAA,cAAU,QAAA;AAAA,cAAU,WAAA;AAAA,cAAa,OAAA;AAAA,cACjC,mBAAA;AAAA,cAAqB;AAAA,aACvB;AAEA,YAAA,MAAM,KAAA,GAAQ;AAAA;AAAA,YAAA,EAER,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAMxB,YAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAoC,KAAK,CAAA;AAE1E,YAAA,IAAA,GAAO,OAAO,OAAA,EAAQ;AAAA,UACxB;AAGA,UAAA,IAAI,KAAA,CAAM,aAAA,IAAiB,KAAA,CAAM,aAAA,CAAc,SAAS,CAAA,EAAG;AACzD,YAAA,IAAA,CAAK,IAAA,CAAK,GAAG,KAAA,CAAM,aAAa,CAAA;AAChC,YAAA,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAU,CAAA;AAAA,UACjD;AAGA,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,YACvC,IAAI,GAAA,CAAI,EAAA;AAAA,YACR,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,SAAS,GAAA,CAAI,OAAA;AAAA,YACb,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,aAAa,GAAA,CAAI,WAAA;AAAA,YACjB,YAAY,GAAA,CAAI,UAAA;AAAA,YAChB,cAAc,GAAA,CAAI,YAAA;AAAA,YAClB,QAAQ,GAAA,CAAI,MAAA;AAAA,YACZ,YAAY,GAAA,CAAI,UAAA;AAAA,YAChB,iBAAiB,GAAA,CAAI,eAAA;AAAA,YACrB,uBAAuB,GAAA,CAAI,qBAAA;AAAA,YAC3B,QAAQ,GAAA,CAAI,MAAA;AAAA,YACZ,MAAA,EAAQ,IAAI,MAAA,KAAW,CAAA;AAAA,YACvB,aAAa,GAAA,CAAI,WAAA;AAAA,YACjB,WAAW,GAAA,CAAI,SAAA;AAAA,YACf,OAAO,GAAA,CAAI,KAAA;AAAA,YACX,mBAAmB,GAAA,CAAI,iBAAA;AAAA,YACvB,mBAAmB,GAAA,CAAI;AAAA,WACzB,CAAE,CAAA;AAIF,UAAA,OAAO,IAAA,CAAK,sBAAsB,MAAA,CAAO,QAAA,EAAU,OAAO,IAAA,CAAK,uBAAA,CAAwB,QAAQ,CAAC,CAAA;AAAA,QAClG,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,aAAqB,qBAAA,CACnB,MAAA,EACA,KAAA,EACA,IAAA,EACgB;AAChB,QAAA,IAAI;AAEF,UAAA,MAAM,aAAA,GAAgB,OAAO,KAAA,EAAM;AAGnC,UAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,aAAA,CAAc,iBAAiB,CAAA,EAAG;AACvD,YAAA,OAAO,IAAA;AAAA,UACT;AAGA,UAAA,MAAM,UAAA,GAAa,cAAc,iBAAiB,CAAA;AAClD,UAAA,MAAM,IAAA,GAAO,MAAM,UAAA,EAAW;AAE9B,UAAA,IAAI,CAAC,IAAA,EAAM;AACT,YAAA,OAAO,IAAA;AAAA,UACT;AAGA,UAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,CAAc,KAAK,CAAA;AACvD,UAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AAClD,UAAA,OAAO,aAAA;AAAA,QACT,SAAS,KAAA,EAAO;AAEd,UAAA,OAAA,CAAQ,KAAA,CAAM,sDAAiD,KAAK,CAAA;AACpE,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAqB,QAAA,CACnB,KAAA,EACA,KAAA,EACA,WACA,OAAA,EACe;AACf,QAAA,IAAI;AACF,UAAA,MAAM,eACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,UAAA,MAAM,UAAA,GAAa,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAA;AAE1D,UAAA,MAAM,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YACtB;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,YAMA,OAAO,UAAA,EAAW;AAAA,YAClB,sCAAA;AAAA;AAAA,YACA,QAAA;AAAA,YACA,OAAA,IAAW,SAAA;AAAA,YACX,CAAA,EAAG,YAAY,CAAA,EAAG,UAAA,GAAa;;AAAA;AAAA,EAAqB,UAAU,KAAK,EAAE,CAAA,CAAA;AAAA,YACrE,SAAA;AAAA,YACA,IAAA,CAAK,KAAI,GAAI;AAAA,WACf;AAAA,QACF,SAAS,QAAA,EAAU;AAEjB,UAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,QAAQ,CAAA;AAAA,QAC5D;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAe,gBAAgB,QAAA,EAA2B;AACxD,QAAA,OAAO,QAAA,CAAS,WAAW,QAAQ,CAAA;AAAA,MACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,aAAqB,2BAAA,CACnB,GAAA,EACA,KAAA,EACA,YAAA,EACyB;AACzB,QAAA,MAAM,WAAA,GAAc,IAAI,OAAA,IAAW,EAAA;AAGnC,QAAA,IAAI,CAAC,IAAI,WAAA,EAAa;AACpB,UAAA,OAAO,WAAA;AAAA,QACT;AAEA,QAAA,IAAI,WAAA;AACJ,QAAA,IAAI;AACF,UAAA,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA;AAAA,QAC1C,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wCAAA,EAA2C,GAAA,CAAI,EAAE,KAAK,CAAC,CAAA;AACrE,UAAA,OAAO,WAAA;AAAA,QACT;AAEA,QAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAC5C,UAAA,OAAO,WAAA;AAAA,QACT;AAGA,QAAA,MAAM,mBAAmB,WAAA,CAAY,MAAA;AAAA,UAAO,CAAC,CAAA,KAC3C,IAAA,CAAK,eAAA,CAAgB,EAAE,QAAQ;AAAA,SACjC;AAEA,QAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AAEjC,UAAA,MAAMC,iBAAgB,WAAA,CAAY,MAAA;AAAA,YAChC,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,eAAA,CAAgB,EAAE,QAAQ;AAAA,WACzC;AACA,UAAA,IAAIA,cAAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,YAAA,MAAM,QAAA,GAAWA,eAAc,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC3D,YAAA,OAAO,GAAG,WAAW;;AAAA,iBAAA,EAAwB,QAAQ,CAAA,CAAA,CAAA;AAAA,UACvD;AACA,UAAA,OAAO,WAAA;AAAA,QACT;AAGA,QAAA,MAAM,kBAAqC,EAAC;AAG5C,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,YACnB,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA,WACP,CAAA;AAAA,QACH;AAGA,QAAA,KAAA,MAAW,cAAc,gBAAA,EAAkB;AACzC,UAAA,IAAI;AAEF,YAAA,MAAM,MAAA,GAAS,MAAO,KAAA,CAAM,MAAA,CAAO,QAAA,CAAiB,QAAA;AAAA,cAClD,UAAA,CAAW;AAAA,aACb;AAEA,YAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AAEjC,cAAA,MAAM,UAAU,CAAA,KAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,CAAA;AAEjE,cAAA,IAAI,YAAA,EAAc;AAChB,gBAAA,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,UAAA,CAAW,IAAI,CAAA;AAAA,cAC3C;AACA,cAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,gBACnB,IAAA,EAAM,WAAA;AAAA,gBACN,SAAA,EAAW;AAAA,kBACT,GAAA,EAAK,OAAA;AAAA,kBACL,MAAA,EAAQ;AAAA;AACV,eACD,CAAA;AAAA,YACH,CAAA,MAAO;AAEL,cAAA,OAAA,CAAQ,IAAA;AAAA,gBACN,CAAA,gCAAA,EAAmC,WAAW,IAAI,CAAA,CAAA,CAAA;AAAA,gBAClD,MAAA,CAAO;AAAA,eACT;AACA,cAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,gBACnB,IAAA,EAAM,MAAA;AAAA,gBACN,IAAA,EAAM,CAAA,sBAAA,EAAyB,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,eAC/C,CAAA;AAAA,YACH;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,UAAA,CAAW,IAAI,KAAK,KAAK,CAAA;AACzE,YAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,cACnB,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,CAAA,sBAAA,EAAyB,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,aAC/C,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,MAAM,gBAAgB,WAAA,CAAY,MAAA;AAAA,UAChC,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,eAAA,CAAgB,EAAE,QAAQ;AAAA,SACzC;AACA,QAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,UAAA,MAAM,QAAA,GAAW,cAAc,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC3D,UAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,YACnB,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;;AAAA,iBAAA,EAAwB,QAAQ,CAAA,CAAA;AAAA,WACvC,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,eAAA;AAAA,MACT;AAAA,KAEF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACv7EO,SAAS,SAAA,CACd,IAAA,EACA,QAAA,EACA,IAAA,GAAgC,EAAC,EAC3B;AACN,EAAA,MAAM,QAAA,GAAqB;AAAA,IACzB,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,IACtB,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,QAAA;AAAA,MACN,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAChC;AAAA,IACA,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACnC;AAuCA,eAAsB,aAAA,CACpB,MACA,OAAA,EACkB;AAClB,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,EAAA,IAAM,MAAA,CAAO,UAAA,EAAW;AAClD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,KAAA;AAIjC,EAAA,MAAM,aAAA,GAAgB,QAAQ,aAAA,IAAiB,KAAA;AAC/C,EAAA,MAAM,OAAA,GAAmB;AAAA,IACvB,EAAA,EAAI,SAAA;AAAA,IACJ,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,IAAA,EAAM,QAAQ,IAAA,IAAQ,IAAA;AAAA,IACtB,YAAA,EAAc,QAAQ,UAAA,IAAc,IAAA;AAAA,IACpC,UAAA,EAAY,SAAA;AAAA,IACZ,MAAA,EAAQ,WAAA;AAAA,IACR,MAAA;AAAA,IACA,SAAA,EAAW,aAAA,GAAgB,IAAA,GAAQ,IAAA,CAAK,eAAA,IAAmB,IAAA;AAAA,IAC3D,KAAA,EAAO,aAAA,GAAgB,CAAA,GAAI,IAAA,CAAK;AAAA,GAClC;AAEA,EAAA,IAAI,QAAQ,eAAA,EAAiB;AAG3B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA;AAAA,MACpC,CAAA,4CAAA,CAAA;AAAA,MACA,OAAA,CAAQ;AAAA,KACV;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,IAAA,MAAM,aAAA,GAAgB,KAAK,CAAC,CAAA;AAE5B,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,gBAAA,EAAmB,QAAQ,eAAe,CAAA,UAAA;AAAA,OAC5C;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,UAAA,GAAc,cAAc,UAAA,GAAwB,CAAA;AAAA,EAC9D;AAGA,EAAA,MAAM,IAAA,CAAK,QAAQ,GAAA,CAAI,IAAA;AAAA,IACrB,CAAA,gJAAA,CAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,CAAQ,IAAA;AAAA,IACR,OAAA,CAAQ,OAAA;AAAA,IACR,OAAA,CAAQ,IAAA;AAAA,IACR,OAAA,CAAQ,YAAA;AAAA,IACR,OAAA,CAAQ,UAAA;AAAA,IACR,OAAA,CAAQ,MAAA;AAAA,IACR,SAAS,CAAA,GAAI,CAAA;AAAA,IACb,OAAA,CAAQ,SAAA;AAAA,IACR,OAAA,CAAQ;AAAA,GACV;AAIA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,OAAO,CAAA;AAAA,EAClC,CAAA,MAAO;AAEL,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,EAChD;AAGA,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EAC1B;AAGA,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,SAAA,CAAU,IAAA,EAAM,QAAQ,SAAS,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,OAAA;AACT;AAqGA,eAAsB,cAAc,KAAA,EAAsC;AAExE,EAAA,MAAM,EAAE,UAAA,EAAAN,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAC7B,EAAA,KAAA,CAAM,cAAA,GAAiB,MAAMA,WAAAA,CAAW,kBAAA,CAAmB,KAAK,CAAA;AAChE,EAAA,OAAO,KAAA,CAAM,cAAA;AACf;AA+EO,SAAS,SAAA,CAAU,MAAiB,IAAA,EAAiC;AAG1E,EAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,EAC1B,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,EACxB;AACF;AAnXA,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yBAAA,GAAA;AACA,IAAA,UAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACDA,IAqDa,eAAA,EA8cP,kBAAA;AAngBN,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AA4CA,IAAA,cAAA,EAAA;AASO,IAAM,eAAA,GAAN,MAAM,gBAAA,CAAuC;AAAA,MAC1C,UAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA,GAA6C,IAAA;AAAA,MAErD,WAAA,CACE,SAAA,EACA,cAAA,EACA,QAAA,EACA;AACA,QAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAClB,QAAA,IAAA,CAAK,eAAA,GAAkB,cAAA;AACvB,QAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AAGjB,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,kBAAA,CAAmB,SAAS,CAAA;AAAA,QACzD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,QAAA,GAAmB;AACrB,QAAA,OAAO,KAAK,SAAA,CAAU,EAAA;AAAA,MACxB;AAAA,MAEA,IAAI,OAAA,GAAkB;AACpB,QAAA,OAAO,KAAK,SAAA,CAAU,QAAA;AAAA,MACxB;AAAA,MAEA,IAAI,MAAA,GAAwB;AAC1B,QAAA,OAAO,KAAK,SAAA,CAAU,OAAA;AAAA,MACxB;AAAA,MAEA,IAAI,SAAA,GAAoB;AACtB,QAAA,OAAO,KAAK,SAAA,CAAU,UAAA;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,IAAI,WAAA,GAA4B;AAC9B,QAAA,OAAO,IAAA,CAAK,YAAY,WAAA,IAAe,IAAA;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,0BAAA,GAAkE;AACpE,QAAA,IAAI,CAAC,IAAA,CAAK,UAAA,EAAY,GAAA,EAAK;AACzB,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,KAAK,UAAA,CAAW;AAAA,SACvB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,YAAY,OAAA,EAAuD;AACvE,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,WAAA;AAAA,UACxC,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,MAAA;AAAA,UACT,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,aAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAGA,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,KAAK,WAAW,CAAA;AAAA,UAC9C,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,SAAS,MAAA,CAAO;AAAA,SAClB;AAAA,MACF;AAAA,MAEA,MAAM,WAAW,SAAA,EAA4C;AAG3D,QAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,KAAK,eAAA,CAAgB,WAAA;AAAA,UAC9C,MAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,MAAM,MAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,SAAS,CAAA;AACnD,QAAA,OAAO,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA,GAAI,IAAA;AAAA,MACvC;AAAA,MAEA,MAAM,cAAc,KAAA,EAA6C;AAC/D,QAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,UAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,QACvE;AAGA,QAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAkB,IAAA,CAAK,UAAA,EAAY;AAAA,UACvD,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAQ,KAAA,CAAM;AAAA,SACf,CAAA;AAED,QAAA,OAAO,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,MACjC;AAAA,MAEA,MAAM,aAAA,CAAc,SAAA,EAAmB,OAAA,EAA2C;AAGhF,QAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,MACrD;AAAA,MAEA,MAAM,cAAc,SAAA,EAAqC;AACvD,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,cAAc,SAAS,CAAA;AACjE,QAAA,OAAO,MAAA,CAAO,OAAA;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,QAAQ,OAAA,EAA0C;AACtD,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAA;AAAA,UACtC,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,MAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAGA,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,UAC7B,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,IAAA,EAAM,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI,GAAA,CAAI,IAAA;AAAA,UAChE,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,WAAW,GAAA,CAAI;AAAA,SACjB,CAAE,CAAA;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,UAAuB,IAAA,EAA0B;AACrD,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AAAA,MAC5C;AAAA,MAEA,MAAM,WAAwB,IAAA,EAA0B;AACtD,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,UAAA,CAAW,IAAI,CAAA;AAAA,MAC7C;AAAA,MAEA,MAAM,UAAuB,IAAA,EAA0B;AACrD,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AAAA,MAC5C;AAAA,MAEA,cAAA,GAA2B;AACzB,QAAA,OAAO,IAAA,CAAK,gBAAgB,cAAA,EAAe;AAAA,MAC7C;AAAA,MAEA,aAAA,GAA0B;AACxB,QAAA,OAAO,IAAA,CAAK,gBAAgB,aAAA,EAAc;AAAA,MAC5C;AAAA,MAEA,aAAA,GAA0B;AAExB,QAAA,OAAO,EAAC;AAAA,MACV;AAAA;AAAA;AAAA;AAAA,MAMA,SAAA,CAAU,UAAkB,IAAA,EAAqC;AAC/D,QAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEpB,UAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,QACnE;AAEA,QAAA,SAAA,CAAc,IAAA,CAAK,UAAA,EAAY,QAAA,EAAU,IAAI,CAAA;AAAA,MAC/C;AAAA,MAEA,MAAM,UAAA,CAAW,QAAA,EAAkB,IAAA,EAAoD;AAErF,QAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA,MAMA,IAAA,CAAK,OAAe,IAAA,EAAqB;AACvC,QAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC9B,UAAA,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,KAAA,EAAO,IAAI,CAAA;AAAA,QACvC;AAAA,MAEF;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,OAAA,GAAmC;AACrC,QAAA,IAAI,KAAK,UAAA,EAAY;AACnB,UAAA,OAAO,KAAK,UAAA,CAAW,OAAA;AAAA,QACzB;AAGA,QAAA,OAAO,EAAC;AAAA,MACV;AAAA,MAEA,IAAI,QAAQ,KAAA,EAAgC;AAC1C,QAAA,IAAI,KAAK,UAAA,EAAY;AACnB,UAAA,IAAA,CAAK,WAAW,OAAA,GAAU,KAAA;AAAA,QAC5B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,SAAA,CACJ,IAAA,EACA,IAAA,EACA,UACA,OAAA,EACqB;AACrB,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAU,IAAA,EAAM,IAAA,EAAM,UAAU,OAAkC,CAAA;AAC5G,QAAA,OAAO,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,MACnC;AAAA,MAEA,MAAM,SAAS,IAAA,EAA2C;AACxD,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,QAAA,CAAS,IAAI,CAAA;AAAA,MAC3C;AAAA,MAEA,MAAM,cAAA,CACJ,IAAA,EACA,OAAA,EAC0C;AAE1C,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,SAAS,IAAI,CAAA;AAEzD,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,OAAO,IAAA;AAAA,QACT;AAGA,QAAA,IAAI,QAAA,CAAS,YAAY,OAAA,EAAS;AAChC,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,SAAA,GAAY,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,UAAA,IAAc,KAAA;AAC/D,QAAA,MAAM,UAAA,GAAa,QAAA,CAAS,UAAA,IAAc,QAAA,CAAS,WAAA,IAAe,CAAA;AAClE,QAAA,MAAM,WAAA,GAAc,YAAY,UAAA,GAAa,CAAA;AAE7C,QAAA,MAAM,iBAAiB,IAAA,CAAK,eAAA;AAC5B,QAAA,MAAM,SAAS,OAAA,EAAS,MAAA;AAGxB,QAAA,OAAO;AAAA,UACL,CAAC,MAAA,CAAO,aAAa,GAAG,mBAA8C;AAEpE,YAAA,IAAI,CAAC,SAAA,EAAW;AACd,cAAA,MAAM,IAAA,GAAO,MAAM,cAAA,CAAe,QAAA,CAAS,IAAI,CAAA;AAC/C,cAAA,IAAI,SAAS,IAAA,EAAM;AACjB,gBAAA;AAAA,cACF;AACA,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,IAAI,UAAA,CAAW,IAAI,CAAA;AAAA,gBACzB,KAAA,EAAO,CAAA;AAAA,gBACP,WAAA,EAAa,CAAA;AAAA,gBACb,MAAA,EAAQ;AAAA,eACV;AACA,cAAA;AAAA,YACF;AAGA,YAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AAEpC,cAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,gBAAA;AAAA,cACF;AAEA,cAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,aAAA,CAAc,MAAM,CAAC,CAAA;AAEzD,cAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,gBAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,CAAA,qBAAA,EAAwB,CAAC,CAAA,CAAE,CAAA;AAAA,cAC7D;AAGA,cAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAC/B,cAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AACzC,cAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,gBAAA,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,cAC/B;AAEA,cAAA,MAAM;AAAA,gBACJ,IAAA;AAAA,gBACA,KAAA,EAAO,CAAA;AAAA,gBACP,WAAA;AAAA,gBACA,MAAA,EAAQ,MAAM,WAAA,GAAc;AAAA,eAC9B;AAAA,YACF;AAAA,UACF;AAAA,SACF;AAAA,MACF;AAAA,MAEA,MAAM,SAAS,IAAA,EAA0C;AACvD,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,SAAS,IAAI,CAAA;AACvD,QAAA,OAAO,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA,GAAI,IAAA;AAAA,MAChD;AAAA,MAEA,MAAM,YAAY,IAAA,EAAsC;AACtD,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,eAAA,CAAgB,YAAY,IAAI,CAAA;AAC3D,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,QAAQ,GAAA,CAAI,CAAC,MAAW,IAAA,CAAK,cAAA,CAAe,CAAC,CAAC;AAAA,SACzD;AAAA,MACF;AAAA,MAEA,MAAM,WAAW,IAAA,EAA6B;AAC5C,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAA,CAAW,IAAI,CAAA;AAAA,MAC5C;AAAA,MAEA,MAAM,UAAU,IAAA,EAAmC;AACjD,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAU,IAAI,CAAA;AACxD,QAAA,OAAO,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,MACnC;AAAA,MAEA,MAAM,UAAU,IAAA,EAA6B;AAC3C,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AAAA,MAC3C;AAAA,MAEA,MAAM,YAAA,GAAmC;AACvC,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,eAAA,CAAgB,YAAA,EAAa;AACtD,QAAA,OAAO;AAAA,UACL,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,UAAA,IAAc,CAAA;AAAA,UAClD,cAAA,EAAgB,KAAA,CAAM,cAAA,IAAkB,KAAA,CAAM,eAAA,IAAmB,CAAA;AAAA,UACjE,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,UAAA,IAAc;AAAA,SACpD;AAAA,MACF;AAAA,MAEA,MAAM,UAAU,OAAA,EAAwC;AACtD,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAU,OAAO,CAAA;AAC5D,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,UAC9B,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,OAAA,EAAS,CAAA,CAAE,OAAA,IAAW;AAAC,SACzB,CAAE,CAAA;AAAA,MACJ;AAAA,MAEA,MAAM,UAAU,OAAA,EAAsC;AACpD,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAU,OAAO,CAAA;AAC5D,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,GAAU,OAAA,CAAQ,SAAS;AAAC,SAC9D;AAAA,MACF;AAAA,MAEA,MAAM,iBAAiB,IAAA,EAA2C;AAChE,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,gBAAA,CAAiB,IAAI,CAAA;AAAA,MACnD;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,SAAA,GAAmC;AACrC,QAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,SAAS,SAAA,EAAkC;AAC/C,QAAA,MAAM,KAAK,eAAA,CAAgB,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,SAAS,CAAA;AAAA,MAClE;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,cAAA,CAAe,IAAA,EAAc,IAAA,EAA+B,QAAgB,CAAA,EAAoB;AACpG,QAAA,OAAO,IAAA,CAAK,gBAAgB,cAAA,CAAe,IAAA,CAAK,UAAU,EAAA,EAAI,IAAA,EAAM,MAAM,KAAK,CAAA;AAAA,MACjF;AAAA,MAEA,MAAM,oBAAoB,IAAA,EAA2C;AACnE,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,mBAAA,CAAoB,IAAI,CAAA;AAAA,MACtD;AAAA,MAEA,MAAM,sBAAsB,EAAA,EAA8B;AACxD,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,qBAAA,CAAsB,EAAE,CAAA;AAAA,MACtD;AAAA;AAAA;AAAA;AAAA,MAMQ,WAAA,GAAc,CAAC,GAAA,KAAiC;AACtD,QAAA,OAAO;AAAA,UACL,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,WAAW,GAAA,CAAI,SAAA;AAAA,UACf,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,QAAA,EAAU;AAAA;AAAA,SACZ;AAAA,MACF,CAAA;AAAA,MAEQ,cAAA,GAAiB,CAAC,MAAA,KAA4B;AACpD,QAAA,OAAO;AAAA,UACL,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,SAAA,IAAa,0BAAA;AAAA,UACjD,OAAA,EAAS,OAAO,OAAA,IAAW,OAAA;AAAA,UAC3B,IAAA,EAAM,OAAO,IAAA,IAAQ,CAAA;AAAA,UACrB,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,YAAA,IAAgB,KAAA;AAAA,UAC1D,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,UAAA;AAAA,UACtC,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO;AAAA,SACxC;AAAA,MACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,OAAO,cAAc,SAAA,EAAmC;AACtD,QAAA,OAAO,IAAI,gBAAA;AAAA,UACT,SAAA;AAAA,UACA,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,UAAU,MAAA,CAAO;AAAA,SACnB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,kBAAA,CACL,cAAA,EACA,QAAA,EACa;AACb,QAAA,OAAO,IAAI,gBAAA,CAAgB,IAAA,EAAM,cAAA,EAAgB,QAAQ,CAAA;AAAA,MAC3D;AAAA,KACF;AAKA,IAAM,qBAAN,MAAmD;AAAA,MACzC,UAAA;AAAA,MAER,YAAY,SAAA,EAAsB;AAChC,QAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAAA,MACpB;AAAA,MAEA,IAAI,MAAA,GAAiB;AACnB,QAAA,OAAO,KAAK,UAAA,CAAW,MAAA;AAAA,MACzB;AAAA,MAEA,IAAI,WAAA,GAAyB;AAC3B,QAAA,OAAO,KAAK,UAAA,CAAW,WAAA;AAAA,MACzB;AAAA,MAEA,IAAI,SAAA,GAAoB;AACtB,QAAA,OAAO,KAAK,UAAA,CAAW,SAAA;AAAA,MACzB;AAAA,MAEA,IAAI,cAAA,GAAyB;AAC3B,QAAA,OAAO,KAAK,UAAA,CAAW,cAAA;AAAA,MACzB;AAAA,MAEA,IAAI,cAAA,GAAyB;AAC3B,QAAA,OAAO,KAAK,UAAA,CAAW,cAAA;AAAA,MACzB;AAAA,MAEA,IAAI,OAAA,GAAmB;AACrB,QAAA,OAAO,KAAK,UAAA,CAAW,OAAA;AAAA,MACzB;AAAA,MAEA,IAAI,SAAA,GAAmC;AACrC,QAAA,OAAO,KAAK,UAAA,CAAW,SAAA;AAAA,MACzB;AAAA,MAEA,IAAI,cAAA,GAA4B;AAE9B,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,UAClD,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,WAAW,GAAA,CAAI,SAAA;AAAA,UACf,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,QAAA,EAAU;AAAA,SACZ,CAAE,CAAA;AAAA,MACJ;AAAA,MAEA,UAAU,IAAA,EAAuB;AAC/B,QAAA,IAAA,CAAK,UAAA,CAAW,cAAA,GAAiB,IAAA,KAAS,GAAA,GAAM,QAAA,GAAW,QAAA;AAAA,MAC7D;AAAA,MAEA,IAAA,GAAa;AACX,QAAA,IAAA,CAAK,WAAW,OAAA,GAAU,IAAA;AAC1B,QAAA,IAAA,CAAK,UAAA,CAAW,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,WAAA;AAAA,MAC9C;AAAA,MAEA,IAAI,WAAA,GAA2B;AAC7B,QAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,eAAA,EAAiB;AACpC,UAAA,IAAA,CAAK,UAAA,CAAW,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAAA,QACxD;AACA,QAAA,OAAO,IAAA,CAAK,WAAW,eAAA,CAAgB,MAAA;AAAA,MACzC;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtkBA,IAAM,+BAAgC,CAAA,MAAM;AAC3C,EAAA,MAAM,IAAI,WAAW;AAAA,EAAC,CAAA;AACtB,EAAA,OAAO,CAAA,CAAE,SAAA,mBAAY,MAAA,CAAO,MAAA,CAAO,IAAI,GAAG,MAAA,CAAO,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA,EAAG,CAAA;AACvE,CAAA,GAAG;AAYH,SAAS,UAAU,IAAA,EAAM;AACxB,EAAA,MAAM,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AAChC,EAAA,OAAO,CAAA,CAAE,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,KAAM,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAClD;AAiBA,SAAS,QAAA,CAAS,GAAA,EAAK,MAAA,GAAS,EAAA,EAAI,MAAM,IAAA,EAAM;AAC/C,EAAA,MAAA,GAAS,OAAO,WAAA,EAAY;AAC5B,EAAA,IAAI,KAAK,UAAA,CAAW,CAAC,MAAM,EAAA,EAAI,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,UAAU,IAAI,CAAA;AAC/B,EAAA,IAAI,OAAO,GAAA,CAAI,IAAA;AACf,EAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,EAAA,MAAM,YAAY,EAAC;AACnB,EAAA,MAAM,eAAe,EAAC;AACtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACzC,IAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAC7B,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,OAAe,QAAA,GAAW,EAAE,KAAK,IAAA,EAAK;AAChD,MAAA,IAAA,GAAO,IAAA,CAAK,QAAA;AACZ,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACd,CAAC,CAAA;AAAA,QACD,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA;AAAA,QACzB,QAAQ,MAAA,KAAW;AAAA,OACnB,CAAA;AACD,MAAA;AAAA,IACD;AACA,IAAA,IAAI,OAAA,KAAY,GAAA,IAAO,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAC7C,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,OAAY,KAAA,GAAQ,EAAE,KAAK,GAAA,EAAI;AACzC,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA;AACZ,MAAA,IAAI,OAAA,KAAY,GAAA,EAAK,SAAA,CAAU,IAAA,CAAK;AAAA,QACnC,CAAA;AAAA,QACA,IAAI,kBAAA,EAAoB,CAAA,CAAA;AAAA,QACxB;AAAA,OACA,CAAA;AAAA,WAAA,IACQ,OAAA,CAAQ,QAAA,CAAS,GAAA,EAAK,CAAC,CAAA,EAAG;AAClC,QAAA,MAAM,MAAA,GAAS,eAAe,OAAO,CAAA;AACrC,QAAA,YAAA,CAAa,CAAC,CAAA,GAAI,MAAA;AAClB,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,QAAA,SAAA,CAAU,IAAA,CAAK;AAAA,UACd,CAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACA,CAAA;AAAA,MACF,CAAA,gBAAiB,IAAA,CAAK;AAAA,QACrB,CAAA;AAAA,QACA,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,QACf;AAAA,OACA,CAAA;AACD,MAAA;AAAA,IACD;AACA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAS,OAAO,CAAA;AACnC,IAAA,IAAI,OAAO,IAAA,GAAO,KAAA;AAAA,SACb;AACJ,MAAA,MAAM,UAAA,GAAa,EAAE,GAAA,EAAK,OAAA,EAAQ;AAClC,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,EAAa;AACjD,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,GAAI,UAAA;AACvB,MAAA,IAAA,GAAO,UAAA;AAAA,IACR;AAAA,EACD;AACA,EAAA,MAAM,SAAA,GAAY,UAAU,MAAA,GAAS,CAAA;AACrC,EAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,OAAA,GAAU,IAAI,YAAA,EAAa;AACnD,EAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,KAAM,EAAC;AAC1B,EAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,CAAE,IAAA,CAAK;AAAA,IACzB,MAAM,IAAA,IAAQ,IAAA;AAAA,IACd,YAAA;AAAA,IACA,SAAA,EAAW,YAAY,SAAA,GAAY;AAAA,GACnC,CAAA;AACD,EAAA,IAAI,CAAC,SAAA,EAAW,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AACpC;AACA,SAAS,eAAe,OAAA,EAAS;AAChC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,CAAC,CAAA,EAAG,EAAA,KAAO,CAAA,GAAA,EAAM,EAAE,CAAA,OAAA,CAAS,CAAA,CAAE,OAAA,CAAQ,OAAO,KAAK,CAAA;AAC3F,EAAA,uBAAuB,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AAC/C;ACmIO,SAAS,iBACd,UAAA,EACwB;AACxB,EAAA,OAAO,UAAA;AACT;;;AC1OA,IAAO,kBAAA,GAAQ,iBAAiB,MAAM;AACpC,EAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAe;AAAA,IAChC,MAAM,UAAA,EAAY;AAChB,MAAA,MAAM,IAAA,GAAO,aAAA;AACb,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,MAAM,OAAO,MAAM;AACjB,QAAA,IAAI,KAAA,GAAQ,KAAK,MAAA,EAAQ;AACvB,UAAA,UAAA,CAAW,OAAA,CAAQ,IAAI,WAAA,EAAY,CAAE,OAAO,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AACxD,UAAA,KAAA,EAAA;AACA,UAAA,UAAA,CAAW,MAAM,GAAG,CAAA;AAAA,QACtB,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,KAAA,EAAM;AAAA,QACnB;AAAA,MACF,CAAA;AACA,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,GACD,CAAA;AACD,EAAA,OAAO,IAAI,SAAS,MAAM,CAAA;AAC5B,CAAC,CAAA;;;ACRD,IAAO,kBAAA,GAAQ,iBAAiB,OAAO,EAAE,QAAQ,UAAA,EAAY,OAAA,EAAS,aAAY,KAAM;AACtF,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,EAAY;AAC1B,IAAA,OAAO,SAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAI,CAAA;AAAA,EACrC;AAGA,EAAA,MAAM,YAAiC,EAAC;AACxC,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,WAAA,CAAY,GAAA,CAAI,OAAO,IAAA,KAAiB;AACtC,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,QAAQ,IAAI,CAAA;AAC3B,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,SAAA,CAAU,IAAI,CAAA,GAAI,MAAM,MAAA,EAAO;AAAA,UACjC;AAAA,QACF,SAAS,KAAA,EAAO;AAAA,QAEhB;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC9B,UAAA,CAAW,GAAA,CAAI,OAAO,IAAA,KAAiB;AACrC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,EAAO;AAGhC,QAAA,MAAM,WAAA,GAAc,SAAA,CAAU,UAAA,CAAW,KAAA,EAAO,MAAM,CAAA;AACtD,QAAA,MAAM,cAAc,UAAA,CAAW,KAAA,GAC3B,UAAU,UAAA,CAAW,KAAA,EAAO,MAAM,CAAA,GAClC,IAAA;AAEJ,QAAA,OAAO;AAAA,UACL,IAAI,UAAA,CAAW,IAAA;AAAA,UACf,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,OAAO,UAAA,CAAW,KAAA;AAAA,UAClB,IAAA,EAAM,WAAW,IAAA,IAAQ,UAAA;AAAA;AAAA,UAGzB,YAAA,EAAc,UAAA,CAAW,KAAA,EAAO,KAAA,IAAS,IAAA;AAAA,UACzC,mBAAA,EAAqB,WAAW,KAAA,EAAO,MAAA;AAAA,UACvC,wBAAA,EAA0B,WAAA,EAAa,IAAA,IAAQ,UAAA,CAAW,KAAA,EAAO,MAAA;AAAA,UACjE,yBACE,UAAA,CAAW,KAAA,EAAO,mBAAmB,KAAA,CAAA,GACjC,UAAA,CAAW,MAAM,cAAA,GACjB,IAAA;AAAA,UACN,gBAAA,EAAkB,UAAA,CAAW,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,UAChD,kCAAA,EACE,UAAA,CAAW,KAAA,EAAO,wBAAA,IAA4B,IAAA;AAAA,UAChD,gBAAA,EAAkB,UAAA,CAAW,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,UAChD,uBAAA,EACE,UAAA,CAAW,KAAA,EAAO,cAAA,IAAkB,IAAA;AAAA,UACtC,4BAAA,EACE,UAAA,CAAW,KAAA,EAAO,mBAAA,IAAuB,KAAA;AAAA;AAAA,UAG3C,YAAA,EAAc,UAAA,CAAW,KAAA,EAAO,KAAA,IAAS,IAAA;AAAA,UACzC,mBAAA,EAAqB,UAAA,CAAW,KAAA,EAAO,MAAA,IAAU,IAAA;AAAA,UACjD,wBAAA,EAA0B,WAAA,EAAa,IAAA,IAAQ,UAAA,CAAW,OAAO,MAAA,IAAU,IAAA;AAAA,UAC3E,yBACE,UAAA,CAAW,KAAA,EAAO,mBAAmB,KAAA,CAAA,GACjC,UAAA,CAAW,MAAM,cAAA,GACjB,IAAA;AAAA,UACN,gBAAA,EAAkB,UAAA,CAAW,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,UAChD,kCAAA,EACE,UAAA,CAAW,KAAA,EAAO,wBAAA,IAA4B,IAAA;AAAA,UAChD,gBAAA,EAAkB,UAAA,CAAW,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,UAChD,uBAAA,EACE,UAAA,CAAW,KAAA,EAAO,cAAA,IAAkB,IAAA;AAAA,UACtC,4BAAA,EACE,UAAA,CAAW,KAAA,EAAO,mBAAA,IAAuB,KAAA;AAAA;AAAA,UAG3C,iBAAA,EAAmB,WAAW,eAAA,IAAmB,IAAA;AAAA;AAAA,UAGjD,cAAA,EAAgB,WAAW,YAAA,IAAgB,KAAA;AAAA,UAC3C,gBAAA,EAAkB,WAAW,eAAA,IAAmB,IAAA;AAAA,UAEhD,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI;AAAA,SAC1C;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACnD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAC;AAAA,GACH;AAGA,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA;AAE5C,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,aAAa,CAAA;AAC9C,CAAC,CAAA;;;ACtGM,SAAS,mBAAA,CAAoB,SAAiB,EAAA,EAAY;AAC/D,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,CAAA;AACnC,EAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAC5B,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,CAAA,IAAA,KAAQ,KAAK,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAC9E;AAKO,SAAS,iBAAA,GAA4B;AAC1C,EAAA,OAAO,CAAA,QAAA,EAAW,mBAAA,CAAoB,EAAE,CAAC,CAAA,CAAA;AAC3C;AAKO,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO,CAAA,QAAA,EAAW,mBAAA,CAAoB,EAAE,CAAC,CAAA,CAAA;AAC3C;AAKA,eAAsB,aAAa,QAAA,EAAmC;AACpE,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA;AAGpC,EAAA,MAAM,OAAO,MAAA,CAAO,eAAA,CAAgB,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AAGtD,EAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,IACtC,KAAA;AAAA,IACA,IAAA;AAAA,IACA,EAAE,MAAM,QAAA,EAAS;AAAA,IACjB,KAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAGA,EAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,MAAA,CAAO,UAAA;AAAA,IACtC;AAAA,MACE,IAAA,EAAM,QAAA;AAAA,MACN,IAAA;AAAA,MACA,UAAA,EAAY,GAAA;AAAA,MACZ,IAAA,EAAM;AAAA,KACR;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,SAAA,GAAY,IAAI,UAAA,CAAW,WAAW,CAAA;AAC5C,EAAA,MAAM,WAAW,IAAI,UAAA,CAAW,IAAA,CAAK,MAAA,GAAS,UAAU,MAAM,CAAA;AAC9D,EAAA,QAAA,CAAS,IAAI,IAAI,CAAA;AACjB,EAAA,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,IAAA,CAAK,MAAM,CAAA;AAGnC,EAAA,OAAO,eAAe,QAAQ,CAAA;AAChC;AAKA,eAAsB,cAAA,CAAe,UAAkB,IAAA,EAAgC;AACrF,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,eAAe,IAAI,CAAA;AAGpC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACjC,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAEpC,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA;AAGpC,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,MACtC,KAAA;AAAA,MACA,IAAA;AAAA,MACA,EAAE,MAAM,QAAA,EAAS;AAAA,MACjB,KAAA;AAAA,MACA,CAAC,YAAY;AAAA,KACf;AAGA,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,MAAA,CAAO,UAAA;AAAA,MACtC;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA;AAAA,QACA,UAAA,EAAY,GAAA;AAAA,QACZ,IAAA,EAAM;AAAA,OACR;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,WAAA,GAAc,IAAI,UAAA,CAAW,WAAW,CAAA;AAG9C,IAAA,IAAI,WAAA,CAAY,MAAA,KAAW,UAAA,CAAW,MAAA,EAAQ;AAC5C,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,MAAA,IAAI,WAAA,CAAY,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAA,EAAG;AACpC,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKA,eAAsB,UAAU,KAAA,EAAgC;AAC9D,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AAEjC,EAAA,MAAM,aAAa,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,IAAI,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,IAAI,UAAA,CAAW,UAAU,CAAA;AAE3C,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,CAAA,IAAA,KAAQ,KAAK,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAClF;AAKO,SAAS,YAAA,CAAa,GAAA,EAAa,KAAA,GAAgB,CAAA,EAAW;AACnE,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAC,KAAK,CAAA;AACzB;AAKO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA;AACrC,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,EAAA;AAC5B;AAKO,SAAS,iBAAiB,KAAA,EAAwB;AACvD,EAAA,OAAO,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA,IAAK,MAAM,MAAA,GAAS,EAAA;AACxD;AAKO,SAAS,cAAc,GAAA,EAAsB;AAClD,EAAA,OAAO,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,IAAK,IAAI,MAAA,GAAS,EAAA;AACpD;AAaA,eAAsB,SAAA,CAAU,SAAiB,aAAA,EAAwC;AACvF,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAGhC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,IACpC,KAAA;AAAA,IACA,OAAA;AAAA,IACA,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,IAChC,KAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAGA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AAC1C,EAAA,MAAM,YAAY,MAAM,MAAA,CAAO,OAAO,IAAA,CAAK,MAAA,EAAQ,WAAW,WAAW,CAAA;AAGzE,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAI,UAAA,CAAW,WAAW,CAAC,CAAA;AAC7D,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,IAAI,UAAA,CAAW,SAAS,CAAC,CAAA;AAE7D,EAAA,OAAO,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA;AACtC;AAMA,eAAsB,iBAAA,CAAkB,aAAqB,aAAA,EAA+C;AAC1G,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AACnC,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,CAAC,UAAA,EAAY,YAAY,CAAA,GAAI,KAAA;AACnC,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAGhC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,MACpC,KAAA;AAAA,MACA,OAAA;AAAA,MACA,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,MAChC,KAAA;AAAA,MACA,CAAC,QAAQ;AAAA,KACX;AAGA,IAAA,MAAM,WAAA,GAAc,eAAe,UAAU,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,eAAe,YAAY,CAAA;AAG7C,IAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,MAAA,CAAO,OAAO,MAAA,EAAQ,SAAA,EAAW,WAAW,WAAW,CAAA;AAEpF,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,OAAO,OAAA,CAAQ,OAAO,WAAW,CAAA;AAAA,EACnC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMA,eAAsB,wBAAwB,aAAA,EAAwC;AACpF,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,KAAA,GAAQ,oBAAoB,EAAE,CAAA;AACpC,EAAA,MAAM,OAAA,GAAU,CAAA,YAAA,EAAe,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AACjD,EAAA,OAAO,MAAM,SAAA,CAAU,OAAA,EAAS,aAAa,CAAA;AAC/C;AAMA,eAAsB,qBAAA,CAAsB,OAAe,aAAA,EAAyC;AAClG,EAAA,MAAM,OAAA,GAAU,MAAM,iBAAA,CAAkB,KAAA,EAAO,aAAa,CAAA;AAC5D,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AAC/B,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,CAAC,MAAM,aAAA,EAAe;AACpD,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AACzB,EAAA,MAAM,MAAA,GAAS,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAEnC,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,eAAe,MAAA,EAA4B;AAClD,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,YAAY,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAEA,SAAS,eAAe,MAAA,EAA4B;AAClD,EAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,KAAA;AACT;;;AC9QA,SAAS,mBAAmB,OAAA,EAAiC;AAE3D,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA;AACtD,EAAA,IAAI,UAAA,IAAc,UAAA,CAAW,UAAA,CAAW,SAAS,CAAA,EAAG;AAClD,IAAA,OAAO,UAAA,CAAW,UAAU,CAAC,CAAA;AAAA,EAC/B;AAGA,EAAA,MAAM,cACJ,OAAA,CAAQ,OAAA,CAAQ,IAAI,SAAS,CAAA,EAAG,aAAY,KAAM,WAAA;AACpD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAC1C,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,SAAS,GAAA,EAAK;AAAA,IAEd;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,gBAAgB,GAAA,EAAe;AACtC,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,EAAA,OAAO,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAC7C;AAKA,eAAsB,YAAA,CACpB,SACA,GAAA,EAC6B;AAC7B,EAAA,MAAM,KAAA,GAAQ,mBAAmB,OAAO,CAAA;AAExC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,GAAA,CAAI,oBAAA,IAAwB,GAAA,CAAI,cAAA,EAAgB;AAElD,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AACvB,MAAA,MAAM,oBAAoB,MAAM,qBAAA;AAAA,QAC9B,KAAA;AAAA,QACA,GAAA,CAAI;AAAA,OACN;AACA,MAAA,IAAI,iBAAA,EAAmB;AACrB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM;AAAA,YACJ,EAAA,EAAI,aAAA;AAAA,YACJ,QAAA,EAAU,OAAA;AAAA,YACV,IAAA,EAAM;AAAA,WACR;AAAA,UACA,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,MAAM,SAAA,GAAY,MAAM,SAAA,CAAU,KAAK,CAAA;AACvC,IAAA,MAAM,YAAA,GAAe,gBAAgB,GAAG,CAAA;AAExC,IAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,eAAA,CAAgB,SAAS,CAAA;AAC5D,IAAA,IAAI,OAAA,EAAS;AAEX,MAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,WAAA,CAAY,QAAQ,OAAO,CAAA;AAC3D,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,OAAO;AAAA,UACL,IAAA,EAAM;AAAA,YACJ,IAAI,IAAA,CAAK,EAAA;AAAA,YACT,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,MAAM,IAAA,CAAK;AAAA,WACb;AAAA,UACA,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,aAAA,CAAc,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,KAAK,CAAA;AACrC,IAAA,MAAM,YAAA,GAAe,gBAAgB,GAAG,CAAA;AAExC,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,cAAA,CAAe,OAAO,CAAA;AACxD,IAAA,IAAI,MAAA,EAAQ;AAEV,MAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,WAAA,CAAY,OAAO,OAAO,CAAA;AAC1D,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,OAAO;AAAA,UACL,IAAA,EAAM;AAAA,YACJ,IAAI,IAAA,CAAK,EAAA;AAAA,YACT,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,MAAM,IAAA,CAAK;AAAA,WACb;AAAA,UACA,QAAA,EAAU;AAAA,SACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAMA,eAAsB,WAAA,CACpB,SACA,GAAA,EACiC;AACjC,EAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,OAAA,EAAS,GAAG,CAAA;AAEnD,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,IAAI,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA,EAAG;AAAA,MAC7D,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,KAC/C,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,WAAA;AACT;AAMA,eAAsB,YAAA,CACpB,SACA,GAAA,EACiC;AACjC,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,OAAA,EAAS,GAAG,CAAA;AAE7C,EAAA,IAAI,kBAAkB,QAAA,EAAU;AAC9B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,IAAA,OAAO,IAAI,QAAA;AAAA,MACT,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,oCAAoC,CAAA;AAAA,MAC5D;AAAA,QACE,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB;AAChD,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AC9KA,IAAO,oBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,KAAI,KAAM;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,GAAA,EAAK,GAAG,CAAA;AAC7C,IAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,MAAA,OAAO,UAAA;AAAA,IACT;AAGA,IAAA,IAAI,UAAA,CAAW,aAAa,aAAA,EAAe;AACzC,MAAA,OAAO,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,EAAC,EAAG,OAAA,EAAS,0EAA0E,CAAA;AAAA,IACtH;AAGA,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAEzD,IAAA,MAAM,OAAO,MAAM,YAAA,CAAa,WAAA,CAAY,UAAA,CAAW,KAAK,EAAE,CAAA;AAE9D,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA;AAAA,EAC/B,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAC3C,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,yBAAA,EAA0B;AAAA,MACpD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;ACpBD,IAAOO,sBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,KAAI,KAAM;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,GAAA,EAAK,GAAG,CAAA;AAC7C,IAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,MAAA,OAAO,UAAA;AAAA,IACT;AAGA,IAAA,IAAI,UAAA,CAAW,aAAa,aAAA,EAAe;AACzC,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,yEAAA,EAA0E;AAAA,QACnF,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AAEjB,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,kBAAA,EAAmB;AAAA,QAC5B,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,SAAS,GAAA,EAAK;AACxC,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,2CAAA,EAA4C;AAAA,QACrD,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,IAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,MAAM,CAAA;AACtC,IAAA,MAAM,SAAA,GAAY,eAAe,MAAM,CAAA;AACvC,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,MAAA,EAAQ,CAAC,CAAA;AAGvC,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAEzD,IAAA,MAAM,EAAA,GAAK,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,MACzC,IAAA;AAAA,MACA,QAAA,EAAU,OAAA;AAAA,MACV,UAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,QAAA;AAAA,MACX,OAAA,EAAS,WAAW,IAAA,CAAK;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAExC,IAAA,OAAO,SAAS,IAAA,CAAK;AAAA,MACnB,GAAA,EAAK,MAAA;AAAA;AAAA,MACL,EAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,QAAA;AAAA,MACX,UAAA,EAAY;AAAA,KACd,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACpB,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,0BAAA,EAA2B;AAAA,MACrD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;ACtFD,IAAO,kBAAA,GAAQ,gBAAA,CAAiB,OAAO,EAAE,QAAO,KAAM;AACpD,EAAA,OAAO,QAAA,CAAS,KAAK,MAAM,CAAA;AAC7B,CAAC,CAAA;;;ACSD,IAAO,uBAAA,GAAQ,iBAAiB,OAAO,EAAE,OAAO,OAAA,EAAS,WAAA,EAAa,MAAA,EAAQ,UAAA,EAAW,KAAM;AAC7F,EAAA,MAAM,WAAmE,EAAC;AAG1E,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAyB;AAGrD,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AACnC,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,MAAM,UAAU,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA,wBAAS,GAAA,EAAI;AACrD,MAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,MAAA,eAAA,CAAgB,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,IACnC;AAAA,EACF;AAGA,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,MAAM,UAAU,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA,wBAAS,GAAA,EAAI;AACrD,MAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AACpB,MAAA,eAAA,CAAgB,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,IACnC;AAAA,EACF;AAGA,EAAA,IAAI,UAAU,UAAA,EAAY;AACxB,IAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,UAAA,GAAa,MAAM,MAAA,EAAO;AAChC,UAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,YAAA,MAAM,UAAU,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA,wBAAS,GAAA,EAAI;AACrD,YAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,YAAA,eAAA,CAAgB,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,UACnC;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,CAAA,IAAK,eAAA,EAAiB;AAC7C,IAAA,IAAI,OAAA,CAAQ,OAAO,CAAA,EAAG;AACpB,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,wBAAwB,IAAI,CAAA,UAAA,CAAA;AAAA,QACrC,OAAA,EAAS;AAAA,UACP,IAAA;AAAA,UACA,OAAA,EAAS,CAAC,GAAG,OAAO;AAAA;AACtB,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,QAAA,EAAU,CAAA;AACnC,CAAC,CAAA;;;ACzDD,IAAO,qBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,KAAI,KAAM;AAEtD,EAAA,IAAI,IAAI,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG,WAAA,OAAkB,WAAA,EAAa;AAC7D,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,OAAO,+CAAA,EAAgD;AAAA,MACzD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AACjD,IAAA,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EAC7B,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAC3D,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,0CAAA,EAA2C;AAAA,MACrE,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;ACxBD,IAAO,qBAAQ,gBAAA,CAAiB,OAAO,EAAE,MAAA,EAAQ,YAAW,KAAM;AAChE,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,EAAY;AAC1B,IAAA,OAAO,SAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAI,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC9B,UAAA,CAAW,GAAA,CAAI,OAAO,IAAA,KAAiB;AACrC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,EAAO;AAGhC,QAAA,MAAM,eAAA,GAAA,CAAmB,UAAA,CAAW,SAAA,IAAa,EAAC,EAAG,GAAA;AAAA,UACnD,CAAC,cAAsB,KAAA,MAAmB;AAAA,YACxC,EAAA,EAAI,YAAA;AAAA,YACJ,IAAA,EAAM,YAAA;AAAA,YACN,KAAA,EAAO;AAAA,WACT;AAAA,SACF;AAEA,QAAA,OAAO;AAAA,UACL,IAAI,UAAA,CAAW,IAAA;AAAA,UACf,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,UAAU,UAAA,CAAW,QAAA;AAAA,UACrB,OAAO,UAAA,CAAW,KAAA;AAAA,UAClB,aAAa,UAAA,CAAW,UAAA;AAAA,UACxB,cAAc,UAAA,CAAW,WAAA;AAAA,UACzB,cAAc,UAAA,CAAW,WAAA;AAAA,UACzB,oBAAoB,UAAA,CAAW,iBAAA;AAAA,UAC/B,SAAA,EAAW,eAAA;AAAA,UACX,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI;AAAA;AAAA,SAC1C;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACnD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAC;AAAA,GACH;AAGA,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA;AAE5C,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,aAAa,CAAA;AAC9C,CAAC,CAAA;;;ACxDD,IAAO,uBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAI,KAAM;AAC9D,EAAA,OAAO,EAAE,SAAS,6BAAA,EAA+B,SAAA,EAAA,qBAAe,IAAA,EAAK,EAAE,aAAY,EAAE;AACvF,CAAC,CAAA;ACGD,SAAS,aAAa,MAAA,EAAkB;AACtC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,IAAI,UAAU,OAAO,MAAA,KAAW,aAAa,WAAA,IAAe,MAAA,IAAU,UAAU,MAAA,CAAA,EAAS;AACvF,IAAA,OAAO,CAAA,CAAE,aAAa,MAAM,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,MAAA;AACT;AAOA,SAAS,uBAAuB,MAAA,EAA4C;AAC1E,EAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AAEpB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,IAAA,OAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,MAAA;AACT;AAWA,IAAO,mBAAA,GAAQ,iBAAiB,OAAO,EAAE,SAAS,WAAA,EAAa,MAAA,EAAQ,YAAW,KAAM;AACtF,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,WAAA,EAAa;AAC5B,IAAA,OAAO,SAAS,IAAA,CAAK,EAAE,OAAA,EAAS,IAAI,CAAA;AAAA,EACtC;AAGA,EAAA,MAAM,WAAgC,EAAC;AACvC,EAAA,IAAI,UAAU,UAAA,EAAY;AACxB,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,UAAA,CAAW,GAAA,CAAI,OAAO,IAAA,KAAiB;AACrC,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,QAAA,CAAS,IAAI,CAAA,GAAI,MAAM,MAAA,EAAO;AAAA,UAChC;AAAA,QACF,SAAS,KAAA,EAAO;AAAA,QAEhB;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC/B,WAAA,CAAY,GAAA,CAAI,OAAO,IAAA,KAAiB;AACtC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,QAAQ,IAAI,CAAA;AAC3B,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,EAAO;AAChC,QAAA,MAAM,QAAA,GAAW,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAG1C,QAAA,MAAM,KAAA,GAAA,CAAS,UAAA,CAAW,KAAA,IAAS,EAAC,EAAG,GAAA;AAAA,UAAI,CAAC,IAAA,KAC1C,OAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,CAAK;AAAA,SACzC;AAEA,QAAA,OAAO;AAAA,UACL,IAAI,UAAA,CAAW,IAAA;AAAA,UACf,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,kBAAkB,UAAA,CAAW,eAAA;AAAA,UAC7B,MAAA,EAAQ,sBAAA,CAAuB,UAAA,CAAW,MAAM,CAAA;AAAA,UAChD,eAAA,EAAiB,YAAA,CAAa,UAAA,CAAW,cAAc,CAAA;AAAA,UACvD,UAAU,UAAA,CAAW,KAAA;AAAA,UACrB,UAAA,EAAY,QAAA,EAAU,IAAA,IAAQ,UAAA,CAAW,KAAA;AAAA,UACzC,cAAA,EAAgB,UAAU,QAAA,IAAY,SAAA;AAAA,UACtC,YAAA,EAAc,WAAW,WAAA,IAAe,KAAA;AAAA,UACxC,kBAAA,EAAoB,WAAW,gBAAA,IAAoB,KAAA;AAAA,UACnD,mBAAA,EAAqB,WAAW,iBAAA,IAAqB,KAAA;AAAA,UACrD,WAAA,EAAa,WAAW,UAAA,IAAc,MAAA;AAAA,UACtC,KAAA;AAAA,UACA,SAAA,EAAW,WAAW,SAAA,IAAa,IAAA;AAAA,UACnC,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI;AAAA,SAC1C;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACpD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAC;AAAA,GACH;AAGA,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,MAAA,CAAO,OAAO,CAAA;AAE9C,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,cAAc,CAAA;AAChD,CAAC,CAAA;;;ACpGD,IAAM,mBAAA,GAAsB;AAAA,EAC1B;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,GAAA,EAAK,QAAA;AAAA,IACL,KAAA,EAAO,QAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,GAAA,EAAK,YAAA;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ;AAAA;AAEZ,CAAA;AAWA,IAAO,qBAAA,GAAQ,gBAAA,CAAiB,OAAO,EAAE,KAAI,KAAM;AACjD,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,IACvD,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,KAAK,QAAA,CAAS,GAAA;AAAA,IACd,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,MAAM,CAAC;AAAA,GACzC,CAAE,CAAA;AAEF,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,SAAA,EAAW,CAAA;AACpC,CAAC,CAAA;;;ACTD,IAAOA,sBAAQ,gBAAA,CAAsB,OAAO,EAAE,GAAA,EAAK,KAAI,KAAM;AAE3D,EAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,GAAA,EAAK,GAAG,CAAA;AAC7C,EAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,UAAA;AAEb,EAAA,IAAI,IAAA;AAOJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,IAAI,IAAA,EAAK;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,OAAO,8BAAA,EAA+B;AAAA,MACxC,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,QAAA,EAAU,gBAAA,EAAkB,IAAA,EAAM,MAAK,GAAI,IAAA;AAKnD,EAAA,MAAM,UAAU,IAAA,CAAK,QAAA,KAAa,aAAA,GAAgB,IAAA,GAAO,KAAK,IAAA,CAAK,EAAA;AAGnE,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,OAAO,kCAAA,EAAmC;AAAA,MAC5C,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAGA,EAAA,IAAI,gBAAA,KAAqB,MAAA,IAAa,gBAAA,KAAqB,IAAA,EAAM;AAC/D,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AACpC,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,mCAAA,EAAoC;AAAA,QAC7C,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA,EAAM;AACvC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,kCAAA,EAAmC;AAAA,QAC5C,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AACA,IAAA,IAAI,CAAC,KAAK,KAAA,CAAM,CAAC,QAAQ,OAAO,GAAA,KAAQ,QAAQ,CAAA,EAAG;AACjD,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,0BAAA,EAA2B;AAAA,QACpC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAGzD,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,CAAa,UAAU,QAAQ,CAAA;AAAA,EACvC,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,CAAA,iBAAA,EAAoB,QAAQ,CAAA,CAAA,EAAG;AAAA,MACxC,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,MAC7C,UAAA,EAAY,QAAA;AAAA,MACZ,SAAS,OAAA,IAAW,KAAA,CAAA;AAAA,MACpB;AAAA,KACD,CAAA;AAKD,IAAA,OAAO,SAAS,IAAA,CAAK;AAAA,MACnB,UAAU,MAAA,CAAO,EAAA;AAAA,MACjB,UAAU,MAAA,CAAO,UAAA;AAAA,MACjB,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAE7C,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd;AAAA,QACE,KAAA,EAAO,MAAM,OAAA,IAAW;AAAA,OAC1B;AAAA,MACA,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;AC/HD,SAAS,cAAA,CAAe,MAA0B,MAAA,EAAoC;AACpF,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAElB,EAAA,IAAI,KAAK,UAAA,CAAW,SAAS,KAAK,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,EACzB;AAEA,EAAA,OAAO,IAAA;AACT;AAmBA,IAAO,kBAAQ,gBAAA,CAAsB,OAAO,EAAE,GAAA,EAAK,KAAI,KAAM;AAC3D,EAAA,IAAI,GAAA,CAAI,WAAW,KAAA,EAAO;AACxB,IAAA,OAAO,IAAI,QAAA,CAAS,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC3D;AAGA,EAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,GAAA,EAAK,GAAG,CAAA;AAC7C,EAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,UAAA;AAEb,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC3B,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,SAAS,GAAA,CAAI,YAAA,CAAa,IAAI,OAAO,CAAA,IAAK,MAAM,EAAE,CAAA;AAChE,IAAA,MAAM,MAAA,GAAS,SAAS,GAAA,CAAI,YAAA,CAAa,IAAI,QAAQ,CAAA,IAAK,KAAK,EAAE,CAAA;AACjE,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA;AAIjD,IAAA,MAAM,SAAS,IAAA,CAAK,IAAA,CAAK,SAAS,OAAA,GAAU,KAAA,CAAA,GAAY,KAAK,IAAA,CAAK,EAAA;AAGlE,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAGzD,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,WAAA,CAAY;AAAA,MAC5C,YAAY,SAAA,IAAa,KAAA,CAAA;AAAA,MACzB,SAAS,MAAA,IAAU,KAAA,CAAA;AAAA,MACnB,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC5B,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,OAAO,MAAA,KAAW;AACnC,QAAA,IAAI,YAAA,GAMO,IAAA;AACX,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,SAAA,CAAU,OAAO,UAAU,CAAA;AAC/D,UAAA,YAAA,GAAe;AAAA,YACb,MAAM,MAAA,CAAO,UAAA;AAAA,YACb,KAAA,EAAO,QAAA,CAAS,KAAA,IAAS,MAAA,CAAO,UAAA;AAAA,YAChC,IAAA,EAAM,SAAS,IAAA,IAAQ,UAAA;AAAA,YACvB,aAAa,QAAA,CAAS,WAAA;AAAA,YACtB,IAAA,EAAM,cAAA,CAAe,QAAA,CAAS,IAAA,EAAM,MAAM;AAAA,WAC5C;AAAA,QACF,CAAA,CAAA,MAAQ;AAEN,UAAA,YAAA,GAAe,EAAE,MAAM,MAAA,CAAO,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA,EAAY,MAAM,SAAA,EAAU;AAAA,QACtF;AAEA,QAAA,OAAO;AAAA,UACL,IAAI,MAAA,CAAO,EAAA;AAAA,UACX,UAAU,MAAA,CAAO,UAAA;AAAA,UACjB,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,EAAC;AAAA,UACtB,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,KAAA,EAAO;AAAA,SACT;AAAA,MACF,CAAC;AAAA,KACH;AAEA,IAAA,OAAO,SAAS,IAAA,CAAK;AAAA,MACnB,OAAA;AAAA,MACA,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,OAAA,EAAS,MAAA,GAAS,OAAA,CAAQ,MAAA,GAAS,MAAA,CAAO;AAAA,KAC3C,CAAA;AAAA,EACH,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,yBAAA,EAA0B;AAAA,MACpD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;ACjHD,SAASC,cAAa,MAAA,EAAkB;AACtC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI;AAEF,IAAA,IAAI,UAAU,OAAO,MAAA,KAAW,aAAa,WAAA,IAAe,MAAA,IAAU,OAAO,IAAA,CAAA,EAAO;AAClF,MAAA,OAAOH,CAAAA,CAAE,aAAa,MAAM,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAcA,IAAO,iBAAA,GAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAQ,UAAA,EAAW,KAAM;AACtH,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AACxC,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,KAAM,MAAA;AAGzD,EAAA,MAAM,WAAgC,EAAC;AACvC,EAAA,IAAI,UAAU,UAAA,EAAY;AACxB,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,UAAA,CAAW,GAAA,CAAI,OAAO,IAAA,KAAiB;AACrC,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,QAAA,CAAS,IAAI,CAAA,GAAI,MAAM,MAAA,EAAO;AAAA,UAChC;AAAA,QACF,SAAS,KAAA,EAAO;AAAA,QAEhB;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,SAAA,EAAW;AAEtB,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,WAAA,EAAa;AAC5B,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AAAA,IACzB;AAEA,IAAA,MAAMN,UAA8B,EAAC;AAErC,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,WAAA,CAAY,GAAA,CAAI,OAAO,IAAA,KAAiB;AACtC,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,QAAQ,IAAI,CAAA;AAC3B,UAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,UAAA,MAAM,UAAA,GAAa,MAAM,MAAA,EAAO;AAChC,UAAA,MAAM,QAAA,GAAW,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAE1C,UAAAA,OAAAA,CAAO,IAAI,CAAA,GAAI;AAAA,YACb,WAAA,EAAa,WAAW,eAAA,IAAmB,EAAA;AAAA,YAC3C,QAAQ,aAAA,IAAiB,UAAA,CAAW,iBAChCS,aAAAA,CAAa,UAAA,CAAW,cAAc,CAAA,GACtC,IAAA;AAAA,YACJ,QAAA,EAAU,KAAA;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,KAAA,EAAO,QAAA,EAAU,IAAA,IAAQ,UAAA,CAAW;AAAA,WACtC;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,QACtD;AAAA,MACF,CAAC;AAAA,KACH;AAEA,IAAA,OAAO,QAAA,CAAS,KAAKT,OAAM,CAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,SAAS,QAAA,EAAU;AAErB,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,EAAY;AAC1B,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AAAA,IACzB;AAEA,IAAA,MAAMA,UAA8B,EAAC;AAErC,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,UAAA,CAAW,GAAA,CAAI,OAAO,IAAA,KAAiB;AACrC,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,UAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,UAAA,MAAM,UAAA,GAAa,MAAM,MAAA,EAAO;AAGhC,UAAA,IAAI,CAAC,WAAW,YAAA,EAAc;AAE9B,UAAAA,OAAAA,CAAO,IAAI,CAAA,GAAI;AAAA,YACb,WAAA,EAAa,UAAA,CAAW,eAAA,IAAmB,UAAA,CAAW,KAAA,IAAS,EAAA;AAAA,YAC/D,MAAA,EAAQ,IAAA;AAAA;AAAA,YACR,QAAA,EAAU,KAAA;AAAA,YACV,IAAA,EAAM;AAAA,WACR;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,QACrD;AAAA,MACF,CAAC;AAAA,KACH;AAEA,IAAA,OAAO,QAAA,CAAS,KAAKA,OAAM,CAAA;AAAA,EAC7B;AAGA,EAAA,MAAM,SAA8B,EAAC;AAGrC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAEnC,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,SAAA,CAAU,GAAA,CAAI,OAAO,IAAA,KAAiB;AACpC,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,IAAI,CAAA;AACzB,UAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,UAAA,MAAM,UAAA,GAAa,MAAM,MAAA,EAAO;AAGhC,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,IAAK,OAAO,UAAA,CAAW,CAAC,CAAA,KAAM,QAAA,IAAY,UAAA,CAAW,CAAC,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,EAAG;AACrG,YAAA,MAAA,CAAO,IAAI,CAAA,GAAI;AAAA,cACb,WAAA,EAAa,EAAA;AAAA,cACb,MAAA,EAAQ,IAAA;AAAA,cACR,QAAA,EAAU,IAAA;AAAA,cACV,KAAA,EAAO,WAAW,CAAC,CAAA;AAAA,cACnB,IAAA,EAAM;AAAA,aACR;AACA,YAAA;AAAA,UACF;AAGA,UAAA,MAAM,CAAC,WAAA,EAAa,MAAM,CAAA,GAAI,UAAA;AAE9B,UAAA,MAAA,CAAO,IAAI,CAAA,GAAI;AAAA,YACb,aAAa,WAAA,IAAe,EAAA;AAAA,YAC5B,MAAA,EAAQ,aAAA,IAAiB,MAAA,GAASS,aAAAA,CAAa,MAAM,CAAA,GAAI,IAAA;AAAA,YACzD,QAAA,EAAU,KAAA;AAAA,YACV,IAAA,EAAM;AAAA,WACR;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAClD,UAAA,MAAA,CAAO,IAAI,CAAA,GAAI;AAAA,YACb,WAAA,EAAa,EAAA;AAAA,YACb,MAAA,EAAQ,IAAA;AAAA,YACR,QAAA,EAAU,IAAA;AAAA,YACV,KAAA,EAAO,uBAAuB,KAAK,CAAA,CAAA;AAAA,YACnC,IAAA,EAAM;AAAA,WACR;AAAA,QACF;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAGA,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,WAAA,CAAY,GAAA,CAAI,OAAO,IAAA,KAAiB;AACtC,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,QAAQ,IAAI,CAAA;AAC3B,UAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,UAAA,MAAM,UAAA,GAAa,MAAM,MAAA,EAAO;AAChC,UAAA,MAAM,QAAA,GAAW,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAE1C,UAAA,MAAA,CAAO,IAAI,CAAA,GAAI;AAAA,YACb,WAAA,EAAa,WAAW,eAAA,IAAmB,EAAA;AAAA,YAC3C,QAAQ,aAAA,IAAiB,UAAA,CAAW,iBAChCA,aAAAA,CAAa,UAAA,CAAW,cAAc,CAAA,GACtC,IAAA;AAAA,YACJ,QAAA,EAAU,KAAA;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,KAAA,EAAO,QAAA,EAAU,IAAA,IAAQ,UAAA,CAAW;AAAA,WACtC;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,QACtD;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAEA,EAAA,OAAO,QAAA,CAAS,KAAK,MAAM,CAAA;AAC7B,CAAC,CAAA;;;AC3LD,IAAOC,qBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,KAAI,KAAM;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,GAAA,EAAK,GAAG,CAAA;AAC9C,IAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,MAAA,OAAO,UAAA;AAAA,IACT;AAGA,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAEzD,IAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,SAAA,EAAU;AAE3C,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA;AAAA,EAChC,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,sBAAA,EAAuB;AAAA,MACjD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;AChCD,IAAM,WAAA,GAAc,CAAC,OAAA,EAAS,MAAM,CAAA;AAsBpC,IAAOF,sBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,KAAI,KAAM;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,GAAA,EAAK,GAAG,CAAA;AAC9C,IAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,MAAA,OAAO,UAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAU,IAAA,GAAO,QAAO,GAAI,IAAA;AAE9C,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AAC1B,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,oCAAA,EAAqC;AAAA,QAC9C,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACtC,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,sEAAA,EAAuE;AAAA,QAChF,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,QAAA,CAAS,SAAS,EAAA,EAAI;AAC/C,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,8CAAA,EAA+C;AAAA,QACxD,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,wCAAA,EAAyC;AAAA,QAClD,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,WAAA,CAAY,QAAA,CAAS,IAAgB,CAAA,EAAG;AAC3C,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,8BAAA,EAAiC,YAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAG;AAAA,QACnE,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAGzD,IAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,iBAAA,CAAkB,QAAQ,CAAA;AAClE,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,yBAAA,EAA0B;AAAA,QACnC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,MAAM,YAAA,CAAa,QAAQ,CAAA;AAGjD,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,UAAA,CAAW;AAAA,MACzC,QAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACD,CAAA;AAGD,IAAA,OAAO,SAAS,IAAA,CAAK;AAAA,MACnB,IAAA,EAAM;AAAA,QACJ,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,YAAY,IAAA,CAAK;AAAA;AACnB,KACF,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACpB,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,uBAAA,EAAwB;AAAA,MAClD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;ACtGD,IAAO,gBAAA,GAAQ,iBAAiB,OAAO,EAAE,QAAQ,MAAA,EAAQ,OAAA,EAAS,aAAY,KAAM;AAClF,EAAA,MAAM,EAAE,MAAK,GAAI,MAAA;AAEjB,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,IAAI,CAAA,EAAG;AAC5B,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,mBAAkB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACpE;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,YAAiC,EAAC;AACxC,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,QACZ,WAAA,CAAY,GAAA,CAAI,OAAO,UAAA,KAAuB;AAC5C,UAAA,IAAI;AACF,YAAA,MAAMG,OAAAA,GAAS,QAAQ,UAAU,CAAA;AACjC,YAAA,IAAIA,OAAAA,EAAQ;AACV,cAAA,SAAA,CAAU,UAAU,CAAA,GAAI,MAAMA,OAAAA,EAAO;AAAA,YACvC;AAAA,UACF,SAAS,KAAA,EAAO;AAAA,UAEhB;AAAA,QACF,CAAC;AAAA,OACH;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,EAAO;AAGhC,IAAA,MAAM,WAAA,GAAc,SAAA,CAAU,UAAA,CAAW,KAAA,EAAO,MAAM,CAAA;AACtD,IAAA,MAAM,cAAc,UAAA,CAAW,KAAA,GAC3B,UAAU,UAAA,CAAW,KAAA,EAAO,MAAM,CAAA,GAClC,IAAA;AAEJ,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,IAAI,UAAA,CAAW,IAAA;AAAA,MACf,MAAM,UAAA,CAAW,IAAA;AAAA;AAAA,MAEjB,KAAA,EAAO,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,IAAA;AAAA,MACtC,IAAA,EAAM,WAAW,IAAA,IAAQ,UAAA;AAAA;AAAA,MAGzB,YAAA,EAAc,UAAA,CAAW,KAAA,EAAO,KAAA,IAAS,IAAA;AAAA,MACzC,mBAAA,EAAqB,WAAW,KAAA,EAAO,MAAA;AAAA,MACvC,wBAAA,EAA0B,WAAA,EAAa,IAAA,IAAQ,UAAA,CAAW,KAAA,EAAO,MAAA;AAAA,MACjE,yBACE,UAAA,CAAW,KAAA,EAAO,mBAAmB,KAAA,CAAA,GACjC,UAAA,CAAW,MAAM,cAAA,GACjB,IAAA;AAAA,MACN,gBAAA,EAAkB,UAAA,CAAW,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,MAChD,kCAAA,EACE,UAAA,CAAW,KAAA,EAAO,wBAAA,IAA4B,IAAA;AAAA,MAChD,gBAAA,EAAkB,UAAA,CAAW,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,MAChD,uBAAA,EACE,UAAA,CAAW,KAAA,EAAO,cAAA,IAAkB,IAAA;AAAA,MACtC,4BAAA,EACE,UAAA,CAAW,KAAA,EAAO,mBAAA,IAAuB,KAAA;AAAA;AAAA,MAG3C,YAAA,EAAc,UAAA,CAAW,KAAA,EAAO,KAAA,IAAS,IAAA;AAAA,MACzC,mBAAA,EAAqB,UAAA,CAAW,KAAA,EAAO,MAAA,IAAU,IAAA;AAAA,MACjD,wBAAA,EAA0B,WAAA,EAAa,IAAA,IAAQ,UAAA,CAAW,OAAO,MAAA,IAAU,IAAA;AAAA,MAC3E,yBACE,UAAA,CAAW,KAAA,EAAO,mBAAmB,KAAA,CAAA,GACjC,UAAA,CAAW,MAAM,cAAA,GACjB,IAAA;AAAA,MACN,gBAAA,EAAkB,UAAA,CAAW,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,MAChD,kCAAA,EACE,UAAA,CAAW,KAAA,EAAO,wBAAA,IAA4B,IAAA;AAAA,MAChD,gBAAA,EAAkB,UAAA,CAAW,KAAA,EAAO,QAAA,IAAY,IAAA;AAAA,MAChD,uBAAA,EACE,UAAA,CAAW,KAAA,EAAO,cAAA,IAAkB,IAAA;AAAA,MACtC,4BAAA,EACE,UAAA,CAAW,KAAA,EAAO,mBAAA,IAAuB,KAAA;AAAA;AAAA,MAG3C,iBAAA,EAAmB,WAAW,eAAA,IAAmB,IAAA;AAAA;AAAA,MAGjD,cAAA,EAAgB,WAAW,YAAA,IAAgB,KAAA;AAAA,MAC3C,gBAAA,EAAkB,WAAW,eAAA,IAAmB,IAAA;AAAA,MAEhD,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI;AAAA,KAC1C;AAEA,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA;AAAA,EAChC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACnD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAA,EAAG;AAAA,MACzC,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;ACzFD,IAAO,oBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,GAAA,EAAK,QAAO,KAAM;AAC9D,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,GAAA,EAAK,GAAG,CAAA;AAC7C,IAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,MAAA,OAAO,UAAA;AAAA,IACT;AAGA,IAAA,IAAI,UAAA,CAAW,aAAa,aAAA,EAAe;AACzC,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,wCAAA,EAAyC;AAAA,QAClD,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,MAAA,CAAO,EAAA;AACrB,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,wBAAA,EAAyB;AAAA,QAClC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAEzD,IAAA,MAAM,YAAA,CAAa,YAAA,CAAa,KAAA,EAAO,UAAA,CAAW,KAAK,EAAE,CAAA;AAEzD,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EACxC,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,0BAAA,EAA2B;AAAA,MACrD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;AC9CD,SAASF,cAAa,MAAA,EAAkB;AACtC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,IAAI,UAAU,OAAO,MAAA,KAAW,aAAa,WAAA,IAAe,MAAA,IAAU,UAAU,MAAA,CAAA,EAAS;AACvF,IAAA,OAAOH,CAAAA,CAAE,aAAa,MAAM,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,MAAA;AACT;AAOA,SAASM,wBAAuB,MAAA,EAA4C;AAC1E,EAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AAEpB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,IAAA,OAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,MAAA;AACT;AAWA,IAAOC,iBAAAA,GAAQ,iBAAiB,OAAO,EAAE,QAAQ,OAAA,EAAS,MAAA,EAAQ,YAAW,KAAM;AACjF,EAAA,MAAM,EAAE,MAAK,GAAI,MAAA;AAEjB,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,oBAAmB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACrE;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,WAAgC,EAAC;AACvC,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,QACZ,UAAA,CAAW,GAAA,CAAI,OAAO,SAAA,KAAsB;AAC1C,UAAA,IAAI;AACF,YAAA,MAAMF,OAAAA,GAAS,OAAO,SAAS,CAAA;AAC/B,YAAA,IAAIA,OAAAA,EAAQ;AACV,cAAA,QAAA,CAAS,SAAS,CAAA,GAAI,MAAMA,OAAAA,EAAO;AAAA,YACrC;AAAA,UACF,SAAS,KAAA,EAAO;AAAA,UAEhB;AAAA,QACF,CAAC;AAAA,OACH;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,QAAQ,IAAI,CAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,EAAO;AAChC,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAG1C,IAAA,MAAM,SAAS,UAAA,CAAW,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,KAAuC;AACjF,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAE5B,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,IAAA;AAAA,UACN,qBAAA,EAAuB,IAAA;AAAA,UACvB,kBAAA,EAAoB,IAAA;AAAA,UACpB,cAAA,EAAgB,IAAA;AAAA,UAChB,0BAAA,EAA4B;AAAA,SAC9B;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,qBAAA,EAAuB,IAAA,CAAK,mBAAA,KAAwB,KAAA,CAAA,GAAY,KAAK,mBAAA,GAAsB,IAAA;AAAA,QAC3F,kBAAA,EAAoB,IAAA,CAAK,gBAAA,KAAqB,KAAA,CAAA,GAAY,KAAK,gBAAA,GAAmB,IAAA;AAAA,QAClF,cAAA,EAAgB,IAAA,CAAK,aAAA,KAAkB,KAAA,CAAA,GAAY,KAAK,aAAA,GAAgB,IAAA;AAAA,QACxE,0BAAA,EAA4B,KAAK,uBAAA,IAA2B;AAAA,OAC9D;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,IAAI,UAAA,CAAW,IAAA;AAAA,MACf,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,kBAAkB,UAAA,CAAW,eAAA;AAAA,MAC7B,MAAA,EAAQC,uBAAAA,CAAuB,UAAA,CAAW,MAAM,CAAA;AAAA,MAChD,eAAA,EAAiBH,aAAAA,CAAa,UAAA,CAAW,cAAc,CAAA;AAAA,MACvD,UAAU,UAAA,CAAW,KAAA;AAAA,MACrB,UAAA,EAAY,QAAA,EAAU,IAAA,IAAQ,UAAA,CAAW,KAAA;AAAA,MACzC,cAAA,EAAgB,UAAU,QAAA,IAAY,SAAA;AAAA,MACtC,YAAA,EAAc,WAAW,WAAA,IAAe,KAAA;AAAA,MACxC,kBAAA,EAAoB,WAAW,gBAAA,IAAoB,KAAA;AAAA,MACnD,mBAAA,EAAqB,WAAW,iBAAA,IAAqB,KAAA;AAAA,MACrD,WAAA,EAAa,WAAW,UAAA,IAAc,MAAA;AAAA,MACtC,KAAA;AAAA,MACA,SAAA,EAAW,WAAW,SAAA,IAAa,IAAA;AAAA,MACnC,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI;AAAA,KAC1C;AAEA,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA;AAAA,EACjC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACpD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,CAAA,sBAAA,EAAyB,KAAK,CAAA,CAAA,EAAG;AAAA,MAC1C,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;AC9EM,SAAS,eAAA,CACd,MACA,MAAA,EACS;AAET,EAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAIA,EAAA,IAAI,MAAA,CAAO,YAAY,IAAA,EAAM;AAC3B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,CAAO,OAAA,KAAY,IAAA,CAAK,IAAA,CAAK,EAAA;AACtC;;;AClCA,IAAOK,qBAAQ,gBAAA,CAAsB,OAAO,EAAE,GAAA,EAAK,GAAA,EAAK,QAAO,KAAM;AAEnE,EAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,GAAA,EAAK,GAAG,CAAA;AAC7C,EAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,UAAA;AAEb,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AAExB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,qBAAoB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACtE;AAGA,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAGzD,EAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAEpD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,MACzC,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,EAAM,MAAM,CAAA,EAAG;AAClC,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,OAAO,iDAAA,EAAkD;AAAA,MAC3D,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,YAAA,CAAa,aAAa,QAAQ,CAAA;AAGxC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAGnD,IAAA,MAAM,KAAK,YAAA,EAAa;AAExB,IAAA,OAAO,SAAS,IAAA,CAAK;AAAA,MACnB,OAAA,EAAS,IAAA;AAAA,MACT,QAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAEzD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd;AAAA,QACE,KAAA,EAAO,MAAM,OAAA,IAAW,yBAAA;AAAA,QACxB;AAAA,OACF;AAAA,MACA,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;ACrED,IAAO,mBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,GAAA,EAAK,QAAO,KAAM;AAC9D,EAAA,IAAI,GAAA,CAAI,WAAW,OAAA,EAAS;AAC1B,IAAA,OAAO,IAAI,QAAA,CAAS,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC3D;AAGA,EAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,GAAA,EAAK,GAAG,CAAA;AAC7C,EAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,UAAA;AAEb,EAAA,MAAM,WAAW,MAAA,EAAQ,EAAA;AAEzB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,IAAA;AAG3B,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAGzD,IAAA,MAAM,cAAA,GAAiB,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAC5D,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,QACzC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,EAAM,cAAc,CAAA,EAAG;AAC1C,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,iDAAA,EAAkD;AAAA,QAC3D,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,UAA+B,EAAC;AAEtC,IAAA,IAAI,SAAS,KAAA,CAAA,EAAW;AACtB,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,UACd,EAAE,OAAO,kCAAA,EAAmC;AAAA,UAC5C,EAAE,QAAQ,GAAA;AAAI,SAChB;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,KAAK,KAAA,CAAM,CAAC,QAAQ,OAAO,GAAA,KAAQ,QAAQ,CAAA,EAAG;AACjD,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,UACd,EAAE,OAAO,0BAAA,EAA2B;AAAA,UACpC,EAAE,QAAQ,GAAA;AAAI,SAChB;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,IAAA,GAAO,IAAA;AAAA,IACjB;AAEA,IAAA,IAAI,aAAa,KAAA,CAAA,EAAW;AAC1B,MAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,UACd,EAAE,OAAO,2BAAA,EAA4B;AAAA,UACrC,EAAE,QAAQ,GAAA;AAAI,SAChB;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAEnD,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAC9C,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,OAAO,QAAA,CAAS,IAAA;AAAA,YACd,EAAE,KAAA,EAAO,CAAA,iBAAA,EAAoB,QAAQ,CAAA,CAAA,EAAG;AAAA,YACxC,EAAE,QAAQ,GAAA;AAAI,WAChB;AAAA,QACF;AAEA,QAAA,IAAI,QAAA,CAAS,SAAS,UAAA,EAAY;AAChC,UAAA,OAAO,QAAA,CAAS,IAAA;AAAA,YACd,EAAE,OAAO,iDAAA,EAAkD;AAAA,YAC3D,EAAE,QAAQ,GAAA;AAAI,WAChB;AAAA,QACF;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,UACd,EAAE,KAAA,EAAO,CAAA,iBAAA,EAAoB,QAAQ,CAAA,CAAA,EAAG;AAAA,UACxC,EAAE,QAAQ,GAAA;AAAI,SAChB;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,UAAA,GAAa,QAAA;AAAA,IACvB;AAEA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,WAAW,CAAA,EAAG;AACrC,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,2BAAA,EAA4B;AAAA,QACrC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB,MAAM,YAAA,CAAa,YAAA,CAAa,UAAU,OAAO,CAAA;AAEvE,IAAA,OAAO,SAAS,IAAA,CAAK;AAAA,MACnB,IAAI,aAAA,CAAc,EAAA;AAAA,MAClB,UAAU,aAAA,CAAc,UAAA;AAAA;AAAA,MACxB,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,IAAA,EAAM,aAAA,CAAc,IAAA,IAAQ,EAAC;AAAA,MAC7B,YAAY,aAAA,CAAc;AAAA,KAC3B,CAAA;AAAA,EACH,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,yBAAA,EAA0B;AAAA,MACpD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;ACrID,SAASC,eAAAA,CAAe,MAA0B,MAAA,EAAoC;AACpF,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAElB,EAAA,IAAI,KAAK,UAAA,CAAW,SAAS,KAAK,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,EACzB;AAEA,EAAA,OAAO,IAAA;AACT;AAcA,IAAO,aAAQ,gBAAA,CAAsB,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAI,KAAM;AAEnE,EAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,GAAA,EAAK,GAAG,CAAA;AAC7C,EAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,UAAA;AAEb,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AAExB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAEpD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,QACzC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,EAAM,MAAM,CAAA,EAAG;AAClC,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,iDAAA,EAAkD;AAAA,QAC3D,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAGnD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAEhD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,QACzC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,CAAE,MAAA;AAChC,MAAA,MAAA,CAAO,MAAM,IAAA,GAAOA,eAAAA,CAAe,MAAA,CAAO,KAAA,CAAM,MAAM,MAAM,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,EAC7B,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACzD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,wBAAA,EAAyB;AAAA,MACnD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;AC5FD,SAASN,cAAa,MAAA,EAAkB;AACtC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI;AAEF,IAAA,IAAI,UAAU,OAAO,MAAA,KAAW,aAAa,WAAA,IAAe,MAAA,IAAU,OAAO,IAAA,CAAA,EAAO;AAClF,MAAA,OAAOH,CAAAA,CAAE,aAAa,MAAM,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAWA,IAAOO,oBAAQ,gBAAA,CAAiB,OAAO,EAAE,MAAA,EAAQ,OAAM,KAAM;AAC3D,EAAA,MAAM,EAAE,MAAK,GAAI,MAAA;AAEjB,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,IAAI,CAAA,EAAG;AAC1B,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,kBAAiB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACnE;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAI,CAAA;AACzB,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,EAAO;AAGhC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,IAAK,OAAO,UAAA,CAAW,CAAC,CAAA,KAAM,QAAA,IAAY,UAAA,CAAW,CAAC,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,EAAG;AACrG,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,IAAA;AAAA,QACA,WAAA,EAAa,EAAA;AAAA,QACb,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,IAAA;AAAA,QACV,KAAA,EAAO,WAAW,CAAC;AAAA,OACpB,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,CAAC,WAAA,EAAa,MAAM,CAAA,GAAI,UAAA;AAE9B,IAAA,OAAO,SAAS,IAAA,CAAK;AAAA,MACnB,IAAA;AAAA,MACA,aAAa,WAAA,IAAe,EAAA;AAAA,MAC5B,MAAA,EAAQJ,cAAa,MAAM,CAAA;AAAA,MAC3B,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAClD,IAAA,OAAO,SAAS,IAAA,CAAK;AAAA,MACnB,IAAA;AAAA,MACA,WAAA,EAAa,EAAA;AAAA,MACb,MAAA,EAAQ,IAAA;AAAA,MACR,QAAA,EAAU,IAAA;AAAA,MACV,KAAA,EAAO,uBAAuB,KAAK,CAAA;AAAA,KACpC,CAAA;AAAA,EACH;AACF,CAAC,CAAA;;;ACrDD,IAAOK,qBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,GAAA,EAAK,QAAO,KAAM;AAC9D,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,GAAA,EAAK,GAAG,CAAA;AAC9C,IAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,MAAA,OAAO,UAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAE,IAAG,GAAI,MAAA;AAEf,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,uBAAsB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACxE;AAGA,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAGzD,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,WAAA,CAAY,EAAE,CAAA;AAC9C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,kBAAiB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,YAAA,CAAa,WAAW,EAAE,CAAA;AAEhC,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EACxC,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,uBAAA,EAAwB;AAAA,MAClD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;AC1BD,IAAO,iBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,GAAA,EAAK,QAAO,KAAM;AAC9D,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,GAAA,EAAK,GAAG,CAAA;AAC9C,IAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,MAAA,OAAO,UAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAE,IAAG,GAAI,MAAA;AAEf,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,uBAAsB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACxE;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAU,IAAA,EAAK,GAAI,IAAA;AAGrC,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAGzD,IAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,WAAA,CAAY,EAAE,CAAA;AACtD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,kBAAiB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACnE;AAGA,IAAA,IAAI,QAAA,IAAY,QAAA,KAAa,YAAA,CAAa,QAAA,EAAU;AAClD,MAAA,MAAM,gBAAA,GAAmB,MAAM,YAAA,CAAa,iBAAA,CAAkB,QAAQ,CAAA;AACtE,MAAA,IAAI,gBAAA,IAAoB,gBAAA,CAAiB,EAAA,KAAO,EAAA,EAAI;AAClD,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,UACd,EAAE,OAAO,wBAAA,EAAyB;AAAA,UAClC,EAAE,QAAQ,GAAA;AAAI,SAChB;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,eAIF,EAAC;AAEL,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,YAAA,CAAa,QAAA,GAAW,QAAA;AAAA,IAC1B;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,YAAA,CAAa,aAAA,GAAgB,MAAM,YAAA,CAAa,QAAQ,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,YAAA,CAAa,IAAA,GAAO,IAAA;AAAA,IACtB;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,UAAA,CAAW,IAAI,YAAY,CAAA;AAElE,IAAA,OAAO,SAAS,IAAA,CAAK;AAAA,MACnB,IAAA,EAAM;AAAA,QACJ,IAAI,WAAA,CAAY,EAAA;AAAA,QAChB,UAAU,WAAA,CAAY,QAAA;AAAA,QACtB,MAAM,WAAA,CAAY,IAAA;AAAA,QAClB,YAAY,WAAA,CAAY,UAAA;AAAA,QACxB,YAAY,WAAA,CAAY;AAAA;AAC1B,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,uBAAA,EAAwB;AAAA,MAClD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;AC1FD,IAAOE,mBAAAA,GAAQ,gBAAA,CAAiB,OAAO,EAAE,KAAI,KAAM;AAEjD,EAAA,MAAM,gBAAA,GAAmB,CAAC,EAAE,GAAA,CAAI,oBAAoB,GAAA,CAAI,oBAAA,CAAA;AACxD,EAAA,MAAM,gBAAA,GAAmB,CAAC,EAAE,GAAA,CAAI,oBAAoB,GAAA,CAAI,oBAAA,CAAA;AAExD,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,gBAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AACF,CAAC,CAAA;;;ACQD,IAAO,qBAAQ,gBAAA,CAAsB,OAAO,EAAE,GAAA,EAAK,KAAI,KAAM;AAC3D,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,IAAA;AAE/B,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,sBAAA,EAAuB;AAAA,QAChC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,IAAI,IAAI,oBAAA,IAAwB,QAAA,KAAa,OAAA,IAAW,QAAA,KAAa,IAAI,oBAAA,EAAsB;AAE7F,MAAA,IAAI,CAAC,IAAI,cAAA,EAAgB;AACvB,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,UACd,EAAE,OAAO,+DAAA,EAAgE;AAAA,UACzE,EAAE,QAAQ,GAAA;AAAI,SAChB;AAAA,MACF;AAEA,MAAA,MAAMC,MAAAA,GAAQ,MAAM,uBAAA,CAAwB,GAAA,CAAI,cAAc,CAAA;AAE9D,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,KAAA,EAAAA,MAAAA;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,EAAA,EAAI,aAAA;AAAA,UACJ,QAAA,EAAU,OAAA;AAAA,UACV,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,sBAAA,EAAuB;AAAA,QAChC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAGzD,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,iBAAA,CAAkB,QAAQ,CAAA;AAE1D,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,8BAAA,EAA+B;AAAA,QACxC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,QAAA,EAAU,KAAK,aAAa,CAAA;AAEjE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,8BAAA,EAA+B;AAAA,QACxC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,QAAQ,iBAAA,EAAkB;AAChC,IAAA,MAAM,SAAA,GAAY,MAAM,SAAA,CAAU,KAAK,CAAA;AAGvC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AACjE,IAAA,MAAM,aAAa,aAAA,CAAc;AAAA,MAC/B,SAAS,IAAA,CAAK,EAAA;AAAA,MACd,UAAA,EAAY,SAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACb,CAAA;AAED,IAAA,OAAO,SAAS,IAAA,CAAK;AAAA,MACnB,KAAA;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,MAAM,IAAA,CAAK;AAAA;AACb,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,gBAAgB,KAAK,CAAA;AACnC,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,cAAA,EAAe;AAAA,MACzC,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;ACrGD,IAAO,sBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,KAAI,KAAM;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA;AAElD,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,CAAW,UAAA,CAAW,SAAS,CAAA,EAAG;AACpD,MAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,gBAAe,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,SAAA,CAAU,CAAC,CAAA;AAGpC,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAEvB,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,IACxC;AAGA,IAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,MAAA,MAAM,SAAA,GAAY,MAAM,SAAA,CAAU,KAAK,CAAA;AAGvC,MAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,MAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AAEzD,MAAA,MAAM,YAAA,CAAa,cAAc,SAAS,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EACxC,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,iBAAiB,KAAK,CAAA;AACpC,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,eAAA,EAAgB;AAAA,MAC1C,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;ACnCD,IAAO,iBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,KAAI,KAAM;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,GAAA,EAAK,GAAG,CAAA;AAE/C,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,gBAAe,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACjE;AAEA,IAAA,OAAO,SAAS,IAAA,CAAK;AAAA,MACnB,MAAM,WAAA,CAAY,IAAA;AAAA,MAClB,UAAU,WAAA,CAAY;AAAA,KACvB,CAAA;AAAA,EACH,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,6BAAA,EAA8B;AAAA,MACxD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;AC7BD,IAAM,gBAAA,GAeF;AAAA,EACF,MAAA,EAAQ;AAAA,IACN,GAAA,EAAK,QAAA;AAAA,IACL,cAAA,EAAgB,kCAAA;AAAA,IAChB,MAAA,EAAQ,gBAAA;AAAA,IACR,OAAA,EAAS,CAAC,MAAA,MAAY;AAAA,MACpB,aAAA,EAAe,UAAU,MAAM,CAAA;AAAA,KACjC,CAAA;AAAA,IACA,aAAA,EAAe,CAAC,IAAA,KAAS;AAEvB,MAAA,MAAM,iBAAA,GAAoB;AAAA,QACxB,OAAA;AAAA,QACA,SAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO,IAAA,CAAK,IAAA,CACT,MAAA,CAAO,CAAC,KAAA,KAAe;AACtB,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,CAAG,WAAA,EAAY;AAChC,QAAA,OAAO,kBAAkB,IAAA,CAAK,CAAC,WAAW,EAAA,CAAG,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,MACjE,CAAC,CAAA,CACA,GAAA,CAAI,CAAC,KAAA,MAAgB;AAAA,QACpB,OAAO,KAAA,CAAM,EAAA;AAAA,QACb,OAAO,KAAA,CAAM,EAAA;AAAA,QACb,WAAA,EAAa,CAAA,SAAA,EAAY,KAAA,CAAM,QAAQ,CAAA,CAAA;AAAA,QACvC,MAAA,EAAQ;AAAA,OACV,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,CAAA,EAAQ,CAAA,KAAW,CAAA,CAAE,KAAA,CAAM,aAAA,CAAc,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAC5D;AAAA,GACF;AAAA,EACA,UAAA,EAAY;AAAA,IACV,GAAA,EAAK,YAAA;AAAA,IACL,cAAA,EAAgB,qCAAA;AAAA,IAChB,MAAA,EAAQ,oBAAA;AAAA,IACR,OAAA,EAAS,OAAO,EAAC,CAAA;AAAA;AAAA,IACjB,aAAA,EAAe,CAAC,IAAA,KAAS;AACvB,MAAA,OAAO,IAAA,CAAK,IAAA,CACT,GAAA,CAAI,CAAC,KAAA,MAAgB;AAAA,QACpB,OAAO,KAAA,CAAM,EAAA;AAAA,QACb,KAAA,EAAO,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,EAAA;AAAA,QAC3B,WAAA,EAAa,KAAA,CAAM,WAAA,EAAa,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,IAAK,KAAA,CAAM,WAAA,EAAa,MAAA,GAAS,GAAA,GAAM,KAAA,GAAQ,EAAA,CAAA,IAAO,EAAA;AAAA,QAClG,IAAA,EAAM,KAAA,CAAM,cAAA,IAAkB,KAAA,CAAM,EAAA;AAAA,QACpC,QAAQ,KAAA,CAAM,EAAA,CAAG,KAAA,CAAM,GAAG,EAAE,CAAC;AAAA;AAAA,OAC/B,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,CAAA,EAAQ,CAAA,KAAW,CAAA,CAAE,KAAA,CAAM,aAAA,CAAc,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAC5D;AAAA;AAEJ,CAAA;AAgBA,IAAO,yBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,KAAI,KAAM;AACtD,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC9C,EAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,wBAAuB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACzE;AAEA,EAAA,MAAM,MAAA,GAAS,iBAAiB,QAAQ,CAAA;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,aAAA,EAAgB,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAG;AAAA,MACjG,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA;AAGhC,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,GAAA,KAAQ,YAAA,EAAc;AAC1C,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,CAAA,2BAAA,EAA8B,QAAQ,CAAA,MAAA,EAAS,MAAA,CAAO,MAAM,CAAA,sBAAA,CAAA,EAAyB;AAAA,MAC9F,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,cAAA,EAAgB;AAAA,MAClD,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAG,MAAA,CAAO,OAAA,CAAQ,MAAA,IAAU,EAAE;AAAA;AAChC,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,EAA+B,QAAQ,CAAA,CAAA,CAAA,EAAK,SAAS,CAAA;AACnE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,4BAAA,EAA+B,QAAQ,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAA,EAAG;AAAA,QAC3E,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA;AAAO,OAC5B;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,aAAA,CAAc,IAAI,CAAA;AAExC,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA;AAAA,EACjC,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC9D,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,CAAA,wBAAA,EAA2B,KAAA,CAAM,OAAO,CAAA,CAAA,EAAG;AAAA,MACpD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;AC1HD,IAAO,yBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,KAAI,KAAM;AACtD,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC9C,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAU,GAAI,IAAA;AAEhC,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,SAAA,EAAW;AAC3B,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,OAAO,qCAAA,EAAsC;AAAA,MAC/C,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAGA,EAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,OAAO,sDAAA,EAAuD;AAAA,MAChE,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAIA,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,OAAA,CAAQ,GAAG,CAAA;AACxC,EAAA,IAAI,eAAe,EAAA,EAAI;AACrB,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,CAAA,2BAAA,EAA8B,SAAS,CAAA,oCAAA,CAAA,EAAuC;AAAA,MACvF,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,UAAU,CAAA;AAChD,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,SAAA,CAAU,UAAA,GAAa,CAAC,CAAA;AAE/C,EAAA,IAAI;AAGF,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,uCAAuC,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,UAAA,CAAA,EAAc;AAAA,MAC9F,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA;AAClB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,UACd,EAAE,KAAA,EAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,EAAG;AAAA,UACzC,EAAE,QAAQ,GAAA;AAAI,SAChB;AAAA,MACF;AACA,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,OAAA,CAAQ,KAAA,CAAM,8CAA8C,SAAS,CAAA;AACrE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,2BAAA,EAA8B,QAAA,CAAS,UAAU,CAAA,CAAA,EAAG;AAAA,QAC7D,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA;AAAO,OAC5B;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAGjC,IAAA,MAAM,SAAA,GAAY,yBAAyB,IAAI,CAAA;AAE/C,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,SAAA,EAAW,CAAA;AAAA,EACpC,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,6BAAA,EAAgC,SAAS,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACjE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,CAAA,2BAAA,EAA8B,KAAA,CAAM,OAAO,CAAA,CAAA,EAAG;AAAA,MACvD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;AAKD,SAAS,yBAAyB,IAAA,EAO/B;AAED,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,IAAQ,IAAA;AAC3B,EAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,SAAA,IAAa,EAAC;AAE3C,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,IAAK,cAAA,CAAe,WAAW,CAAA,EAAG;AACjE,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO,cAAA,CAAe,GAAA,CAAI,CAAC,QAAA,MAAmB;AAAA;AAAA,IAE5C,EAAA,EAAI,QAAA,CAAS,GAAA,IAAO,QAAA,CAAS,iBAAiB,QAAA,CAAS,IAAA;AAAA,IACvD,IAAA,EAAM,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,iBAAiB,QAAA,CAAS,GAAA;AAAA,IAC1D,OAAA,EAAS;AAAA;AAAA,MAEP,MAAA,EAAQ,UAAA,CAAW,QAAA,CAAS,OAAA,EAAS,MAAM,CAAA,IAAK,CAAA;AAAA,MAChD,UAAA,EAAY,UAAA,CAAW,QAAA,CAAS,OAAA,EAAS,UAAU,CAAA,IAAK;AAAA,KAC1D;AAAA,IACA,cAAc,QAAA,CAAS,YAAA;AAAA,IACvB,eAAA,EAAiB,QAAA,CAAS,iBAAA,IAAqB,QAAA,CAAS,cAAA;AAAA,IACxD,qBAAqB,QAAA,CAAS;AAAA,GAChC,CAAE,CAAA;AACJ;;;AC1GA,IAAO,mBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAI,KAAM;AAC9D,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AAExB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAEpD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,QACzC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAGnD,IAAA,MAAM,aAAa,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAO,GAAG,KAAK,CAAA;AACrD,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,IAAQ,EAAC;AAGjC,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,MAAM,aAGF,EAAC;AAGL,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AAEvC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,OAAO,GAAA,CAAI,UAAA;AACjB,MAAA,IAAI,SAAS,IAAA,IAAQ,IAAA,KAAS,UAAa,CAAC,KAAA,CAAM,IAAI,CAAA,EAAG;AACvD,QAAA,SAAA,IAAa,IAAA;AAGb,QAAA,IAAI,IAAI,UAAA,EAAY;AAClB,UAAA,cAAA,CAAe,GAAA,CAAI,IAAI,UAAU,CAAA;AAAA,QACnC;AAGA,QAAA,MAAM,QAAA,GAAW,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,KAAA,IAAS,SAAA;AAChD,QAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,UAAA,UAAA,CAAW,QAAQ,CAAA,GAAI;AAAA,YACrB,SAAA,EAAW,CAAA;AAAA,YACX,KAAA,EAAO;AAAA,WACT;AAAA,QACF;AACA,QAAA,UAAA,CAAW,QAAQ,EAAE,SAAA,IAAa,IAAA;AAClC,QAAA,UAAA,CAAW,QAAQ,EAAE,KAAA,IAAS,CAAA;AAAA,MAChC;AAAA,IACF;AAGA,IAAA,MAAM,eAAe,cAAA,CAAe,IAAA;AACpC,IAAA,MAAM,iBAAA,GAAoB,YAAA,GAAe,CAAA,GAAI,SAAA,GAAY,YAAA,GAAe,CAAA;AAGxE,IAAA,MAAM,2BAGF,EAAC;AAEL,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC1D,MAAA,wBAAA,CAAyB,SAAS,CAAA,GAAI;AAAA,QACpC,SAAS,IAAA,CAAK,KAAA,GAAQ,IAAI,IAAA,CAAK,SAAA,GAAY,KAAK,KAAA,GAAQ,CAAA;AAAA,QACxD,cAAc,IAAA,CAAK;AAAA,OACrB;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,IAAI,CAAC,CAAC,SAAA,EAAW,IAAI,CAAA,MAAO;AAAA,MAC5E,SAAA;AAAA,MACA,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,cAAc,IAAA,CAAK,KAAA;AAAA,MACnB,mBAAmB,IAAA,CAAK,KAAA,GAAQ,IAAI,IAAA,CAAK,SAAA,GAAY,KAAK,KAAA,GAAQ;AAAA,KACpE,CAAE,CAAA;AAEF,IAAA,OAAO,SAAS,IAAA,CAAK;AAAA,MACnB,SAAA;AAAA,MACA,YAAA;AAAA,MACA,iBAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACrE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,2BAAA,EAA4B;AAAA,MACtD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;ACzGD,IAAO,aAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAI,KAAM;AAC9D,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AAExB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,GAAA,CAAI,WAAW,KAAA,EAAO;AACxB,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,CAAA,OAAA,EAAU,GAAA,CAAI,MAAM,CAAA,YAAA,CAAA,EAAe;AAAA,MAC5C,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAE3B,EAAA,IAAI;AAEF,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAGnD,IAAA,IAAI,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA,EAAG;AACjC,MAAA,MAAMjB,OAAAA,GAAS,MAAM,IAAA,CAAK,YAAA,EAAa;AACvC,MAAA,IAAI,CAACA,QAAO,OAAA,EAAS;AACnB,QAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAOA,OAAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,MAC/D;AACA,MAAA,OAAO,QAAA,CAAS,IAAA,CAAKA,OAAAA,CAAO,KAAK,CAAA;AAAA,IACnC;AAGA,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AAC/C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,IAAK,KAAA,CAAA;AAC7C,MAAA,MAAM,KAAA,GAAQ,SAAS,GAAA,CAAI,YAAA,CAAa,IAAI,OAAO,CAAA,IAAK,OAAO,EAAE,CAAA;AAEjE,MAAA,MAAMA,OAAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,aAAa,EAAE,IAAA,EAAM,OAAO,CAAA;AAChE,MAAA,IAAI,CAACA,QAAO,OAAA,EAAS;AACnB,QAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAOA,OAAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,MAC/D;AACA,MAAA,OAAO,QAAA,CAAS,KAAK,EAAE,OAAA,EAASA,QAAO,OAAA,EAAS,OAAA,EAAS,aAAa,CAAA;AAAA,IACxE;AAGA,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AAC/C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AACxC,MAAA,MAAM,KAAA,GAAQ,SAAS,GAAA,CAAI,YAAA,CAAa,IAAI,OAAO,CAAA,IAAK,OAAO,EAAE,CAAA;AAEjE,MAAA,MAAMA,OAAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa;AAAA,QAC/C,MAAM,IAAA,IAAQ,KAAA;AAAA,QACd;AAAA,OACD,CAAA;AACD,MAAA,IAAI,CAACA,QAAO,OAAA,EAAS;AACnB,QAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAOA,OAAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,MAC/D;AACA,MAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAOA,QAAO,KAAA,EAAO,OAAA,EAAS,aAAa,CAAA;AAAA,IACpE;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AACzC,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,OAAO,KAAA,EAAO,IAAA,EAAM,KAAK,CAAA;AAAA,EACzD,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAAmC,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACnE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,uBAAA,EAAwB;AAAA,MAClD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;AClED,IAAO,mBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAI,KAAM;AAC9D,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AAExB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAEpD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,QACzC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,SAAS,GAAA,CAAI,YAAA,CAAa,IAAI,OAAO,CAAA,IAAK,OAAO,EAAE,CAAA;AACjE,IAAA,MAAM,MAAA,GAAS,SAAS,GAAA,CAAI,YAAA,CAAa,IAAI,QAAQ,CAAA,IAAK,KAAK,EAAE,CAAA;AACjE,IAAA,MAAM,QAAQ,GAAA,CAAI,YAAA,CAAa,IAAI,OAAO,CAAA,KAAM,SAAS,MAAA,GAAS,KAAA;AAGlE,IAAA,IAAI,IAAI,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG,WAAA,OAAkB,WAAA,EAAa;AAC7D,MAAA,MAAMkB,UAAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,MAAA,MAAMC,KAAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAID,UAAS,CAAA;AAEnD,MAAA,OAAO,MAAMC,KAAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,IAC7B;AAGA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAGnD,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,QAAQ,KAAK,CAAA;AAEtD,IAAA,OAAO,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,EAC7B,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAClE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,sBAAA,EAAuB;AAAA,MACjD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;AC1BD,IAAO,uBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAI,KAAM;AAC9D,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AAExB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAEpD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,QACzC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,SAAS,GAAA,CAAI,YAAA,CAAa,IAAI,OAAO,CAAA,IAAK,OAAO,EAAE,CAAA;AACjE,IAAA,MAAM,MAAA,GAAS,SAAS,GAAA,CAAI,YAAA,CAAa,IAAI,QAAQ,CAAA,IAAK,KAAK,EAAE,CAAA;AACjE,IAAA,MAAM,QAAQ,GAAA,CAAI,YAAA,CAAa,IAAI,OAAO,CAAA,KAAM,QAAQ,KAAA,GAAQ,MAAA;AAChE,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,eAAe,CAAA,KAAM,MAAA;AAChE,IAAA,MAAM,QAAA,GAAW,SAAS,GAAA,CAAI,YAAA,CAAa,IAAI,OAAO,CAAA,IAAK,KAAK,EAAE,CAAA;AAGlE,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAGnD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA;AAAA,MACxB,KAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,EAC7B,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mCAAA,EAAsC,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACtE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,0BAAA,EAA2B;AAAA,MACrD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;ACrFD,SAAS,eAAA,CAAgB,YAAoB,QAAA,EAA2B;AAEtE,EAAA,MAAM,aAAa,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,IAAI,CAAC,CAAA;AACtD,EAAA,MAAM,QAAA,GAAW,IAAI,IAAA,GAAO,IAAA;AAG5B,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,QAAA,KAAa,YAAA,IAAgB,QAAA,KAAa,WAAA,EAAa;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AA+CA,IAAO,wBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAI,KAAM;AAC9D,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AAExB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAEpD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,QACzC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,IAAA,MAAM,EAAE,OAAA,GAAU,EAAA,EAAI,IAAA,EAAM,WAAA,EAAa,QAAO,GAAI,IAAA;AAGpD,IAAA,MAAM,UAAA,GAAa,WAAW,OAAO,OAAA,KAAY,YAAY,OAAA,CAAQ,IAAA,GAAO,MAAA,GAAS,CAAA;AACrF,IAAA,MAAM,iBAAiB,WAAA,IAAe,KAAA,CAAM,QAAQ,WAAW,CAAA,IAAK,YAAY,MAAA,GAAS,CAAA;AAEzF,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,cAAA,EAAgB;AAClC,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,yCAAA,EAA0C;AAAA,QACnD,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAGnD,IAAA,IAAI,cAAA;AAEJ,IAAA,IAAI,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACzC,MAAA,cAAA,GAAiB,EAAC;AAElB,MAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AAEpC,QAAA,MAAM,YAAA,GAAe,OAAO,UAAA,EAAW;AACvC,QAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,QAAA,IAAI,WAAW,UAAA,CAAW,IAAA;AAC1B,QAAA,IAAI,WAAW,UAAA,CAAW,QAAA;AAC1B,QAAA,IAAI,QAAQ,UAAA,CAAW,KAAA;AACvB,QAAA,IAAI,SAAS,UAAA,CAAW,MAAA;AAIxB,QAAA,IAAI,SAAS,UAAA,CAAW,QAAQ,KAAK,eAAA,CAAgB,QAAA,EAAU,QAAQ,CAAA,EAAG;AACxE,UAAA,IAAI;AACF,YAAA,MAAM,eAAe,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,IAAI,CAAC,CAAA;AACtD,YAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,YAAA,CAAa,UAAU,QAAQ,CAAA;AAE5D,YAAA,IAAI,SAAA,CAAU,OAAA,IAAW,SAAA,CAAU,IAAA,EAAM;AACvC,cAAA,QAAA,GAAW,SAAA,CAAU,IAAA;AACrB,cAAA,QAAA,GAAW,SAAA,CAAU,QAAA;AACrB,cAAA,KAAA,GAAQ,SAAA,CAAU,KAAA;AAClB,cAAA,MAAA,GAAS,SAAA,CAAU,MAAA;AAEnB,cAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,IAAI,CAAC,CAAA;AACjD,cAAA,OAAA,CAAQ,GAAA;AAAA,gBACN,CAAA,6BAAA,EAAgC,UAAA,CAAW,IAAI,CAAA,EAAA,EAAA,CAC3C,YAAA,GAAe,OAAO,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,UAAA,EAAA,CAAS,OAAA,GAAU,OAAO,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,EACjF,SAAA,CAAU,KAAK,CAAA,CAAA,EAAI,SAAA,CAAU,MAAM,CAAA,EAAA,EAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,eAC/D;AAAA,YACF,CAAA,MAAO;AACL,cAAA,OAAA,CAAQ,MAAM,CAAA,qCAAA,EAAwC,UAAA,CAAW,IAAI,CAAA,CAAA,CAAA,EAAK,UAAU,KAAK,CAAA;AAAA,YAE3F;AAAA,UACF,SAAS,GAAA,EAAK;AACZ,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qCAAA,EAAwC,UAAA,CAAW,IAAI,KAAK,GAAG,CAAA;AAAA,UAE/E;AAAA,QACF;AAGA,QAAA,MAAM,GAAA,GAAM,QAAA,KAAa,WAAA,GAAc,KAAA,GAC3B,QAAA,KAAa,YAAA,GAAe,KAAA,GAC5B,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,KAAA;AAChD,QAAA,MAAM,OAAO,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAA,EAAI,YAAY,IAAI,GAAG,CAAA,CAAA;AAG7D,QAAA,MAAM,aAAa,QAAA,CAAS,MAAA;AAC5B,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,UAAA,GAAa,IAAI,CAAC,CAAA;AAC/C,QAAA,OAAA,CAAQ,GAAA,CAAI,uBAAuB,UAAA,CAAW,IAAI,MAAM,UAAA,GAAa,IAAA,GAAO,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,WAAA,EAAA,CAAe,UAAA,GAAa,OAAO,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAE,CAAA;AAEtK,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA;AAAA,UACxB,IAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,YACE,WAAW,UAAA,CAAW,SAAA;AAAA,YACtB,KAAA;AAAA,YACA;AAAA;AACF,SACF;AAEA,QAAA,OAAA,CAAQ,IAAI,CAAA,mBAAA,CAAA,EAAuB,MAAA,CAAO,OAAA,GAAU,SAAA,GAAY,OAAO,KAAK,CAAA;AAE5E,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAA,CAAQ,MAAM,CAAA,2BAAA,EAA8B,UAAA,CAAW,IAAI,CAAA,CAAA,CAAA,EAAK,OAAO,KAAK,CAAA;AAC5E,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,GAAA,GAAqB;AAAA,UACzB,EAAA,EAAI,YAAA;AAAA,UACJ,IAAA,EAAM,MAAA;AAAA,UACN,IAAA;AAAA,UACA,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB;AAAA,SACF;AAEA,QAAA,IAAI,KAAA,MAAW,KAAA,GAAQ,KAAA;AACvB,QAAA,IAAI,MAAA,MAAY,MAAA,GAAS,MAAA;AAEzB,QAAA,cAAA,CAAe,KAAK,GAAG,CAAA;AAAA,MACzB;AAAA,IACF;AAGA,IAAA,MAAM,eAAA,GAAkB,kBAAkB,cAAA,CAAe,MAAA,GAAS,IAC9D,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA,GAC7B,KAAA,CAAA;AACJ,IAAA,OAAO,MAAM,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,OAAA,EAAS,MAAM,eAAe,CAAA;AAAA,EACxE,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAAmC,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACnE,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,wBAAA,EAAyB;AAAA,MACnD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;AC3MD,IAAO,mBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAI,KAAM;AAC9D,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AAExB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACvE;AAGA,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,GAAO,IAAG,GAAI,IAAA;AAE9B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,mBAAkB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACpE;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AACvD,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,EAAE,CAAA;AAI9C,IAAA,MAAM,SAAS,MAAM,MAAA,CAAO,MAAM,CAAA,CAAE,GAAG,IAAI,CAAA;AAG3C,IAAA,IAAI,kBAAkB,QAAA,EAAU;AAC9B,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,OAAO,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,EAC7B,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,YAAA,EAAe,MAAM,CAAA,QAAA,CAAA,EAAY,KAAK,CAAA;AACpD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,iBAAA,EAAkB;AAAA,MAC5C,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;AChCD,IAAO,oBAAQ,gBAAA,CAAiB,OAAO,EAAE,MAAA,EAAQ,KAAI,KAAM;AACzD,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AAExB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAEpD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,QACzC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAGnD,IAAA,OAAO,MAAM,KAAK,IAAA,EAAK;AAAA,EACzB,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACzD,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,uBAAA,EAAwB;AAAA,MAClD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;AC7BD,IAAO,iBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAI,KAAM;AAC9D,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AAExB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACvE;AAGA,EAAA,IAAI,IAAI,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG,WAAA,OAAkB,WAAA,EAAa;AAC7D,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,OAAO,mDAAA,EAAoD;AAAA,MAC7D,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAEpD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,QACzC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AACnD,IAAA,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAAA,EAC7B,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,yCAAA,EAA4C,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC5E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,oCAAA,EAAqC;AAAA,MAC/D,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;ACnDD,IAAM,UAAA,GAAa,OAAO,IAAA,GAAO,IAAA;AAKjC,SAAS,gBAAgB,IAAA,EASvB;AAEA,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,QAAA,EAAU,KAAA;AACtC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,QAAA,EAAU,MAAA;AAExC,EAAA,OAAO;AAAA,IACL,IAAI,IAAA,CAAK,IAAA;AAAA;AAAA,IACT,IAAA,EAAM,MAAA;AAAA,IACN,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,GAAI,KAAA,IAAS,EAAE,KAAA,EAAM;AAAA,IACrB,GAAI,MAAA,IAAU,EAAE,MAAA;AAAO,GACzB;AACF;AAgBA,IAAO,eAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAI,KAAM;AAC9D,EAAA,OAAA,CAAQ,GAAA,CAAI,uBAAA,EAAyB,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAE3D,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AAExB,EAAA,MAAM,YAAY,MAAA,CAAO,CAAA,IAAK,OAAO,IAAA,IAAQ,MAAA,CAAO,GAAG,CAAA,IAAK,EAAA;AAE5D,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACvE;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAI,gBAAA,EAAkB,QAAA,EAAU,YAAA,EAAc,SAAS,CAAA;AAG/D,EAAA,MAAM,IAAA,GAAO,SAAA,GAAY,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,GAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAE3B,EAAA,IAAI;AAEF,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAInD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,+CAA+C,CAAA;AAC9E,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,QAAA,GAAW,YAAY,CAAC,CAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,YAAY,CAAC,CAAA;AAC5B,MAAA,MAAM,UAAA,GAAa,YAAY,CAAC,CAAA,GAAI,SAAS,WAAA,CAAY,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA,CAAA;AAEnE,MAAA,IAAI,MAAA,KAAW,OAAA,IAAW,GAAA,CAAI,MAAA,KAAW,MAAA,EAAQ;AAC/C,QAAA,OAAO,wBAAA,CAAyB,IAAA,EAAM,QAAA,EAAU,GAAG,CAAA;AAAA,MACrD;AACA,MAAA,IAAI,MAAA,KAAW,UAAA,IAAc,GAAA,CAAI,MAAA,KAAW,MAAA,EAAQ;AAClD,QAAA,OAAO,2BAAA,CAA4B,IAAA,EAAM,QAAA,EAAU,GAAG,CAAA;AAAA,MACxD;AACA,MAAA,IAAI,MAAA,CAAO,WAAW,QAAQ,CAAA,IAAK,IAAI,MAAA,KAAW,KAAA,IAAS,eAAe,KAAA,CAAA,EAAW;AACnF,QAAA,OAAO,wBAAA,CAAyB,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,GAAG,CAAA;AAAA,MACjE;AAEA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,uBAAA,EAA0B,MAAM,CAAA,aAAA,EAAgB,GAAA,CAAI,MAAM,CAAA,CAAA,EAAG;AAAA,QACtE,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,QAAQ,IAAI,MAAA;AAAQ,MAClB,KAAK,KAAA;AACH,QAAA,OAAO,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,GAAG,CAAA;AAAA,MAClC,KAAK,MAAA;AACH,QAAA,OAAO,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,GAAG,CAAA;AAAA,MACnC,KAAK,QAAA;AACH,QAAA,OAAO,YAAA,CAAa,MAAM,IAAI,CAAA;AAAA,MAChC;AACE,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,UACd,EAAE,KAAA,EAAO,CAAA,OAAA,EAAU,GAAA,CAAI,MAAM,CAAA,YAAA,CAAA,EAAe;AAAA,UAC5C,EAAE,QAAQ,GAAA;AAAI,SAChB;AAAA;AACJ,EACF,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC9D,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,uBAAA,EAAwB;AAAA,MAClD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;AAKD,eAAe,SAAA,CAAU,IAAA,EAAW,IAAA,EAAc,GAAA,EAA6B;AAE7E,EAAA,IAAI,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA,EAAG;AACjC,IAAA,MAAMnB,OAAAA,GAAS,MAAM,IAAA,CAAK,YAAA,EAAa;AACvC,IAAA,IAAI,CAACA,QAAO,OAAA,EAAS;AACnB,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAOA,OAAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,QAAA,CAAS,IAAA,CAAKA,OAAAA,CAAO,KAAK,CAAA;AAAA,EACnC;AAGA,EAAA,IAAI,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,WAAW,CAAA,EAAG;AACrC,IAAA,MAAMA,OAAAA,GAAS,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA;AAC/C,IAAA,IAAI,CAACA,QAAO,OAAA,EAAS;AACnB,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAOA,OAAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IAC/D;AAGA,IAAA,MAAMoB,OAAAA,GAAS,IAAA,CAAKpB,OAAAA,CAAO,IAAI,CAAA;AAC/B,IAAA,MAAMqB,MAAAA,GAAQ,IAAI,UAAA,CAAWD,OAAAA,CAAO,MAAM,CAAA;AAC1C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,OAAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAAC,MAAAA,CAAM,CAAC,CAAA,GAAID,OAAAA,CAAO,WAAW,CAAC,CAAA;AAAA,IAChC;AAEA,IAAA,OAAO,IAAI,SAASC,MAAAA,EAAO;AAAA,MACzB,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,YAAA;AAAA;AAAA,QAChB,eAAA,EAAiB;AAAA;AAAA;AACnB,KACD,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAE3C,EAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,aAAY,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,OAAO,UAAA,CAAW,IAAA;AAGxB,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,MAAMrB,OAAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAC1C,IAAA,IAAI,CAACA,QAAO,OAAA,EAAS;AACnB,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAOA,OAAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,SAAS,IAAA,CAAK,EAAE,OAAOA,OAAAA,CAAO,KAAA,EAAO,MAAM,CAAA;AAAA,EACpD;AAGA,EAAA,IAAI,IAAA,CAAK,YAAY,OAAA,EAAS;AAC5B,IAAA,OAAO,SAAS,IAAA,CAAK;AAAA,MACnB,IAAA;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,MAAA;AAEvD,EAAA,IAAI,iBAAiB,MAAA,EAAQ;AAE3B,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,UAAA,EAAY;AACrC,IAAA,OAAO,iBAAA,CAAkB,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AACvC,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC/D;AAGA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO,IAAI,SAAS,KAAA,EAAO;AAAA,IACzB,OAAA,EAAS;AAAA,MACP,gBAAgB,IAAA,CAAK,QAAA;AAAA,MACrB,gBAAA,EAAkB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,MAClC,qBAAA,EAAuB,CAAA,kBAAA,EAAqB,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA;AACvD,GACD,CAAA;AACH;AAMA,SAAS,iBAAA,CACP,IAAA,EACA,IAAA,EACA,IAAA,EACU;AACV,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,IAAI,eAAA,EAAgB;AACnD,EAAA,MAAM,MAAA,GAAS,SAAS,SAAA,EAAU;AAGlC,EAAA,CAAC,YAAY;AACX,IAAA,IAAI;AACF,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,YAAY,CAAA,EAAA,EAAK;AACxC,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,CAAc,MAAM,CAAC,CAAA;AAC/C,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,CAAC,CAAA,CAAA,CAAA,EAAK,OAAO,KAAK,CAAA;AACxD,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAC/B,QAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,QAChC;AAEA,QAAA,MAAM,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,MAC1B;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AAAA,IACtD,CAAA,SAAE;AACA,MAAA,MAAM,OAAO,KAAA,EAAM;AAAA,IACrB;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,OAAO,IAAI,SAAS,QAAA,EAAU;AAAA,IAC5B,OAAA,EAAS;AAAA,MACP,gBAAgB,IAAA,CAAK,QAAA;AAAA,MACrB,gBAAA,EAAkB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,MAClC,qBAAA,EAAuB,CAAA,kBAAA,EAAqB,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA;AAAA;AAEvD,GACD,CAAA;AACH;AAKA,eAAe,UAAA,CAAW,IAAA,EAAW,IAAA,EAAc,GAAA,EAAiC;AAClF,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAGvD,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAG5B,IAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC7B,MAAA,MAAMA,OAAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AACxC,MAAA,IAAI,CAACA,QAAO,OAAA,EAAS;AACnB,QAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAOA,OAAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,MAC/D;AACA,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,SAAA,EAAWA,OAAAA,CAAO,WAAU,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACvE;AAGA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAMA,UAAS,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,KAAK,QAAA,EAAU;AAAA,QACtD,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AACD,MAAA,IAAI,CAACA,QAAO,OAAA,EAAS;AACnB,QAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAOA,OAAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,MAC/D;AACA,MAAA,OAAO,QAAA,CAAS,KAAK,eAAA,CAAgBA,OAAAA,CAAO,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACpE;AAGA,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,MAAMA,OAAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,QAAA,IAAY,0BAAA,EAA4B;AAAA,QAChG,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,WAAW,IAAA,CAAK;AAAA,OACjB,CAAA;AACD,MAAA,IAAI,CAACA,QAAO,OAAA,EAAS;AACnB,QAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAOA,OAAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,MAC/D;AACA,MAAA,OAAO,QAAA,CAAS,KAAK,eAAA,CAAgBA,OAAAA,CAAO,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,wBAAuB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACzE;AAGA,EAAA,MAAM,QAAA,GAAW,YAAY,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,CAAE,MAAK,IAAK,0BAAA;AACrD,EAAA,MAAM,aAAA,GAAgB,SAAS,GAAA,CAAI,OAAA,CAAQ,IAAI,gBAAgB,CAAA,IAAK,KAAK,EAAE,CAAA;AAG3E,EAAA,IAAI,aAAA,GAAgB,UAAA,IAAc,GAAA,CAAI,IAAA,EAAM;AAC1C,IAAA,OAAO,qBAAA,CAAsB,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,eAAe,GAAG,CAAA;AAAA,EACvE;AAGA,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,WAAA,EAAY;AAGnC,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAI,CAAA;AACjC,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAE1B,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,MAAA,EAAQ,QAAA,EAAU,EAAE,CAAA;AAC9D,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC/D;AAGA,EAAA,OAAO,QAAA,CAAS,KAAK,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AACpE;AAMA,eAAe,qBAAA,CACb,IAAA,EACA,IAAA,EACA,QAAA,EACA,WACA,GAAA,EACmB;AAEnB,EAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,kBAAA,CAAmB,MAAM,SAAA,EAAW,QAAA,EAAU,EAAE,CAAA;AAC/E,EAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,CAAY,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACpE;AAEA,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,CAAM,SAAA,EAAU;AACnC,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,MAAA,GAAS,IAAI,UAAA,CAAW,CAAC,CAAA;AAE7B,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAE1C,MAAA,IAAI,KAAA,EAAO;AAET,QAAA,MAAM,YAAY,IAAI,UAAA,CAAW,MAAA,CAAO,MAAA,GAAS,MAAM,MAAM,CAAA;AAC7D,QAAA,SAAA,CAAU,IAAI,MAAM,CAAA;AACpB,QAAA,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AAClC,QAAA,MAAA,GAAS,SAAA;AAGT,QAAA,OAAO,MAAA,CAAO,UAAU,UAAA,EAAY;AAClC,UAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA;AACxC,UAAA,MAAM,MAAA,GAAS,oBAAoB,KAAK,CAAA;AAExC,UAAA,MAAM,cAAc,MAAM,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,YAAY,MAAM,CAAA;AACtE,UAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,YAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,CAAY,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,UACpE;AAEA,UAAA,UAAA,EAAA;AACA,UAAA,MAAA,GAAS,MAAA,CAAO,MAAM,UAAU,CAAA;AAAA,QAClC;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,EAAM;AAER,QAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,UAAA,MAAM,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACzC,UAAA,MAAM,cAAc,MAAM,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,YAAY,MAAM,CAAA;AACtE,UAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,YAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,CAAY,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,UACpE;AACA,UAAA,UAAA,EAAA;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,iBAAiB,MAAM,IAAA,CAAK,sBAAsB,IAAA,EAAM,UAAA,EAAY,EAAE,CAAA;AAC5E,IAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC3B,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,cAAA,CAAe,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACvE;AAEA,IAAA,OAAO,QAAA,CAAS,KAAK,eAAA,CAAgB,cAAA,CAAe,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC5E,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,eAAA,EAAgB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACnF;AACF;AAKA,SAAS,oBAAoB,KAAA,EAA2B;AAEtD,EAAA,MAAM,UAAA,GAAa,KAAA;AACnB,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,UAAA,EAAY;AACjD,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,GAAI,UAAA,EAAY,KAAA,CAAM,MAAM,CAAC,CAAA;AACtE,IAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,IAAA,EAAM,KAA4B,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAKA,eAAe,YAAA,CAAa,MAAW,IAAA,EAAiC;AAEtE,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAE3C,EAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,aAAY,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,OAAO,UAAA,CAAW,IAAA;AAExB,EAAA,IAAI,KAAK,WAAA,EAAa;AAEpB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AACxC,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IAC/D;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AACzC,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IAC/D;AAAA,EACF;AAEA,EAAA,OAAO,IAAI,QAAA,CAAS,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAC3C;AAUA,eAAe,wBAAA,CACb,IAAA,EACA,QAAA,EACA,GAAA,EACmB;AACnB,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAQ5B,EAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,KAAK,QAAA,EAAU;AACrC,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,OAAO,qCAAA,EAAsC;AAAA,MAC/C,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,kBAAA,CAAmB,UAAU,IAAA,CAAK,SAAA,EAAW,KAAK,QAAA,EAAU;AAAA,IACpF,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,QAAQ,IAAA,CAAK;AAAA,GACd,CAAA;AAED,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC/D;AAEA,EAAA,OAAO,SAAS,IAAA,CAAK;AAAA,IACnB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AAMA,eAAe,wBAAA,CACb,IAAA,EACA,QAAA,EACA,UAAA,EACA,GAAA,EACmB;AAEnB,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,WAAA,EAAY;AAGnC,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAI,CAAA;AACjC,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAE1B,EAAA,MAAM,SAAS,MAAM,IAAA,CAAK,cAAA,CAAe,QAAA,EAAU,YAAY,MAAM,CAAA;AAErE,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC/D;AAEA,EAAA,OAAO,SAAS,IAAA,CAAK;AAAA,IACnB,UAAA;AAAA,IACA,UAAU,IAAA,CAAK;AAAA,GAChB,CAAA;AACH;AAMA,eAAe,2BAAA,CACb,IAAA,EACA,QAAA,EACA,GAAA,EACmB;AACnB,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAK5B,EAAA,IAAI,OAAO,IAAA,CAAK,cAAA,KAAmB,QAAA,EAAU;AAC3C,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,OAAO,4BAAA,EAA6B;AAAA,MACtC,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,MAAM,IAAA,CAAK,qBAAA,CAAsB,QAAA,EAAU,KAAK,cAAA,EAAgB;AAAA,IAC7E,WAAW,IAAA,CAAK;AAAA,GACjB,CAAA;AAED,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,OAAM,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC/D;AAGA,EAAA,OAAO,QAAA,CAAS,KAAK,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AACpE;;;AC3iBA,IAAO,oBAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAI,KAAM;AAC9D,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AACxB,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,mBAAkB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACpE;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAEpD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,QACzC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAGnD,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AAEjD,IAAA,OAAO,QAAA,CAAS,KAAK,UAAU,CAAA;AAAA,EACjC,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAE/D,IAAA,IAAI,KAAA,CAAM,OAAA,EAAS,QAAA,CAAS,WAAW,CAAA,EAAG;AACxC,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAQ;AAAA,QACvB,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAEA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,6BAAA,EAA8B;AAAA,MACxD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;AC3DD,oBAAA,EAAA;AAaA,IAAO,2BAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAI,KAAM;AAC9D,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AACxB,EAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AAEzB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,uBAAsB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACxE;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AACzD,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAEtD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,QACzC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAGvD,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,kBAAA,CAAmB,QAAA,EAAU,QAAQ,CAAA;AACnE,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,aAAA,CAAc,SAAS,CAAA;AAEnD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,OAAO,mBAAA,EAAoB;AAAA,QAC7B,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAEA,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EACxC,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,MAAM,CAAA,uBAAA,EAA0B,SAAS,CAAA,aAAA,EAAgB,QAAQ,KAAK,KAAK,CAAA;AACnF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,0BAAA,EAA2B;AAAA,MACrD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;AC9CD,IAAO,0BAAQ,gBAAA,CAAiB,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAI,KAAM;AAC9D,EAAA,MAAM,WAAW,MAAA,CAAO,EAAA;AACxB,EAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AAEzB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,sBAAqB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,uBAAsB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACxE;AAGA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,IAAI,IAAA,EAAK;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,qBAAoB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACtE;AAEA,EAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,EAAU;AACpC,IAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,4CAA2C,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EAC7F;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,WAAW,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,cAAc,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,CAAA;AAEpD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG;AAAA,QACzC,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,oBAAA,CAAqB,UAAA,CAAW,QAAQ,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAGnD,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,oBAAA,CAAqB,SAAA,EAAW,KAAK,OAAO,CAAA;AAEtE,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,0BAAA,EAA2B;AAAA,QACpD,EAAE,QAAQ,GAAA;AAAI,OAChB;AAAA,IACF;AAEA,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EACxC,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,MAAM,CAAA,uBAAA,EAA0B,SAAS,CAAA,WAAA,EAAc,QAAQ,KAAK,KAAK,CAAA;AACjF,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MACd,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,0BAAA,EAA2B;AAAA,MACrD,EAAE,QAAQ,GAAA;AAAI,KAChB;AAAA,EACF;AACF,CAAC,CAAA;;;ACvBD,IAAM,aAAA,GAAqC;AAAA,EACzC,QAAA,EAAU,kBAAA;AAAA,EACV,aAAA,EAAe,kBAAA;AAAA,EACf,eAAA,EAAiB,iBAAA;AAAA,EACjB,gBAAA,EAAkBQ,mBAAAA;AAAA,EAClB,aAAA,EAAe,kBAAA;AAAA,EACf,kBAAA,EAAoB,uBAAA;AAAA,EACpB,aAAA,EAAe,kBAAA;AAAA,EACf,aAAA,EAAe,kBAAA;AAAA,EACf,eAAA,EAAiB,oBAAA;AAAA,EACjB,cAAA,EAAgB,mBAAA;AAAA,EAChB,gBAAA,EAAkB,qBAAA;AAAA,EAClB,eAAA,EAAiBA,mBAAAA;AAAA,EACjB,cAAA,EAAgB,eAAA;AAAA,EAChB,YAAA,EAAc,iBAAA;AAAA,EACd,YAAA,EAAcE,kBAAAA;AAAA,EACd,aAAA,EAAeF,mBAAAA;AAAA,EACf,mBAAA,EAAqB,gBAAA;AAAA,EACrB,sBAAA,EAAwB,iBAAA;AAAA,EACxB,oBAAA,EAAsBK,iBAAAA;AAAA,EACtB,qBAAA,EAAuBC,kBAAAA;AAAA,EACvB,oBAAA,EAAsB,gBAAA;AAAA,EACtB,kBAAA,EAAoB,UAAA;AAAA,EACpB,kBAAA,EAAoBD,iBAAAA;AAAA,EACpB,mBAAA,EAAqBC,kBAAAA;AAAA,EACrB,gBAAA,EAAkB,cAAA;AAAA,EAClB,kBAAA,EAAoBE,mBAAAA;AAAA,EACpB,kBAAA,EAAoB,kBAAA;AAAA,EACpB,mBAAA,EAAqB,mBAAA;AAAA,EACrB,cAAA,EAAgB,cAAA;AAAA,EAChB,wBAAA,EAA0B,sBAAA;AAAA,EAC1B,wBAAA,EAA0B,sBAAA;AAAA,EAC1B,uBAAA,EAAyB,gBAAA;AAAA,EACzB,qBAAA,EAAuB,UAAA;AAAA,EACvB,uBAAA,EAAyB,gBAAA;AAAA,EACzB,2BAAA,EAA6B,oBAAA;AAAA,EAC7B,4BAAA,EAA8B,qBAAA;AAAA,EAC9B,uBAAA,EAAyB,gBAAA;AAAA,EACzB,wBAAA,EAA0B,iBAAA;AAAA,EAC1B,yBAAA,EAA2B,cAAA;AAAA,EAC3B,2BAAA,EAA6B,YAAA;AAAA,EAC7B,yBAAA,EAA2B,YAAA;AAAA,EAC3B,wBAAA,EAA0B,YAAA;AAAA,EAC1B,8BAAA,EAAgC,iBAAA;AAAA,EAChC,yCAAA,EAA2C,wBAAA;AAAA,EAC3C,wCAAA,EAA0C;AAC5C,CAAA;AAaO,SAAS,qBAAA,CAAsB,QAAa,WAAA,EAA2B;AAC5E,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AAC1D,IAAA,MAAM,CAAC,MAAA,EAAQ,GAAG,UAAU,CAAA,GAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AACjC,IAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA,CAAA;AAE7B,IAAA,MAAM,cAAA,GAAiB,OAAO,OAAA,KAAiB;AAE7C,MAAA,MAAM,eAAA,GAAkB;AAAA,QACtB,GAAG,OAAA;AAAA,QACH,GAAI,WAAA,EAAa,MAAA,IAAU,EAAE,MAAA,EAAQ,YAAY,MAAA,EAAO;AAAA,QACxD,GAAI,WAAA,EAAa,KAAA,IAAS,EAAE,KAAA,EAAO,YAAY,KAAA,EAAM;AAAA,QACrD,GAAI,WAAA,EAAa,MAAA,IAAU,EAAE,MAAA,EAAQ,YAAY,MAAA,EAAO;AAAA,QACxD,GAAI,WAAA,EAAa,UAAA,IAAc,EAAE,UAAA,EAAY,YAAY,UAAA,EAAW;AAAA,QACpE,GAAI,WAAA,EAAa,OAAA,IAAW,EAAE,OAAA,EAAS,YAAY,OAAA,EAAQ;AAAA,QAC3D,GAAI,WAAA,EAAa,WAAA,IAAe,EAAE,WAAA,EAAa,YAAY,WAAA,EAAY;AAAA,QACvE,GAAI,WAAA,EAAa,MAAA,IAAU,EAAE,MAAA,EAAQ,YAAY,MAAA,EAAO;AAAA,QACxD,GAAI,WAAA,EAAa,UAAA,IAAc,EAAE,UAAA,EAAY,YAAY,UAAA;AAAW,OACtE;AACA,MAAA,OAAO,QAAQ,eAAe,CAAA;AAAA,IAChC,CAAA;AACA,IAAA,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,YAAY,cAAc,CAAA;AAAA,EAC/D;AACF","file":"built-in-routes.js","sourcesContent":["import type { DurableObjectStorage } from \"@cloudflare/workers-types\";\nimport type { StreamManager } from \"./StreamManager\";\nimport { type z, type ZodObject, type ZodRawShape } from \"zod\";\nimport type { ThreadEnv } from \"../router/index.js\";\nimport type { HookSignatures, ToolResult as SpecToolResult } from \"@standardagents/spec\";\n\n/**\n * Agent configuration from D1 agents table\n */\nexport interface Agent {\n id: string;\n title: string;\n type: \"dual_ai\" | \"ai_human\";\n created_at: number;\n\n // Global configuration\n max_session_turns: number | null; // Total back-and-forth exchanges allowed (dual_ai only)\n\n // Side A configuration\n side_a_label: string | null; // Optional custom label (e.g., \"ATC\", \"Pilot\")\n side_a_agent_prompt: string | null;\n side_a_stop_on_response: boolean;\n side_a_stop_tool: string | null;\n side_a_stop_tool_response_property: string | null;\n side_a_max_steps: number | null; // Per-side safety limit (LLM request/response cycles)\n side_a_end_session_tool: string | null;\n\n // Side B configuration (null for ai_human type)\n side_b_label: string | null; // Optional custom label (e.g., \"ATC\", \"Pilot\")\n side_b_agent_prompt: string | null;\n side_b_stop_on_response: boolean;\n side_b_stop_tool: string | null;\n side_b_stop_tool_response_property: string | null;\n side_b_max_steps: number | null; // Per-side safety limit (LLM request/response cycles)\n side_b_end_session_tool: string | null;\n}\n\n/**\n * Message in OpenAI chat completion format\n */\nexport interface Message {\n id: string;\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | null;\n name?: string | null;\n tool_calls?: string | null; // JSON array of tool calls\n tool_call_id?: string | null;\n log_id?: string | null; // Log that produced this message\n created_at: number; // Microseconds since epoch\n\n // Request/Response timing\n request_sent_at?: number | null; // Microseconds - when LLM request was sent\n response_completed_at?: number | null; // Microseconds - when response was fully received\n status?: \"pending\" | \"completed\" | \"failed\"; // Message status\n silent?: boolean; // Whether this message is hidden from the LLM (UI-only)\n tool_status?: \"success\" | \"error\" | null; // Status of tool execution (for role='tool' messages only)\n\n // Reasoning content from models like o1 (stored for message history inclusion)\n reasoning_content?: string | null;\n\n // Reasoning details from OpenRouter (structured reasoning blocks)\n // https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n // Contains array of reasoning detail objects (summary, encrypted, or text types)\n // Must be preserved exactly as returned for proper multi-turn reasoning continuity\n reasoning_details?: string | null; // JSON array of reasoning detail objects\n\n // Hierarchical tracking for sub-prompts\n parent_id?: string | null; // Parent message ID for sub-prompt messages (NULL for top-level)\n depth?: number; // Nesting depth: 0 for top-level, 1+ for sub-prompts\n\n // File attachments (JSON array of AttachmentRef objects)\n attachments?: string | null; // JSON array of AttachmentRef\n}\n\n/**\n * Tool call from OpenAI format\n */\nexport interface ToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string; // JSON string\n };\n forceAllow?: boolean;\n}\n\n/**\n * Tool call detail stored in tool_calls table\n */\nexport interface ToolCallDetail {\n id: string;\n message_id: string;\n type: string;\n function_name: string;\n function_arguments: string;\n created_at: number;\n}\n\n/**\n * Thread metadata from DurableAgentBuilder\n * Note: agent_id is now the agent name (not UUID) since agents are in TypeScript\n */\nexport interface ThreadMetadata {\n id: string;\n agent_id: string; // Agent name from TypeScript config\n user_id: string | null;\n created_at: number;\n}\n\n/**\n * Hook registry type - transforms HookSignatures into lazy-loaded optional hooks\n */\nexport type HookRegistry = {\n [K in keyof HookSignatures]?: () => Promise<HookSignatures[K]>;\n};\n\n/**\n * Native tool module type - represents a loaded tool definition.\n * Tools can have args (with validation schema) or no args.\n * Uses local Zod types for compatibility with z.toJSONSchema().\n */\nexport type NativeToolModule =\n | [description: string, argsSchema: ZodObject<ZodRawShape>, toolFn: (state: any, args: Record<string, unknown>) => Promise<SpecToolResult>]\n | [description: string, argsSchema: null, toolFn: (state: any) => Promise<SpecToolResult>];\n\n/**\n * Thread instance (forward reference to avoid circular dependency)\n */\nexport interface ThreadInstance {\n ctx: DurableObjectState;\n env: ThreadEnv;\n getMessages(\n limit?: number,\n offset?: number,\n order?: \"asc\" | \"desc\",\n includeSilent?: boolean,\n maxDepth?: number\n ): Promise<{\n messages: Message[];\n total: number;\n hasMore: boolean;\n }>;\n getLogs(limit?: number, offset?: number, order?: \"asc\" | \"desc\"): Promise<LogData[]>;\n getThreadMeta(threadId: string): Promise<ThreadMetadata | null>;\n deleteMessage(messageId: string): Promise<{ success: boolean; error?: string }>;\n shouldStop(): Promise<boolean>; // Check if execution should be stopped (async - reads from SQLite)\n tools(): Record<string, () => Promise<NativeToolModule>>;\n hooks(): HookRegistry;\n\n // Dynamic configuration loading from virtual modules\n loadModel(name: string): Promise<any>;\n loadPrompt(name: string): Promise<any>;\n loadAgent(name: string): Promise<any>;\n getPromptNames(): string[];\n getAgentNames(): string[];\n\n // File system operations\n writeFile(path: string, data: ArrayBuffer | string, mimeType: string, options?: Record<string, unknown>): Promise<any>;\n readFile(path: string): Promise<ArrayBuffer | null>;\n statFile(path: string): Promise<any>;\n readdirFile(path: string): Promise<any[]>;\n unlinkFile(path: string): Promise<void>;\n mkdirFile(path: string): Promise<any>;\n rmdirFile(path: string): Promise<void>;\n getFileStats(): Promise<any>;\n grepFiles(pattern: string): Promise<any[]>;\n findFiles(pattern: string): Promise<any>;\n getFileThumbnail(path: string): Promise<ArrayBuffer | null>;\n readFileChunk(path: string, chunkIndex: number): Promise<{\n success: boolean;\n data?: string; // base64 encoded\n error?: string;\n }>;\n\n // Agent execution\n runAgent(threadId: string, agentName: string): Promise<void>;\n\n // Effect scheduling\n scheduleEffect(\n threadId: string,\n effectName: string,\n effectArgs: Record<string, unknown>,\n delayMs?: number\n ): Promise<string>;\n getScheduledEffects(name?: string): Promise<Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n scheduledAt: number;\n createdAt: number;\n }>>;\n removeScheduledEffect(id: string): Promise<boolean>;\n\n // Testing utilities\n insertOrphanedToolCall(params: {\n content?: string;\n toolCallId: string;\n toolName: string;\n toolArgs: string;\n }): Promise<Response>;\n}\n\n/**\n * Tool call for internal flow management\n */\nexport type FlowToolCall = { tool: string; args: Record<string, unknown> };\n\n/**\n * Prompt call for internal flow management\n */\nexport type FlowPromptCall = { prompt: string; args: Record<string, unknown> };\n\n/**\n * Flow call (tool or prompt)\n */\nexport type FlowCall = FlowToolCall | FlowPromptCall;\n\n/**\n * Flow call with retry tracking\n */\nexport type FlowCallWithRetries = FlowCall & {\n retries: number;\n reasons: string[];\n};\n\n/**\n * Sub-prompt configuration - defines options for when a sub-prompt is called as a tool\n */\nexport interface SubpromptConfig {\n name: string;\n initUserMessageProperty?: string; // Property to use as initial user message when sub-prompt is called\n includeTextResponse?: boolean; // Include LLM text response in result string (default: true)\n includeToolCalls?: boolean; // Serialize tool call summaries into result string (default: true)\n includeErrors?: boolean; // Serialize error details into result string (default: true)\n}\n\n/** @deprecated Use SubpromptConfig instead */\nexport type ToolConfig = SubpromptConfig;\n\n/**\n * Prompt configuration - now loaded from TypeScript virtual modules\n */\nexport interface PromptData {\n id: string;\n name: string;\n prompt: string | any[]; // Plain text prompt OR structured array of prompt parts\n system_prompt?: string; // System prompt text (alias for prompt)\n model: string; // Model name (was model_id with UUID)\n model_id?: string; // Deprecated: legacy model UUID\n tool_description: string;\n required_schema: string; // JSON schema (legacy)\n include_chat: boolean;\n include_past_tools: boolean;\n prompts: string; // JSON array (legacy)\n created_at: number;\n /** @deprecated All prompts are now automatically exposed as tools */\n expose_as_tool?: boolean;\n parallel_tool_calls: boolean;\n tool_choice: \"auto\" | \"none\" | \"required\" | \"function\";\n reasoning_effort: \"low\" | \"medium\" | \"high\" | null;\n reasoning_max_tokens: number | null;\n reasoning_exclude: boolean;\n include_reasoning: boolean;\n recentImageThreshold: number | null; // Messages to keep images for\n\n // New fields from TypeScript config\n _tools?: (string | SubpromptConfig)[]; // Tool names or sub-prompt configs from definePrompt\n _requiredSchema?: any; // Zod schema for validation (replaces JSON schema)\n}\n\n/**\n * Central state object that flows through execution\n */\nexport interface FlowState {\n // Identity\n threadId: string;\n flowId: string;\n\n // Thread reference\n thread: {\n instance: ThreadInstance; // Reference to the DurableThread instance\n metadata: ThreadMetadata; // Thread metadata from D1\n };\n\n // Configuration\n agentConfig: Agent;\n currentSide: \"a\" | \"b\";\n\n // Prompt configuration (loaded once per execution)\n prompts: {\n sideA: PromptData;\n sideB: PromptData | null; // null for ai_human agents\n };\n prompt: PromptData; // Current active prompt (switches with side)\n\n // Execution tracking\n stepCount: number;\n sideAStepCount: number; // Per-side step count for max_steps safety limit\n sideBStepCount: number; // Per-side step count for max_steps safety limit\n stopped: boolean;\n stoppedBy?: \"a\" | \"b\";\n forcedNextSide?: \"side_a\" | \"side_b\"; // Force a specific side to play next turn\n pendingForceTurn?: \"side_a\" | \"side_b\"; // Deferred force turn (applied after tool queue completes)\n abortController?: AbortController; // For user-initiated stop\n\n // Message context\n messageHistory: Message[];\n /**\n * Appends these messages\n */\n extraMessages: Message[];\n\n // Tool execution queue\n sequence: {\n queue: ToolCall[];\n isHandling: boolean;\n };\n\n // Tool execution state (for individual tool calls)\n active: FlowCallWithRetries; // Current tool/prompt being executed\n queue: FlowCall[]; // Queue of pending tool/prompt calls\n\n // Agent handoff tracking\n pendingHandoff?: {\n agentId: string;\n };\n\n // Streaming & telemetry\n stream: StreamManager;\n\n // Runtime context\n context: Record<string, unknown>;\n retryCount: number;\n retryReason?: string;\n\n // Storage\n storage: DurableObjectStorage;\n env: ThreadEnv;\n\n // Real-time broadcasting callbacks (for nested flows)\n emitLog?: (log: unknown) => void;\n emitMessage?: (message: unknown) => void;\n emitMessageChunk?: (messageId: string, chunk: string, depth?: number) => void;\n emitTelemetry?: (event: TelemetryEvent) => void;\n emitEvent?: (type: string, data: unknown) => void;\n\n // Hierarchical tracking\n rootState: FlowState // The root flow state object\n rootMessageId?: string | null; // Root message ID for FK relationships\n parentLogId?: string | null; // Parent log ID for nested prompts\n currentLogId?: string | null; // Current LLM request's log ID\n parentMessageId?: string; // Parent message ID for sub-prompts (used to determine one-shot behavior)\n depth: number; // Nesting depth: 0 for top-level, 1+ for sub-prompts\n\n // Behavior flags\n pendingMessageId?: string; // Message currently being streamed\n\n // Tool restrictions\n allowedTools?: ToolDefinition[]; // Tools allowed for current prompt\n}\n\n/**\n * Text content part for multimodal messages\n */\nexport interface TextContentPart {\n type: \"text\";\n text: string;\n}\n\n/**\n * Image URL content part for multimodal messages (OpenAI/OpenRouter format)\n */\nexport interface ImageContentPart {\n type: \"image_url\";\n image_url: {\n url: string; // Can be data URL (data:image/...) or http(s) URL\n detail?: \"auto\" | \"low\" | \"high\"; // Image detail level\n };\n}\n\n/**\n * Multimodal content - array of text and image parts\n */\nexport type MultimodalContent = Array<TextContentPart | ImageContentPart>;\n\n/**\n * Message content - can be string (text only) or array (multimodal)\n */\nexport type MessageContent = string | MultimodalContent;\n\n/**\n * Request context for LLM calls\n */\nexport interface RequestContext {\n messages: Array<{\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content?: MessageContent;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n name?: string;\n }>;\n model: string;\n tools?: ToolDefinition[]; // Available tools for this request\n stream?: boolean;\n promptName?: string; // Name of the prompt being executed (if any)\n systemPrompt?: string; // The actual system prompt text\n parentLogId?: string | null; // Parent log ID if this is a nested prompt call\n parallel_tool_calls?: boolean; // Allow parallel tool execution\n tool_choice?: \"auto\" | \"none\" | \"required\" | { type: \"function\"; function: { name: string } }; // Tool calling strategy\n reasoning?: {\n effort?: \"low\" | \"medium\" | \"high\"; // Reasoning effort level (for OpenAI o-series, Grok)\n max_tokens?: number; // Max reasoning tokens (for Anthropic, Gemini, Qwen)\n exclude?: boolean; // Use reasoning internally but don't return it\n };\n imagePathMap?: Map<string, string>; // Maps data URLs to attachment paths for log transformation\n}\n\n/**\n * Tool definition for LLM requests\n */\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters?: Record<string, any>; // JSON Schema format\n };\n}\n\n/**\n * Image returned by an LLM response (e.g., from image generation models)\n * Format follows OpenAI/OpenRouter chat completions API\n */\nexport interface LLMResponseImage {\n type: \"image_url\";\n image_url: {\n url: string; // data:image/png;base64,... or https://...\n };\n}\n\n/**\n * LLM response\n */\nexport interface LLMResponse {\n id: string;\n model: string;\n content: string | null;\n reasoning_content?: string | null; // Reasoning output from models like o1 (should not be displayed as regular content)\n reasoning_details?: any[]; // OpenRouter structured reasoning blocks (summary, encrypted, text types)\n tool_calls?: ToolCall[];\n images?: LLMResponseImage[]; // Generated images from image generation models\n finish_reason: string;\n usage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n // @ts-ignore - OpenRouter non-standard cost field\n cost?: number;\n // @ts-ignore - OpenRouter non-standard provider field (actual provider that handled request)\n provider?: string;\n };\n}\n\n/**\n * LLM response with associated log ID\n * The logId allows tracking which log entry corresponds to this LLM request\n * Useful for linking tool execution errors back to the parent LLM request\n */\nexport interface LLMResponseWithLog {\n response: LLMResponse;\n logId: string;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n retryPrompt?: string;\n}\n\n/**\n * Attachment returned by a tool (e.g., generated images)\n * Stored in thread filesystem and linked to the tool message\n */\nexport interface ToolAttachment {\n name: string;\n mimeType: string;\n data: string; // base64 encoded\n width?: number; // For images\n height?: number; // For images\n}\n\n/**\n * Tool result\n */\nexport interface ToolResult {\n status: \"success\" | \"error\";\n /**\n * Flattened text representation of the tool output.\n *\n * For tools that return structured MCP-style content (an array of\n * content parts), this will be derived by concatenating all text\n * parts. For legacy tools that returned a plain string `result`,\n * that value is used directly.\n */\n result?: string;\n error?: string;\n stack?: string; // Stack trace for errors\n /**\n * File attachments returned by the tool.\n *\n * Can contain either:\n * - ToolAttachment: New files with base64 data to be stored\n * - AttachmentRef: References to existing files in the thread filesystem\n *\n * New attachments are stored under /attachments/ directory.\n */\n attachments?: Array<ToolAttachment | AttachmentRef>;\n}\n\n/**\n * Flow execution result\n */\nexport interface FlowResult {\n messages: Message[];\n stopped: boolean;\n stoppedBy?: \"a\" | \"b\";\n stepCount: number;\n stream: ReadableStream<Uint8Array>; // HTTP stream for content\n}\n\n/**\n * Log emitter callback for DurableObject real-time updates\n */\nexport type EmitLog = (log: Partial<LogData> & { id: string }) => void;\n\n/**\n * Model fallback from D1\n */\nexport interface ModelFallback {\n parent_model_id: string;\n fallback_model_id: string;\n idx: number;\n}\n\n/**\n * Telemetry event types\n */\nexport type TelemetryEvent =\n | { type: \"step_started\"; step: number; side: \"a\" | \"b\"; timestamp: number }\n | { type: \"step_completed\"; step: number; stopped: boolean; timestamp: number }\n | { type: \"llm_request\"; model: string; attempt: number; timestamp: number }\n | {\n type: \"llm_response\";\n tokens: number;\n latency: number;\n timestamp: number;\n }\n | { type: \"validation_failed\"; error: string; timestamp: number }\n | {\n type: \"fallback_triggered\";\n from: string;\n to: string;\n timestamp: number;\n }\n | { type: \"tool_started\"; tool: string; timestamp: number }\n | {\n type: \"tool_completed\";\n tool: string;\n status: string;\n timestamp: number;\n }\n | {\n type: \"stopped\";\n reason: string;\n side: \"a\" | \"b\";\n timestamp: number;\n }\n | {\n type: \"stopped_by_user\";\n timestamp: number;\n };\n\n/**\n * Log data for telemetry table\n */\nexport interface LogData {\n id: string;\n message_id: string;\n\n // Request details\n provider: string;\n model: string;\n model_name?: string; // Human-readable model name\n endpoint?: string;\n request_body?: string;\n request_headers?: string;\n\n // Response details\n response_body?: string;\n response_headers?: string;\n status_code?: number;\n reasoning_content?: string | null; // Reasoning output from models like o1 (should not be displayed)\n\n // Token usage\n input_tokens?: number;\n cached_tokens?: number;\n output_tokens?: number;\n reasoning_tokens?: number;\n total_tokens?: number;\n\n // Performance metrics\n latency_ms?: number;\n time_to_first_token_ms?: number;\n\n // Result metadata\n finish_reason?: string;\n error?: string;\n error_type?: string;\n\n // Cost tracking\n cost_input?: number;\n cost_output?: number;\n cost_total?: number;\n\n // Context\n message_history_length?: number;\n tools_available?: number;\n prompt_name?: string;\n tools_called?: string;\n\n // Enhanced context (migration 003)\n parent_log_id?: string | null; // Parent log ID for prompt chains\n tools_schema?: string | null; // JSON schema of tools available\n message_history?: string | null; // Snapshot of message history\n system_prompt?: string | null; // System prompt sent with request\n is_complete?: boolean; // Whether log has all data\n\n // Error and retry tracking (migration 007)\n errors?: string | null; // JSON array of errors [{message, type, timestamp}]\n retry_of_log_id?: string | null; // Log ID this is a retry of\n\n created_at: number;\n}\n\n/**\n * Tool type identifier\n */\nexport type ToolType = \"native\" | \"prompt\" | \"agent\";\n\n/**\n * Base environment interface for StandardAgents.\n * Extends ThreadEnv with optional provider API keys.\n *\n * User's Env interface should extend this or include these bindings.\n */\nexport interface Env extends ThreadEnv {\n // Provider API keys (optional - providers check for these)\n OPENAI_API_KEY?: string;\n ANTHROPIC_API_KEY?: string;\n OPENROUTER_API_KEY?: string;\n GOOGLE_API_KEY?: string;\n\n // Optional UI dev server for local development\n UI_DEV_SERVER?: string;\n\n // Optional assets binding (Cloudflare Workers Assets)\n ASSETS?: {\n fetch(request: Request | string): Promise<Response>;\n };\n\n // GitHub integration (optional)\n GITHUB_TOKEN?: string;\n GITHUB_REPO?: string;\n GITHUB_BRANCH?: string;\n\n // Auth (optional)\n SUPER_ADMIN_PASSWORD?: string;\n ENCRYPTION_KEY?: string;\n\n // Allow additional bindings from user\n [key: string]: unknown;\n}\n\n/**\n * Storage backend types for files\n */\nexport type StorageBackend = \"local\" | \"url\" | \"s3\" | \"r2\";\n\n/**\n * File record stored in the files table\n */\nexport interface FileRecord {\n path: string; // Primary key, e.g., \"/uploads/photo.jpg\"\n name: string; // Basename\n mimeType: string;\n storage: StorageBackend; // Where the data lives\n location?: string | null; // External reference (null for local)\n size: number;\n metadata?: Record<string, unknown> | null; // JSON parsed\n isDirectory: boolean;\n createdAt: number;\n // Image dimensions (populated for processed images)\n width?: number | null;\n height?: number | null;\n // Chunked storage (for files > 1.75MB)\n isChunked?: boolean; // true if stored in file_chunks table\n chunkCount?: number; // number of chunks (if chunked)\n}\n\n/**\n * Image-specific metadata stored in FileRecord.metadata\n */\nexport interface ImageMetadata {\n width: number;\n height: number;\n}\n\n/**\n * Attachment reference stored in messages.attachments (JSON array)\n */\nexport interface AttachmentRef {\n id: string; // Unique attachment ID\n type: \"file\";\n path: string; // FK to files.path\n name: string;\n mimeType: string;\n // Image-specific (when mime starts with \"image/\")\n width?: number;\n height?: number;\n description?: string; // AI-generated for context management\n}\n\n/**\n * Grep search result\n */\nexport interface GrepResult {\n path: string;\n name: string;\n matches: string[]; // Matching lines/snippets\n lineNumbers?: number[]; // Line numbers of matches\n}\n\n/**\n * File stats for storage tracking\n */\nexport interface FileStats {\n totalSize: number;\n fileCount: number;\n}\n\n/**\n * Constants\n */\nexport const MAX_STEPS = 250;\nexport const MAX_RETRIES_PER_MODEL = 2;\nexport const TIMESTAMP_MULTIPLIER = 1000; // Convert ms to microseconds\nexport const STREAM_COOLDOWN = 200; // ms\nexport const BACKOFF_BASE = 1000; // ms\n","import { STREAM_COOLDOWN } from \"./types\";\n\n/**\n * Callback function to execute before stream closes\n */\nexport type BeforeClose = () => Promise<void> | void;\n\n/**\n * Stream channel\n */\ninterface Channel {\n id: number;\n label: string;\n active: boolean;\n}\n\n/**\n * Manages HTTP streaming of content chunks.\n * WebSocket telemetry is handled separately by DurableThread.\n * Inspired by bod.coach MultiplexedStream pattern.\n */\nexport class StreamManager {\n /**\n * HTTP ReadableStream controller for content\n */\n private httpController?: ReadableStreamDefaultController<Uint8Array>;\n\n /**\n * HTTP ReadableStream for content chunks\n */\n public httpStream: ReadableStream<Uint8Array>;\n\n /**\n * Active channels\n */\n public activeChannels: number = 0;\n\n /**\n * Before close hooks\n */\n private beforeCloseHooks: BeforeClose[] = [];\n\n /**\n * Prevent automatic close\n */\n public preventClose: boolean = false;\n\n /**\n * Text encoder for streams\n */\n private encoder: TextEncoder;\n\n /**\n * Promise that resolves when stream is completely finished\n */\n public then: Promise<void>;\n\n /**\n * Resolver for the then promise\n */\n private resolver: () => void = () => {};\n\n /**\n * Whether the stream has been closed\n */\n private closed: boolean = false;\n\n constructor(beforeClose: BeforeClose | BeforeClose[] = []) {\n this.encoder = new TextEncoder();\n\n // Create HTTP stream\n this.httpStream = new ReadableStream<Uint8Array>({\n start: (controller) => {\n this.httpController = controller;\n },\n });\n\n // Setup before close hooks\n this.beforeCloseHooks = Array.isArray(beforeClose)\n ? beforeClose\n : [beforeClose];\n\n // Create promise for stream completion\n this.then = new Promise((resolve) => {\n this.resolver = resolve;\n });\n }\n\n /**\n * Send content chunk to HTTP stream\n */\n sendContent(chunk: string): void {\n if (!this.httpController || this.closed) {\n console.warn(\"Cannot send content: stream is closed or not initialized\");\n return;\n }\n\n try {\n this.httpController.enqueue(this.encoder.encode(chunk));\n } catch (error) {\n console.error(\"Error sending content chunk:\", error);\n }\n }\n\n /**\n * Add a before close hook\n */\n addBeforeClose(hook: BeforeClose | BeforeClose[]): void {\n this.beforeCloseHooks.push(...(Array.isArray(hook) ? hook : [hook]));\n }\n\n /**\n * Wait for a callback to complete before allowing stream to close\n */\n async waitFor(callback: () => Promise<void> | void): Promise<void> {\n this.activeChannels++;\n\n try {\n await callback();\n } catch (error) {\n console.error(\"Error in waitFor callback:\", error);\n throw error;\n } finally {\n this.closeChannel();\n }\n }\n\n /**\n * Close a channel (decrement active channel count)\n */\n closeChannel(): void {\n this.activeChannels--;\n\n if (this.activeChannels <= 0 && !this.preventClose && !this.closed) {\n // Small delay to allow any final operations\n setTimeout(async () => {\n if (this.activeChannels <= 0 && !this.closed) {\n await this.close();\n }\n }, STREAM_COOLDOWN);\n }\n }\n\n /**\n * Close all streams and connections\n */\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n\n try {\n // Run before close hooks\n await Promise.all(\n this.beforeCloseHooks.map(async (hook) => {\n try {\n await hook();\n } catch (error) {\n console.error(\"Error in beforeClose hook:\", error);\n }\n })\n );\n\n // Close HTTP stream\n if (this.httpController) {\n try {\n this.httpController.close();\n } catch (error) {\n console.error(\"Error closing HTTP stream:\", error);\n }\n }\n\n // Resolve the completion promise\n this.resolver();\n } catch (error) {\n console.error(\"Error during stream close:\", error);\n this.resolver();\n }\n }\n\n /**\n * Force close the stream immediately\n */\n forceClose(): void {\n this.preventClose = false;\n this.activeChannels = 0;\n this.close();\n }\n}\n","import type { FlowState, ToolDefinition, LLMResponse, RequestContext, Env } from \"../types\";\n\n/**\n * Provider configuration from database\n */\nexport interface ProviderConfig {\n name: string;\n sdk: string; // 'openai', 'anthropic', 'openrouter', 'custom'\n api_key: string;\n}\n\n/**\n * Model configuration from database\n */\nexport interface ModelConfig {\n id: string;\n name: string;\n provider_id: string;\n included_providers: string; // JSON array\n input_price: number | null;\n output_price: number | null;\n cached_price: number | null;\n}\n\n/**\n * Base interface that all providers must implement\n */\nexport interface LLMProvider {\n /**\n * Provider identifier (e.g., 'openai', 'openrouter', 'anthropic')\n */\n readonly name: string;\n\n /**\n * Make a chat completion request to the provider\n *\n * @param modelId - The model identifier\n * @param context - Request context with messages and tools\n * @param state - Current flow state for streaming\n * @param logId - Log ID for updating request body before API call\n * @param signal - Optional abort signal for cancelling in-flight requests\n * @param modelConfig - Optional model configuration with provider routing options\n * @returns LLM response with content, tool calls, and usage\n */\n chat(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string,\n signal?: AbortSignal,\n modelConfig?: ModelConfig\n ): Promise<LLMResponse>;\n\n /**\n * Test if this provider can handle a given model\n *\n * @param modelId - The model identifier\n * @returns true if this provider supports the model\n */\n supportsModel(modelId: string): boolean;\n}\n\n/**\n * Factory function type for creating provider instances\n */\nexport type ProviderFactory = (config: ProviderConfig) => LLMProvider;\n\n/**\n * Registry of available providers\n */\nexport interface ProviderRegistry {\n /**\n * Register a new provider factory\n */\n register(sdk: string, factory: ProviderFactory): void;\n\n /**\n * Get a provider instance for a model\n * @param modelName - The model name (from TypeScript config or D1)\n * @param env - Environment bindings\n * @param thread - Optional thread instance for loading model from virtual modules\n */\n getProvider(\n modelName: string,\n env: Env,\n thread?: import(\"../types\").ThreadInstance\n ): Promise<{ provider: LLMProvider; modelName: string; modelConfig: ModelConfig }>;\n\n /**\n * Check if a provider is registered\n */\n hasProvider(sdk: string): boolean;\n}\n","import type { LLMProvider, ProviderConfig, ModelConfig } from \"./types\";\nimport type {\n FlowState,\n LLMResponse,\n RequestContext,\n ToolCall,\n MessageContent,\n TextContentPart,\n ImageContentPart,\n MultimodalContent,\n AttachmentRef,\n} from \"../types\";\n\n/**\n * Base class for LLM providers with common functionality\n */\nexport abstract class BaseProvider implements LLMProvider {\n protected config: ProviderConfig;\n\n constructor(config: ProviderConfig) {\n this.config = config;\n }\n\n abstract get name(): string;\n\n abstract chat(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string,\n signal?: AbortSignal,\n modelConfig?: ModelConfig\n ): Promise<LLMResponse>;\n\n abstract supportsModel(modelId: string): boolean;\n\n /**\n * Helper: Stream content chunks to the client\n */\n protected streamContent(chunk: string, state: FlowState): void {\n if (chunk) {\n state.stream.sendContent(chunk);\n }\n }\n\n /**\n * Helper: Broadcast content chunk via WebSocket for real-time UI updates\n * Does NOT write to database - only broadcasts to connected clients\n */\n protected streamContentChunk(chunk: string, state: FlowState): void {\n if (!chunk) return;\n\n const emitMessageChunk = (state as any).emitMessageChunk as\n ((messageId: string, chunk: string) => void) | undefined;\n const pendingMessageId = (state as any).pendingMessageId as string | undefined;\n\n if (emitMessageChunk && pendingMessageId) {\n emitMessageChunk(pendingMessageId, chunk);\n }\n }\n\n /**\n * Helper: Accumulate tool call deltas\n * OpenAI streams tool calls incrementally, need to accumulate\n */\n protected accumulateToolCall(\n toolCallsMap: Map<number, Partial<ToolCall>>,\n index: number,\n delta: any\n ): void {\n if (!toolCallsMap.has(index)) {\n toolCallsMap.set(index, {\n id: \"\",\n type: \"function\",\n function: { name: \"\", arguments: \"\" },\n });\n }\n\n const toolCall = toolCallsMap.get(index)!;\n\n if (delta.id) {\n toolCall.id = delta.id;\n }\n\n if (delta.type) {\n toolCall.type = delta.type as \"function\";\n }\n\n if (delta.function) {\n if (delta.function.name) {\n toolCall.function!.name += delta.function.name;\n }\n if (delta.function.arguments) {\n toolCall.function!.arguments += delta.function.arguments;\n }\n }\n }\n\n /**\n * Helper: Convert accumulated tool calls to final array\n */\n protected finalizeToolCalls(\n toolCallsMap: Map<number, Partial<ToolCall>>\n ): ToolCall[] {\n const toolCalls: ToolCall[] = [];\n\n for (const [_index, partialCall] of Array.from(toolCallsMap.entries()).sort(\n (a, b) => a[0] - b[0]\n )) {\n if (partialCall.id && partialCall.function?.name) {\n toolCalls.push(partialCall as ToolCall);\n }\n }\n\n return toolCalls;\n }\n\n /**\n * Helper: Update log with actual request body before making API call\n * This ensures we have the complete request even if the call fails\n *\n * NOTE: Only updates if request_body is NULL - LLMRequest may have already\n * set a transformed request_body (with image paths instead of base64 data URLs)\n *\n * We check if request_body is already set BEFORE serializing to avoid\n * processing megabytes of base64 image data unnecessarily.\n */\n protected async logActualRequest(\n request: any,\n logId: string,\n state: FlowState\n ): Promise<void> {\n try {\n // First check if request_body is already set (to avoid serializing huge base64 data)\n // IMPORTANT: Use COUNT query to avoid loading potentially huge request_body into memory\n let needsUpdate = false;\n await (state.stream as any).waitFor(async () => {\n const result = await state.storage.sql.exec<{ cnt: number }>(\n `SELECT COUNT(*) as cnt FROM logs WHERE id = ?1 AND request_body IS NULL`,\n logId\n );\n const rows = result.toArray();\n needsUpdate = rows.length > 0 && rows[0].cnt > 0;\n });\n\n // Skip serialization if request_body is already set\n if (!needsUpdate) {\n return;\n }\n\n const requestBody = JSON.stringify(request);\n\n await (state.stream as any).waitFor(async () => {\n await state.storage.sql.exec(\n `UPDATE logs SET request_body = ?1 WHERE id = ?2`,\n requestBody,\n logId\n );\n });\n\n // Broadcast updated log to WebSocket\n const emitLog = (state as any).emitLog as ((message: any) => void) | undefined;\n if (emitLog) {\n emitLog({\n type: 'log_data',\n log_id: logId,\n data: {\n id: logId,\n request_body: requestBody,\n },\n });\n }\n } catch (error) {\n // Non-fatal - logging is best-effort\n console.error(`[${this.name}] Failed to log actual request:`, error);\n }\n }\n\n /**\n * Helper: Log provider errors\n */\n protected async logError(\n state: FlowState,\n error: Error | unknown,\n context: string\n ): Promise<void> {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n console.error(`[${this.name}] ${context}:`, errorMessage);\n\n try {\n const id = crypto.randomUUID();\n const log = {\n id,\n message_id: (state as any).rootMessageId || \"00000000-0000-0000-0000-000000000000\",\n provider: this.name,\n model: context,\n error: `${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}`,\n error_type: \"provider_error\",\n created_at: Date.now() * 1000,\n };\n\n await (state.stream as any).waitFor(async () => {\n await state.storage.sql.exec(\n `INSERT INTO logs (\n id, message_id, provider, model,\n error, error_type, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)`,\n log.id,\n log.message_id,\n log.provider,\n log.model,\n log.error,\n log.error_type,\n log.created_at\n );\n });\n\n const emitLog = (state as any).emitLog as ((message: any) => void) | undefined;\n if (emitLog) {\n emitLog({\n type: 'log_data',\n log_id: log.id,\n data: log,\n });\n }\n } catch (logError) {\n console.error(`[${this.name}] Failed to log error:`, logError);\n }\n }\n\n /**\n * Helper: Check if a MIME type is an image\n */\n protected isImageMimeType(mimeType: string): boolean {\n return mimeType.startsWith(\"image/\");\n }\n\n /**\n * Helper: Create image content part for OpenAI/OpenRouter format\n * Converts base64 data to a data URL\n */\n protected createImageContentPart(\n base64Data: string,\n mimeType: string,\n detail: \"auto\" | \"low\" | \"high\" = \"auto\"\n ): ImageContentPart {\n // Create data URL from base64\n const dataUrl = `data:${mimeType};base64,${base64Data}`;\n return {\n type: \"image_url\",\n image_url: {\n url: dataUrl,\n detail,\n },\n };\n }\n\n /**\n * Helper: Create text content part\n */\n protected createTextContentPart(text: string): TextContentPart {\n return {\n type: \"text\",\n text,\n };\n }\n\n /**\n * Helper: Convert message content and attachments to multimodal format\n * Returns multimodal content array if there are images, otherwise returns string\n *\n * @param textContent The text content of the message\n * @param attachments Array of attachment references with resolved base64 data\n * @returns MessageContent - either string or multimodal array\n */\n protected buildMultimodalContent(\n textContent: string | null,\n attachments: Array<{ ref: AttachmentRef; base64: string }> | undefined\n ): MessageContent {\n // If no attachments or no image attachments, return plain text\n if (!attachments || attachments.length === 0) {\n return textContent || \"\";\n }\n\n // Filter to only image attachments\n const imageAttachments = attachments.filter((a) =>\n this.isImageMimeType(a.ref.mimeType)\n );\n\n if (imageAttachments.length === 0) {\n return textContent || \"\";\n }\n\n // Build multimodal content array\n const parts: MultimodalContent = [];\n\n // Add text content first (if any)\n if (textContent) {\n parts.push(this.createTextContentPart(textContent));\n }\n\n // Add image attachments\n for (const attachment of imageAttachments) {\n parts.push(\n this.createImageContentPart(attachment.base64, attachment.ref.mimeType)\n );\n }\n\n return parts;\n }\n\n /**\n * Helper: Convert MessageContent to string for logging/display\n * Extracts text from multimodal content, describes images\n */\n protected contentToString(content: MessageContent | undefined): string {\n if (!content) return \"\";\n if (typeof content === \"string\") return content;\n\n const parts: string[] = [];\n for (const part of content) {\n if (part.type === \"text\") {\n parts.push(part.text);\n } else if (part.type === \"image_url\") {\n parts.push(\"[Image]\");\n }\n }\n return parts.join(\" \");\n }\n}\n","import { BaseProvider } from \"./BaseProvider\";\nimport type { FlowState, LLMResponse, LLMResponseImage, RequestContext, ToolCall } from \"../types\";\nimport type { ProviderConfig } from \"./types\";\nimport type OpenAI from \"openai\";\n\n/**\n * OpenAI provider implementation\n * Supports: gpt-4, gpt-4-turbo, gpt-3.5-turbo, o1, o3, etc.\n */\nexport class OpenAIProvider extends BaseProvider {\n get name(): string {\n return \"openai\";\n }\n\n supportsModel(modelId: string): boolean {\n return (\n modelId.startsWith(\"gpt-\") ||\n modelId.startsWith(\"o1-\") ||\n modelId.startsWith(\"o3-\")\n );\n }\n\n async chat(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string,\n signal?: AbortSignal,\n modelConfig?: import(\"./types\").ModelConfig\n ): Promise<LLMResponse> {\n try {\n // Dynamic import to avoid bundling if not used\n const { default: OpenAI } = await import(\"openai\");\n\n const client = new OpenAI({\n apiKey: this.config.api_key,\n });\n\n // Prepare request with streaming enabled\n const request: OpenAI.Chat.ChatCompletionCreateParamsStreaming = {\n model: modelId,\n messages: context.messages as OpenAI.Chat.ChatCompletionMessageParam[],\n stream: true,\n // Optional fields - add only if present\n ...(context.tools && context.tools.length > 0 && {\n tools: context.tools as OpenAI.Chat.ChatCompletionTool[],\n ...(context.parallel_tool_calls !== undefined && {\n parallel_tool_calls: context.parallel_tool_calls,\n }),\n ...(context.tool_choice && {\n tool_choice: context.tool_choice as OpenAI.Chat.ChatCompletionToolChoiceOption,\n }),\n }),\n // OpenAI o-series models use max_completion_tokens for reasoning\n ...(context.reasoning?.max_tokens && {\n max_completion_tokens: context.reasoning.max_tokens,\n }),\n };\n\n // Log actual request BEFORE making API call\n // This ensures we have the complete request even if the call fails\n await this.logActualRequest(request, logId, state);\n\n // Create streaming completion with abort signal\n const stream = await client.chat.completions.create(request, {\n signal,\n });\n\n // Process stream\n let content = \"\";\n const toolCallsMap = new Map<number, Partial<ToolCall>>();\n let finishReason = \"\";\n let responseId = \"\";\n let usage: LLMResponse[\"usage\"] | undefined;\n let images: LLMResponseImage[] = []; // Store generated images from image generation models\n\n for await (const chunk of stream) {\n // CHECK STOP CONDITIONS BEFORE PROCESSING CHUNK\n // This ensures that if user hits stop, we immediately stop broadcasting chunks\n if (signal?.aborted || (await state.thread.instance.shouldStop())) {\n break;\n }\n\n responseId = chunk.id;\n\n const choice = chunk.choices[0];\n if (!choice) continue;\n\n // Accumulate content\n if (choice.delta?.content) {\n content += choice.delta.content;\n this.streamContent(choice.delta.content, state); // HTTP stream\n this.streamContentChunk(choice.delta.content, state); // WebSocket broadcast\n }\n\n // Accumulate tool calls\n if (choice.delta?.tool_calls) {\n for (const toolCallDelta of choice.delta.tool_calls) {\n if (toolCallDelta.index !== undefined) {\n this.accumulateToolCall(\n toolCallsMap,\n toolCallDelta.index,\n toolCallDelta\n );\n }\n }\n }\n\n // Capture images from response (image generation models)\n // Images may come in delta or message field depending on streaming vs non-streaming\n const delta = choice.delta as any;\n if (delta?.images && Array.isArray(delta.images)) {\n images.push(...delta.images);\n }\n // Also check message field (non-streaming response format)\n const message = (choice as any).message;\n if (message?.images && Array.isArray(message.images)) {\n images.push(...message.images);\n }\n\n // Capture finish reason\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n // Capture usage (only in last chunk)\n if (chunk.usage) {\n usage = {\n prompt_tokens: chunk.usage.prompt_tokens || 0,\n completion_tokens: chunk.usage.completion_tokens || 0,\n total_tokens: chunk.usage.total_tokens || 0,\n prompt_tokens_details: chunk.usage.prompt_tokens_details\n ? {\n cached_tokens:\n chunk.usage.prompt_tokens_details.cached_tokens || 0,\n }\n : undefined,\n };\n }\n }\n\n // Finalize tool calls\n const toolCalls =\n toolCallsMap.size > 0 ? this.finalizeToolCalls(toolCallsMap) : undefined;\n\n // Return response\n return {\n id: responseId,\n model: modelId,\n content: content || null,\n tool_calls: toolCalls,\n images: images.length > 0 ? images : undefined,\n finish_reason: finishReason || \"stop\",\n usage: usage || {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n },\n };\n } catch (error) {\n await this.logError(state, error, `OpenAI chat completion: ${modelId}`);\n throw error;\n }\n }\n}\n","import { BaseProvider } from \"./BaseProvider\";\nimport type { FlowState, LLMResponse, LLMResponseImage, RequestContext, ToolCall } from \"../types\";\nimport type { ProviderConfig } from \"./types\";\nimport type OpenAI from \"openai\";\n\n/**\n * OpenRouter-specific request extensions\n * These fields are not in the OpenAI SDK types but are supported by OpenRouter\n */\ninterface OpenRouterRequestExtensions {\n usage?: { include: boolean };\n provider?: { only: string[] };\n reasoning?: {\n effort?: string;\n max_tokens?: number;\n exclude?: boolean;\n };\n}\n\n/**\n * OpenRouter streaming request type - OpenAI base + OpenRouter extensions\n */\ntype OpenRouterStreamingRequest = OpenAI.Chat.ChatCompletionCreateParamsStreaming & OpenRouterRequestExtensions;\n\n/**\n * OpenRouter-specific chunk extensions\n * These fields are returned by OpenRouter but not in OpenAI types\n */\ninterface OpenRouterChunkExtensions {\n provider?: string;\n}\n\n/**\n * OpenRouter-specific delta extensions for reasoning\n */\ninterface OpenRouterDeltaExtensions {\n reasoning?: string;\n reasoning_details?: Array<{\n type: string;\n text?: string;\n }>;\n}\n\n/**\n * OpenRouter-specific usage extensions\n */\ninterface OpenRouterUsageExtensions {\n cost?: number;\n is_byok?: boolean;\n cost_details?: {\n upstream_inference_cost?: number;\n };\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n}\n\n/**\n * Type-safe accessor for OpenRouter-specific chunk fields\n */\ntype OpenRouterChunk = OpenAI.Chat.ChatCompletionChunk & OpenRouterChunkExtensions & {\n choices: Array<OpenAI.Chat.ChatCompletionChunk.Choice & {\n delta: OpenAI.Chat.ChatCompletionChunk.Choice.Delta & OpenRouterDeltaExtensions;\n }>;\n usage?: OpenAI.CompletionUsage & OpenRouterUsageExtensions;\n};\n\n/**\n * Reasoning detail item from OpenRouter\n */\ninterface ReasoningDetail {\n type: string;\n text?: string;\n}\n\n/**\n * OpenRouter provider implementation\n * OpenRouter uses OpenAI-compatible API but routes to multiple providers\n */\nexport class OpenRouterProvider extends BaseProvider {\n get name(): string {\n return \"openrouter\";\n }\n\n supportsModel(modelId: string): boolean {\n // OpenRouter supports a wide variety of models\n // We identify by the provider SDK being 'openrouter'\n // Actual model support is determined by the database configuration\n return true;\n }\n\n async chat(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string,\n signal?: AbortSignal,\n modelConfig?: import(\"./types\").ModelConfig\n ): Promise<LLMResponse> {\n try {\n // Dynamic import OpenAI SDK (OpenRouter is compatible)\n const { default: OpenAI } = await import(\"openai\");\n\n const client = new OpenAI({\n apiKey: this.config.api_key,\n baseURL: \"https://openrouter.ai/api/v1\",\n });\n\n // Parse provider routing config if specified\n let providerRouting: { only: string[] } | undefined;\n if (modelConfig?.included_providers) {\n try {\n const providers = JSON.parse(modelConfig.included_providers);\n if (Array.isArray(providers) && providers.length > 0) {\n providerRouting = { only: providers };\n }\n } catch (error) {\n console.error(\"[OpenRouter] Failed to parse included_providers:\", error);\n }\n }\n\n // Build reasoning config if present\n // https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n let reasoningConfig: OpenRouterRequestExtensions[\"reasoning\"] | undefined;\n if (context.reasoning) {\n reasoningConfig = {};\n if (context.reasoning.effort) {\n reasoningConfig.effort = context.reasoning.effort;\n }\n if (context.reasoning.max_tokens) {\n reasoningConfig.max_tokens = context.reasoning.max_tokens;\n }\n if (context.reasoning.exclude) {\n reasoningConfig.exclude = true;\n }\n }\n\n // Prepare request with streaming enabled\n const request: OpenRouterStreamingRequest = {\n model: modelId,\n messages: context.messages as OpenAI.Chat.ChatCompletionMessageParam[],\n stream: true,\n // OpenRouter-specific: enable usage accounting\n // https://openrouter.ai/docs/use-cases/usage-accounting\n usage: { include: true },\n // Optional OpenRouter routing\n ...(providerRouting && { provider: providerRouting }),\n // Optional reasoning config\n ...(reasoningConfig && { reasoning: reasoningConfig }),\n // Optional tools\n ...(context.tools && context.tools.length > 0 && {\n tools: context.tools as OpenAI.Chat.ChatCompletionTool[],\n ...(context.parallel_tool_calls !== undefined && {\n parallel_tool_calls: context.parallel_tool_calls,\n }),\n ...(context.tool_choice && {\n tool_choice: context.tool_choice as OpenAI.Chat.ChatCompletionToolChoiceOption,\n }),\n }),\n };\n\n // Log actual request BEFORE making API call\n // This ensures we have the complete request even if the call fails\n await this.logActualRequest(request, logId, state);\n\n // Create streaming completion with abort signal\n // Use type assertion because OpenAI SDK types don't include OpenRouter extensions\n const stream = await client.chat.completions.create(\n request as OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n { signal }\n );\n\n // Process stream - aggregate all important information from chunks\n let content = \"\";\n let reasoning_content = \"\"; // Store reasoning separately\n let reasoning_details: ReasoningDetail[] = []; // Store structured reasoning blocks\n const toolCallsMap = new Map<number, Partial<ToolCall>>();\n let finishReason = \"\";\n let responseId = \"\";\n let usage: LLMResponse[\"usage\"] | undefined;\n let cost: number | undefined;\n let actualProvider: string | undefined;\n const allChunks: OpenRouterChunk[] = []; // Store all chunks for aggregate response body\n let images: LLMResponseImage[] = []; // Store generated images from image generation models\n\n try {\n for await (const rawChunk of stream) {\n // Cast to OpenRouter extended type for type-safe access\n const chunk = rawChunk as OpenRouterChunk;\n\n // CHECK STOP CONDITIONS BEFORE PROCESSING CHUNK\n // This ensures that if user hits stop, we immediately stop broadcasting chunks\n if (signal?.aborted || (await state.thread.instance.shouldStop())) {\n break;\n }\n\n // Store chunk for aggregate response\n allChunks.push(chunk);\n\n responseId = chunk.id;\n\n const choice = chunk.choices[0];\n if (!choice) continue;\n\n // Accumulate regular content\n if (choice.delta?.content) {\n content += choice.delta.content;\n this.streamContent(choice.delta.content, state); // HTTP stream\n this.streamContentChunk(choice.delta.content, state); // WebSocket broadcast\n }\n\n // GPT-5/o1 returns reasoning in a separate field - DON'T stream it or mix it with content\n if (choice.delta?.reasoning) {\n reasoning_content += choice.delta.reasoning;\n // DO NOT stream reasoning content to user\n }\n\n // Capture reasoning_details from OpenRouter\n // https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n if (choice.delta?.reasoning_details) {\n const details = choice.delta.reasoning_details;\n // Separate text chunks from structured reasoning\n for (const item of details) {\n if (item.type === \"reasoning.text\") {\n // Accumulate text directly into reasoning_content\n reasoning_content += item.text || \"\";\n } else {\n // Store non-text reasoning (summaries, encrypted, etc.)\n reasoning_details.push(item);\n }\n }\n }\n\n // Accumulate tool calls\n if (choice.delta?.tool_calls) {\n for (const toolCallDelta of choice.delta.tool_calls) {\n if (toolCallDelta.index !== undefined) {\n this.accumulateToolCall(\n toolCallsMap,\n toolCallDelta.index,\n toolCallDelta\n );\n }\n }\n }\n\n // Capture images from response (image generation models)\n // Images may come in delta or message field depending on streaming vs non-streaming\n const delta = choice.delta as any;\n if (delta?.images && Array.isArray(delta.images)) {\n images.push(...delta.images);\n }\n // Also check message field (non-streaming response format)\n const message = (choice as any).message;\n if (message?.images && Array.isArray(message.images)) {\n images.push(...message.images);\n }\n\n // Capture finish reason\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n // Capture actual provider from chunk root (OpenRouter-specific field)\n if (chunk.provider !== undefined) {\n actualProvider = chunk.provider;\n }\n\n // Capture usage from ANY chunk (can appear in any chunk, not just the last)\n if (chunk.usage) {\n usage = {\n prompt_tokens: chunk.usage.prompt_tokens || 0,\n completion_tokens: chunk.usage.completion_tokens || 0,\n total_tokens: chunk.usage.total_tokens || 0,\n prompt_tokens_details: chunk.usage.prompt_tokens_details\n ? {\n cached_tokens:\n chunk.usage.prompt_tokens_details.cached_tokens || 0,\n }\n : undefined,\n completion_tokens_details: chunk.usage.completion_tokens_details\n ? {\n reasoning_tokens:\n chunk.usage.completion_tokens_details.reasoning_tokens || 0,\n }\n : undefined,\n };\n\n // Cost can appear in ANY chunk - capture it whenever we see it\n // For BYOK (Bring Your Own Key) models, cost is 0 but actual cost is in cost_details\n if (chunk.usage.is_byok && chunk.usage.cost_details?.upstream_inference_cost !== undefined) {\n cost = chunk.usage.cost_details.upstream_inference_cost;\n } else if (chunk.usage.cost !== undefined) {\n cost = chunk.usage.cost;\n }\n }\n }\n } catch (streamError: unknown) {\n // Enhanced error logging for stream errors\n const err = streamError as { code?: string; status?: number; message?: string; type?: string };\n console.error(`[openrouter] Stream error for model ${modelId}:`, {\n error: streamError,\n code: err.code,\n status: err.status,\n message: err.message,\n type: err.type,\n });\n throw new Error(\n `Stream error: ${err.message || 'Unknown error'} (code: ${err.code || 'unknown'})`\n );\n }\n\n // Add captured cost and provider to usage (extend the usage object)\n const extendedUsage = usage as LLMResponse[\"usage\"] & { cost?: number; provider?: string } | undefined;\n if (extendedUsage && cost !== undefined) {\n extendedUsage.cost = cost;\n }\n if (extendedUsage && actualProvider !== undefined) {\n extendedUsage.provider = actualProvider;\n }\n\n // Finalize tool calls\n const toolCalls =\n toolCallsMap.size > 0 ? this.finalizeToolCalls(toolCallsMap) : undefined;\n\n // Build aggregate response body (similar to standard OpenAI response format)\n const aggregateResponse = {\n id: responseId,\n object: \"chat.completion\" as const,\n created: allChunks[0]?.created || Math.floor(Date.now() / 1000),\n model: modelId,\n provider: allChunks.find((c) => c.provider)?.provider,\n choices: [\n {\n index: 0,\n message: {\n role: \"assistant\" as const,\n content: content || null,\n tool_calls: toolCalls || undefined,\n images: images.length > 0 ? images : undefined,\n },\n finish_reason: finishReason || \"stop\",\n },\n ],\n usage: extendedUsage || {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n },\n // Include all chunks for debugging/auditing\n _raw_chunks: allChunks.length,\n };\n\n // Text reasoning is already accumulated in reasoning_content\n // Non-text reasoning (summaries, encrypted) is in reasoning_details\n const finalReasoningContent = reasoning_content || null;\n const finalReasoningDetails: ReasoningDetail[] | undefined = reasoning_details.length > 0 ? reasoning_details : undefined;\n\n // Return response\n return {\n id: responseId,\n model: modelId,\n content: content || null,\n reasoning_content: finalReasoningContent,\n reasoning_details: finalReasoningDetails,\n tool_calls: toolCalls,\n images: images.length > 0 ? images : undefined,\n finish_reason: finishReason || \"stop\",\n usage: usage || {\n prompt_tokens: 0,\n completion_tokens: 0,\n total_tokens: 0,\n },\n // Store aggregate response for logging\n _aggregate_response: aggregateResponse,\n } as LLMResponse;\n } catch (error) {\n // Don't log here - LLMRequest handles error logging\n // to avoid duplicate log entries\n throw error;\n }\n }\n}\n","/**\n * TestScript - Fluent builder for defining deterministic LLM response sequences.\n *\n * Use this to script exact responses for tests, enabling deterministic testing\n * of agent behavior without calling real LLM APIs.\n *\n * @example\n * ```typescript\n * const script = TestScript.create()\n * .addTextResponse(\"Hello! How can I help?\")\n * .addToolCallResponse([\n * { name: \"search\", arguments: { query: \"test\" } }\n * ])\n * .addTextResponse(\"Based on the search, here's what I found...\");\n * ```\n */\n\nimport type { ToolCall } from \"../types\";\n\n/**\n * A single scripted response from the LLM\n */\nexport interface ScriptedResponse {\n /** Text content to return (null for pure tool calls) */\n content?: string | null;\n\n /** Tool calls to return (OpenAI format) */\n toolCalls?: ToolCall[];\n\n /** Reasoning content for o1-style models */\n reasoningContent?: string | null;\n\n /** Reasoning details for OpenRouter structured reasoning */\n reasoningDetails?: any[];\n\n /** Finish reason */\n finishReason?: \"stop\" | \"tool_calls\" | \"length\" | \"content_filter\";\n\n /** Token usage to report */\n usage?: {\n promptTokens?: number;\n completionTokens?: number;\n reasoningTokens?: number;\n };\n\n /** Simulate an error instead of a successful response */\n error?: {\n message: string;\n code?: string;\n status?: number;\n };\n\n /** Optional: Validate the input matches expectations */\n expectInput?: InputExpectation;\n\n /** Optional: Delay before responding (ms) - useful for streaming tests */\n delayMs?: number;\n}\n\n/**\n * Input validation expectations\n */\nexport interface InputExpectation {\n /** Check that a message contains this text (string or regex) */\n containsMessage?: string | RegExp;\n\n /** Check that a tool result for this tool exists */\n containsToolResult?: {\n toolName: string;\n resultContains?: string;\n };\n\n /** Exact message count expected */\n messageCount?: number;\n\n /** Check that the system prompt contains this text */\n systemPromptContains?: string | RegExp;\n}\n\n/**\n * Configuration for streaming simulation\n */\nexport interface StreamingConfig {\n /** Characters per chunk */\n chunkSize: number;\n\n /** Delay between chunks in milliseconds */\n chunkDelayMs: number;\n}\n\n/**\n * Shorthand for creating tool calls\n */\nexport interface ToolCallSpec {\n name: string;\n arguments: Record<string, any>;\n id?: string;\n}\n\n/**\n * Builder class for creating deterministic test scripts.\n *\n * Each call to addResponse/addTextResponse/etc adds a response to the sequence.\n * When the TestProvider is used, it returns these responses in order.\n */\nexport class TestScript {\n private responses: ScriptedResponse[] = [];\n private streamingConfig?: StreamingConfig;\n\n /**\n * Create a new TestScript instance\n */\n static create(): TestScript {\n return new TestScript();\n }\n\n /**\n * Add a response to the sequence\n */\n addResponse(response: ScriptedResponse): this {\n this.responses.push(response);\n return this;\n }\n\n /**\n * Add a simple text response (stops after response)\n */\n addTextResponse(content: string, options?: Partial<ScriptedResponse>): this {\n return this.addResponse({\n content,\n finishReason: \"stop\",\n ...options,\n });\n }\n\n /**\n * Add a response with tool calls\n */\n addToolCallResponse(\n toolCalls: ToolCallSpec[],\n content?: string,\n options?: Partial<ScriptedResponse>\n ): this {\n return this.addResponse({\n content: content ?? null,\n toolCalls: toolCalls.map((tc) => ({\n id: tc.id || `call_${crypto.randomUUID().substring(0, 8)}`,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.arguments),\n },\n })),\n finishReason: \"tool_calls\",\n ...options,\n });\n }\n\n /**\n * Add an error response (simulates provider error)\n */\n addErrorResponse(\n message: string,\n code?: string,\n status?: number,\n options?: Partial<ScriptedResponse>\n ): this {\n return this.addResponse({\n error: { message, code, status },\n ...options,\n });\n }\n\n /**\n * Add a response with reasoning content (for o1-style models)\n */\n addReasoningResponse(\n content: string,\n reasoningContent: string,\n options?: Partial<ScriptedResponse>\n ): this {\n return this.addResponse({\n content,\n reasoningContent,\n finishReason: \"stop\",\n ...options,\n });\n }\n\n /**\n * Enable streaming simulation for all responses\n */\n withStreamingSimulation(config: StreamingConfig): this {\n this.streamingConfig = config;\n return this;\n }\n\n /**\n * Get all scripted responses\n */\n getResponses(): ScriptedResponse[] {\n return [...this.responses];\n }\n\n /**\n * Get streaming configuration\n */\n getStreamingConfig(): StreamingConfig | undefined {\n return this.streamingConfig;\n }\n\n /**\n * Get total number of responses\n */\n get length(): number {\n return this.responses.length;\n }\n\n /**\n * Check if script is empty\n */\n isEmpty(): boolean {\n return this.responses.length === 0;\n }\n\n /**\n * Create a clone of this script\n */\n clone(): TestScript {\n const cloned = new TestScript();\n cloned.responses = [...this.responses];\n cloned.streamingConfig = this.streamingConfig\n ? { ...this.streamingConfig }\n : undefined;\n return cloned;\n }\n}\n","/**\n * TestProvider - Deterministic LLM provider for testing.\n *\n * Returns scripted responses in sequence, enabling deterministic testing\n * of agent execution without real API calls.\n *\n * @example\n * ```typescript\n * const script = TestScript.create()\n * .addTextResponse(\"Hello!\")\n * .addToolCallResponse([{ name: \"search\", arguments: { q: \"test\" } }])\n * .addTextResponse(\"Found results.\");\n *\n * // Provider returns these responses in order\n * const provider = new TestProvider({\n * script,\n * name: \"test\",\n * sdk: \"test\",\n * api_key: \"test\",\n * });\n * ```\n */\n\nimport { BaseProvider } from \"./BaseProvider\";\nimport type { FlowState, LLMResponse, RequestContext, MessageContent } from \"../types\";\nimport type { ProviderConfig, ModelConfig } from \"./types\";\nimport { TestScript } from \"./TestScript\";\nimport type { ScriptedResponse, InputExpectation } from \"./TestScript\";\n\n/**\n * Helper to extract text from MessageContent (string or multimodal array)\n */\nfunction contentToString(content: MessageContent | undefined | null): string {\n if (!content) return \"\";\n if (typeof content === \"string\") return content;\n // Extract text from multimodal content\n return content\n .filter((part) => part.type === \"text\")\n .map((part) => (part as { type: \"text\"; text: string }).text)\n .join(\" \");\n}\n\n/**\n * Extended provider config for TestProvider\n */\nexport interface TestProviderConfig extends ProviderConfig {\n /** The test script defining response sequence. If not provided, uses a default that echoes responses. */\n script?: TestScript;\n\n /** Whether to validate inputs match expectations (default: false) */\n validateInputs?: boolean;\n\n /** Log all requests for debugging (default: false) */\n debugLog?: boolean;\n}\n\n/**\n * Deterministic test provider that returns scripted LLM responses.\n *\n * Key features:\n * - Returns responses in sequence as defined by TestScript\n * - Supports streaming simulation\n * - Optional input validation\n * - Request logging for assertions\n * - Clear error when script is exhausted\n */\nexport class TestProvider extends BaseProvider {\n private script: TestScript;\n private responseIndex: number = 0;\n private validateInputs: boolean;\n private debugLog: boolean;\n private requestLog: RequestContext[] = [];\n private useDefaultResponse: boolean;\n\n constructor(config: TestProviderConfig) {\n super(config);\n // If no script provided, use a default that returns a simple acknowledgment\n this.useDefaultResponse = !config.script;\n this.script = config.script ?? TestScript.create().addTextResponse(\"Test response received.\");\n this.validateInputs = config.validateInputs ?? false;\n this.debugLog = config.debugLog ?? false;\n }\n\n get name(): string {\n return \"test\";\n }\n\n /**\n * Test provider supports any model ID\n */\n supportsModel(_modelId: string): boolean {\n return true;\n }\n\n /**\n * Return the next scripted response\n */\n async chat(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string,\n signal?: AbortSignal,\n _modelConfig?: ModelConfig\n ): Promise<LLMResponse> {\n // Log request for debugging/assertions\n if (this.debugLog) {\n console.log(`[TestProvider] Request ${this.responseIndex + 1}:`, {\n messageCount: context.messages.length,\n lastMessage: context.messages.slice(-1)[0],\n });\n }\n this.requestLog.push({ ...context });\n\n // Check for abort\n if (signal?.aborted) {\n throw new Error(\"Request aborted\");\n }\n\n // Get next scripted response\n const responses = this.script.getResponses();\n let scripted: ScriptedResponse;\n\n if (this.responseIndex >= responses.length) {\n if (this.useDefaultResponse) {\n // When using default response mode, keep returning the same response\n scripted = responses[0];\n } else {\n const lastMessage = context.messages.slice(-1)[0];\n const lastContent = contentToString(lastMessage?.content);\n throw new Error(\n `TestProvider: Script exhausted after ${this.responseIndex} responses. ` +\n `Expected ${responses.length} total requests. ` +\n `Received request with ${context.messages.length} messages. ` +\n `Last message role: \"${lastMessage?.role}\", ` +\n `content: \"${lastContent.substring(0, 100)}...\"`\n );\n }\n } else {\n scripted = responses[this.responseIndex];\n }\n\n this.responseIndex++;\n\n // Validate input expectations if configured\n if (this.validateInputs && scripted.expectInput) {\n this.validateInput(context, scripted.expectInput);\n }\n\n // Simulate delay if configured\n if (scripted.delayMs) {\n await this.sleep(scripted.delayMs);\n }\n\n // Simulate error if scripted\n if (scripted.error) {\n const error = new Error(scripted.error.message) as any;\n error.code = scripted.error.code;\n error.status = scripted.error.status;\n await this.logError(state, error, `TestProvider: ${modelId}`);\n throw error;\n }\n\n // Log request body (mimics real providers)\n await this.logActualRequest(\n { model: modelId, messages: context.messages, tools: context.tools },\n logId,\n state\n );\n\n // Handle streaming simulation\n const streamingConfig = this.script.getStreamingConfig();\n if (streamingConfig && scripted.content) {\n await this.simulateStreaming(scripted.content, streamingConfig, state);\n } else if (scripted.content) {\n // Immediate mode - still call stream methods for code path testing\n this.streamContent(scripted.content, state);\n this.streamContentChunk(scripted.content, state);\n }\n\n // Build response\n const responseId = `test_${crypto.randomUUID().substring(0, 12)}`;\n const promptTokens =\n scripted.usage?.promptTokens ?? this.estimateTokens(context.messages);\n const completionTokens =\n scripted.usage?.completionTokens ??\n this.estimateTokens([{ content: scripted.content }]);\n const reasoningTokens = scripted.usage?.reasoningTokens ?? 0;\n\n return {\n id: responseId,\n model: modelId,\n content: scripted.content ?? null,\n reasoning_content: scripted.reasoningContent ?? null,\n reasoning_details: scripted.reasoningDetails,\n tool_calls: scripted.toolCalls,\n finish_reason: scripted.finishReason ?? \"stop\",\n usage: {\n prompt_tokens: promptTokens,\n completion_tokens: completionTokens,\n total_tokens: promptTokens + completionTokens,\n completion_tokens_details: reasoningTokens\n ? { reasoning_tokens: reasoningTokens }\n : undefined,\n },\n };\n }\n\n /**\n * Simulate streaming by sending content in chunks\n */\n private async simulateStreaming(\n content: string,\n config: { chunkSize: number; chunkDelayMs: number },\n state: FlowState\n ): Promise<void> {\n for (let i = 0; i < content.length; i += config.chunkSize) {\n const chunk = content.substring(i, i + config.chunkSize);\n this.streamContent(chunk, state);\n this.streamContentChunk(chunk, state);\n\n if (config.chunkDelayMs > 0) {\n await this.sleep(config.chunkDelayMs);\n }\n }\n }\n\n /**\n * Validate request matches expectations\n */\n private validateInput(\n context: RequestContext,\n expectations: InputExpectation\n ): void {\n if (expectations.messageCount !== undefined) {\n if (context.messages.length !== expectations.messageCount) {\n throw new Error(\n `TestProvider: Expected ${expectations.messageCount} messages, got ${context.messages.length}`\n );\n }\n }\n\n if (expectations.containsMessage) {\n const pattern = expectations.containsMessage;\n const found = context.messages.some((m) => {\n const content = contentToString(m.content);\n if (!content) return false;\n return typeof pattern === \"string\"\n ? content.includes(pattern)\n : pattern.test(content);\n });\n\n if (!found) {\n throw new Error(\n `TestProvider: Expected message containing \"${pattern}\" not found`\n );\n }\n }\n\n if (expectations.containsToolResult) {\n const { toolName, resultContains } = expectations.containsToolResult;\n const found = context.messages.some((m) => {\n if (m.role !== \"tool\") return false;\n const content = contentToString(m.content);\n if (!content) return false;\n return !resultContains || content.includes(resultContains);\n });\n\n if (!found) {\n throw new Error(\n `TestProvider: Expected tool result for \"${toolName}\" not found`\n );\n }\n }\n\n if (expectations.systemPromptContains) {\n const pattern = expectations.systemPromptContains;\n const systemMessage = context.messages.find((m) => m.role === \"system\");\n const systemContent = contentToString(systemMessage?.content);\n if (!systemContent) {\n throw new Error(`TestProvider: No system message found`);\n }\n const matches =\n typeof pattern === \"string\"\n ? systemContent.includes(pattern)\n : pattern.test(systemContent);\n if (!matches) {\n throw new Error(\n `TestProvider: System prompt does not contain \"${pattern}\"`\n );\n }\n }\n }\n\n /**\n * Simple token estimation (for mock usage stats)\n */\n private estimateTokens(\n messages: Array<{ content?: MessageContent | null }>\n ): number {\n return messages.reduce((sum, m) => {\n const content = contentToString(m.content);\n // Rough approximation: ~4 chars per token\n return sum + Math.ceil(content.length / 4);\n }, 0);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n // ============ Test Utility Methods ============\n\n /**\n * Get logged requests (for test assertions)\n */\n getRequestLog(): RequestContext[] {\n return [...this.requestLog];\n }\n\n /**\n * Get the last request made\n */\n getLastRequest(): RequestContext | undefined {\n return this.requestLog[this.requestLog.length - 1];\n }\n\n /**\n * Reset provider state for reuse across tests\n */\n reset(): void {\n this.responseIndex = 0;\n this.requestLog = [];\n }\n\n /**\n * Replace the script with a new one and reset\n */\n setScript(script: TestScript): void {\n this.script = script;\n this.reset();\n }\n\n /**\n * Check if all scripted responses were consumed\n */\n isScriptComplete(): boolean {\n return this.responseIndex === this.script.length;\n }\n\n /**\n * Get remaining unconsumed response count\n */\n remainingResponses(): number {\n return this.script.length - this.responseIndex;\n }\n\n /**\n * Get current response index\n */\n getCurrentIndex(): number {\n return this.responseIndex;\n }\n}\n","import type {\n LLMProvider,\n ProviderFactory,\n ProviderRegistry as IProviderRegistry,\n ProviderConfig,\n ModelConfig,\n} from \"./types\";\nimport type { ThreadInstance, Env } from \"../types\";\nimport { OpenAIProvider } from \"./OpenAIProvider\";\nimport { OpenRouterProvider } from \"./OpenRouterProvider\";\nimport { TestProvider, type TestProviderConfig } from \"./TestProvider\";\n\n/**\n * Provider registry implementation\n * Manages provider factories and model-to-provider mapping\n *\n * Now loads model configs from TypeScript virtual modules and\n * provider API keys from DurableAgentBuilder.\n */\nclass ProviderRegistryImpl implements IProviderRegistry {\n private factories = new Map<string, ProviderFactory>();\n private providerCache = new Map<string, { provider: LLMProvider; modelName: string; modelConfig: ModelConfig }>();\n\n constructor() {\n // Register built-in providers\n this.registerBuiltInProviders();\n }\n\n private registerBuiltInProviders(): void {\n // OpenAI provider\n this.register(\"openai\", (config) => new OpenAIProvider(config));\n\n // OpenRouter provider\n this.register(\"openrouter\", (config) => new OpenRouterProvider(config));\n\n // Test provider - for deterministic testing with scripted responses\n this.register(\"test\", (config) => new TestProvider(config as TestProviderConfig));\n }\n\n register(sdk: string, factory: ProviderFactory): void {\n this.factories.set(sdk.toLowerCase(), factory);\n }\n\n hasProvider(sdk: string): boolean {\n return this.factories.has(sdk.toLowerCase());\n }\n\n /**\n * Get provider for a model.\n *\n * @param modelName - The model name (from TypeScript config)\n * @param env - Environment bindings\n * @param thread - Thread instance for loading model from virtual modules\n */\n async getProvider(\n modelName: string,\n env: Env,\n thread?: ThreadInstance\n ): Promise<{ provider: LLMProvider; modelName: string; modelConfig: ModelConfig }> {\n // Check cache first\n const cacheKey = `${modelName}`;\n const cachedData = this.providerCache.get(cacheKey);\n if (cachedData) {\n return cachedData;\n }\n\n // Get model configuration from TypeScript virtual modules\n const modelConfig = await this.getModelConfig(modelName, env, thread);\n if (!modelConfig) {\n throw new Error(`Model not found: ${modelName}`);\n }\n\n // Get provider configuration from DurableAgentBuilder or environment\n const providerConfig = await this.getProviderConfig(\n modelConfig.provider_id,\n env\n );\n if (!providerConfig) {\n throw new Error(`Provider not found: ${modelConfig.provider_id}`);\n }\n\n // Get factory for this provider SDK\n const factory = this.factories.get(providerConfig.sdk.toLowerCase());\n if (!factory) {\n throw new Error(`No provider registered for SDK: ${providerConfig.sdk}`);\n }\n\n // Create provider instance\n const provider = factory(providerConfig);\n\n // Cache provider with model name and config\n const result = { provider, modelName: modelConfig.name, modelConfig };\n this.providerCache.set(cacheKey, result);\n\n return result;\n }\n\n /**\n * Get model configuration from TypeScript virtual modules\n */\n private async getModelConfig(\n modelName: string,\n env: Env,\n thread?: ThreadInstance\n ): Promise<ModelConfig | null> {\n if (!thread) {\n throw new Error(\"Thread instance required for model lookup\");\n }\n\n try {\n const modelDef = await thread.loadModel(modelName);\n if (!modelDef) {\n return null;\n }\n\n // Convert ModelDefinition to ModelConfig format\n return {\n id: modelName, // Use name as ID\n name: modelDef.model, // The actual model ID sent to provider\n provider_id: modelDef.provider, // Provider name\n included_providers: modelDef.includedProviders\n ? JSON.stringify(modelDef.includedProviders)\n : \"[]\",\n input_price: modelDef.inputPrice ?? null,\n output_price: modelDef.outputPrice ?? null,\n cached_price: modelDef.cachedPrice ?? null,\n };\n } catch (error) {\n console.error(\"Error loading model config:\", error);\n throw error;\n }\n }\n\n /**\n * Get provider configuration.\n *\n * Provider API keys come from environment variables.\n */\n private async getProviderConfig(\n providerName: string,\n env: Env\n ): Promise<ProviderConfig | null> {\n // Test provider doesn't require an API key\n if (providerName.toLowerCase() === \"test\") {\n return {\n name: \"test\",\n sdk: \"test\",\n api_key: \"test\", // Dummy key for test provider\n };\n }\n\n // Map provider name to API key environment variable\n const apiKeyEnvVarMap: Record<string, string> = {\n openai: \"OPENAI_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n anthropic: \"ANTHROPIC_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n };\n\n // Get API key from environment\n const envVar = apiKeyEnvVarMap[providerName.toLowerCase()];\n if (envVar && (env as any)[envVar]) {\n return {\n name: providerName,\n sdk: providerName, // SDK is same as provider name for built-in providers\n api_key: (env as any)[envVar],\n };\n }\n\n return null;\n }\n\n /**\n * Clear the provider cache\n * Useful for testing or when configurations change\n */\n clearCache(): void {\n this.providerCache.clear();\n }\n}\n\n/**\n * Singleton instance\n */\nexport const ProviderRegistry = new ProviderRegistryImpl();\n","/**\n * Provider system for LLM integrations\n *\n * This module provides a modular, extensible system for integrating\n * different LLM providers (OpenAI, OpenRouter, Anthropic, etc.)\n *\n * ## Architecture\n *\n * - **LLMProvider**: Base interface that all providers must implement\n * - **BaseProvider**: Abstract base class with common functionality\n * - **Concrete Providers**: OpenAIProvider, OpenRouterProvider, etc.\n * - **ProviderRegistry**: Singleton that manages provider instances\n *\n * ## Usage\n *\n * ```typescript\n * // Get provider for a model\n * const provider = await ProviderRegistry.getProvider(modelId, env);\n *\n * // Make a chat completion request\n * const response = await provider.chat(modelId, context, state);\n * ```\n *\n * ## Adding a New Provider\n *\n * 1. Create a new provider class extending BaseProvider\n * 2. Implement the `chat()` and `supportsModel()` methods\n * 3. Register it in ProviderRegistry constructor\n *\n * ```typescript\n * export class CustomProvider extends BaseProvider {\n * get name(): string {\n * return \"custom\";\n * }\n *\n * supportsModel(modelId: string): boolean {\n * return modelId.startsWith(\"custom-\");\n * }\n *\n * async chat(modelId, context, state): Promise<LLMResponse> {\n * // Implementation\n * }\n * }\n *\n * // In ProviderRegistry:\n * this.register(\"custom\", (config) => new CustomProvider(config));\n * ```\n */\n\nexport * from \"./types\";\nexport * from \"./BaseProvider\";\nexport * from \"./OpenAIProvider\";\nexport * from \"./OpenRouterProvider\";\nexport * from \"./TestScript\";\nexport * from \"./TestProvider\";\nexport { ProviderRegistry } from \"./ProviderRegistry\";\n","import type {\n RequestContext,\n LLMResponse,\n LLMResponseWithLog,\n FlowState,\n ModelFallback,\n LogData,\n} from \"./types\";\nimport { MAX_RETRIES_PER_MODEL, BACKOFF_BASE, TIMESTAMP_MULTIPLIER } from \"./types\";\n\n/**\n * Transform messages for logging by replacing data URLs with file paths\n * This prevents megabytes of base64 data from being stored in logs\n */\nfunction transformMessagesForLog(\n messages: RequestContext[\"messages\"],\n imagePathMap?: Map<string, string>\n): RequestContext[\"messages\"] {\n if (!imagePathMap || imagePathMap.size === 0) {\n return messages;\n }\n\n return messages.map(msg => {\n // Only transform multimodal content (arrays)\n if (!Array.isArray(msg.content)) {\n return msg;\n }\n\n return {\n ...msg,\n content: msg.content.map(part => {\n // Check if this is an image_url part with a data URL\n if (\n typeof part === \"object\" &&\n part !== null &&\n \"type\" in part &&\n part.type === \"image_url\" &&\n \"image_url\" in part &&\n part.image_url?.url\n ) {\n const path = imagePathMap.get(part.image_url.url);\n if (path) {\n return {\n ...part,\n image_url: { ...part.image_url, url: path }\n };\n }\n }\n return part;\n })\n };\n });\n}\n\n/**\n * Executes LLM requests with smart retry and fallback logic\n */\nexport class LLMRequest {\n /**\n * Execute an LLM request with full retry/fallback logic\n *\n * Retry hierarchy:\n * 1. Try primary model (2x)\n * 2. Try each fallback model (2x each)\n * 3. If all fail, throw terminal error\n *\n * Error classification:\n * - Provider errors (from model call): Retriable with backoff + fallbacks\n * - Code errors (validation, setup): Thrown immediately without retry\n *\n * This applies to ALL prompts (top-level and sub-prompts)\n * Returns both the LLM response and the log ID for tracking\n */\n static async execute(\n context: RequestContext,\n state: FlowState\n ): Promise<LLMResponseWithLog> {\n const startTime = Date.now();\n let lastFailedLogId: string | undefined;\n\n // Try primary model\n try {\n return await this.tryModel(context, state, context.model, startTime, undefined);\n } catch (primaryError) {\n console.error(`Primary model ${context.model} failed:`, primaryError);\n\n // Get the log ID from the error (set by tryModel)\n lastFailedLogId = (primaryError as any)?._lastLogId;\n\n // Send fallback telemetry\n state.emitTelemetry?.({\n type: \"fallback_triggered\",\n from: context.model,\n to: \"fetching_fallbacks\",\n timestamp: Date.now(),\n });\n }\n\n // Try fallback models\n const fallbacks = await this.getFallbacks(context.model, state);\n\n for (const fallback of fallbacks) {\n try {\n state.emitTelemetry?.({\n type: \"fallback_triggered\",\n from: context.model,\n to: fallback.fallback_model_id,\n timestamp: Date.now(),\n });\n\n // Pass lastFailedLogId so fallback attempts are linked as retries\n return await this.tryModel(\n context,\n state,\n fallback.fallback_model_id,\n startTime,\n lastFailedLogId\n );\n } catch (fallbackError) {\n console.error(\n `Fallback model ${fallback.fallback_model_id} failed:`,\n fallbackError\n );\n\n // Get the log ID from this fallback attempt\n lastFailedLogId = (fallbackError as any)?._lastLogId;\n\n continue;\n }\n }\n\n // All retries exhausted\n const exhaustionError = new Error(\n `All retry attempts exhausted for model ${context.model} and ${fallbacks.length} fallbacks`\n );\n\n // Log final exhaustion (this is a new error so won't be deduplicated)\n await this.logError(\n state,\n exhaustionError,\n \"all_retries_exhausted\",\n context.model,\n startTime\n );\n\n throw exhaustionError;\n }\n\n /**\n * Try a specific model with retries and validation\n * @param initialParentLogId - Log ID from previous attempt (for linking fallbacks as retries)\n */\n private static async tryModel(\n context: RequestContext,\n state: FlowState,\n modelId: string,\n startTime: number,\n initialParentLogId?: string\n ): Promise<LLMResponseWithLog> {\n let attempts = 0;\n let logId: string | undefined;\n let previousLogId: string | undefined = initialParentLogId; // Track previous attempt for retry linking\n\n while (attempts < MAX_RETRIES_PER_MODEL) {\n attempts++;\n\n try {\n // Log request details (non-blocking) and get log ID\n // Pass previousLogId for retry tracking (includes fallback linking)\n logId = await this.logRequest(state, modelId, context, previousLogId);\n\n // Send telemetry for this attempt\n state.emitTelemetry?.({\n type: \"llm_request\",\n model: modelId,\n attempt: attempts,\n timestamp: Date.now(),\n });\n\n // Make the actual LLM call\n const response = await this.callModel(modelId, context, state, logId);\n\n // Success! Update log with response data\n await this.logSuccess(response, state, modelId, startTime, context, logId);\n\n state.emitTelemetry?.({\n type: \"llm_response\",\n tokens: response.usage.total_tokens,\n latency: Date.now() - startTime,\n timestamp: Date.now(),\n });\n\n return { response, logId };\n } catch (error) {\n console.error(\n `Error calling ${modelId} (attempt ${attempts}):`,\n error\n );\n\n // Log API error - attach to existing log if available\n await this.logError(\n state,\n error,\n \"api_error\",\n modelId,\n startTime,\n logId\n );\n\n // Network or API error - retry with backoff\n if (attempts < MAX_RETRIES_PER_MODEL) {\n const backoffMs = BACKOFF_BASE * Math.pow(2, attempts - 1);\n await this.sleep(backoffMs);\n // Save current logId as previous for retry tracking\n previousLogId = logId;\n logId = undefined;\n } else {\n // Last attempt failed, attach log ID to error for execute() to retrieve\n if (error && typeof error === 'object') {\n (error as any)._lastLogId = logId;\n }\n throw error;\n }\n }\n }\n\n const error = new Error(\n `Model ${modelId} failed validation after ${MAX_RETRIES_PER_MODEL} attempts`\n ) as any;\n error._lastLogId = logId;\n throw error;\n }\n\n /**\n * Log the outbound request details with full context\n * Returns the log ID for later updating\n */\n private static async logRequest(\n state: FlowState,\n modelId: string,\n context: RequestContext,\n retryOfLogId?: string\n ): Promise<string> {\n try {\n const id = crypto.randomUUID();\n\n // Get model name from TypeScript config\n let modelName: string | null = null;\n try {\n const modelDef = await state.thread.instance.loadModel(modelId);\n if (modelDef) {\n modelName = modelDef.model; // The actual model ID sent to provider\n }\n } catch (err) {\n console.error(\"Failed to fetch model name:\", err);\n }\n\n\n // Transform messages for logging (replace data URLs with file paths)\n const messagesForLog = transformMessagesForLog(context.messages, context.imagePathMap);\n\n const requestBodyObj = {\n model: modelName || modelId,\n messages: messagesForLog,\n tools: context.tools,\n stream: context.stream ?? true,\n };\n const requestBodyStr = JSON.stringify(requestBodyObj);\n\n const logData: Partial<LogData> & { id: string } = {\n id,\n message_id: state.rootMessageId || crypto.randomUUID(),\n provider: this.getProviderFromModel(modelId),\n model: modelId,\n model_name: modelName ?? undefined,\n endpoint: \"chat.completions\",\n request_body: requestBodyStr,\n tools_available: context.tools ? context.tools.length : 0,\n message_history_length: context.messages.length,\n prompt_name: context.promptName ?? undefined,\n parent_log_id: context.parentLogId ?? undefined,\n retry_of_log_id: retryOfLogId ?? undefined,\n tools_schema: context.tools ? JSON.stringify(context.tools) : undefined,\n system_prompt: context.systemPrompt ?? undefined,\n is_complete: false, // Incomplete until response received\n created_at: Date.now() * TIMESTAMP_MULTIPLIER,\n };\n\n await (state.stream as any).waitFor(async () => {\n await state.storage.sql.exec(\n `\n INSERT INTO logs (\n id, message_id, provider, model, model_name, endpoint,\n request_body, tools_available, message_history_length, prompt_name,\n parent_log_id, retry_of_log_id, tools_schema, system_prompt, is_complete, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16)\n `,\n logData.id,\n logData.message_id,\n logData.provider,\n logData.model,\n logData.model_name,\n logData.endpoint,\n logData.request_body,\n logData.tools_available,\n logData.message_history_length,\n logData.prompt_name,\n logData.parent_log_id,\n logData.retry_of_log_id,\n logData.tools_schema,\n logData.system_prompt,\n logData.is_complete ? 1 : 0,\n logData.created_at\n );\n });\n\n // Broadcast partial log to WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: logData.id,\n data: logData,\n });\n }\n\n return id;\n } catch (err) {\n console.error(\"Failed to log request (non-fatal):\", err);\n return crypto.randomUUID(); // Return a dummy ID\n }\n }\n\n /**\n * Call the LLM model using the provider system\n */\n private static async callModel(\n modelId: string,\n context: RequestContext,\n state: FlowState,\n logId: string\n ): Promise<LLMResponse> {\n // Import provider registry\n const { ProviderRegistry } = await import(\"./providers\");\n\n // Get provider, model name, and model config for this model\n // Pass thread instance for loading model from TypeScript virtual modules\n const { provider, modelName, modelConfig } = await ProviderRegistry.getProvider(\n modelId,\n state.env,\n state.thread.instance\n );\n\n // Make the chat completion request (use modelName, not modelId)\n // Pass modelConfig so provider can access routing options (e.g., included_providers for OpenRouter)\n // Wrap in waitFor() to hold a channel open during streaming\n // This prevents the stream from auto-closing while chunks are being received\n let response: LLMResponse | undefined;\n await (state.stream as any).waitFor(async () => {\n response = await provider.chat(\n modelName,\n context,\n state,\n logId,\n state.abortController?.signal,\n modelConfig\n );\n });\n\n if (!response) {\n throw new Error(\"Provider chat returned undefined\");\n }\n\n return response;\n }\n\n /**\n * Get fallback models from TypeScript model definition\n */\n private static async getFallbacks(\n modelName: string,\n state: FlowState\n ): Promise<ModelFallback[]> {\n try {\n const modelDef = await state.thread.instance.loadModel(modelName);\n if (modelDef && modelDef.fallbacks && modelDef.fallbacks.length > 0) {\n // Convert fallbacks array to ModelFallback format\n return modelDef.fallbacks.map((fallbackName: string, idx: number) => ({\n parent_model_id: modelName,\n fallback_model_id: fallbackName,\n idx,\n }));\n }\n return [];\n } catch (error) {\n console.error(\"Error fetching fallbacks:\", error);\n return [];\n }\n }\n\n /**\n * Update log with successful response data (best-effort, non-blocking)\n */\n private static async logSuccess(\n response: LLMResponse,\n state: FlowState,\n modelId: string,\n startTime: number,\n context: RequestContext | undefined,\n logId: string\n ): Promise<void> {\n try {\n // Extract tools called from response\n const toolsCalled = response.tool_calls\n ? JSON.stringify(response.tool_calls.map((tc) => tc.function.name))\n : null;\n\n // Get cost directly from provider (e.g., OpenRouter with usage accounting enabled)\n const cost_total: number | null = response.usage.cost\n ? parseFloat(response.usage.cost as any)\n : null;\n\n // Get actual provider from usage (e.g., OpenRouter returns the actual provider that handled the request)\n const actualProvider: string | null = (response.usage as any).provider || null;\n\n // Use aggregate response if available, otherwise use the standard response\n const responseBody = (response as any)._aggregate_response\n ? JSON.stringify((response as any)._aggregate_response)\n : JSON.stringify(response);\n\n const logData: Partial<LogData> & { id: string } = {\n id: logId,\n response_body: responseBody,\n input_tokens: response.usage.prompt_tokens,\n cached_tokens: response.usage.prompt_tokens_details?.cached_tokens || 0,\n output_tokens: response.usage.completion_tokens,\n reasoning_tokens: response.usage.completion_tokens_details?.reasoning_tokens || 0,\n total_tokens: response.usage.total_tokens,\n latency_ms: Date.now() - startTime,\n finish_reason: response.finish_reason,\n tools_called: toolsCalled ?? undefined,\n cost_total: cost_total ?? undefined,\n provider: actualProvider ?? undefined, // Update provider with actual value if available\n is_complete: true, // Now complete\n reasoning_content: response.reasoning_content ?? undefined, // Store reasoning separately\n };\n\n // Update the existing log record\n await (state.stream as any).waitFor(async () => {\n // Build SQL conditionally based on whether we have a provider update\n if (actualProvider !== null) {\n await state.storage.sql.exec(\n `\n UPDATE logs\n SET\n response_body = ?1,\n input_tokens = ?2,\n cached_tokens = ?3,\n output_tokens = ?4,\n reasoning_tokens = ?5,\n total_tokens = ?6,\n latency_ms = ?7,\n finish_reason = ?8,\n tools_called = ?9,\n cost_total = ?10,\n is_complete = ?11,\n reasoning_content = ?12,\n provider = ?13\n WHERE id = ?14\n `,\n logData.response_body,\n logData.input_tokens,\n logData.cached_tokens,\n logData.output_tokens,\n logData.reasoning_tokens,\n logData.total_tokens,\n logData.latency_ms,\n logData.finish_reason,\n logData.tools_called,\n logData.cost_total,\n logData.is_complete ? 1 : 0,\n logData.reasoning_content,\n actualProvider,\n logId\n );\n } else {\n await state.storage.sql.exec(\n `\n UPDATE logs\n SET\n response_body = ?1,\n input_tokens = ?2,\n cached_tokens = ?3,\n output_tokens = ?4,\n reasoning_tokens = ?5,\n total_tokens = ?6,\n latency_ms = ?7,\n finish_reason = ?8,\n tools_called = ?9,\n cost_total = ?10,\n is_complete = ?11,\n reasoning_content = ?12\n WHERE id = ?13\n `,\n logData.response_body,\n logData.input_tokens,\n logData.cached_tokens,\n logData.output_tokens,\n logData.reasoning_tokens,\n logData.total_tokens,\n logData.latency_ms,\n logData.finish_reason,\n logData.tools_called,\n logData.cost_total,\n logData.is_complete ? 1 : 0,\n logData.reasoning_content,\n logId\n );\n }\n });\n\n // Broadcast updated log to WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: logData.id,\n data: logData,\n });\n }\n } catch (error) {\n console.error(\"Failed to update log with response (non-fatal):\", error);\n }\n }\n\n /**\n * Extract provider name from model ID\n */\n private static getProviderFromModel(modelId: string): string {\n if (modelId.startsWith(\"gpt-\") || modelId.startsWith(\"o1-\")) {\n return \"openai\";\n }\n if (modelId.startsWith(\"claude-\")) {\n return \"anthropic\";\n }\n if (modelId.startsWith(\"gemini-\")) {\n return \"google\";\n }\n return \"unknown\";\n }\n\n /**\n * Sleep utility for backoff\n */\n private static sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Update the response_body in a log record to replace base64 image URLs with file paths\n * Called after processResponseImages() stores images and creates the path mapping\n */\n static async updateResponseBodyInLog(\n state: FlowState,\n logId: string,\n response: LLMResponse,\n imagePathMap: Map<string, string>\n ): Promise<void> {\n try {\n // Get the aggregate response (what was originally logged)\n const aggregateResponse = (response as any)._aggregate_response;\n if (!aggregateResponse) return;\n\n // Transform the response body to replace base64 with paths\n const transformedResponse = this.transformResponseBodyForLog(\n aggregateResponse,\n imagePathMap\n );\n\n // Update the log record\n await state.storage.sql.exec(\n `UPDATE logs SET response_body = ?1 WHERE id = ?2`,\n JSON.stringify(transformedResponse),\n logId\n );\n\n // Broadcast update to WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: logId,\n data: { id: logId, response_body: JSON.stringify(transformedResponse) },\n });\n }\n } catch (error) {\n console.error(\"Failed to update response body in log (non-fatal):\", error);\n }\n }\n\n /**\n * Transform response body to replace base64 data URLs with file paths\n */\n private static transformResponseBodyForLog(\n responseBody: any,\n imagePathMap: Map<string, string>\n ): any {\n if (!responseBody?.choices?.[0]?.message?.images) {\n return responseBody;\n }\n\n return {\n ...responseBody,\n choices: responseBody.choices.map((choice: any) => ({\n ...choice,\n message: {\n ...choice.message,\n images: choice.message.images?.map((img: any) => {\n const path = imagePathMap.get(img.image_url?.url);\n if (path) {\n return {\n ...img,\n image_url: { ...img.image_url, url: path }\n };\n }\n return img;\n })\n }\n }))\n };\n }\n\n /**\n * Log an error to the logs table (best-effort)\n * Attaches log ID to error object to prevent duplicate logging\n */\n private static async logError(\n state: FlowState,\n error: Error | unknown,\n errorType: string,\n modelId: string,\n startTime: number,\n existingLogId?: string\n ): Promise<string | undefined> {\n try {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n // Capture full error object including any metadata\n let errorDetails = \"\";\n const errorObj = error as any;\n\n // For OpenAI/OpenRouter errors, capture the complete error structure\n if (errorObj && typeof errorObj === \"object\") {\n // Check for common error structures\n const relevantFields = [\n \"error\", // OpenRouter wraps errors here\n \"code\", // Error code\n \"status\", // HTTP status\n \"metadata\", // OpenRouter metadata\n \"type\", // Error type\n \"param\", // Parameter that caused error\n \"user_id\", // User context\n \"response\", // Raw response\n ];\n\n const metadata: Record<string, any> = {};\n for (const field of relevantFields) {\n if (field in errorObj && errorObj[field] !== undefined) {\n metadata[field] = errorObj[field];\n }\n }\n\n if (Object.keys(metadata).length > 0) {\n errorDetails = `\\n\\nError Details:\\n${JSON.stringify(metadata, null, 2)}`;\n }\n }\n\n const fullError = `${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}${errorDetails}`;\n\n // Check if this error has already been logged\n const trackedLogId = existingLogId || errorObj?._loggedId;\n\n if (trackedLogId) {\n // Update existing log entry - append error to errors array\n await (state.stream as any).waitFor(async () => {\n // First, get the current errors array\n const result = await state.storage.sql.exec<{ errors: string | null }>(\n `SELECT errors FROM logs WHERE id = ?1`,\n trackedLogId\n );\n const rows = result.toArray();\n const currentErrors = rows[0]?.errors;\n\n // Parse existing errors or create new array\n let errorsArray: Array<{message: string, type: string, timestamp: number}> = [];\n if (currentErrors) {\n try {\n errorsArray = JSON.parse(currentErrors);\n } catch (e) {\n console.error(\"Failed to parse existing errors array:\", e);\n }\n }\n\n // Append new error\n errorsArray.push({\n message: fullError,\n type: errorType,\n timestamp: Date.now(),\n });\n\n // Update the log with appended error\n await state.storage.sql.exec(\n `\n UPDATE logs SET\n error = ?1,\n error_type = ?2,\n errors = ?3,\n latency_ms = ?4,\n is_complete = ?5\n WHERE id = ?6\n `,\n fullError, // Keep last error in error field for backwards compatibility\n errorType, // Keep last error type\n JSON.stringify(errorsArray), // All errors in array\n Date.now() - startTime,\n 1, // is_complete = true\n trackedLogId\n );\n });\n\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: trackedLogId,\n data: {\n id: trackedLogId,\n error: fullError,\n error_type: errorType,\n latency_ms: Date.now() - startTime,\n is_complete: true,\n },\n });\n }\n\n // Attach log ID to error object to prevent duplicate logging\n if (errorObj && !errorObj._loggedId) {\n errorObj._loggedId = trackedLogId;\n }\n\n return trackedLogId;\n } else {\n // Create new standalone error log (fallback for errors before request log was created)\n const id = crypto.randomUUID();\n const logData: Partial<LogData> & { id: string } = {\n id,\n message_id: state.rootMessageId || \"00000000-0000-0000-0000-000000000000\",\n provider: this.getProviderFromModel(modelId),\n model: modelId,\n error: fullError,\n error_type: errorType,\n latency_ms: Date.now() - startTime,\n is_complete: true,\n created_at: Date.now() * TIMESTAMP_MULTIPLIER,\n } as any;\n\n await (state.stream as any).waitFor(async () => {\n await state.storage.sql.exec(\n `\n INSERT INTO logs (\n id, message_id, provider, model,\n error, error_type, latency_ms, is_complete, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)\n `,\n logData.id,\n logData.message_id,\n logData.provider,\n logData.model,\n logData.error,\n logData.error_type,\n logData.latency_ms,\n 1,\n logData.created_at\n );\n });\n\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: logData.id,\n data: logData,\n });\n }\n\n // Attach log ID to error object to prevent duplicate logging\n if (errorObj && !errorObj._loggedId) {\n errorObj._loggedId = id;\n }\n\n return id;\n }\n } catch (logError) {\n // If logging fails, fall back to console only\n console.error(\"Failed to log LLM error to database:\", logError);\n }\n\n return undefined;\n }\n}\n","/**\n * File storage utilities for DurableThread\n *\n * This module provides filesystem-like operations for storing files within\n * a DurableThread's SQLite database. Files are stored in an S3-style flat\n * structure with path-based keys.\n */\n\nimport type { DurableObjectStorage } from \"@cloudflare/workers-types\";\nimport type { FileRecord, FileStats, StorageBackend } from \"../agents/types.js\";\n\n/**\n * Chunk size for large file storage.\n * Files > CHUNK_SIZE are split into chunks stored in file_chunks table.\n * 1.75MB provides 250KB safety margin under 2MB Durable Object row limit.\n */\nexport const CHUNK_SIZE = 1.75 * 1024 * 1024; // 1.75MB\n\n/**\n * MIME types that should be stored as text (in `content` column)\n * These are searchable via FTS5\n */\nconst TEXT_MIME_TYPES = [\n \"text/\",\n \"application/json\",\n \"application/javascript\",\n \"application/xml\",\n \"application/x-yaml\",\n \"application/yaml\",\n];\n\n/**\n * Check if a MIME type should be stored as text\n */\nexport function isTextMimeType(mimeType: string): boolean {\n return TEXT_MIME_TYPES.some((prefix) => mimeType.startsWith(prefix));\n}\n\n/**\n * Detect storage backend from location URL\n */\nexport function detectStorageBackend(location: string): StorageBackend {\n if (location.startsWith(\"s3://\")) return \"s3\";\n if (location.startsWith(\"r2://\")) return \"r2\";\n if (location.startsWith(\"http://\") || location.startsWith(\"https://\"))\n return \"url\";\n return \"local\";\n}\n\n/**\n * Extract basename from path\n */\nexport function basename(path: string): string {\n const parts = path.split(\"/\").filter(Boolean);\n return parts[parts.length - 1] || \"\";\n}\n\n/**\n * Normalize path to ensure it starts with / and doesn't end with /\n */\nexport function normalizePath(path: string): string {\n let normalized = path.replace(/\\/+/g, \"/\"); // Replace multiple slashes with single\n if (!normalized.startsWith(\"/\")) normalized = \"/\" + normalized;\n if (normalized.length > 1 && normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n}\n\n/**\n * Get parent directory path\n */\nexport function dirname(path: string): string {\n const normalized = normalizePath(path);\n const lastSlash = normalized.lastIndexOf(\"/\");\n if (lastSlash <= 0) return \"/\";\n return normalized.slice(0, lastSlash);\n}\n\n/**\n * Convert database row to FileRecord\n */\nexport function rowToFileRecord(row: any): FileRecord {\n return {\n path: row.path,\n name: row.name,\n mimeType: row.mime_type,\n storage: row.storage as StorageBackend,\n location: row.location,\n size: row.size,\n metadata: row.metadata ? JSON.parse(row.metadata) : null,\n isDirectory: row.is_directory === 1,\n createdAt: row.created_at,\n width: row.width ?? null,\n height: row.height ?? null,\n isChunked: row.is_chunked === 1,\n chunkCount: row.chunk_count ?? undefined,\n };\n}\n\n/**\n * File storage operations for DurableThread\n */\nexport class FileStorage {\n constructor(private sql: DurableObjectStorage[\"sql\"]) {}\n\n /**\n * Write a file to storage.\n * Files > CHUNK_SIZE are automatically chunked into file_chunks table.\n */\n async writeFile(\n path: string,\n data: ArrayBuffer | string,\n mimeType: string,\n options?: {\n metadata?: Record<string, unknown>;\n thumbnail?: ArrayBuffer;\n width?: number;\n height?: number;\n }\n ): Promise<FileRecord> {\n const normalizedPath = normalizePath(path);\n const name = basename(normalizedPath);\n const isText = isTextMimeType(mimeType);\n const now = Date.now();\n\n // Convert data to appropriate format\n let content: string | null = null;\n let blobData: Uint8Array | null = null;\n let size: number;\n\n if (isText) {\n content =\n typeof data === \"string\"\n ? data\n : new TextDecoder().decode(data as ArrayBuffer);\n size = new TextEncoder().encode(content).length;\n } else {\n blobData = typeof data === \"string\"\n ? new TextEncoder().encode(data)\n : new Uint8Array(data as ArrayBuffer);\n size = blobData.byteLength;\n }\n\n const metadataJson = options?.metadata\n ? JSON.stringify(options.metadata)\n : null;\n\n // Check if we need to chunk this file\n const needsChunking = !isText && blobData && size > CHUNK_SIZE;\n\n if (needsChunking) {\n // Large file: store chunks in file_chunks table\n return this.writeFileChunked(\n normalizedPath,\n name,\n blobData!,\n mimeType,\n size,\n now,\n metadataJson,\n options\n );\n }\n\n // Small file or text: store inline as before\n // Delete any existing chunks if overwriting a chunked file\n await this.sql.exec(`DELETE FROM file_chunks WHERE file_path = ?`, normalizedPath);\n\n // Use INSERT OR REPLACE for upsert behavior\n await this.sql.exec(\n `INSERT OR REPLACE INTO files (path, name, mime_type, storage, location, data, content, size, metadata, thumbnail, is_directory, created_at, width, height, is_chunked, chunk_count)\n VALUES (?, ?, ?, 'local', NULL, ?, ?, ?, ?, ?, 0, ?, ?, ?, 0, NULL)`,\n normalizedPath,\n name,\n mimeType,\n blobData,\n content,\n size,\n metadataJson,\n options?.thumbnail || null,\n now,\n options?.width ?? null,\n options?.height ?? null\n );\n\n // Update file stats\n await this.updateStats();\n\n return {\n path: normalizedPath,\n name,\n mimeType,\n storage: \"local\",\n location: null,\n size,\n metadata: options?.metadata || null,\n isDirectory: false,\n createdAt: now,\n width: options?.width ?? null,\n height: options?.height ?? null,\n isChunked: false,\n };\n }\n\n /**\n * Write a large file in chunks.\n * Called internally by writeFile when data > CHUNK_SIZE.\n */\n private async writeFileChunked(\n normalizedPath: string,\n name: string,\n data: Uint8Array,\n mimeType: string,\n size: number,\n now: number,\n metadataJson: string | null,\n options?: {\n metadata?: Record<string, unknown>;\n thumbnail?: ArrayBuffer;\n width?: number;\n height?: number;\n }\n ): Promise<FileRecord> {\n // Delete any existing file data and chunks\n await this.sql.exec(`DELETE FROM file_chunks WHERE file_path = ?`, normalizedPath);\n\n // Calculate number of chunks\n const chunkCount = Math.ceil(size / CHUNK_SIZE);\n\n // Create file record (no inline data, is_chunked=1)\n await this.sql.exec(\n `INSERT OR REPLACE INTO files (path, name, mime_type, storage, location, data, content, size, metadata, thumbnail, is_directory, created_at, width, height, is_chunked, chunk_count)\n VALUES (?, ?, ?, 'local', NULL, NULL, NULL, ?, ?, ?, 0, ?, ?, ?, 1, ?)`,\n normalizedPath,\n name,\n mimeType,\n size,\n metadataJson,\n options?.thumbnail || null,\n now,\n options?.width ?? null,\n options?.height ?? null,\n chunkCount\n );\n\n // Write chunks\n for (let i = 0; i < chunkCount; i++) {\n const start = i * CHUNK_SIZE;\n const end = Math.min(start + CHUNK_SIZE, size);\n const chunk = data.slice(start, end);\n\n await this.sql.exec(\n `INSERT INTO file_chunks (file_path, chunk_index, data) VALUES (?, ?, ?)`,\n normalizedPath,\n i,\n chunk\n );\n }\n\n // Update file stats\n await this.updateStats();\n\n return {\n path: normalizedPath,\n name,\n mimeType,\n storage: \"local\",\n location: null,\n size,\n metadata: options?.metadata || null,\n isDirectory: false,\n createdAt: now,\n width: options?.width ?? null,\n height: options?.height ?? null,\n isChunked: true,\n chunkCount,\n };\n }\n\n /**\n * Link to an external file (URL, S3, R2)\n */\n async linkFile(\n path: string,\n location: string,\n options?: {\n mimeType?: string;\n size?: number;\n metadata?: Record<string, unknown>;\n }\n ): Promise<FileRecord> {\n const normalizedPath = normalizePath(path);\n const name = basename(normalizedPath);\n const storage = detectStorageBackend(location);\n const now = Date.now();\n\n // Try to infer MIME type from extension if not provided\n const mimeType = options?.mimeType || inferMimeType(name);\n\n const metadataJson = options?.metadata\n ? JSON.stringify(options.metadata)\n : null;\n\n await this.sql.exec(\n `INSERT OR REPLACE INTO files (path, name, mime_type, storage, location, data, content, size, metadata, thumbnail, is_directory, created_at)\n VALUES (?, ?, ?, ?, ?, NULL, NULL, ?, ?, NULL, 0, ?)`,\n normalizedPath,\n name,\n mimeType,\n storage,\n location,\n options?.size || 0,\n metadataJson,\n now\n );\n\n // Update file stats\n await this.updateStats();\n\n return {\n path: normalizedPath,\n name,\n mimeType,\n storage,\n location,\n size: options?.size || 0,\n metadata: options?.metadata || null,\n isDirectory: false,\n createdAt: now,\n };\n }\n\n /**\n * Read file data from storage.\n * Chunked files are automatically reassembled.\n * Returns null if file doesn't exist or is external.\n *\n * WARNING: For large chunked files, this loads the entire file into memory.\n * Use streamFile() for memory-efficient access to large files.\n */\n async readFile(path: string): Promise<ArrayBuffer | null> {\n const normalizedPath = normalizePath(path);\n\n const cursor = await this.sql.exec<{\n data: ArrayBuffer | null;\n content: string | null;\n storage: string;\n is_chunked: number;\n chunk_count: number | null;\n }>(\n `SELECT data, content, storage, is_chunked, chunk_count FROM files WHERE path = ? AND is_directory = 0`,\n normalizedPath\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return null;\n\n const row = rows[0];\n\n // External files - return null (caller should fetch from location)\n if (row.storage !== \"local\") return null;\n\n // Chunked file - reassemble from chunks\n if (row.is_chunked === 1 && row.chunk_count) {\n return this.readFileChunked(normalizedPath, row.chunk_count);\n }\n\n // Text file stored in content column\n if (row.content !== null) {\n const encoded = new TextEncoder().encode(row.content);\n return encoded.buffer.slice(encoded.byteOffset, encoded.byteOffset + encoded.byteLength) as ArrayBuffer;\n }\n\n // Binary file stored in data column\n return row.data;\n }\n\n /**\n * Read a chunked file by reassembling all chunks.\n * WARNING: Loads entire file into memory. Use streamFile() for large files.\n */\n private async readFileChunked(\n normalizedPath: string,\n chunkCount: number\n ): Promise<ArrayBuffer> {\n const chunks: Uint8Array[] = [];\n let totalSize = 0;\n\n // Read chunks in order\n for (let i = 0; i < chunkCount; i++) {\n const cursor = await this.sql.exec<{ data: ArrayBuffer }>(\n `SELECT data FROM file_chunks WHERE file_path = ? AND chunk_index = ?`,\n normalizedPath,\n i\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n throw new Error(`Missing chunk ${i} for file ${normalizedPath}`);\n }\n\n const chunk = new Uint8Array(rows[0].data);\n chunks.push(chunk);\n totalSize += chunk.byteLength;\n }\n\n // Combine chunks into single buffer\n const result = new Uint8Array(totalSize);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return result.buffer as ArrayBuffer;\n }\n\n /**\n * Stream file data chunk by chunk.\n * Memory-efficient way to read large chunked files.\n * Yields one chunk at a time for streaming HTTP responses.\n */\n async *streamFile(path: string): AsyncGenerator<Uint8Array, void, undefined> {\n const normalizedPath = normalizePath(path);\n\n const cursor = await this.sql.exec<{\n data: ArrayBuffer | null;\n content: string | null;\n storage: string;\n is_chunked: number;\n chunk_count: number | null;\n }>(\n `SELECT data, content, storage, is_chunked, chunk_count FROM files WHERE path = ? AND is_directory = 0`,\n normalizedPath\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return;\n\n const row = rows[0];\n\n // External files - can't stream\n if (row.storage !== \"local\") return;\n\n // Chunked file - yield chunks one at a time\n if (row.is_chunked === 1 && row.chunk_count) {\n for (let i = 0; i < row.chunk_count; i++) {\n const chunkCursor = await this.sql.exec<{ data: ArrayBuffer }>(\n `SELECT data FROM file_chunks WHERE file_path = ? AND chunk_index = ?`,\n normalizedPath,\n i\n );\n\n const chunkRows = chunkCursor.toArray();\n if (chunkRows.length > 0) {\n yield new Uint8Array(chunkRows[0].data);\n }\n }\n return;\n }\n\n // Text file - yield as single chunk\n if (row.content !== null) {\n yield new TextEncoder().encode(row.content);\n return;\n }\n\n // Binary file - yield as single chunk\n if (row.data !== null) {\n yield new Uint8Array(row.data);\n }\n }\n\n /**\n * Read text file content\n */\n async readTextFile(path: string): Promise<string | null> {\n const normalizedPath = normalizePath(path);\n\n const cursor = await this.sql.exec<{\n content: string | null;\n data: ArrayBuffer | null;\n storage: string;\n }>(\n `SELECT content, data, storage FROM files WHERE path = ? AND is_directory = 0`,\n normalizedPath\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return null;\n\n const row = rows[0];\n\n // External files - return null\n if (row.storage !== \"local\") return null;\n\n // Text content\n if (row.content !== null) return row.content;\n\n // Try to decode binary as text\n if (row.data !== null) {\n return new TextDecoder().decode(row.data as ArrayBuffer);\n }\n\n return null;\n }\n\n /**\n * Get file metadata (stat)\n */\n async stat(path: string): Promise<FileRecord | null> {\n const normalizedPath = normalizePath(path);\n\n const cursor = await this.sql.exec<any>(\n `SELECT path, name, mime_type, storage, location, size, metadata, is_directory, created_at, width, height, is_chunked, chunk_count\n FROM files WHERE path = ?`,\n normalizedPath\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return null;\n\n return rowToFileRecord(rows[0]);\n }\n\n /**\n * Check if file or directory exists\n */\n async exists(path: string): Promise<boolean> {\n const normalizedPath = normalizePath(path);\n\n const cursor = await this.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM files WHERE path = ?`,\n normalizedPath\n );\n\n return cursor.one().count > 0;\n }\n\n /**\n * Delete a file\n */\n async unlink(path: string): Promise<void> {\n const normalizedPath = normalizePath(path);\n\n await this.sql.exec(\n `DELETE FROM files WHERE path = ? AND is_directory = 0`,\n normalizedPath\n );\n\n await this.updateStats();\n }\n\n /**\n * Create a directory marker\n */\n async mkdir(path: string): Promise<FileRecord> {\n const normalizedPath = normalizePath(path);\n const name = basename(normalizedPath);\n const now = Date.now();\n\n await this.sql.exec(\n `INSERT OR IGNORE INTO files (path, name, mime_type, storage, location, data, content, size, metadata, thumbnail, is_directory, created_at)\n VALUES (?, ?, 'inode/directory', 'local', NULL, NULL, NULL, 0, NULL, NULL, 1, ?)`,\n normalizedPath,\n name,\n now\n );\n\n return {\n path: normalizedPath,\n name,\n mimeType: \"inode/directory\",\n storage: \"local\",\n location: null,\n size: 0,\n metadata: null,\n isDirectory: true,\n createdAt: now,\n };\n }\n\n /**\n * List directory contents\n */\n async readdir(path: string): Promise<FileRecord[]> {\n const normalizedPath = normalizePath(path);\n const prefix = normalizedPath === \"/\" ? \"/\" : normalizedPath + \"/\";\n\n // Find immediate children (not nested subdirectories)\n const cursor = await this.sql.exec<any>(\n `SELECT path, name, mime_type, storage, location, size, metadata, is_directory, created_at\n FROM files\n WHERE path LIKE ? || '%'\n AND path != ?\n AND SUBSTR(path, LENGTH(?) + 1) NOT LIKE '%/%'\n ORDER BY is_directory DESC, name ASC`,\n prefix,\n normalizedPath,\n prefix\n );\n\n return cursor.toArray().map(rowToFileRecord);\n }\n\n /**\n * Remove empty directory\n */\n async rmdir(path: string): Promise<void> {\n const normalizedPath = normalizePath(path);\n const prefix = normalizedPath + \"/\";\n\n // Check if directory has children\n const cursor = await this.sql.exec<{ count: number }>(\n `SELECT COUNT(*) as count FROM files WHERE path LIKE ? || '%'`,\n prefix\n );\n\n if (cursor.one().count > 0) {\n throw new Error(\"Directory not empty\");\n }\n\n await this.sql.exec(\n `DELETE FROM files WHERE path = ? AND is_directory = 1`,\n normalizedPath\n );\n }\n\n /**\n * Get storage statistics\n */\n async getFileStats(): Promise<FileStats> {\n const cursor = await this.sql.exec<{\n total_size: number;\n file_count: number;\n }>(`SELECT total_size, file_count FROM file_stats WHERE id = 1`);\n\n const rows = cursor.toArray();\n if (rows.length === 0) {\n return { totalSize: 0, fileCount: 0 };\n }\n\n return {\n totalSize: rows[0].total_size,\n fileCount: rows[0].file_count,\n };\n }\n\n /**\n * Update file statistics (call after writes/deletes)\n */\n private async updateStats(): Promise<void> {\n await this.sql.exec(`\n UPDATE file_stats SET\n total_size = (SELECT COALESCE(SUM(size), 0) FROM files WHERE is_directory = 0),\n file_count = (SELECT COUNT(*) FROM files WHERE is_directory = 0)\n WHERE id = 1\n `);\n }\n\n /**\n * Get thumbnail for an image\n */\n async getThumbnail(path: string): Promise<ArrayBuffer | null> {\n const normalizedPath = normalizePath(path);\n\n const cursor = await this.sql.exec<{ thumbnail: ArrayBuffer | null }>(\n `SELECT thumbnail FROM files WHERE path = ? AND is_directory = 0`,\n normalizedPath\n );\n\n const rows = cursor.toArray();\n if (rows.length === 0) return null;\n\n return rows[0].thumbnail;\n }\n\n /**\n * Search file contents using FTS5\n */\n async grep(\n pattern: string,\n options?: {\n path?: string;\n limit?: number;\n }\n ): Promise<Array<{ path: string; name: string; snippet: string }>> {\n const limit = options?.limit || 100;\n\n let query = `\n SELECT files.path, files.name, snippet(files_fts, 2, '<mark>', '</mark>', '...', 32) as snippet\n FROM files_fts\n JOIN files ON files.rowid = files_fts.rowid\n WHERE files_fts MATCH ?\n `;\n\n const params: any[] = [pattern];\n\n if (options?.path) {\n query += ` AND files.path LIKE ? || '%'`;\n params.push(normalizePath(options.path));\n }\n\n query += ` LIMIT ?`;\n params.push(limit);\n\n const cursor = await this.sql.exec<{\n path: string;\n name: string;\n snippet: string;\n }>(query, ...params);\n\n return cursor.toArray();\n }\n\n /**\n * Find files by path pattern (glob-like)\n */\n async find(\n pattern: string,\n options?: {\n type?: \"file\" | \"directory\" | \"all\";\n limit?: number;\n }\n ): Promise<FileRecord[]> {\n const limit = options?.limit || 100;\n const type = options?.type || \"all\";\n\n // Convert glob pattern to SQL LIKE pattern\n let sqlPattern = pattern\n .replace(/\\*\\*/g, \"%\")\n .replace(/\\*/g, \"%\")\n .replace(/\\?/g, \"_\");\n\n // If pattern doesn't start with /, prefix with %\n if (!sqlPattern.startsWith(\"/\")) {\n sqlPattern = \"%\" + sqlPattern;\n }\n\n let typeClause = \"\";\n if (type === \"file\") typeClause = \" AND is_directory = 0\";\n if (type === \"directory\") typeClause = \" AND is_directory = 1\";\n\n const cursor = await this.sql.exec<any>(\n `SELECT path, name, mime_type, storage, location, size, metadata, is_directory, created_at\n FROM files\n WHERE path LIKE ?${typeClause}\n ORDER BY path\n LIMIT ?`,\n sqlPattern,\n limit\n );\n\n return cursor.toArray().map(rowToFileRecord);\n }\n}\n\n/**\n * Infer MIME type from filename extension\n */\nfunction inferMimeType(filename: string): string {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n\n const mimeTypes: Record<string, string> = {\n // Text\n txt: \"text/plain\",\n md: \"text/markdown\",\n html: \"text/html\",\n css: \"text/css\",\n csv: \"text/csv\",\n\n // Code\n js: \"application/javascript\",\n ts: \"application/typescript\",\n json: \"application/json\",\n xml: \"application/xml\",\n yaml: \"application/yaml\",\n yml: \"application/yaml\",\n\n // Images\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n ico: \"image/x-icon\",\n\n // Documents\n pdf: \"application/pdf\",\n\n // Archives\n zip: \"application/zip\",\n tar: \"application/x-tar\",\n gz: \"application/gzip\",\n };\n\n return mimeTypes[ext || \"\"] || \"application/octet-stream\";\n}\n","import { DurableThread } from \"../durable-objects/DurableThread\";\nimport type {\n FlowState,\n ToolCall,\n ToolResult,\n ToolType,\n Message,\n AttachmentRef,\n ToolAttachment,\n NativeToolModule,\n} from \"./types\";\nimport { TIMESTAMP_MULTIPLIER } from \"./types\";\nimport { ThreadStateImpl } from \"./ThreadStateImpl.js\";\n\n/**\n * Executes tools, prompts, and agents sequentially\n * Inspired by bod.coach runSequence pattern\n */\nexport class ToolExecutor {\n /**\n * Execute a sequence of tool calls sequentially\n * No parallel execution - tools run one after another\n */\n static async executeSequence(\n state: FlowState,\n toolCalls: ToolCall[]\n ): Promise<void> {\n // Add all tool calls to the queue\n state.sequence.queue.push(...toolCalls);\n state.sequence.isHandling = true;\n\n while (state.sequence.queue.length > 0) {\n // Check if execution should be stopped before processing each tool call\n if ((await state.thread.instance.shouldStop()) || state.abortController?.signal.aborted) {\n // Clear the queue and exit\n state.sequence.queue = [];\n state.sequence.isHandling = false;\n throw new Error(\"aborted\");\n }\n\n const call = state.sequence.queue.shift()!\n // Generate tool message ID upfront so sub-prompts can use it as parent_id\n const toolMessageId = crypto.randomUUID();\n\n try {\n // Send telemetry\n state.emitTelemetry?.({\n type: \"tool_started\",\n tool: call.function.name,\n timestamp: Date.now(),\n });\n\n // Validate that this tool is in the allowed tools list\n const validationError = this.validateToolCall(call, state);\n if (validationError) {\n // Tool not allowed - treat as error and continue\n const result: ToolResult = {\n status: \"error\",\n error: validationError,\n };\n\n await this.storeToolResult(call, result, state, toolMessageId);\n\n state.emitTelemetry?.({\n type: \"tool_completed\",\n tool: call.function.name,\n status: \"error\",\n timestamp: Date.now(),\n });\n\n continue; // Skip to next tool\n }\n\n // Execute the tool (pass toolMessageId for sub-prompts to use as parent_id)\n const result = await this.executeToolCall(call, state, toolMessageId);\n\n // If tool returned an error, log it to database\n if (result.status === \"error\") {\n const error = new Error(result.error || \"Tool execution failed\");\n // Preserve the stack trace from the result if available\n if (result.stack) {\n error.stack = result.stack;\n }\n await this.logError(state, error, call.function.name);\n }\n\n // Run the appropriate hook based on result status\n // Import FlowEngine dynamically to access hook methods\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n\n const hookResult = result.status === \"success\"\n ? await FlowEngine.runAfterToolCallSuccessHook(state, call, result)\n : await FlowEngine.runAfterToolCallFailureHook(state, call, result);\n\n // If hook returned null, remove the tool call from history and database\n if (hookResult === null) {\n await this.removeToolCallFromHistory(call, state);\n continue; // Skip to next tool without storing anything\n }\n\n // Store tool result as a message (including handoff confirmations)\n // Use the potentially modified result from the hook\n await this.storeToolResult(call, hookResult, state, toolMessageId);\n\n // Send telemetry\n state.emitTelemetry?.({\n type: \"tool_completed\",\n tool: call.function.name,\n status: hookResult.status,\n timestamp: Date.now(),\n });\n } catch (error) {\n console.error(`Error executing tool ${call.function.name}:`, error);\n\n // Log error to database\n await this.logError(state, error, call.function.name);\n\n // Create error result for hook processing\n const errorResult: ToolResult = {\n status: \"error\",\n error: (error as Error).message,\n };\n\n // Run after_tool_call_failure hook\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n const hookResult = await FlowEngine.runAfterToolCallFailureHook(state, call, errorResult);\n\n // If hook returned null, remove the tool call from history and database\n if (hookResult === null) {\n await this.removeToolCallFromHistory(call, state);\n continue; // Skip to next tool without storing anything\n }\n\n // Store error as tool result (use potentially modified result from hook)\n await this.storeToolResult(call, hookResult, state, toolMessageId);\n\n // Send telemetry\n state.emitTelemetry?.({\n type: \"tool_completed\",\n tool: call.function.name,\n status: \"error\",\n timestamp: Date.now(),\n });\n }\n }\n\n state.sequence.isHandling = false;\n\n // Apply any pending force turn that was deferred during tool execution\n // This allows queueTool + forceTurn to work together properly\n if (state.pendingForceTurn) {\n state.forcedNextSide = state.pendingForceTurn;\n state.pendingForceTurn = undefined;\n }\n }\n\n /**\n * Execute a single tool call\n */\n private static async executeToolCall(\n call: ToolCall,\n state: FlowState,\n toolMessageId: string\n ): Promise<ToolResult> {\n const toolType = await this.identifyToolType(call, state);\n\n switch (toolType) {\n case \"native\":\n return await this.executeNativeTool(call, state);\n case \"prompt\":\n return await this.executePromptTool(call, state, toolMessageId);\n case \"agent\":\n return await this.executeAgentTool(call, state);\n default:\n throw new Error(`Unknown tool type for: ${call.function.name}`);\n }\n }\n\n /**\n * Validate that a tool call is allowed for the current prompt\n * Returns error message if invalid, null if valid\n */\n private static validateToolCall(\n call: ToolCall,\n state: FlowState\n ): string | null {\n // If no allowed tools list is set, allow all tools (backward compatibility)\n if (!state.allowedTools || call.forceAllow) {\n return null;\n }\n\n // Check if tool is in the allowed list\n const isAllowed = state.allowedTools.some(\n (tool) => tool.function.name === call.function.name\n );\n\n if (!isAllowed) {\n return `Tool \"${call.function.name}\" is not available for this prompt. You can only use tools that were explicitly configured for this prompt.`;\n }\n\n return null;\n }\n\n /**\n * Identify the type of tool (native, prompt, or agent)\n */\n private static async identifyToolType(\n call: ToolCall,\n state: FlowState\n ): Promise<ToolType> {\n const toolName = call.function.name;\n // Check if it's a native tool\n const tools = state.thread.instance.tools();\n if (toolName in tools) {\n return \"native\";\n }\n\n // Check if it's a prompt (all prompts are exposed as tools)\n try {\n const promptDef = await state.thread.instance.loadPrompt(toolName);\n if (promptDef) {\n return \"prompt\";\n }\n } catch {\n // Prompt not found, continue checking\n }\n\n // Check if it's an agent (exposed or in tools array)\n // Helper to check if agent name is in prompt's tools array\n const isInToolsArray = (agentName: string): boolean => {\n const tools = state.prompt._tools || [];\n return tools.some(t => typeof t === 'string' ? t === agentName : t.name === agentName);\n };\n\n try {\n const agentDef = await state.thread.instance.loadAgent(toolName);\n // Check by title as well (agents are called by their title in tool calls)\n if (agentDef) {\n if (call.forceAllow) {\n // Just check that an agent by that name exists and is ai_human\n if (agentDef.type === 'ai_human') {\n return \"agent\";\n }\n } else {\n // Agent is callable if exposed globally or in prompt's tools array\n if (agentDef.exposeAsTool || isInToolsArray(toolName)) {\n return \"agent\";\n }\n }\n }\n } catch {\n // Agent not found by name, try by title\n }\n\n // Try finding agent by title (agents are often called by title in tool calls)\n const agentNames = state.thread.instance.getAgentNames();\n for (const name of agentNames) {\n try {\n const agentDef = await state.thread.instance.loadAgent(name);\n if (agentDef.title === toolName) {\n if (call.forceAllow) {\n if (agentDef.type === 'ai_human') {\n return \"agent\";\n }\n } else {\n if (agentDef.exposeAsTool || isInToolsArray(name)) {\n return \"agent\";\n }\n }\n }\n } catch {\n // Skip agents that fail to load\n }\n }\n\n throw new Error(`Tool not found: ${toolName}`);\n }\n\n /**\n * Execute a native tool from server/tools/\n */\n private static async executeNativeTool(\n call: ToolCall,\n state: FlowState\n ): Promise<ToolResult> {\n try {\n // Get tools from thread instance (user's extended Thread class)\n const tools = state.thread.instance.tools();\n\n // Load the tool\n const toolLoader = tools[call.function.name];\n if (!toolLoader) {\n throw new Error(`Native tool not found: ${call.function.name}`);\n }\n\n const toolModule: NativeToolModule = await toolLoader();\n const [description, argsSchema, toolFn] = toolModule;\n\n // Parse arguments\n const args: Record<string, any> = JSON.parse(call.function.arguments);\n\n // Validate arguments against tool schema\n if (argsSchema) {\n const validation = argsSchema.safeParse(args);\n if (!validation.success) {\n const errorMessage = validation.error.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.map(String).join(\".\") : \"root\";\n return `[${path}] ${issue.message}`;\n })\n .join(\"; \");\n\n return {\n status: \"error\",\n error: `Tool argument validation failed: ${errorMessage}`,\n };\n }\n }\n\n // Update state.active to track current tool execution\n state.active = {\n tool: call.function.name,\n args,\n retries: 0,\n reasons: [],\n };\n\n // Create ThreadState wrapper for the tool\n const threadState = ThreadStateImpl.fromFlowState(state);\n\n // Execute the tool with ThreadState\n // Type narrowing: if argsSchema exists, call with args; otherwise call without\n const result = argsSchema\n ? await (toolFn as (state: any, args: Record<string, unknown>) => Promise<ToolResult>)(threadState, args)\n : await (toolFn as (state: any) => Promise<ToolResult>)(threadState);\n\n // Normalize tool result into internal ToolResult shape\n const status = result.status === \"error\" ? \"error\" : \"success\";\n\n let textResult: string | undefined;\n let errorText: string | undefined;\n\n // Prefer MCP-style content array if present\n const content = (result as any).content;\n if (Array.isArray(content)) {\n const textParts = content\n .filter(\n (part: any) =>\n part &&\n part.type === \"text\" &&\n typeof part.text === \"string\"\n )\n .map((part: any) => part.text as string);\n\n if (textParts.length > 0) {\n textResult = textParts.join(\"\\n\");\n }\n }\n\n // Fallback to legacy `result` field\n if (!textResult && (result as any).result !== undefined) {\n const raw = (result as any).result;\n textResult =\n typeof raw === \"string\" ? raw : JSON.stringify(raw, null, 2);\n }\n\n // Normalize error text\n if (typeof (result as any).error === \"string\") {\n errorText = (result as any).error;\n }\n\n if (status === \"error\" && !errorText) {\n // If tool marked as error but didn't provide an explicit error string,\n // fall back to the textual result (if any).\n errorText = textResult;\n }\n\n return {\n status,\n result: textResult,\n error: status === \"error\" ? errorText : undefined,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const stackTrace = error instanceof Error && error.stack ? error.stack : undefined;\n return {\n status: \"error\",\n error: errorMessage,\n stack: stackTrace,\n };\n }\n }\n\n /**\n * Execute a prompt tool (creates a sub-flow) with retry logic\n * This is essentially chaining another prompt\n * Creates an in-memory sub-flow that executes the prompt and returns the result\n * Note: LLM-level retries with model fallbacks are handled inside FlowEngine/LLMRequest\n */\n private static async executePromptTool(\n call: ToolCall,\n state: FlowState,\n toolMessageId: string\n ): Promise<ToolResult> {\n // Sub-prompts execute as one-shot calls - no retry logic\n // Errors are returned as tool results for the parent to handle\n return await this.executePromptToolInternal(call, state, toolMessageId);\n }\n\n /**\n * Internal method to execute a prompt tool\n */\n private static async executePromptToolInternal(\n call: ToolCall,\n state: FlowState,\n toolMessageId: string\n ): Promise<ToolResult> {\n try {\n // Get prompt configuration from TypeScript config\n const promptDef = await state.thread.instance.loadPrompt(call.function.name);\n\n if (!promptDef) {\n throw new Error(`Prompt tool not found: ${call.function.name}`);\n }\n\n // Parse arguments\n const args = JSON.parse(call.function.arguments);\n\n // Validate arguments against required schema if present\n if (promptDef.requiredSchema) {\n const validation = promptDef.requiredSchema.safeParse(args);\n if (!validation.success) {\n const errorMessage = validation.error.issues\n .map((issue: any) => `[${issue.path.join('.')}] ${issue.message}`)\n .join('; ');\n return {\n status: \"error\",\n error: `Prompt tool argument validation failed: ${errorMessage}`,\n };\n }\n }\n\n // Get parent prompt's tool config for initialization options\n const parentToolConfigs = state.prompt._tools || [];\n const toolConfig = parentToolConfigs.find((t: any) =>\n typeof t === 'string' ? t === call.function.name : t.name === call.function.name\n );\n const initUserMessageProperty = typeof toolConfig === 'object'\n ? toolConfig.initUserMessageProperty\n : null;\n\n // Import FlowEngine dynamically to avoid circular dependency\n const { FlowEngine } = await import(\"./FlowEngine\");\n\n // Create a temporary agent configuration for the prompt\n // Store the prompt name in side_a_agent_prompt - FlowEngine will load and interpolate it\n // Use \"ai_human\" type to prevent side switching - prompts should only execute on side A\n const promptAgent: import(\"./types\").Agent = {\n id: promptDef.name,\n title: promptDef.name,\n type: \"ai_human\", // Prevent side switching - prompts execute only on side A\n created_at: Date.now(),\n\n // Global configuration\n max_session_turns: null,\n\n // Side A configuration (only side used for prompt tools)\n side_a_label: null,\n side_a_agent_prompt: promptDef.name, // Pass prompt name, FlowEngine will load it\n side_a_stop_on_response: true,\n side_a_stop_tool: null,\n side_a_stop_tool_response_property: null,\n side_a_max_steps: null,\n side_a_end_session_tool: null,\n\n // Side B configuration (unused for prompt tools)\n side_b_label: null,\n side_b_agent_prompt: null,\n side_b_stop_on_response: true,\n side_b_stop_tool: null,\n side_b_stop_tool_response_property: null,\n side_b_max_steps: null,\n side_b_end_session_tool: null,\n };\n\n // Build the user message content based on initialization options\n let userMessageContent: string | undefined;\n if (initUserMessageProperty && args[initUserMessageProperty] !== undefined) {\n // Use the specified property as the user message\n const propertyValue = args[initUserMessageProperty];\n userMessageContent = typeof propertyValue === 'string'\n ? propertyValue\n : JSON.stringify(propertyValue);\n }\n\n\n const extraMessages: Message[] = [...(state.extraMessages || [])];\n if (userMessageContent) {\n extraMessages.push({\n id: crypto.randomUUID(),\n role: \"user\",\n content: userMessageContent,\n created_at: Date.now() * 1000,\n });\n }\n\n // Execute the prompt as a sub-flow\n // IMPORTANT: Child prompt messages should NOT be stored in parent thread\n // Only the tool result should appear in the parent's messages\n // However, we DO want child logs to be stored with parent_log_id\n const parentLogId = state.currentLogId || null;\n const rootMessageIdForChild = state.pendingMessageId || state.rootMessageId || null;\n\n const result = await FlowEngine.execute({\n agentConfig: promptAgent,\n storage: state.storage,\n env: state.env,\n threadId: `${state.threadId}-prompt-${call.id}`,\n thread: state.thread, // Pass through parent thread instance and metadata\n context: {\n ...args, // Pass tool arguments for template interpolation\n // Pass parent tool config for response options\n __parentToolConfig: toolConfig,\n __parentToolName: call.function.name,\n },\n // Mark this as a sub-flow by providing a different flowId\n flowId: `prompt-${call.id}`,\n // Pass emit callbacks so child messages/logs are broadcast\n // This allows tools running in sub-prompts to use injectMessage()\n emitLog: state.emitLog,\n emitMessage: state.emitMessage,\n emitMessageChunk: state.emitMessageChunk,\n // Pass parent log ID for hierarchical log tracking\n parentLogId,\n // Pass root message ID so child logs link to parent's message\n rootMessageId: rootMessageIdForChild,\n // The root state is FlowState object for the root prompt\n rootState: state.rootState,\n // Mark as sub-prompt by providing parent message ID (tool message from parent)\n parentMessageId: toolMessageId,\n // Set depth one level deeper than parent\n depth: state.depth + 1,\n // Additional messages to inject\n extraMessages,\n }, true); // awaitCompletion: true - ensures all sub-prompt DB writes complete before parent continues\n\n // Get tool response options from parent prompt's tool config\n // toolConfig is already loaded above from state.prompt._tools\n let toolResponseOptions = {\n include_text_response: true,\n include_tool_calls: true,\n include_errors: true,\n };\n\n if (typeof toolConfig === 'object' && toolConfig !== null) {\n toolResponseOptions = {\n include_text_response: toolConfig.includeTextResponse ?? true,\n include_tool_calls: toolConfig.includeToolCalls ?? true,\n include_errors: toolConfig.includeErrors ?? true,\n };\n }\n\n // Consume the stream to get the final content\n const reader = result.stream.getReader();\n const decoder = new TextDecoder();\n let textContent = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n textContent += decoder.decode(value, { stream: true });\n }\n } finally {\n reader.releaseLock();\n }\n\n // Query child tool messages from database to determine aggregate status\n const childToolMessagesResult = await state.storage.sql.exec(\n `SELECT id, content, tool_status, tool_call_id FROM messages WHERE parent_id = ? AND role = 'tool'`,\n toolMessageId\n );\n const childToolRows = childToolMessagesResult.toArray();\n\n // Query for assistant messages with attachments from sub-prompt (e.g., generated images)\n const assistantAttachmentsResult = await state.storage.sql.exec(\n `SELECT attachments FROM messages WHERE parent_id = ? AND role = 'assistant' AND attachments IS NOT NULL`,\n toolMessageId\n );\n const assistantAttachmentRows = assistantAttachmentsResult.toArray();\n\n // Collect attachment refs from sub-prompt's assistant messages\n // These are already stored in the filesystem, so we just pass the refs through\n const collectedAttachments: AttachmentRef[] = [];\n for (const row of assistantAttachmentRows) {\n if (row.attachments) {\n try {\n const refs: AttachmentRef[] = JSON.parse(row.attachments as string);\n collectedAttachments.push(...refs);\n } catch (e) {\n console.error('[ToolExecutor] Failed to parse sub-prompt attachments:', e);\n }\n }\n }\n\n // Determine overall status based on child tool results\n let overallStatus: \"success\" | \"error\" = \"success\";\n if (childToolRows.length > 0) {\n const statuses = childToolRows.map(row => row.tool_status as string);\n const hasError = statuses.some(s => s === \"error\");\n\n // If any child tool failed, the overall status is error\n if (hasError) {\n overallStatus = \"error\";\n }\n }\n\n // Build response based on tool response options\n const responseParts: string[] = [];\n\n // Include text response if enabled\n if (toolResponseOptions.include_text_response && textContent) {\n responseParts.push(textContent);\n }\n\n // Include tool calls and responses based on options\n if (toolResponseOptions.include_tool_calls || toolResponseOptions.include_errors) {\n // Query for child assistant messages (containing tool calls)\n const childAssistantMessagesResult = await state.storage.sql.exec(\n `SELECT id, tool_calls FROM messages WHERE parent_id = ? AND role = 'assistant' AND tool_calls IS NOT NULL`,\n toolMessageId\n );\n const childAssistantRows = childAssistantMessagesResult.toArray();\n\n const toolCallsSummary: string[] = [];\n\n // Add assistant messages with tool calls if enabled\n if (toolResponseOptions.include_tool_calls && childAssistantRows.length > 0) {\n for (const row of childAssistantRows) {\n const toolCalls = JSON.parse(row.tool_calls as string);\n for (const tc of toolCalls) {\n toolCallsSummary.push(\n `Tool Call: ${tc.function.name}(${tc.function.arguments})`\n );\n }\n }\n }\n\n // Add tool responses based on options\n for (const row of childToolRows) {\n const isError = (row.content as string)?.startsWith(\"Error: \");\n\n // Include based on options: errors if include_errors, successes if include_tool_calls\n if ((isError && toolResponseOptions.include_errors) ||\n (!isError && toolResponseOptions.include_tool_calls)) {\n toolCallsSummary.push(`Tool Response: ${row.content}`);\n }\n }\n\n if (toolCallsSummary.length > 0) {\n responseParts.push(\n \"Tool Executions:\\n\" + toolCallsSummary.join(\"\\n\")\n );\n }\n }\n\n const finalResponse = responseParts.length > 0\n ? responseParts.join(\"\\n\\n\")\n : \"Prompt executed successfully\";\n\n return {\n status: overallStatus,\n result: overallStatus === \"success\" ? finalResponse : undefined,\n error: overallStatus === \"error\" ? finalResponse : undefined,\n attachments: collectedAttachments.length > 0 ? collectedAttachments : undefined,\n };\n } catch (error) {\n // Get tool response options from parent prompt's tool config\n const parentToolConfigs = state.prompt._tools || [];\n const toolConfig = parentToolConfigs.find((t: any) =>\n typeof t === 'string' ? t === call.function.name : t.name === call.function.name\n );\n\n let includeErrors = true;\n if (typeof toolConfig === 'object' && toolConfig !== null) {\n includeErrors = toolConfig.includeErrors ?? true;\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n const stackTrace = error instanceof Error && error.stack ? error.stack : undefined;\n\n // Prefix error message with \"Error: \" when include_errors is true\n const formattedError = includeErrors\n ? `Error: ${errorMessage}`\n : \"Error: Tool execution failed\";\n\n return {\n status: \"error\",\n error: formattedError,\n stack: includeErrors ? stackTrace : undefined,\n };\n }\n }\n\n /**\n * Execute an agent tool (creates a new thread OR buffers handoff)\n * - For ai_human agents: buffer handoff for later execution\n * - For dual_ai agents (subagents): throw exception (not yet implemented)\n */\n private static async executeAgentTool(\n call: ToolCall,\n state: FlowState\n ): Promise<ToolResult> {\n try {\n // Get agent configuration from TypeScript config\n // First try to find by name, then by title\n let agentDef: any = null;\n let agentName = call.function.name;\n\n try {\n agentDef = await state.thread.instance.loadAgent(call.function.name);\n } catch {\n // Not found by name, try by title\n const agentNames = state.thread.instance.getAgentNames();\n for (const name of agentNames) {\n try {\n const def = await state.thread.instance.loadAgent(name);\n if (def.title === call.function.name) {\n agentDef = def;\n agentName = name;\n break;\n }\n } catch {\n // Skip agents that fail to load\n }\n }\n }\n\n if (!agentDef) {\n throw new Error(`Agent tool not found: ${call.function.name}`);\n }\n\n const agentType = agentDef.type as \"dual_ai\" | \"ai_human\";\n\n // Handle AI + Human agent handoff (buffer for later execution)\n if (agentType === \"ai_human\") {\n // Buffer the handoff - will be executed at turn completion\n // Use agent name (not title) as the identifier\n state.pendingHandoff = {\n agentId: agentName,\n };\n const text = \"Handoff complete\";\n\n // Return handoff confirmation message - will be stored as tool result\n return {\n status: \"success\",\n result: text,\n };\n }\n\n // Handle AI + AI subagent (not yet implemented)\n if (agentType === \"dual_ai\") {\n throw new Error(\n `AI + AI subagents are not yet implemented. Agent \"${call.function.name}\" cannot be called as a subagent.`\n );\n }\n\n // Parse arguments\n const args = JSON.parse(call.function.arguments);\n\n // Create a new child thread (new DurableObject)\n const childThreadId = crypto.randomUUID();\n\n // Register child thread in DurableAgentBuilder\n const agentBuilderId = state.env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = state.env.AGENT_BUILDER.get(agentBuilderId) as any;\n await agentBuilder.createThread(childThreadId, agentName, null); // No user_id for agent-spawned threads\n\n // Get DurableObject instance for the child thread\n const durableId = state.env.AGENT_BUILDER_THREAD.idFromName(childThreadId);\n const stub = state.env.AGENT_BUILDER_THREAD.get(durableId) as unknown as DurableThread;\n\n // Create initial message with the agent's input\n const initialMessages: Message[] = [\n {\n id: crypto.randomUUID(),\n role: \"user\",\n content: typeof args === \"string\" ? args : JSON.stringify(args),\n created_at: Date.now() * 1000,\n },\n ];\n\n // Execute the agent in the new thread via RPC\n const response = await stub.execute(\n childThreadId,\n agentName, // Use agent name instead of UUID\n initialMessages,\n {}\n );\n\n if (!response.ok) {\n throw new Error(\n `Agent execution failed with status ${response.status}: ${await response.text()}`\n );\n }\n\n // Consume the stream to get the final content\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body from agent execution\");\n }\n\n const decoder = new TextDecoder();\n let content = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n content += decoder.decode(value, { stream: true });\n }\n } finally {\n reader.releaseLock();\n }\n\n const text = content || \"Agent executed successfully\";\n\n return {\n status: \"success\",\n result: text,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const stackTrace = error instanceof Error && error.stack ? error.stack : undefined;\n return {\n status: \"error\",\n error: errorMessage,\n stack: stackTrace,\n };\n }\n }\n\n /**\n * Store tool result as a message in the database\n */\n private static async storeToolResult(\n call: ToolCall,\n result: ToolResult,\n state: FlowState,\n toolMessageId: string\n ): Promise<void> {\n try {\n // Import FlowEngine to access hook methods\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n\n // Run before_store_tool_result hook to allow modification of the result\n const processedResult = await FlowEngine.runBeforeStoreToolResultHook(\n state,\n call,\n result\n );\n\n // Use pre-generated message ID (generated before tool execution)\n const messageId = toolMessageId;\n\n // Handle attachments - separate new attachments (need storage) from existing refs\n let attachmentRefs: AttachmentRef[] | undefined;\n if (processedResult.attachments && processedResult.attachments.length > 0) {\n const newAttachments: ToolAttachment[] = [];\n const existingRefs: AttachmentRef[] = [];\n\n for (const item of processedResult.attachments) {\n if ('data' in item) {\n // ToolAttachment - has base64 data, needs to be stored\n newAttachments.push(item as ToolAttachment);\n } else {\n // AttachmentRef - already stored in filesystem\n existingRefs.push(item as AttachmentRef);\n }\n }\n\n attachmentRefs = existingRefs;\n if (newAttachments.length > 0) {\n const processedRefs = await this.processToolAttachments(newAttachments, state);\n attachmentRefs = [...attachmentRefs, ...processedRefs];\n }\n if (attachmentRefs.length === 0) {\n attachmentRefs = undefined;\n }\n }\n\n // Normalize tool result into a string for storage in the messages table.\n // At this point, executeRuntimeTool has already flattened any structured\n // tool output (e.g. MCP content parts) into processedResult.result.\n let content: string;\n if (processedResult.status === \"success\") {\n content =\n processedResult.result?.trim() ||\n \"Tool executed successfully\";\n } else {\n const baseError =\n processedResult.error?.trim() ||\n \"Tool execution failed\";\n content = `Failed to execute tool: ${baseError}`;\n }\n\n // If this is a sub-prompt and the tool failed, check if parent wants errors prefixed\n if (state.parentMessageId !== undefined && processedResult.status === \"error\") {\n // Get parent tool config from context (passed when executing prompt tool)\n const parentToolConfig = state.context.__parentToolConfig as { includeErrors?: boolean } | undefined;\n\n // Check include_errors from parent tool config\n let includeErrors = true;\n if (parentToolConfig !== undefined && parentToolConfig !== null) {\n includeErrors = parentToolConfig.includeErrors ?? true;\n }\n\n // If include_errors is true and content doesn't already start with \"Error: \", prefix it\n if (includeErrors && !content.startsWith(\"Error: \")) {\n content = `Error: ${content}`;\n }\n }\n\n // Determine tool_status based on result status\n const toolStatus = processedResult.status === \"success\" ? \"success\" : \"error\";\n\n let message: Message = {\n id: messageId,\n role: \"tool\",\n content,\n tool_call_id: call.id,\n created_at: 0, // Placeholder - will be set just before INSERT\n tool_status: toolStatus,\n parent_id: state.parentMessageId || null,\n depth: state.depth,\n attachments: attachmentRefs && attachmentRefs.length > 0\n ? JSON.stringify(attachmentRefs)\n : null,\n };\n\n // Run before_create_message hook\n message = await FlowEngine.runBeforeCreateMessageHook(state, message) as Message;\n\n // Set timestamp just before INSERT to ensure accurate ordering\n message.created_at = Date.now() * TIMESTAMP_MULTIPLIER;\n\n // Insert message (now includes tool messages from sub-prompts)\n await state.storage.sql.exec(\n `\n INSERT INTO messages (id, role, content, tool_call_id, created_at, tool_status, parent_id, depth, attachments)\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)\n `,\n message.id,\n message.role,\n message.content,\n message.tool_call_id,\n message.created_at,\n message.tool_status,\n message.parent_id,\n message.depth,\n message.attachments\n );\n\n // Run after_create_message hook\n await FlowEngine.runAfterCreateMessageHook(state, message);\n\n // Update the parent log's tool_results field\n const parentLogId = state.currentLogId || null;\n if (parentLogId) {\n try {\n // Get current tool_results\n const result = await state.storage.sql.exec(\n `SELECT tool_results FROM logs WHERE id = ?1`,\n parentLogId\n );\n const rows = result.toArray();\n const currentToolResults = rows[0]?.tool_results;\n\n // Parse existing tool_results or create new array\n let toolResultsArray: Array<{\n tool_call_id: string;\n tool_name: string;\n content: string;\n status: string;\n timestamp: number;\n }> = [];\n\n if (currentToolResults) {\n try {\n toolResultsArray = JSON.parse(currentToolResults as string);\n } catch {\n // Ignore parse errors\n }\n }\n\n // Add new tool result\n toolResultsArray.push({\n tool_call_id: call.id,\n tool_name: call.function.name,\n content: String(message.content ?? \"\"),\n status: processedResult.status,\n timestamp: Date.now(),\n });\n\n // Update log with new tool_results\n await state.storage.sql.exec(\n `UPDATE logs SET tool_results = ?1 WHERE id = ?2`,\n JSON.stringify(toolResultsArray),\n parentLogId\n );\n\n // Emit updated log via WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: parentLogId,\n data: {\n id: parentLogId,\n tool_results: JSON.stringify(toolResultsArray),\n },\n });\n }\n } catch (logError) {\n // Best-effort - don't fail if log update fails\n console.error(\"Failed to update log with tool result:\", logError);\n }\n }\n\n // Broadcast message via WebSocket\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n\n // Stream content if successful\n if (processedResult.status === \"success\" && processedResult.result) {\n state.stream.sendContent(`\\n[Tool: ${call.function.name}] ${processedResult.result}\\n`);\n }\n\n // Add to message history (always do this, even for child prompts - they need their own history)\n state.messageHistory.push(message);\n } catch (error) {\n console.error(\"Error storing tool result:\", error);\n // Log storage error to database\n await this.logError(state, error, `storeToolResult:${call.function.name}`);\n }\n }\n\n /**\n * Process tool attachments and store them in the thread filesystem\n * Returns array of AttachmentRef objects for linking to the message\n */\n private static async processToolAttachments(\n attachments: ToolAttachment[],\n state: FlowState\n ): Promise<AttachmentRef[]> {\n // Lazy import to avoid circular dependencies\n const { FileStorage } = await import(\"../durable-objects/files.js\");\n const fs = new FileStorage(state.storage.sql);\n\n const refs: AttachmentRef[] = [];\n\n for (const attachment of attachments) {\n try {\n const attachmentId = crypto.randomUUID();\n const timestamp = Date.now();\n\n // Determine file extension from MIME type\n const ext = attachment.mimeType === \"image/png\" ? \"png\" :\n attachment.mimeType === \"image/jpeg\" ? \"jpg\" :\n attachment.mimeType === \"image/gif\" ? \"gif\" :\n attachment.mimeType === \"image/webp\" ? \"webp\" :\n attachment.name.split(\".\").pop() || \"bin\";\n\n const path = `/attachments/${timestamp}-${attachmentId}.${ext}`;\n\n // Decode base64 to binary\n const binaryString = atob(attachment.data);\n const dataBuffer = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n dataBuffer[i] = binaryString.charCodeAt(i);\n }\n\n // Write to filesystem (no processing - tool attachments bypass downsampling)\n // Convert Uint8Array to ArrayBuffer for writeFile\n await fs.writeFile(path, dataBuffer.buffer as ArrayBuffer, attachment.mimeType, {\n width: attachment.width,\n height: attachment.height,\n });\n\n // Create attachment reference\n const ref: AttachmentRef = {\n id: attachmentId,\n type: \"file\",\n path,\n name: attachment.name,\n mimeType: attachment.mimeType,\n };\n\n if (attachment.width) ref.width = attachment.width;\n if (attachment.height) ref.height = attachment.height;\n\n refs.push(ref);\n } catch (error) {\n console.error(`Failed to store tool attachment ${attachment.name}:`, error);\n // Continue with other attachments even if one fails\n }\n }\n\n return refs;\n }\n\n /**\n * Store tool error as a message in the database\n */\n private static async storeToolError(\n call: ToolCall,\n error: Error,\n state: FlowState\n ): Promise<void> {\n const toolMessageId = crypto.randomUUID();\n\n const result: ToolResult = {\n status: \"error\",\n error: error.message,\n };\n\n await this.storeToolResult(call, result, state, toolMessageId);\n }\n\n /**\n * Log tool execution error by updating the parent log (best-effort)\n * Instead of creating a new log entry, updates the parent LLM request log with the error\n */\n private static async logError(\n state: FlowState,\n error: unknown,\n toolName: string\n ): Promise<void> {\n try {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n // Get parent log ID from state if available\n const parentLogId = state.currentLogId || null;\n\n if (!parentLogId) {\n // No parent log to update, log to console only\n console.error(`Tool error (${toolName}):`, errorMessage);\n return;\n }\n\n // Format error with stack trace\n const fullError = `Tool \"${toolName}\" failed: ${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}`;\n\n // Update the parent log with the error information\n await state.storage.sql.exec(\n `\n UPDATE logs\n SET\n error = ?1,\n error_type = ?2\n WHERE id = ?3\n `,\n fullError,\n \"tool_execution_error\",\n parentLogId\n );\n\n // Emit updated log via WebSocket\n if (state.emitLog) {\n state.emitLog({\n type: 'log_data',\n log_id: parentLogId,\n data: {\n id: parentLogId,\n error: fullError,\n error_type: \"tool_execution_error\",\n },\n });\n }\n } catch (logError) {\n // If logging fails, fall back to console only\n console.error(\"Failed to update parent log with tool error:\", logError);\n }\n }\n\n /**\n * Validate arguments against a JSON Schema\n * Returns error message if invalid, null if valid\n */\n private static validateJsonSchema(\n data: any,\n schema: Record<string, any>\n ): string | null {\n // Basic JSON Schema validation\n // This is a simple implementation - for production, use a proper JSON Schema validator\n\n if (schema.type === \"object\" && schema.properties) {\n // Check required fields\n if (schema.required && Array.isArray(schema.required)) {\n for (const field of schema.required) {\n if (!(field in data)) {\n return `Missing required field: ${field}`;\n }\n }\n }\n\n // Validate each property\n for (const [key, propSchema] of Object.entries(\n schema.properties as Record<string, any>\n )) {\n if (key in data) {\n const value = data[key];\n const expectedType = propSchema.type;\n\n // Type checking\n if (expectedType === \"string\" && typeof value !== \"string\") {\n return `Field ${key} must be a string`;\n }\n if (expectedType === \"number\" && typeof value !== \"number\") {\n return `Field ${key} must be a number`;\n }\n if (expectedType === \"boolean\" && typeof value !== \"boolean\") {\n return `Field ${key} must be a boolean`;\n }\n if (expectedType === \"array\" && !Array.isArray(value)) {\n return `Field ${key} must be an array`;\n }\n if (\n expectedType === \"object\" &&\n (typeof value !== \"object\" || value === null)\n ) {\n return `Field ${key} must be an object`;\n }\n }\n }\n }\n\n return null; // Valid\n }\n\n /**\n * Interpolate prompt segments with arguments\n * Replaces variable segments with their values from args\n * Converts segments array to final string prompt\n */\n private static async interpolatePrompt(\n promptJson: string,\n args: Record<string, any>,\n state: FlowState\n ): Promise<string> {\n try {\n const segments = JSON.parse(promptJson) as Array<{\n type: string;\n value?: string;\n id?: string;\n label?: string;\n }>;\n\n const results: string[] = [];\n\n for (const segment of segments) {\n if (segment.type === \"string\") {\n // Regular string segment - add as-is\n results.push(segment.value || \"\");\n } else if (segment.type === \"variable\") {\n // Variable segment - replace with value from args\n const variableValue = args[segment.value || \"\"];\n if (variableValue !== undefined) {\n results.push(\n typeof variableValue === \"string\"\n ? variableValue\n : JSON.stringify(variableValue)\n );\n } else {\n // Variable not provided in args - keep placeholder or skip\n results.push(`{{${segment.value}}}`);\n }\n } else if (segment.type === \"prompt\") {\n // Load and interpolate referenced prompt from TypeScript config\n try {\n const promptName = segment.id;\n const promptDef = await state.thread.instance.loadPrompt(promptName!);\n\n if (!promptDef) {\n console.warn(`Referenced prompt not found: ${promptName}`);\n results.push(`[Prompt not found: ${segment.label || promptName}]`);\n } else {\n // For TypeScript-defined prompts, the prompt is a plain string\n // (not JSON segments like the old D1 format)\n // Recursively interpolate variables in the prompt string\n let promptText = promptDef.prompt;\n\n // Replace {{variable}} patterns with args values\n promptText = promptText.replace(/\\{\\{(\\w+)\\}\\}/g, (match: string, varName: string) => {\n const value = args[varName];\n if (value !== undefined) {\n return typeof value === \"string\" ? value : JSON.stringify(value);\n }\n return match; // Keep placeholder if not in args\n });\n\n results.push(promptText);\n }\n } catch (error) {\n console.error(`Error loading prompt ${segment.id}:`, error);\n results.push(`[Error loading prompt: ${segment.label || segment.id}]`);\n }\n }\n }\n\n return results.join(\"\");\n } catch (error) {\n // If parsing fails, treat as plain string\n console.error(\"Error parsing prompt segments:\", error);\n return promptJson;\n }\n }\n\n /**\n * Remove a tool call from message history and database\n * This is called when a hook returns null to completely remove the tool call\n */\n private static async removeToolCallFromHistory(\n call: ToolCall,\n state: FlowState\n ): Promise<void> {\n try {\n // Find the message containing this tool call in the message history\n const messageIndex = state.messageHistory.findIndex(\n (msg) => {\n if (!msg.tool_calls) return false;\n try {\n const toolCalls = JSON.parse(msg.tool_calls);\n return toolCalls.some((tc: ToolCall) => tc.id === call.id);\n } catch {\n return false;\n }\n }\n );\n\n if (messageIndex === -1) {\n console.warn(`[ToolExecutor] Could not find message containing tool call ${call.id}`);\n return;\n }\n\n const message = state.messageHistory[messageIndex];\n const toolCalls = JSON.parse(message.tool_calls!);\n\n // If this message has only one tool call, delete the entire message\n if (toolCalls.length === 1) {\n // Remove from message history\n state.messageHistory.splice(messageIndex, 1);\n\n // Remove from database (now includes sub-prompts)\n await state.storage.sql.exec(\n `DELETE FROM messages WHERE id = ?`,\n message.id\n );\n\n } else {\n // If multiple tool calls, just remove this one from the tool_calls array\n const updatedToolCalls = toolCalls.filter((tc: ToolCall) => tc.id !== call.id);\n message.tool_calls = JSON.stringify(updatedToolCalls);\n\n // Update in database (now includes sub-prompts)\n await state.storage.sql.exec(\n `UPDATE messages SET tool_calls = ? WHERE id = ?`,\n message.tool_calls,\n message.id\n );\n\n }\n } catch (error) {\n console.error(`[ToolExecutor] Error removing tool call from history:`, error);\n }\n }\n}\n","/**\n * Context Management for Image Attachments\n *\n * Handles auto-summarization of old images to reduce context window usage\n * while preserving the semantic meaning of image content.\n */\n\nimport type { FlowState, Message, MessageContent, AttachmentRef } from \"./types\";\n\n/**\n * Configuration for image context management\n */\nexport interface ImageContextConfig {\n /** Number of recent messages to keep images for (default: 10) */\n recentMessageThreshold: number;\n /** System prompt for generating image descriptions */\n descriptionPrompt: string;\n}\n\nconst DEFAULT_CONFIG: ImageContextConfig = {\n recentMessageThreshold: 10,\n descriptionPrompt:\n \"Describe this image concisely in 1-2 sentences, focusing on the key visual elements and any text visible.\",\n};\n\n/**\n * Check if a message has image attachments that could be summarized\n */\nexport function hasImageAttachments(message: Message): boolean {\n if (!message.attachments) return false;\n\n try {\n const attachments: AttachmentRef[] =\n typeof message.attachments === \"string\"\n ? JSON.parse(message.attachments)\n : message.attachments;\n\n return attachments.some((att) => att.mimeType.startsWith(\"image/\"));\n } catch {\n return false;\n }\n}\n\n/**\n * Get image attachments from a message that don't have descriptions yet\n */\nexport function getUnsummarizedImageAttachments(\n message: Message\n): AttachmentRef[] {\n if (!message.attachments) return [];\n\n try {\n const attachments: AttachmentRef[] =\n typeof message.attachments === \"string\"\n ? JSON.parse(message.attachments)\n : message.attachments;\n\n return attachments.filter(\n (att) => att.mimeType.startsWith(\"image/\") && !att.description\n );\n } catch {\n return [];\n }\n}\n\n/**\n * Determine which messages should have their images replaced with descriptions.\n * Returns indices of messages that are old enough to be summarized.\n */\nexport function getMessagesToSummarize(\n messages: Message[],\n config: ImageContextConfig = DEFAULT_CONFIG\n): number[] {\n const indices: number[] = [];\n const threshold = messages.length - config.recentMessageThreshold;\n\n for (let i = 0; i < threshold; i++) {\n const msg = messages[i];\n if (msg.role === \"user\" && hasImageAttachments(msg)) {\n indices.push(i);\n }\n }\n\n return indices;\n}\n\n/**\n * Build text representation for an image attachment (used when image is too old)\n */\nexport function buildImageDescription(attachment: AttachmentRef): string {\n if (attachment.description) {\n return `[Image: ${attachment.name}] ${attachment.description}`;\n }\n\n // Fallback for images without descriptions\n const dimensions =\n attachment.width && attachment.height\n ? ` (${attachment.width}x${attachment.height})`\n : \"\";\n return `[Image: ${attachment.name}${dimensions}]`;\n}\n\n/**\n * Transform message content to replace old images with text descriptions.\n * This modifies the content array for LLM context building.\n */\nexport function replaceImagesWithDescriptions(\n content: MessageContent,\n attachments: AttachmentRef[]\n): MessageContent {\n // If content is a string, prepend image descriptions\n if (typeof content === \"string\") {\n const imageDescriptions = attachments\n .filter((att) => att.mimeType.startsWith(\"image/\"))\n .map(buildImageDescription)\n .join(\"\\n\");\n\n if (!imageDescriptions) return content;\n if (!content) return imageDescriptions;\n return `${imageDescriptions}\\n\\n${content}`;\n }\n\n // If content is multimodal array, filter out image parts and add descriptions\n const textParts = content.filter((part) => part.type === \"text\");\n const imageAttachments = attachments.filter((att) =>\n att.mimeType.startsWith(\"image/\")\n );\n\n if (imageAttachments.length === 0) {\n return content;\n }\n\n const imageDescriptions = imageAttachments.map(buildImageDescription).join(\"\\n\");\n\n // Combine descriptions with existing text\n if (textParts.length > 0) {\n const existingText = textParts.map((p) => p.text).join(\" \");\n return `${imageDescriptions}\\n\\n${existingText}`;\n }\n\n return imageDescriptions;\n}\n\n/**\n * Process message history to optimize context window usage.\n * Old images are replaced with their text descriptions.\n *\n * @param messages - Full message history\n * @param config - Context management configuration\n * @returns Processed messages with old images replaced by descriptions\n */\nexport function optimizeImageContext(\n messages: Message[],\n config: ImageContextConfig = DEFAULT_CONFIG\n): Message[] {\n const messagesToSummarize = getMessagesToSummarize(messages, config);\n\n if (messagesToSummarize.length === 0) {\n return messages;\n }\n\n return messages.map((msg, index) => {\n if (!messagesToSummarize.includes(index)) {\n return msg;\n }\n\n // Parse attachments\n let attachments: AttachmentRef[];\n try {\n attachments =\n typeof msg.attachments === \"string\"\n ? JSON.parse(msg.attachments)\n : msg.attachments || [];\n } catch {\n return msg;\n }\n\n // Replace images with descriptions in content\n const optimizedContent = replaceImagesWithDescriptions(\n msg.content || \"\",\n attachments\n );\n\n // Return modified message without image attachments for LLM context\n return {\n ...msg,\n content:\n typeof optimizedContent === \"string\"\n ? optimizedContent\n : JSON.stringify(optimizedContent),\n // Clear attachments since we've inlined descriptions\n attachments: JSON.stringify(\n attachments.filter((att) => !att.mimeType.startsWith(\"image/\"))\n ),\n };\n });\n}\n\n/**\n * Generate a description for an image using a vision model.\n * This should be called when storing new messages with images.\n *\n * Note: This function is a placeholder for the actual LLM call.\n * The actual implementation would need to make an API call to a vision model.\n *\n * @param imageBase64 - Base64-encoded image data\n * @param mimeType - MIME type of the image\n * @param state - Flow state for LLM access\n * @returns Generated description\n */\nexport async function generateImageDescription(\n _imageBase64: string,\n _mimeType: string,\n _state: FlowState\n): Promise<string | null> {\n // TODO: Implement actual vision model call\n // This would require:\n // 1. Getting a vision-capable model from the prompt/agent config\n // 2. Making a one-off LLM call with the image\n // 3. Returning the description\n //\n // For now, return null to indicate no description was generated.\n // Images will use their filename as a fallback description.\n return null;\n}\n","import type {\n Agent,\n FlowState,\n FlowResult,\n Message,\n RequestContext,\n ThreadInstance,\n ThreadMetadata,\n ToolCall,\n ToolResult,\n Env,\n AttachmentRef,\n MessageContent,\n MultimodalContent,\n LLMResponseImage,\n LLMResponse,\n} from \"./types\";\nimport { MAX_STEPS, TIMESTAMP_MULTIPLIER } from \"./types\";\nimport { StreamManager } from \"./StreamManager\";\nimport { LLMRequest } from \"./LLMRequest\";\nimport { ToolExecutor } from \"./ToolExecutor\";\nimport { buildImageDescription } from \"./context\";\nimport { ThreadStateImpl } from \"./ThreadStateImpl.js\";\nimport type { DurableObjectStorage } from \"@cloudflare/workers-types\";\n\n/**\n * Core orchestration engine for agent execution\n * Manages the main agentic loop with step-based execution\n */\nexport class FlowEngine {\n /**\n * Main execution entry point\n * Executes an agent conversation until stopped or max steps reached\n *\n * By default, returns immediately with the stream while execution continues in background.\n * Set awaitCompletion: true to wait for all steps and database writes to complete (required for sub-prompts).\n *\n * @param stateInput - Partial FlowState object with required fields\n * @param awaitCompletion - If true, awaits full execution completion before returning (default: false)\n */\n static async execute(\n stateInput: Partial<FlowState> & {\n agentConfig: Agent;\n storage: DurableObjectStorage;\n env: Env;\n threadId: string;\n thread: {\n instance: ThreadInstance;\n metadata: ThreadMetadata;\n };\n },\n awaitCompletion: boolean = false\n ): Promise<FlowResult> {\n // Initialize state from partial input\n // All optional properties (emitLog, parentLogId, etc.) are now in FlowState interface\n const state = await this.initializeState(stateInput);\n\n if (awaitCompletion) {\n // Wait for execution to complete (for sub-prompts to ensure serial execution)\n try {\n await this.executeAsync(state, state.threadId);\n } catch (error) {\n console.error(\"Fatal error in executeAsync:\", error);\n await this.logError(state, error, \"fatal_execution_error\", \"FlowEngine.executeAsync\");\n throw error; // Re-throw for caller to handle\n }\n } else {\n // Start execution in background (default behavior for top-level execution)\n this.executeAsync(state, state.threadId).catch(async (error) => {\n console.error(\"Fatal error in executeAsync:\", error);\n await this.logError(state, error, \"fatal_execution_error\", \"FlowEngine.executeAsync\");\n });\n }\n\n // Return immediately with the stream\n return {\n messages: state.messageHistory,\n stopped: state.stopped,\n stoppedBy: state.stoppedBy,\n stepCount: state.stepCount,\n stream: state.stream.httpStream,\n };\n }\n\n /**\n * Execute the agentic loop asynchronously\n * This runs in the background while the stream is being consumed\n */\n private static async executeAsync(\n state: FlowState,\n threadId: string\n ): Promise<void> {\n // Main agentic loop\n while (state.stepCount < MAX_STEPS && !state.stopped && !state.abortController?.signal.aborted) {\n\n try {\n // Check if abort was requested\n if (state.abortController?.signal.aborted) {\n // Create a system message to indicate interruption\n const interruptionMessageId = crypto.randomUUID();\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n\n // Run before hook\n let interruptionMessage: Message = {\n id: interruptionMessageId,\n role: \"system\",\n content: \"Execution stopped by user\",\n created_at: timestamp,\n status: \"completed\",\n };\n\n interruptionMessage = await this.runBeforeCreateMessageHook(state, interruptionMessage) as Message;\n\n await state.storage.sql.exec(\n `INSERT INTO messages (id, role, content, created_at, status) VALUES (?, ?, ?, ?, ?)`,\n interruptionMessage.id,\n interruptionMessage.role,\n interruptionMessage.content,\n interruptionMessage.created_at,\n interruptionMessage.status\n );\n\n // Run after hook\n await this.runAfterCreateMessageHook(state, interruptionMessage);\n\n // Broadcast the interruption message\n if (state.emitMessage) {\n state.emitMessage({\n id: interruptionMessage.id,\n role: interruptionMessage.role as \"system\" | \"user\" | \"assistant\" | \"tool\",\n content: interruptionMessage.content,\n created_at: interruptionMessage.created_at,\n status: interruptionMessage.status,\n });\n }\n\n state.emitTelemetry?.({\n type: \"stopped_by_user\",\n timestamp: Date.now(),\n });\n state.stopped = true;\n break;\n }\n\n await this.executeStep(state);\n state.stepCount++;\n\n\n // Sub-prompts execute as one-shot: make one LLM request, execute tools, return\n // Don't play multiple turns even if tools fail\n // Check if this is a sub-prompt by presence of parentMessageId\n if (state.parentMessageId !== undefined) {\n state.stopped = true;\n break;\n }\n } catch (error) {\n // Check if this is an abort error\n const isAbortError = error instanceof Error &&\n (error.name === \"AbortError\" || error.message.includes(\"aborted\"));\n\n if (isAbortError) {\n // Interruption message already created by stop() method\n state.stopped = true;\n break;\n }\n\n // Handle other errors\n console.error(`Error in step ${state.stepCount}:`, error);\n\n // Log error to database\n await this.logError(\n state,\n error,\n \"step_execution_error\",\n `Step ${state.stepCount}, Side ${state.currentSide}`\n );\n\n // Send error message to HTTP stream\n const errorMessage = error instanceof Error ? error.message : String(error);\n state.stream.sendContent(`\\n\\n[ERROR] ${errorMessage}\\n`);\n\n // Send error telemetry\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `Error: ${errorMessage}`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n\n // Stop execution on fatal error\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n break;\n }\n }\n\n // Check if we hit max steps\n if (state.stepCount >= MAX_STEPS && !state.stopped) {\n console.warn(`Thread ${threadId} reached maximum steps (${MAX_STEPS})`);\n\n // Log to database\n await this.logError(\n state,\n new Error(`Thread reached maximum steps (${MAX_STEPS})`),\n \"max_steps_reached\",\n `Thread ${threadId}`\n );\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: \"Maximum steps reached\",\n side: state.currentSide,\n timestamp: Date.now(),\n });\n }\n\n // Close streams\n await state.stream.close();\n }\n\n /**\n * Load prompts from TypeScript configs via virtual modules.\n *\n * Agent config is already loaded by DurableThread, so we just need to\n * load the referenced prompts.\n */\n private static async loadAgentAndPrompts(\n agentConfig: Agent,\n thread: { instance: ThreadInstance; metadata: ThreadMetadata }\n ): Promise<{\n agentConfig: Agent;\n sideAPrompt: import(\"./types\").PromptData;\n sideBPrompt: import(\"./types\").PromptData | null;\n }> {\n // Load side A prompt (always required)\n const sideAPromptName = agentConfig.side_a_agent_prompt;\n if (!sideAPromptName) {\n throw new Error(`Agent ${agentConfig.title} missing side_a_agent_prompt`);\n }\n\n const sideAPromptDef = await thread.instance.loadPrompt(sideAPromptName);\n\n // Convert PromptDefinition to PromptData format expected by runtime\n const sideAPrompt: import(\"./types\").PromptData = {\n id: sideAPromptName,\n name: sideAPromptDef.name,\n tool_description: sideAPromptDef.toolDescription,\n prompt: sideAPromptDef.prompt,\n model: sideAPromptDef.model,\n include_chat: sideAPromptDef.includeChat ?? false,\n include_past_tools: sideAPromptDef.includePastTools ?? false,\n parallel_tool_calls: sideAPromptDef.parallelToolCalls ?? false,\n tool_choice: sideAPromptDef.toolChoice ?? 'auto',\n reasoning_effort: sideAPromptDef.reasoning?.effort ?? null,\n reasoning_max_tokens: sideAPromptDef.reasoning?.maxTokens ?? null,\n reasoning_exclude: sideAPromptDef.reasoning?.exclude ?? false,\n include_reasoning: sideAPromptDef.reasoning?.include ?? false,\n _tools: sideAPromptDef.tools ?? [],\n _requiredSchema: sideAPromptDef.requiredSchema ?? null,\n } as import(\"./types\").PromptData;\n\n // Load side B prompt (only for dual_ai agents)\n let sideBPrompt: import(\"./types\").PromptData | null = null;\n const sideBPromptName = agentConfig.side_b_agent_prompt;\n if (sideBPromptName) {\n const sideBPromptDef = await thread.instance.loadPrompt(sideBPromptName);\n\n sideBPrompt = {\n id: sideBPromptName,\n name: sideBPromptDef.name,\n tool_description: sideBPromptDef.toolDescription,\n prompt: sideBPromptDef.prompt,\n model: sideBPromptDef.model,\n include_chat: sideBPromptDef.includeChat ?? false,\n include_past_tools: sideBPromptDef.includePastTools ?? false,\n parallel_tool_calls: sideBPromptDef.parallelToolCalls ?? false,\n tool_choice: sideBPromptDef.toolChoice ?? 'auto',\n reasoning_effort: sideBPromptDef.reasoning?.effort ?? null,\n reasoning_max_tokens: sideBPromptDef.reasoning?.maxTokens ?? null,\n reasoning_exclude: sideBPromptDef.reasoning?.exclude ?? false,\n include_reasoning: sideBPromptDef.reasoning?.include ?? false,\n _tools: sideBPromptDef.tools ?? [],\n _requiredSchema: sideBPromptDef.requiredSchema ?? null,\n } as import(\"./types\").PromptData;\n }\n\n return { agentConfig, sideAPrompt, sideBPrompt };\n }\n\n /**\n * Initialize the flow state from partial input\n * Merges provided fields with defaults and loaded data\n */\n private static async initializeState(\n stateInput: Partial<FlowState> & {\n agentConfig: Agent;\n storage: DurableObjectStorage;\n env: Env;\n threadId: string;\n thread: {\n instance: ThreadInstance;\n metadata: ThreadMetadata;\n };\n }\n ): Promise<FlowState> {\n // Load prompts for the provided agent config via virtual modules\n const { sideAPrompt, sideBPrompt } = await this.loadAgentAndPrompts(\n stateInput.agentConfig,\n stateInput.thread\n );\n\n // Create stream manager if not provided\n const stream = stateInput.stream || new StreamManager();\n\n // Build complete state with defaults\n const state: Omit<FlowState, 'rootState'> & { rootState?: FlowState } = {\n threadId: stateInput.threadId,\n flowId: stateInput.flowId || crypto.randomUUID(),\n thread: stateInput.thread,\n agentConfig: stateInput.agentConfig,\n currentSide: stateInput.currentSide || \"a\",\n prompts: {\n sideA: sideAPrompt,\n sideB: sideBPrompt,\n },\n prompt: (stateInput.currentSide || \"a\") === \"a\" ? sideAPrompt : (sideBPrompt || sideAPrompt),\n stepCount: stateInput.stepCount || 0,\n sideAStepCount: stateInput.sideAStepCount || 0,\n sideBStepCount: stateInput.sideBStepCount || 0,\n stopped: stateInput.stopped || false,\n stoppedBy: stateInput.stoppedBy,\n messageHistory: [],\n sequence: stateInput.sequence || {\n queue: [],\n isHandling: false,\n },\n active: stateInput.active || {\n tool: \"\",\n args: {},\n retries: 0,\n reasons: [],\n },\n queue: stateInput.queue || [],\n stream,\n context: stateInput.context || {},\n retryCount: stateInput.retryCount || 0,\n retryReason: stateInput.retryReason,\n storage: stateInput.storage,\n env: stateInput.env,\n // Preserve runtime properties for nested execution and telemetry\n emitLog: stateInput.emitLog,\n emitMessage: stateInput.emitMessage,\n emitMessageChunk: stateInput.emitMessageChunk,\n emitTelemetry: stateInput.emitTelemetry,\n emitEvent: stateInput.emitEvent,\n rootMessageId: stateInput.rootMessageId,\n parentLogId: stateInput.parentLogId,\n currentLogId: stateInput.currentLogId,\n parentMessageId: stateInput.parentMessageId,\n depth: stateInput.depth ?? 0, // Default to 0 for top-level prompts\n pendingMessageId: stateInput.pendingMessageId,\n abortController: stateInput.abortController,\n allowedTools: stateInput.allowedTools,\n extraMessages: stateInput.extraMessages || [],\n };\n if (stateInput.rootState) {\n state.rootState = stateInput.rootState;\n } else {\n state.rootState = state as unknown as FlowState;\n }\n return state as FlowState;\n }\n\n /**\n * Execute a single step\n */\n private static async executeStep(state: FlowState): Promise<void> {\n // Check the persistent stop flag from DurableThread (most reliable)\n if (await state.thread.instance.shouldStop()) {\n throw new Error(\"aborted\");\n }\n\n // Check abort signal before starting turn\n if (state.abortController?.signal.aborted) {\n throw new Error(\"aborted\");\n }\n\n // Check per-side max steps before executing\n const maxSteps = state.currentSide === \"a\"\n ? state.agentConfig.side_a_max_steps\n : state.agentConfig.side_b_max_steps;\n\n const currentSideStepCount = state.currentSide === \"a\"\n ? state.sideAStepCount\n : state.sideBStepCount;\n\n if (maxSteps !== null && currentSideStepCount >= maxSteps) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `Side ${state.currentSide} reached max steps (${maxSteps})`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n return;\n }\n\n // Check max_session_turns for dual_ai agents (global exchange limit)\n if (\n state.agentConfig.type === \"dual_ai\" &&\n state.agentConfig.max_session_turns !== null\n ) {\n // Calculate completed exchanges (both sides must have spoken for a complete exchange)\n const completedExchanges = Math.min(state.sideAStepCount, state.sideBStepCount);\n\n if (completedExchanges >= state.agentConfig.max_session_turns) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `Reached max session turns (${state.agentConfig.max_session_turns} exchanges)`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n return;\n }\n }\n\n // Increment per-side step count\n if (state.currentSide === \"a\") {\n state.sideAStepCount++;\n } else {\n state.sideBStepCount++;\n }\n\n // Send step started telemetry\n state.emitTelemetry?.({\n type: \"step_started\",\n step: state.stepCount,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n\n state.messageHistory = await this.loadMessageHistory(state);\n\n // 1. Assemble context for this turn\n const context = await this.assembleContext(state);\n\n // Store allowed tools in state for validation during tool execution\n state.allowedTools = context.tools;\n\n // 1.25. Run prefilter hook on messages (if it exists)\n // This allows developers to modify the message history before sending to LLM\n // The filtered messages will be logged, so devs can see what was actually sent\n context.messages = await this.runPrefilterLLMHistoryHook(state, context.messages);\n\n // 1.5. Create pending message BEFORE LLM request\n const pendingMessageId = await this.createPendingMessage(state);\n\n // Store pending message ID for streaming chunk broadcasts\n state.pendingMessageId = pendingMessageId;\n\n // 2. Execute LLM request with retry/fallback logic\n let responseStatus: \"completed\" | \"failed\" = \"completed\";\n let response: LLMResponse;\n let logId: string;\n\n try {\n const result = await LLMRequest.execute(context, state);\n response = result.response;\n logId = result.logId;\n } catch (error) {\n // LLM request failed - update pending message to failed status\n responseStatus = \"failed\";\n await this.updateMessageStatus(pendingMessageId, \"failed\", state);\n throw error; // Re-throw to be handled by executeAsync\n }\n\n // Check stop flag BEFORE storing response - discard if stopped\n if ((await state.thread.instance.shouldStop()) || state.abortController?.signal.aborted) {\n\n // Delete the pending message - don't store the response\n await state.storage.sql.exec(\n `DELETE FROM messages WHERE id = ?`,\n pendingMessageId\n );\n\n // Mark log as interrupted\n await state.storage.sql.exec(\n `UPDATE logs SET error = ?, error_type = ? WHERE id = ?`,\n \"Interrupted by user\",\n \"user_interrupted\",\n logId\n );\n\n throw new Error(\"aborted\");\n }\n\n // Store the log ID for tool error tracking\n state.currentLogId = logId;\n\n // 2.5. Check for stop-tool with response parameter and extract it as content\n this.extractStopToolResponse(state, response);\n\n // 3. Update pending message with response\n await this.updateMessage(pendingMessageId, response, responseStatus, state);\n\n // 4. Execute tools if present\n if (response.tool_calls && response.tool_calls.length > 0) {\n await ToolExecutor.executeSequence(state, response.tool_calls);\n }\n\n // Check stop flag and abort signal after tool execution\n if ((await state.thread.instance.shouldStop()) || state.abortController?.signal.aborted) {\n throw new Error(\"aborted\");\n }\n\n // 5. Check stop condition\n this.checkStopCondition(state, response);\n\n // Clear the log ID and pending message ID after turn is complete\n state.currentLogId = null;\n state.pendingMessageId = undefined;\n\n // 5.25. Handle pending agent handoff (if any)\n // IMPORTANT: Check handoff BEFORE forcedNextSide because:\n // - Agent handoffs change the entire agent context\n // - forceTurn after a handoff should apply to the NEW agent\n // - If we check forcedNextSide first, the handoff is skipped due to early return\n if (state.pendingHandoff) {\n // If there's also a pending force turn, preserve it for after the handoff\n // The forcedNextSide will be applied in the next iteration after the new agent loads\n await this.executeHandoff(state);\n // After handoff, continue loop - new agent will execute immediately\n // Do NOT switch sides or increment turn count - handoff doesn't count as a turn\n return;\n }\n\n // 5.5. Handle forced turn if set\n if (state.forcedNextSide) {\n const forcedSide = state.forcedNextSide.substring(5) as 'a' | 'b';\n\n // Special case: forcing side_b in ai_human agent means wait for human input\n if (state.agentConfig.type === \"ai_human\" && forcedSide === \"b\") {\n state.stopped = true;\n state.stoppedBy = \"a\"; // AI stopped to let human respond\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: \"Forced turn to human (side_b)\",\n side: state.currentSide,\n timestamp: Date.now(),\n });\n }\n // Force current side to continue (override stop condition)\n else if (forcedSide === state.currentSide) {\n state.stopped = false; // Clear any stop flag\n state.stoppedBy = undefined;\n }\n // Force switch to other side\n else {\n state.currentSide = forcedSide; // Override normal switching\n state.stopped = false; // Ensure we continue execution\n\n // Update prompt reference to match forced side\n if (state.currentSide === \"b\" && state.prompts.sideB) {\n state.prompt = state.prompts.sideB;\n } else {\n state.prompt = state.prompts.sideA;\n }\n }\n\n // Clear the forced turn flag after applying it\n state.forcedNextSide = undefined;\n\n // Return early to skip normal side switching logic\n return;\n }\n\n // Check abort signal before switching sides (critical to prevent next turn)\n if (state.abortController?.signal.aborted) {\n throw new Error(\"aborted\");\n }\n\n // 6. Switch sides if dual_ai and not stopped\n if (state.agentConfig.type === \"dual_ai\" && !state.stopped) {\n this.switchSides(state);\n }\n\n // Send step completed telemetry\n state.emitTelemetry?.({\n type: \"step_completed\",\n step: state.stepCount,\n stopped: state.stopped,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Execute agent handoff - switch to a new AI + Human agent\n * Updates the thread's agent_name and loads the new agent config\n */\n private static async executeHandoff(state: FlowState): Promise<void> {\n if (!state.pendingHandoff) {\n return;\n }\n\n const newAgentName = state.pendingHandoff.agentId; // Now contains agent name\n\n try {\n // Load new agent definition from TypeScript config\n const newAgentDef = await state.thread.instance.loadAgent(newAgentName);\n\n // Convert AgentDefinition to Agent type expected by runtime\n const agentConfig: Agent = {\n id: newAgentName,\n title: newAgentDef.title || newAgentName,\n type: newAgentDef.type,\n created_at: Date.now(),\n max_session_turns: newAgentDef.maxSessionTurns ?? null,\n side_a_label: newAgentDef.sideA?.label ?? null,\n side_a_agent_prompt: newAgentDef.sideA?.prompt ?? null,\n side_a_stop_on_response: newAgentDef.sideA?.stopOnResponse ?? false,\n side_a_stop_tool: newAgentDef.sideA?.stopTool ?? null,\n side_a_stop_tool_response_property: newAgentDef.sideA?.stopToolResponseProperty ?? null,\n side_a_max_steps: newAgentDef.sideA?.maxSteps ?? null,\n side_a_end_session_tool: newAgentDef.sideA?.endSessionTool ?? null,\n side_b_label: newAgentDef.sideB?.label ?? null,\n side_b_agent_prompt: newAgentDef.sideB?.prompt ?? null,\n side_b_stop_on_response: newAgentDef.sideB?.stopOnResponse ?? false,\n side_b_stop_tool: newAgentDef.sideB?.stopTool ?? null,\n side_b_stop_tool_response_property: newAgentDef.sideB?.stopToolResponseProperty ?? null,\n side_b_max_steps: newAgentDef.sideB?.maxSteps ?? null,\n side_b_end_session_tool: newAgentDef.sideB?.endSessionTool ?? null,\n };\n\n // Load prompts for new agent\n const { sideAPrompt, sideBPrompt } = await this.loadAgentAndPrompts(\n agentConfig,\n state.thread\n );\n\n // Persist the agent change to the threads table in DurableAgentBuilder\n try {\n const agentBuilderStub = state.env.AGENT_BUILDER.get(\n state.env.AGENT_BUILDER.idFromName(\"singleton\")\n ) as unknown as { updateThreadAgent(threadId: string, agentId: string): Promise<void> };\n await agentBuilderStub.updateThreadAgent(state.threadId, newAgentName);\n } catch (persistError) {\n console.error(\"Error persisting handoff to threads table:\", persistError);\n // Continue with handoff even if persistence fails - the in-memory state is correct\n }\n\n // Update state with new agent config and prompts\n state.agentConfig = agentConfig;\n state.prompts.sideA = sideAPrompt;\n state.prompts.sideB = sideBPrompt;\n state.extraMessages = [];\n\n // Reset to Side A and update current prompt reference\n state.currentSide = \"a\";\n state.prompt = state.prompts.sideA;\n\n // Clear pending handoff\n state.pendingHandoff = undefined;\n\n // Send telemetry\n state.emitTelemetry?.({\n type: \"agent_handoff\",\n new_agent_id: newAgentName,\n new_agent_title: state.agentConfig.title,\n timestamp: Date.now(),\n } as any); // Cast to any since agent_handoff is not in TelemetryEvent type yet\n } catch (error) {\n console.error(\"Error executing handoff:\", error);\n await this.logError(state, error, \"handoff_execution_error\", `Handoff to agent ${newAgentName}`);\n throw error;\n }\n }\n\n /**\n * Assemble context for LLM request\n */\n private static async assembleContext(\n state: FlowState\n ): Promise<RequestContext> {\n const messages: RequestContext[\"messages\"] = [];\n // Track data URL -> attachment path mappings for log transformation\n const imagePathMap = new Map<string, string>();\n\n // Use pre-loaded prompt configuration from state\n const model = state.prompt.model;\n const promptName = state.prompt.name;\n const parallelToolCalls = state.prompt.parallel_tool_calls;\n const toolChoice = state.prompt.tool_choice;\n const reasoningEffort = state.prompt.reasoning_effort;\n const reasoningMaxTokens = state.prompt.reasoning_max_tokens;\n const reasoningExclude = state.prompt.reasoning_exclude;\n const includeReasoning = state.prompt.include_reasoning;\n const includePastTools = state.prompt.include_past_tools ?? true;\n\n // Add agent prompt content to messages\n const promptContent = await this.interpolatePrompt(\n state.prompt.prompt,\n state.context || {},\n state\n );\n\n const systemPromptText = promptContent; // Store for logging\n\n messages.push({\n role: \"system\",\n content: promptContent,\n });\n\n // Filter out pending messages - they should NEVER be sent to the LLM\n const completedMessages = state.messageHistory.filter(\n msg => msg.status !== \"pending\"\n );\n\n // First pass: collect all tool_call_ids that have responses\n const toolCallsWithResponses = new Set<string>();\n for (const msg of completedMessages) {\n if (msg.role === \"tool\" && msg.tool_call_id) {\n toolCallsWithResponses.add(msg.tool_call_id);\n }\n }\n\n // Context management: determine threshold for replacing old images with descriptions\n // Messages beyond this threshold will have their images replaced with text descriptions\n // to save context window space\n const recentMessageThreshold = state.prompt.recentImageThreshold ?? 10;\n const oldMessageThreshold = completedMessages.length - recentMessageThreshold;\n\n // Second pass: add messages and inject error responses for missing tool results\n // For dual_ai agents: Transform roles based on perspective\n // - Current side's messages should be labeled \"assistant\"\n // - Opposing side's messages should be labeled \"user\"\n // - System messages remain unchanged\n // - Tool messages are filtered by side (only show current side's tool calls)\n let messageIndex = 0;\n for (const msg of completedMessages) {\n // IMPORTANT: Roles encode side information\n // - role=\"assistant\" = Side A messages\n // - role=\"user\" = Side B messages\n // This allows us to filter tool calls without a separate \"side\" column\n\n // Skip ALL tool messages when includePastTools is false\n if (!includePastTools && msg.role === \"tool\") {\n continue;\n }\n\n // Filter tool messages by side - each AI should only see its own tool calls\n if (state.agentConfig.type === \"dual_ai\" && msg.role === \"tool\" && msg.tool_call_id) {\n // Find the parent message that made this tool call\n const parentMsg = completedMessages.find(m => {\n if (!m.tool_calls) return false;\n try {\n const toolCalls = JSON.parse(m.tool_calls);\n return toolCalls.some((tc: any) => tc.id === msg.tool_call_id);\n } catch {\n return false;\n }\n });\n\n if (parentMsg) {\n // Determine which side made this tool call based on parent message role\n // role=\"assistant\" means Side A made the call\n // role=\"user\" means Side B made the call\n const toolCallSide = parentMsg.role === \"assistant\" ? \"a\" : \"b\";\n\n // Skip tool calls from the opposing side\n if (toolCallSide !== state.currentSide) {\n continue; // Don't include this tool message\n }\n }\n }\n\n let role = msg.role;\n\n // Transform role based on perspective for dual_ai agents\n if (state.agentConfig.type === \"dual_ai\") {\n if (msg.role === \"assistant\") {\n // Message is from side A - keep as \"assistant\" if current side is A, else \"user\"\n role = state.currentSide === \"a\" ? \"assistant\" : \"user\";\n } else if (msg.role === \"user\") {\n // Message is from side B - keep as \"user\" if current side is A, else \"assistant\"\n role = state.currentSide === \"a\" ? \"user\" : \"assistant\";\n }\n // system and tool roles remain unchanged\n }\n\n // Prepare message content - resolve attachments for user messages with images\n // Only resolve attachments if the model supports vision\n // For old messages (beyond recentImageThreshold), replace images with text descriptions\n let messageContent: MessageContent;\n const hasAttachments = msg.attachments && msg.attachments !== \"[]\";\n const isOldMessage = messageIndex < oldMessageThreshold;\n\n if (hasAttachments && msg.role === \"user\") {\n const attachments: AttachmentRef[] = JSON.parse(msg.attachments!);\n const imageAttachments = attachments.filter((a) =>\n a.mimeType.startsWith(\"image/\")\n );\n\n if (isOldMessage && imageAttachments.length > 0) {\n // Old message with images - use text descriptions instead of actual images\n const imageDescriptions = imageAttachments\n .map(buildImageDescription)\n .join(\"\\n\");\n const nonImageFiles = attachments\n .filter((a) => !a.mimeType.startsWith(\"image/\"))\n .map((a) => a.name);\n const nonImageList =\n nonImageFiles.length > 0\n ? `\\n[Other files: ${nonImageFiles.join(\", \")}]`\n : \"\";\n\n messageContent = msg.content\n ? `${imageDescriptions}${nonImageList}\\n\\n${msg.content}`\n : `${imageDescriptions}${nonImageList}`;\n } else {\n // Recent message - always send images as multimodal content\n // Let the provider error if it doesn't support vision\n if (imageAttachments.length > 0) {\n messageContent = await this.resolveAttachmentsToContent(msg, state, imagePathMap);\n } else {\n // Non-image attachments only - append file list\n const fileList = attachments.map((a) => a.name).join(\", \");\n messageContent = msg.content\n ? `${msg.content}\\n\\n[Attached files: ${fileList}]`\n : `[Attached files: ${fileList}]`;\n }\n }\n } else {\n messageContent = msg.content || \"\";\n }\n messageIndex++;\n\n // When includePastTools is false, strip tool_calls from messages\n const messageToAdd: any = {\n role,\n content: messageContent,\n tool_calls: includePastTools && msg.tool_calls ? JSON.parse(msg.tool_calls) : undefined,\n tool_call_id: includePastTools && msg.tool_call_id ? msg.tool_call_id : undefined,\n name: msg.name || undefined,\n };\n\n // Add reasoning if present and includeReasoning is enabled\n // Convert reasoning_content to synthetic detail, combine with structured reasoning\n // https://openrouter.ai/docs/use-cases/reasoning-tokens.md\n if (includeReasoning) {\n const reasoningDetailsArray: any[] = [];\n\n // If we have reasoning_content (accumulated text), add it as a single text detail\n if (msg.reasoning_content) {\n reasoningDetailsArray.push({\n type: \"reasoning.text\",\n text: msg.reasoning_content\n });\n }\n\n // Add any non-text reasoning_details (summaries, encrypted, etc.)\n if (msg.reasoning_details) {\n try {\n const parsedDetails = JSON.parse(msg.reasoning_details);\n reasoningDetailsArray.push(...parsedDetails);\n } catch (e) {\n console.error(`[FlowEngine] Failed to parse reasoning_details for message ${msg.id}:`, e);\n }\n }\n\n // Only add reasoning_details if we have any\n if (reasoningDetailsArray.length > 0) {\n messageToAdd.reasoning_details = reasoningDetailsArray;\n }\n }\n\n // If this is an assistant message with tool_calls, filter out ones without responses\n // Use the ORIGINAL role from storage to identify tool calls\n // Skip this logic if includePastTools is false (tool_calls already stripped)\n if (includePastTools && msg.role === \"assistant\" && msg.tool_calls) {\n const toolCalls = JSON.parse(msg.tool_calls);\n const matchedToolCalls = toolCalls.filter((toolCall: any) =>\n toolCallsWithResponses.has(toolCall.id)\n );\n\n // Only include the message if it has content or matched tool calls\n if (msg.content || matchedToolCalls.length > 0) {\n // Update the message with filtered tool_calls\n if (matchedToolCalls.length === 0) {\n // Remove tool_calls field if no matches\n delete messageToAdd.tool_calls;\n } else if (matchedToolCalls.length !== toolCalls.length) {\n // Update with filtered list if some were removed\n messageToAdd.tool_calls = matchedToolCalls;\n }\n // else: all tool calls have responses, keep as-is\n\n messages.push(messageToAdd);\n } else {\n // Skip message entirely if it has no content and no matched tool calls\n console.warn(`[FlowEngine] Skipping assistant message ${msg.id} - no content and no tool calls with responses`);\n }\n } else {\n // Not an assistant message with tool_calls (or includePastTools is false), include as-is\n messages.push(messageToAdd);\n }\n }\n\n // Inject step budget awareness system message at the bottom to preserve prompt cache\n const maxSteps = state.currentSide === \"a\"\n ? state.agentConfig.side_a_max_steps\n : state.agentConfig.side_b_max_steps;\n\n if (maxSteps !== null) {\n const currentSideStepCount = state.currentSide === \"a\"\n ? state.sideAStepCount\n : state.sideBStepCount;\n\n const stepsRemaining = maxSteps - currentSideStepCount;\n\n // Note: currentSideStepCount has already been incremented in executeStep(), so we don't add 1\n let budgetMessage: string;\n\n if (stepsRemaining === 0) {\n budgetMessage = '[STEP BUDGET] ⚠️ CRITICAL: You must complete your task NOW or an error will be thrown. This is your final step.';\n } else if (stepsRemaining === 1) {\n budgetMessage = '[STEP BUDGET] ⚠️ CRITICAL: Only 1 step available after this before an error will be thrown. Reach completion immediately.';\n } else if (stepsRemaining <= 3) {\n budgetMessage = `[STEP BUDGET] ⚠️ WARNING: Only ${stepsRemaining} steps available before an error will be thrown. Reach completion as soon as possible.`;\n } else {\n budgetMessage = `[STEP BUDGET] ${stepsRemaining} steps available before an error will be thrown. Work efficiently toward completion.`;\n }\n\n messages.push({\n role: \"system\",\n content: budgetMessage,\n });\n }\n\n // Get tools attached to this specific prompt (not all available tools)\n const tools = await this.getToolsForPrompt(state, state.prompt);\n\n // Handle tool_choice: convert \"function\" to object format if needed\n let finalToolChoice: \"auto\" | \"none\" | \"required\" | { type: \"function\"; function: { name: string } } | undefined;\n if (toolChoice === \"function\" && tools.length === 1) {\n // Convert \"function\" to object format with the single tool's name\n finalToolChoice = {\n type: \"function\",\n function: {\n name: tools[0].function.name\n }\n };\n } else if (toolChoice && toolChoice !== \"function\") {\n // Use string value for auto/none/required\n finalToolChoice = toolChoice;\n }\n\n // Build reasoning configuration if either field is set (implicit enable)\n let reasoning: RequestContext[\"reasoning\"] | undefined;\n if (reasoningEffort || reasoningMaxTokens) {\n reasoning = {\n effort: reasoningEffort ?? undefined, // Convert null to undefined\n max_tokens: reasoningMaxTokens ?? undefined,\n exclude: reasoningExclude,\n };\n }\n\n return {\n messages,\n model,\n tools,\n stream: true,\n systemPrompt: systemPromptText,\n promptName: promptName,\n // Use parentLogId from state if this is a chained prompt, otherwise use currentLogId for nested tool calls\n parentLogId: state.parentLogId || state.currentLogId || null,\n // Retries now apply to all prompts (top-level and sub-prompts), only for provider errors\n parallel_tool_calls: parallelToolCalls,\n tool_choice: finalToolChoice,\n reasoning: reasoning,\n imagePathMap: imagePathMap.size > 0 ? imagePathMap : undefined,\n };\n }\n\n /**\n * Interpolate prompt template with context data\n * Prompts can be:\n * 1. Plain strings - returned as-is (with legacy {{var}} interpolation)\n * 2. StructuredPrompt arrays - array of {type, value/id} objects\n * 3. JSON string of a StructuredPrompt array - legacy format, parsed first\n */\n private static async interpolatePrompt(\n promptTemplate: string | any[],\n context: Record<string, any>,\n state: FlowState\n ): Promise<string> {\n // If already an array (StructuredPrompt), process it directly\n if (Array.isArray(promptTemplate)) {\n return this.processPromptParts(promptTemplate, context, state);\n }\n\n // If it's a string, check if it's JSON (legacy format) or plain text\n if (typeof promptTemplate === \"string\") {\n // Try to parse as JSON array (legacy format)\n try {\n const parsed = JSON.parse(promptTemplate);\n if (Array.isArray(parsed)) {\n return this.processPromptParts(parsed, context, state);\n }\n // If parsed but not an array, treat as plain string\n return promptTemplate;\n } catch {\n // Not JSON, return as plain string\n return promptTemplate;\n }\n }\n\n // Fallback for unexpected types\n return String(promptTemplate);\n }\n\n /**\n * Process an array of prompt parts into a final string.\n * Supports both new format (type: 'text'/'include') and legacy format (type: 'string'/'prompt'/'variable')\n */\n private static async processPromptParts(\n parts: any[],\n context: Record<string, any>,\n state: FlowState\n ): Promise<string> {\n const results = await Promise.all(\n parts.map(async (part: any) => {\n // New format: { type: 'text', content: '...' }\n if (part.type === \"text\") {\n return part.content || \"\";\n }\n // New format: { type: 'include', prompt: '...' }\n else if (part.type === \"include\") {\n const promptName = part.prompt;\n return await this.loadAndInterpolatePrompt(promptName, context, state);\n }\n // Legacy format: { type: 'string', value: '...' }\n else if (part.type === \"string\") {\n return part.value || \"\";\n }\n // Legacy format: { type: 'variable', value: '...' }\n else if (part.type === \"variable\") {\n const value = context[part.value];\n if (value === undefined) {\n console.warn(`Missing variable in context: ${part.value}`);\n return `{{${part.value}}}`;\n }\n return typeof value === \"string\" ? value : JSON.stringify(value);\n }\n // Legacy format: { type: 'prompt', id: '...' }\n else if (part.type === \"prompt\") {\n const promptName = part.id;\n return await this.loadAndInterpolatePrompt(promptName, context, state, part.label);\n }\n return \"\";\n })\n );\n\n return results.join(\"\");\n }\n\n /**\n * Load a referenced prompt and interpolate it\n */\n private static async loadAndInterpolatePrompt(\n promptName: string,\n context: Record<string, any>,\n state: FlowState,\n label?: string\n ): Promise<string> {\n try {\n const promptDef = await state.thread.instance.loadPrompt(promptName);\n\n if (!promptDef) {\n console.warn(`Referenced prompt not found: ${promptName}`);\n return `[Prompt not found: ${label || promptName}]`;\n }\n\n // Recursively interpolate the referenced prompt\n return await this.interpolatePrompt(\n promptDef.prompt,\n context,\n state\n );\n } catch (error) {\n console.error(`Error loading prompt ${promptName}:`, error);\n return `[Error loading prompt: ${label || promptName}]`;\n }\n }\n\n /**\n * Get tools attached to a specific prompt from PromptData._tools\n * Returns only the tools that are actually configured for this prompt.\n * Agents (ai_human) in the tools array are included as handoff tools.\n */\n private static async getToolsForPrompt(\n state: FlowState,\n promptData: import(\"./types\").PromptData\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get tool names from the prompt definition\n const toolConfigs = promptData._tools || [];\n const toolNames = toolConfigs.map((t: any) =>\n typeof t === 'string' ? t : t.name\n );\n\n if (toolNames.length > 0) {\n // Load all available tools (native + prompts + agents with exposeAsTool)\n const allTools = await this.getAvailableTools(state);\n\n // Filter to only include tools that are in the tools list\n const selectedTools = allTools.filter((tool) =>\n toolNames.includes(tool.function.name)\n );\n tools.push(...selectedTools);\n\n // Track which tool names were found\n const foundToolNames = new Set(selectedTools.map(t => t.function.name));\n\n // Check for agents in tools array that weren't in allTools (i.e., don't have exposeAsTool)\n for (const toolName of toolNames) {\n if (foundToolNames.has(toolName)) continue;\n\n try {\n const agentDef = await state.thread.instance.loadAgent(toolName);\n if (agentDef && agentDef.type === 'ai_human') {\n tools.push({\n type: \"function\",\n function: {\n name: agentDef.title || toolName,\n description: agentDef.toolDescription || `Hand off conversation to ${agentDef.title || toolName} agent`,\n parameters: {\n type: \"object\",\n properties: {\n input: {\n type: \"string\",\n description: \"Input message for the agent\",\n },\n },\n required: [\"input\"],\n },\n },\n });\n }\n } catch {\n // Not an agent, tool might be missing - will error at call time\n }\n }\n }\n\n return tools;\n } catch (error) {\n console.error(\"Error loading tools for prompt:\", error);\n await this.logError(\n state,\n error,\n \"tool_loading_error\",\n `FlowEngine.getToolsForPrompt (prompt: ${promptData.name})`\n );\n return tools;\n }\n }\n\n /**\n * Get available tools for the current agent\n * Returns tool definitions in OpenAI format\n */\n private static async getAvailableTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // 1. Load native tools from toolsDir\n const nativeTools = await this.loadNativeTools(state);\n tools.push(...nativeTools);\n\n // 2. Load exposed prompts from D1\n const promptTools = await this.loadPromptTools(state);\n tools.push(...promptTools);\n\n // 3. Load exposed agents from D1\n const agentTools = await this.loadAgentTools(state);\n tools.push(...agentTools);\n\n // 4. Check for duplicate tool names and warn\n const toolNameSources = new Map<string, Set<string>>();\n\n // Track sources for each tool name\n for (const tool of nativeTools) {\n const sources = toolNameSources.get(tool.function.name) || new Set();\n sources.add('native tool');\n toolNameSources.set(tool.function.name, sources);\n }\n for (const tool of promptTools) {\n const sources = toolNameSources.get(tool.function.name) || new Set();\n sources.add('prompt');\n toolNameSources.set(tool.function.name, sources);\n }\n for (const tool of agentTools) {\n const sources = toolNameSources.get(tool.function.name) || new Set();\n sources.add('agent');\n toolNameSources.set(tool.function.name, sources);\n }\n\n // Warn about duplicates\n for (const [name, sources] of toolNameSources) {\n if (sources.size > 1) {\n console.warn(\n `[AgentBuilder] Duplicate tool name \"${name}\" detected (sources: ${[...sources].join(', ')}). ` +\n `This may cause unexpected behavior. Consider renaming one of them.`\n );\n }\n }\n } catch (error) {\n console.error(\"Error loading tools:\", error);\n await this.logError(\n state,\n error,\n \"tool_discovery_error\",\n \"FlowEngine.getAvailableTools\"\n );\n }\n\n return tools;\n }\n\n /**\n * Load native tools from toolsDir directory\n */\n private static async loadNativeTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get tools from thread instance (user's extended Thread class)\n const toolRegistry = state.thread.instance.tools();\n const { z } = await import(\"zod\");\n\n for (const [toolName, toolLoader] of Object.entries(toolRegistry)) {\n try {\n const [description, argsSchema, _fn] = await toolLoader();\n\n // Convert Zod schema to JSON Schema if present using Zod 4's native toJSONSchema\n let parameters: Record<string, any> | undefined;\n\n if (argsSchema) {\n // Use Zod 4's native toJSONSchema (defaults to draft-2020-12)\n const jsonSchema = z.toJSONSchema(argsSchema);\n\n parameters = {\n type: \"object\",\n properties: (jsonSchema as any).properties || {},\n required: (jsonSchema as any).required || [],\n };\n }\n\n tools.push({\n type: \"function\",\n function: {\n name: toolName,\n description,\n parameters,\n },\n });\n } catch (toolError) {\n console.error(`Error loading native tool ${toolName}:`, toolError);\n }\n }\n } catch (error) {\n console.error(\"Error loading native tools registry:\", error);\n }\n\n return tools;\n }\n\n /**\n * Load exposed prompts as tools from TypeScript configs\n */\n private static async loadPromptTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get all prompt names - all prompts are exposed as tools\n const promptNames = state.thread.instance.getPromptNames();\n const { z } = await import(\"zod\");\n\n for (const name of promptNames) {\n try {\n const promptDef = await state.thread.instance.loadPrompt(name);\n\n // Build parameters from requiredSchema if present\n let parameters: Record<string, any> | undefined;\n\n if (promptDef.requiredSchema) {\n try {\n // Use Zod 4's native toJSONSchema function\n const jsonSchema = z.toJSONSchema(promptDef.requiredSchema);\n\n parameters = {\n type: \"object\",\n properties: (jsonSchema as any).properties || {},\n required: (jsonSchema as any).required || [],\n };\n } catch (parseError) {\n console.error(\n `Error converting schema for prompt ${name}:`,\n parseError\n );\n }\n }\n\n tools.push({\n type: \"function\",\n function: {\n name: promptDef.name,\n description: promptDef.toolDescription,\n parameters,\n },\n });\n } catch (error) {\n console.error(`Error loading prompt ${name}:`, error);\n }\n }\n } catch (error) {\n console.error(\"Error loading prompt tools:\", error);\n }\n\n return tools;\n }\n\n /**\n * Load exposed agents as tools from TypeScript configs\n */\n private static async loadAgentTools(\n state: FlowState\n ): Promise<import(\"./types\").ToolDefinition[]> {\n const tools: import(\"./types\").ToolDefinition[] = [];\n\n try {\n // Get all agent names and check which have exposeAsTool\n const agentNames = state.thread.instance.getAgentNames();\n\n for (const name of agentNames) {\n try {\n const agentDef = await state.thread.instance.loadAgent(name);\n\n if (agentDef.exposeAsTool) {\n // Agent tools accept arbitrary arguments (no strict schema for now)\n tools.push({\n type: \"function\",\n function: {\n name: agentDef.title || name,\n description: agentDef.toolDescription || `Execute the ${agentDef.title || name} agent`,\n parameters: {\n type: \"object\",\n properties: {\n input: {\n type: \"string\",\n description: \"Input message for the agent\",\n },\n },\n required: [\"input\"],\n },\n },\n });\n }\n } catch (error) {\n console.error(`Error loading agent ${name}:`, error);\n }\n }\n } catch (error) {\n console.error(\"Error loading agent tools:\", error);\n }\n\n return tools;\n }\n\n /**\n * Run the prefilter_llm_history hook if it exists\n * This hook allows developers to modify the message history before sending to LLM\n *\n * @param state - Flow state with execution context\n * @param messages - Messages to prefilter before sending to LLM\n * @returns Processed messages (or original if hook doesn't exist/fails)\n */\n private static async runPrefilterLLMHistoryHook(\n state: FlowState,\n messages: any[]\n ): Promise<any[]> {\n try {\n // Get hooks from thread instance\n const hooksRegistry = state.thread.instance.hooks();\n\n // Check if the hook exists\n if (!hooksRegistry || !hooksRegistry['prefilter_llm_history']) {\n return messages; // No hook - return original messages\n }\n\n // Load the hook\n const hookLoader = hooksRegistry['prefilter_llm_history'];\n const hook = await hookLoader();\n\n if (!hook) {\n return messages; // Hook failed to load - return original messages\n }\n\n // Run the hook with ThreadState\n const threadState = ThreadStateImpl.fromFlowState(state);\n const processedMessages = await hook(threadState, messages);\n return processedMessages;\n } catch (error) {\n // If the hook throws an error, log it but return the original messages\n console.error('[Hooks] ✗ Error running prefilter_llm_history hook:', error);\n return messages;\n }\n }\n\n /**\n * Run the before_create_message hook if it exists\n * This hook allows developers to modify a message before it's created\n *\n * @param state - Flow state with execution context\n * @param message - Message object to be created\n * @returns Processed message (or original if hook doesn't exist/fails)\n */\n public static async runBeforeCreateMessageHook(\n state: FlowState,\n message: Record<string, any>\n ): Promise<Record<string, any>> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['before_create_message']) {\n return message;\n }\n\n const hookLoader = hooksRegistry['before_create_message'];\n const hook = await hookLoader();\n if (!hook) {\n return message;\n }\n\n const threadState = ThreadStateImpl.fromFlowState(state);\n const processedMessage = await hook(threadState, message);\n return processedMessage;\n } catch (error) {\n console.error('[Hooks] ✗ Error running before_create_message hook:', error);\n return message;\n }\n }\n\n /**\n * Run the after_create_message hook if it exists\n * This hook runs after a message is created in the database\n *\n * @param state - Flow state with execution context\n * @param message - The created message object\n */\n public static async runAfterCreateMessageHook(\n state: FlowState,\n message: Record<string, any>\n ): Promise<void> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['after_create_message']) {\n return;\n }\n\n const hookLoader = hooksRegistry['after_create_message'];\n const hook = await hookLoader();\n if (!hook) {\n return;\n }\n\n const threadState = ThreadStateImpl.fromFlowState(state);\n await hook(threadState, message);\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_create_message hook:', error);\n }\n }\n\n /**\n * Run the before_update_message hook if it exists\n * This hook allows developers to modify a message before it's updated\n *\n * Generic type preserves the exact shape of the updates object for type safety\n *\n * @param state - Flow state with execution context\n * @param messageId - ID of the message being updated\n * @param updates - Object with fields to update\n * @returns Processed updates (or original if hook doesn't exist/fails)\n */\n public static async runBeforeUpdateMessageHook<T extends Record<string, any>>(\n state: FlowState,\n messageId: string,\n updates: T\n ): Promise<T> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['before_update_message']) {\n return updates;\n }\n\n const hookLoader = hooksRegistry['before_update_message'];\n const hook = await hookLoader();\n if (!hook) {\n return updates;\n }\n\n const threadState = ThreadStateImpl.fromFlowState(state);\n const processedUpdates = await hook(threadState, messageId, updates);\n return processedUpdates as T;\n } catch (error) {\n console.error('[Hooks] ✗ Error running before_update_message hook:', error);\n return updates;\n }\n }\n\n /**\n * Run the after_update_message hook if it exists\n * This hook runs after a message is updated in the database\n *\n * @param state - Flow state with execution context\n * @param message - Full message object with updated fields\n */\n public static async runAfterUpdateMessageHook(\n state: FlowState,\n message: Message\n ): Promise<void> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['after_update_message']) {\n return;\n }\n\n const hookLoader = hooksRegistry['after_update_message'];\n const hook = await hookLoader();\n if (!hook) {\n return;\n }\n\n const threadState = ThreadStateImpl.fromFlowState(state);\n await hook(threadState, message);\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_update_message hook:', error);\n }\n }\n\n /**\n * Run the before_store_tool_result hook if it exists\n * This hook allows developers to modify tool results before they're stored\n *\n * @param state - Flow state with execution context\n * @param toolCall - The tool call object\n * @param toolResult - The tool result object to be stored\n * @returns Processed tool result (or original if hook doesn't exist/fails)\n */\n public static async runBeforeStoreToolResultHook(\n state: FlowState,\n toolCall: Record<string, any>,\n toolResult: Record<string, any>\n ): Promise<Record<string, any>> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['before_store_tool_result']) {\n return toolResult;\n }\n\n const hookLoader = hooksRegistry['before_store_tool_result'];\n const hook = await hookLoader();\n if (!hook) {\n return toolResult;\n }\n\n const threadState = ThreadStateImpl.fromFlowState(state);\n const processedResult = await hook(threadState, toolCall, toolResult);\n return processedResult;\n } catch (error) {\n console.error('[Hooks] ✗ Error running before_store_tool_result hook:', error);\n return toolResult;\n }\n }\n\n /**\n * Run after_tool_call_success hook\n *\n * @param state - Flow state with execution context\n * @param toolCall - The tool call object\n * @param toolResult - The successful tool result\n * @returns Modified tool result, or null to skip storing this tool call\n */\n public static async runAfterToolCallSuccessHook(\n state: FlowState,\n toolCall: ToolCall,\n toolResult: ToolResult\n ): Promise<ToolResult | null> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['after_tool_call_success']) {\n return toolResult;\n }\n\n const hookLoader = hooksRegistry['after_tool_call_success'];\n const hook = await hookLoader();\n if (!hook) {\n return toolResult;\n }\n\n const threadState = ThreadStateImpl.fromFlowState(state);\n const processedResult = await hook(threadState, toolCall, toolResult);\n return processedResult;\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_tool_call_success hook:', error);\n return toolResult;\n }\n }\n\n /**\n * Run after_tool_call_failure hook\n *\n * @param state - Flow state with execution context\n * @param toolCall - The tool call object\n * @param toolResult - The failed tool result\n * @returns Modified tool result, or null to skip storing this tool call\n */\n public static async runAfterToolCallFailureHook(\n state: FlowState,\n toolCall: ToolCall,\n toolResult: ToolResult\n ): Promise<ToolResult | null> {\n try {\n const hooksRegistry = state.thread.instance.hooks();\n if (!hooksRegistry || !hooksRegistry['after_tool_call_failure']) {\n return toolResult;\n }\n\n const hookLoader = hooksRegistry['after_tool_call_failure'];\n const hook = await hookLoader();\n if (!hook) {\n return toolResult;\n }\n\n const threadState = ThreadStateImpl.fromFlowState(state);\n const processedResult = await hook(threadState, toolCall, toolResult);\n return processedResult;\n } catch (error) {\n console.error('[Hooks] ✗ Error running after_tool_call_failure hook:', error);\n return toolResult;\n }\n }\n\n /**\n * Create a pending message before LLM request\n * Returns the message ID for later updates\n */\n private static async createPendingMessage(state: FlowState): Promise<string> {\n const messageId = crypto.randomUUID();\n\n // Determine role based on current side\n const role = state.currentSide === \"a\" ? \"assistant\" : \"user\";\n\n let message: Message = {\n id: messageId,\n role,\n content: null, // No content yet\n tool_calls: null,\n log_id: null,\n created_at: 0, // Placeholder - will be set just before INSERT\n request_sent_at: 0, // Placeholder - will be set just before INSERT\n response_completed_at: null,\n status: \"pending\",\n };\n\n // Run before_create_message hook\n message = await this.runBeforeCreateMessageHook(state, message) as Message;\n\n // Add hierarchical tracking fields\n message.parent_id = state.parentMessageId || null;\n message.depth = state.depth;\n\n // Set timestamps just before INSERT to ensure accurate ordering\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n message.created_at = now;\n message.request_sent_at = now;\n\n // Insert pending message into database (now includes sub-prompts)\n await state.storage.sql.exec(\n `\n INSERT INTO messages (\n id, role, content, tool_calls, log_id, created_at,\n request_sent_at, response_completed_at, status, parent_id, depth, reasoning_content\n )\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)\n `,\n message.id,\n message.role,\n message.content,\n message.tool_calls,\n message.log_id,\n message.created_at,\n message.request_sent_at,\n message.response_completed_at,\n message.status,\n message.parent_id,\n message.depth,\n null // reasoning_content - will be set when message is updated with LLM response\n );\n\n // Run after_create_message hook\n await this.runAfterCreateMessageHook(state, message);\n\n // Add to message history\n state.messageHistory.push(message);\n\n // Broadcast pending message via WebSocket (already skipped for child prompts via emitMessage not being passed)\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n\n return messageId;\n }\n\n /**\n * Update pending message status (for failures)\n */\n private static async updateMessageStatus(\n messageId: string,\n status: \"completed\" | \"failed\",\n state: FlowState\n ): Promise<void> {\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n\n // Prepare updates object with explicit type\n let updates: {\n status: \"completed\" | \"failed\";\n response_completed_at: number;\n } = {\n status,\n response_completed_at: now,\n };\n\n // Run before_update_message hook (generic preserves type)\n updates = await this.runBeforeUpdateMessageHook(state, messageId, updates);\n\n // Update message in database (now includes sub-prompts)\n await state.storage.sql.exec(\n `\n UPDATE messages\n SET status = ?1, response_completed_at = ?2\n WHERE id = ?3\n `,\n updates.status,\n updates.response_completed_at,\n messageId\n );\n\n // Update in message history\n const message = state.messageHistory.find((m) => m.id === messageId);\n if (message) {\n message.status = updates.status;\n message.response_completed_at = updates.response_completed_at;\n\n // Run after_update_message hook with full message object\n await this.runAfterUpdateMessageHook(state, message);\n\n // Broadcast update via WebSocket\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n }\n }\n\n /**\n * Update pending message with LLM response\n */\n private static async updateMessage(\n messageId: string,\n response: LLMResponse,\n status: \"completed\" | \"failed\",\n state: FlowState\n ): Promise<void> {\n // Get the log_id from state (set by LLMRequest.execute)\n const logId = state.currentLogId || null;\n\n // Prepare message data\n let content = response.content;\n const toolCallsJson = response.tool_calls ? JSON.stringify(response.tool_calls) : null;\n const reasoningContent = response.reasoning_content || null;\n const reasoningDetailsJson = response.reasoning_details ? JSON.stringify(response.reasoning_details) : null;\n\n // Process images into attachments if present\n let attachmentRefs: AttachmentRef[] | undefined;\n let responseImagePathMap: Map<string, string> | undefined;\n if (response.images && response.images.length > 0) {\n const result = await this.processResponseImages(response.images, state);\n attachmentRefs = result.refs;\n responseImagePathMap = result.imagePathMap;\n }\n const attachmentsJson = attachmentRefs && attachmentRefs.length > 0 ? JSON.stringify(attachmentRefs) : null;\n\n // Run post-process hook if available (trims whitespace, applies custom logic)\n let messageForHook: Message = {\n id: messageId,\n role: state.currentSide === \"a\" ? \"assistant\" : \"user\",\n content,\n tool_calls: toolCallsJson,\n log_id: logId,\n created_at: 0, // Will be preserved from original\n request_sent_at: 0, // Will be preserved from original\n response_completed_at: 0, // Placeholder - will be set just before UPDATE\n status,\n reasoning_content: reasoningContent,\n attachments: attachmentsJson,\n };\n\n // Run before_create_message hook (again, now with actual content)\n // This allows hooks to modify the content before it's stored\n messageForHook = await this.runBeforeCreateMessageHook(state, messageForHook) as Message;\n content = messageForHook.content;\n\n // Prepare updates object with explicit type\n let updates: {\n content: string | null;\n tool_calls: string | null;\n log_id: string | null;\n response_completed_at: number;\n status: \"completed\" | \"failed\";\n reasoning_content: string | null;\n reasoning_details: string | null;\n attachments: string | null;\n } = {\n content,\n tool_calls: toolCallsJson,\n log_id: logId,\n response_completed_at: 0, // Placeholder - will be set just before UPDATE\n status,\n reasoning_content: reasoningContent,\n reasoning_details: reasoningDetailsJson,\n attachments: attachmentsJson,\n };\n\n // Run before_update_message hook (generic preserves type)\n updates = await this.runBeforeUpdateMessageHook(state, messageId, updates);\n\n // Set timestamp just before UPDATE to ensure accurate ordering\n const now = Date.now() * TIMESTAMP_MULTIPLIER;\n updates.response_completed_at = now;\n\n // Update message in database (now includes sub-prompts)\n await state.storage.sql.exec(\n `\n UPDATE messages\n SET content = ?1, tool_calls = ?2, log_id = ?3,\n response_completed_at = ?4, status = ?5, reasoning_content = ?6,\n reasoning_details = ?7, attachments = ?8\n WHERE id = ?9\n `,\n updates.content,\n updates.tool_calls,\n updates.log_id,\n updates.response_completed_at,\n updates.status,\n updates.reasoning_content,\n updates.reasoning_details,\n updates.attachments,\n messageId\n );\n\n // Store tool calls in detail table\n if (response.tool_calls) {\n for (const toolCall of response.tool_calls) {\n await state.storage.sql.exec(\n `\n INSERT INTO tool_calls (\n id, message_id, type, function_name, function_arguments, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6)\n `,\n toolCall.id,\n messageId,\n toolCall.type || \"function\",\n toolCall.function.name,\n toolCall.function.arguments,\n now\n );\n }\n }\n\n // Update in message history\n const message = state.messageHistory.find((m) => m.id === messageId);\n if (message) {\n message.content = content;\n message.tool_calls = toolCallsJson;\n message.log_id = logId;\n message.response_completed_at = now;\n message.status = status;\n message.reasoning_content = reasoningContent;\n message.attachments = attachmentsJson;\n\n // Run after_update_message hook with full message object\n await this.runAfterUpdateMessageHook(state, message);\n\n // Broadcast update via WebSocket\n if (state.emitMessage) {\n state.emitMessage(message);\n }\n }\n\n // After image processing, update log to replace base64 with file paths\n if (responseImagePathMap && responseImagePathMap.size > 0 && logId) {\n await LLMRequest.updateResponseBodyInLog(\n state,\n logId,\n response,\n responseImagePathMap\n );\n }\n\n // Note: Content was already streamed during provider execution (OpenAIProvider.chat, etc.)\n // No need to send it again here - that causes duplicate stream writes and \"stream is closed\" warnings\n }\n\n /**\n * Process images from LLM response into stored attachments\n * Similar to ToolExecutor.processToolAttachments but for LLM-generated images\n * Returns both attachment refs and a map of original URLs to file paths (for log transformation)\n */\n private static async processResponseImages(\n images: LLMResponseImage[],\n state: FlowState\n ): Promise<{ refs: AttachmentRef[], imagePathMap: Map<string, string> }> {\n const refs: AttachmentRef[] = [];\n const imagePathMap = new Map<string, string>();\n\n for (const image of images) {\n const originalUrl = image.image_url.url;\n\n // Parse data URL: data:image/png;base64,xxxxx\n const match = originalUrl.match(/^data:([^;]+);base64,(.+)$/);\n if (!match) {\n console.error('[FlowEngine] Invalid image data URL format, skipping');\n continue;\n }\n\n const mimeType = match[1];\n const base64Data = match[2];\n const ext = mimeType.split('/')[1] || 'png';\n\n const attachmentId = crypto.randomUUID();\n const path = `/attachments/${Date.now()}-${attachmentId}.${ext}`;\n\n try {\n // Write file to thread filesystem (handles chunking automatically for large files)\n // Pass base64 data directly - RPC method expects base64 encoded string\n await state.thread.instance.writeFile(path, base64Data, mimeType);\n\n // Track mapping: original data URL → stored path (for log transformation)\n imagePathMap.set(originalUrl, path);\n\n refs.push({\n id: attachmentId,\n type: \"file\",\n path,\n name: `generated-${attachmentId}.${ext}`,\n mimeType,\n });\n } catch (error) {\n console.error('[FlowEngine] Failed to process image:', error);\n }\n }\n\n return { refs, imagePathMap };\n }\n\n /**\n * Extract stop-tool response parameter and use as message content\n * This handles the special case where a stop-tool includes a response parameter\n * that should be treated as the message content\n */\n private static extractStopToolResponse(\n state: FlowState,\n response: { content: string | null; tool_calls?: any[] }\n ): void {\n if (!response.tool_calls || response.tool_calls.length === 0) {\n return;\n }\n\n // Check if any tool call is a stop-tool with response parameter\n const stopTool =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool\n : state.agentConfig.side_b_stop_tool;\n\n const stopToolResponseProperty =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool_response_property\n : state.agentConfig.side_b_stop_tool_response_property;\n\n // Only process if both stop-tool and response property are configured\n if (!stopTool || !stopToolResponseProperty) {\n return;\n }\n\n // Find the stop-tool call\n const stopToolCall = response.tool_calls.find(\n (call) => call.function.name === stopTool\n );\n\n if (!stopToolCall) {\n return;\n }\n\n // Extract the response parameter value\n try {\n const args = JSON.parse(stopToolCall.function.arguments);\n const extractedResponse = args[stopToolResponseProperty];\n\n if (extractedResponse && typeof extractedResponse === \"string\") {\n // Replace the response content with the extracted value\n response.content = extractedResponse;\n\n // Broadcast as chunks for real-time UI update\n if (state.emitMessageChunk && state.pendingMessageId) {\n // Broadcast the extracted response as a single chunk\n // (it's already complete at this point, not streaming from provider)\n state.emitMessageChunk(state.pendingMessageId, extractedResponse);\n }\n\n // Store for potential later use\n // Store final response for stop tool extraction\n (state as any).finalResponse = extractedResponse; // Note: finalResponse not in FlowState type yet\n }\n } catch (error) {\n console.error(\n `Failed to extract response property '${stopToolResponseProperty}' from stop-tool '${stopTool}':`,\n error\n );\n }\n }\n\n /**\n * Check if stop condition is met\n */\n private static checkStopCondition(\n state: FlowState,\n response: { content: string | null; tool_calls?: any[] }\n ): void {\n // Check end session tool first (ends entire session)\n const endSessionTool =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_end_session_tool\n : state.agentConfig.side_b_end_session_tool;\n\n if (\n endSessionTool &&\n response.tool_calls?.some((call) => call.function.name === endSessionTool)\n ) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `End session tool called: ${endSessionTool}`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n return;\n }\n\n // Check stop conditions (OR logic - stop on either condition)\n const stopOnResponse =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_on_response\n : state.agentConfig.side_b_stop_on_response;\n\n const stopTool =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool\n : state.agentConfig.side_b_stop_tool;\n\n const stopToolResponseProperty =\n state.currentSide === \"a\"\n ? state.agentConfig.side_a_stop_tool_response_property\n : state.agentConfig.side_b_stop_tool_response_property;\n\n // Stop on response condition\n if (stopOnResponse && response.content && !response.tool_calls) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: \"Returns content (no tool calls)\",\n side: state.currentSide,\n timestamp: Date.now(),\n });\n }\n\n // Stop on specific tool call\n if (\n stopTool &&\n response.tool_calls?.some((call) => call.function.name === stopTool)\n ) {\n state.stopped = true;\n state.stoppedBy = state.currentSide;\n\n // Note: Response parameter extraction is handled earlier in extractStopToolResponse()\n // which is called before updateMessage to ensure the content is set correctly\n\n state.emitTelemetry?.({\n type: \"stopped\",\n reason: `Stop tool called: ${stopTool}`,\n side: state.currentSide,\n timestamp: Date.now(),\n });\n }\n }\n\n /**\n * Switch to the other side (for dual_ai agents)\n */\n static switchSides(state: FlowState): void {\n state.currentSide = state.currentSide === \"a\" ? \"b\" : \"a\";\n\n // Update current prompt reference to match new side\n // For ai_human agents, keep using sideA prompt even when switching to side B (human)\n if (state.currentSide === \"b\" && state.prompts.sideB) {\n state.prompt = state.prompts.sideB;\n } else {\n state.prompt = state.prompts.sideA;\n }\n }\n\n /**\n * Filter out orphaned tool calls and tool results\n * Removes:\n * 1. Assistant messages with tool_calls that have no matching tool result messages\n * 2. Tool result messages that have no matching tool_call in assistant messages\n *\n * This prevents API errors from OpenAI when tool_calls and results don't match\n */\n private static filterOrphanedToolCalls(messages: Message[]): Message[] {\n // First pass: collect all valid tool_call_ids from tool result messages\n const toolResultIds = new Set<string>();\n for (const msg of messages) {\n if (msg.role === \"tool\" && msg.tool_call_id) {\n toolResultIds.add(msg.tool_call_id);\n }\n }\n\n // Second pass: collect all tool_call_ids from assistant messages with tool_calls\n const assistantToolCallIds = new Set<string>();\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.tool_calls) {\n try {\n const toolCalls = JSON.parse(msg.tool_calls);\n for (const call of toolCalls) {\n if (call.id) {\n assistantToolCallIds.add(call.id);\n }\n }\n } catch (error) {\n console.error(`Failed to parse tool_calls for message ${msg.id}:`, error);\n }\n }\n }\n\n // Third pass: filter messages\n const filtered: Message[] = [];\n for (const msg of messages) {\n // Filter tool result messages - only keep if their tool_call_id has a matching assistant message\n if (msg.role === \"tool\" && msg.tool_call_id) {\n if (!assistantToolCallIds.has(msg.tool_call_id)) {\n console.warn(`[FlowEngine] Filtering orphaned tool result message ${msg.id} - no matching tool_call_id ${msg.tool_call_id}`);\n continue; // Skip this message\n }\n }\n\n // Filter assistant messages with tool_calls - remove tool_calls that have no matching results\n if (msg.role === \"assistant\" && msg.tool_calls) {\n try {\n const toolCalls = JSON.parse(msg.tool_calls);\n const matchedToolCalls = toolCalls.filter((call: any) =>\n toolResultIds.has(call.id)\n );\n\n // If no tool calls have results, check if message has content\n if (matchedToolCalls.length === 0 && toolCalls.length > 0) {\n if (msg.content) {\n // Has content - keep message but remove tool_calls field\n console.warn(`[FlowEngine] Filtering tool_calls from message ${msg.id} - no matching tool results`);\n filtered.push({\n ...msg,\n tool_calls: null\n });\n continue;\n } else {\n // No content and no valid tool calls - skip entire message\n console.warn(`[FlowEngine] Filtering assistant message ${msg.id} - no content and no tool calls with results`);\n continue;\n }\n }\n\n // Some tool calls have results - update with filtered list if needed\n if (matchedToolCalls.length !== toolCalls.length) {\n console.warn(`[FlowEngine] Filtering ${toolCalls.length - matchedToolCalls.length} orphaned tool_calls from message ${msg.id}`);\n filtered.push({\n ...msg,\n tool_calls: JSON.stringify(matchedToolCalls)\n });\n continue;\n }\n } catch (error) {\n console.error(`Failed to parse tool_calls for message ${msg.id}:`, error);\n }\n }\n\n // Keep all other messages as-is\n filtered.push(msg);\n }\n\n const removedCount = messages.length - filtered.length;\n if (removedCount > 0) {\n console.warn(`[FlowEngine] Filtered ${removedCount} orphaned tool call/result messages`);\n }\n\n return filtered;\n }\n\n /**\n * Load message history from DurableObject storage\n * Public to allow FlowStateSdk to reload history when needed\n *\n * @param storage - DurableObject storage instance\n * @param thread - Thread instance and metadata\n * @param stateInput - Partial state containing extraMessages and other context\n * @param includeParentHistory - Whether to load messages from DB (default: true). If false, only extraMessages are returned\n */\n public static async loadMessageHistory(\n state: FlowState,\n ): Promise<Message[]> {\n const storage = state.storage;\n const thread = state.thread;\n const includeParentHistory = state.prompt.include_chat ?? true;\n const includeToolCalls = state.prompt.include_past_tools ?? true;\n\n try {\n let rows: any[] = [];\n\n // Only load parent message history from DB if includeParentHistory is true\n if (includeParentHistory) {\n // IMPORTANT: DurableObject SQL returns an iterator/cursor, NOT a result with .rows!\n // Options: 1) Use for...of loop, OR 2) Call .toArray() for array methods\n // DO NOT try to access cursor.rows - it doesn't exist!\n // CRITICAL: Only load top-level messages (parent_id IS NULL) for LLM context\n // Sub-prompt messages are stored for observability but never sent to parent's LLM\n\n // Select columns conditionally based on includeToolCalls\n const columns = [\n \"id\", \"role\", \"content\", \"name\", \"attachments\",\n ...(includeToolCalls ? [\"tool_calls\", \"tool_call_id\", \"tool_status\"] : []),\n \"log_id\", \"created_at\", \"request_sent_at\", \"response_completed_at\",\n \"status\", \"silent\", \"parent_id\", \"depth\",\n \"reasoning_content\", \"reasoning_details\"\n ];\n\n const query = `\n SELECT\n ${columns.join(\", \")}\n FROM messages\n WHERE parent_id IS NULL\n ORDER BY created_at ASC\n `;\n\n const cursor = await storage.sql.exec<Message & Record<string, any>>(query);\n\n rows = cursor.toArray(); // Convert iterator to array for .map()\n }\n\n // Always append extraMessages if provided, regardless of includeParentHistory setting\n if (state.extraMessages && state.extraMessages.length > 0) {\n rows.push(...state.extraMessages);\n rows.sort((a, b) => a.created_at - b.created_at);\n }\n\n // Rows are objects with column names as properties, NOT arrays!\n const messages = rows.map((row: any) => ({\n id: row.id as string,\n role: row.role as Message[\"role\"],\n content: row.content as string | null,\n name: row.name as string | null,\n attachments: row.attachments as string | null,\n tool_calls: row.tool_calls as string | null,\n tool_call_id: row.tool_call_id as string | null,\n log_id: row.log_id as string | null,\n created_at: row.created_at as number,\n request_sent_at: row.request_sent_at as number | null,\n response_completed_at: row.response_completed_at as number | null,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | undefined,\n silent: row.silent === 1,\n tool_status: row.tool_status as \"success\" | \"error\" | null,\n parent_id: row.parent_id as string | null,\n depth: row.depth as number,\n reasoning_content: row.reasoning_content as string | null,\n reasoning_details: row.reasoning_details as string | null,\n }));\n\n // Filter out orphaned tool calls and tool results BEFORE running hooks\n // This prevents API errors from mismatched tool_call/result pairs\n return this.runFilterMessagesHook(thread.instance, state, this.filterOrphanedToolCalls(messages));\n } catch (error) {\n console.error(\"Error loading message history:\", error);\n return [];\n }\n }\n\n /**\n * Run the filter_messages hook if it exists\n * This hook allows developers to modify SQL row data before transformation\n *\n * @param thread - Thread instance with hooks registry\n * @param stateInput - Partial state for hook context\n * @param rows - SQL rows from messages table\n * @returns Processed rows (or original if hook doesn't exist/fails)\n */\n private static async runFilterMessagesHook(\n thread: ThreadInstance,\n state: FlowState,\n rows: any[]\n ): Promise<any[]> {\n try {\n // Get hooks from thread instance\n const hooksRegistry = thread.hooks();\n\n // Check if the hook exists\n if (!hooksRegistry || !hooksRegistry['filter_messages']) {\n return rows; // No hook - return original rows\n }\n\n // Load the hook\n const hookLoader = hooksRegistry['filter_messages'];\n const hook = await hookLoader();\n\n if (!hook) {\n return rows; // Hook failed to load - return original rows\n }\n\n // Run the hook with ThreadState\n const threadState = ThreadStateImpl.fromFlowState(state);\n const processedRows = await hook(threadState, rows);\n return processedRows;\n } catch (error) {\n // If the hook throws an error, log it but return the original rows\n console.error('[Hooks] ✗ Error running filter_messages hook:', error);\n return rows;\n }\n }\n\n /**\n * Log an error to the logs table (best-effort)\n * Creates a log entry with error details but no associated message_id\n */\n private static async logError(\n state: FlowState,\n error: Error | unknown,\n errorType: string,\n context?: string\n ): Promise<void> {\n try {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n await state.storage.sql.exec(\n `\n INSERT INTO logs (\n id, message_id, provider, model,\n error, error_type, created_at\n ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)\n `,\n crypto.randomUUID(),\n \"00000000-0000-0000-0000-000000000000\", // Placeholder for errors without message\n \"system\",\n context || \"unknown\",\n `${errorMessage}${errorStack ? `\\n\\nStack trace:\\n${errorStack}` : \"\"}`,\n errorType,\n Date.now() * TIMESTAMP_MULTIPLIER\n );\n } catch (logError) {\n // If logging fails, fall back to console only\n console.error(\"Failed to log error to database:\", logError);\n }\n }\n\n /**\n * Check if a MIME type is an image\n */\n private static isImageMimeType(mimeType: string): boolean {\n return mimeType.startsWith(\"image/\");\n }\n\n /**\n * Resolve attachments from a message and build multimodal content\n * Returns the message content (string or multimodal array)\n *\n * @param msg - Message with potential attachments\n * @param state - Flow state with storage access\n * @returns MessageContent - either string or multimodal array\n */\n private static async resolveAttachmentsToContent(\n msg: Message,\n state: FlowState,\n imagePathMap?: Map<string, string>\n ): Promise<MessageContent> {\n const textContent = msg.content || \"\";\n\n // Parse attachments from JSON\n if (!msg.attachments) {\n return textContent;\n }\n\n let attachments: AttachmentRef[];\n try {\n attachments = JSON.parse(msg.attachments);\n } catch (e) {\n console.error(`Failed to parse attachments for message ${msg.id}:`, e);\n return textContent;\n }\n\n if (!attachments || attachments.length === 0) {\n return textContent;\n }\n\n // Filter to only image attachments\n const imageAttachments = attachments.filter((a) =>\n this.isImageMimeType(a.mimeType)\n );\n\n if (imageAttachments.length === 0) {\n // No images, just return text with non-image file mentions\n const nonImageFiles = attachments.filter(\n (a) => !this.isImageMimeType(a.mimeType)\n );\n if (nonImageFiles.length > 0) {\n const fileList = nonImageFiles.map((a) => a.name).join(\", \");\n return `${textContent}\\n\\n[Attached files: ${fileList}]`;\n }\n return textContent;\n }\n\n // Load image data from storage\n const multimodalParts: MultimodalContent = [];\n\n // Add text content first (if any)\n if (textContent) {\n multimodalParts.push({\n type: \"text\",\n text: textContent,\n });\n }\n\n // Add image attachments\n for (const attachment of imageAttachments) {\n try {\n // Load image data from thread's file storage\n const result = await (state.thread.instance as any).readFile(\n attachment.path\n );\n\n if (result.success && result.data) {\n // Create data URL from base64\n const dataUrl = `data:${attachment.mimeType};base64,${result.data}`;\n // Track mapping for log transformation (data URL -> attachment path)\n if (imagePathMap) {\n imagePathMap.set(dataUrl, attachment.path);\n }\n multimodalParts.push({\n type: \"image_url\",\n image_url: {\n url: dataUrl,\n detail: \"auto\",\n },\n });\n } else {\n // If image couldn't be loaded, mention it in text\n console.warn(\n `Failed to load image attachment ${attachment.path}:`,\n result.error\n );\n multimodalParts.push({\n type: \"text\",\n text: `[Image not available: ${attachment.name}]`,\n });\n }\n } catch (error) {\n console.error(`Error loading image attachment ${attachment.path}:`, error);\n multimodalParts.push({\n type: \"text\",\n text: `[Error loading image: ${attachment.name}]`,\n });\n }\n }\n\n // Add non-image file mentions\n const nonImageFiles = attachments.filter(\n (a) => !this.isImageMimeType(a.mimeType)\n );\n if (nonImageFiles.length > 0) {\n const fileList = nonImageFiles.map((a) => a.name).join(\", \");\n multimodalParts.push({\n type: \"text\",\n text: `\\n\\n[Attached files: ${fileList}]`,\n });\n }\n\n return multimodalParts;\n }\n\n}\n","import type { FlowState, Message, ToolCall, FileRecord, FileStats, GrepResult } from \"./types\";\nimport { TIMESTAMP_MULTIPLIER } from \"./types\";\n\n/**\n * Options for injecting a message\n */\nexport interface InjectMessageOptions {\n /** The message content */\n content: string;\n /** The message role */\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n /** Optional message ID. If not provided, a UUID will be generated */\n id?: string;\n /** Optional message to insert before. If not provided, message is appended to the end */\n beforeMessageId?: string;\n /** Optional tool call ID (for role=\"tool\" only) */\n toolCallId?: string;\n /** Optional name field */\n name?: string;\n /** Whether this message is silent (hidden from LLM, visible in UI only). Default: false */\n silent?: boolean;\n /** Force message to be top-level (depth 0) even when called from sub-prompts. Default: false */\n forceTopLevel?: boolean;\n /** Force a specific side to play the next turn after injecting the message */\n forceTurn?: \"side_a\" | \"side_b\";\n}\n\n/**\n * Queue a new tool call to be executed in the current flow\n *\n * This adds a tool call to the execution queue without immediately executing it.\n * The tool will be executed as part of the normal flow processing.\n *\n * @param flow - The current FlowState\n * @param toolName - The name of the tool to call\n * @param args - The arguments to pass to the tool\n *\n * @example\n * ```typescript\n * import { queueTool } from '@standardagents/builder';\n *\n * queueTool(flow, \"search_user\", { email: \"user@example.com\" });\n * ```\n */\nexport function queueTool(\n flow: FlowState,\n toolName: string,\n args: Record<string, unknown> = {}\n): void {\n const toolCall: ToolCall = {\n id: crypto.randomUUID(),\n type: \"function\",\n function: {\n name: toolName,\n arguments: JSON.stringify(args),\n },\n forceAllow: true\n };\n\n flow.sequence.queue.push(toolCall);\n}\n\n/**\n * Inject a message into the thread without triggering execution\n *\n * This allows you to add messages to the conversation history programmatically.\n * The message is persisted to storage but does not cause the agent to execute.\n *\n * By default, messages are appended to the end of the conversation.\n * You can optionally insert a message before another message by providing beforeMessageId.\n *\n * @param flow - The current FlowState\n * @param options - Message options\n *\n * @example\n * ```typescript\n * import { injectMessage } from '@standardagents/builder';\n *\n * // Append a system message\n * await injectMessage(flow, {\n * role: \"system\",\n * content: \"Context has been updated\"\n * });\n *\n * // Insert a user message before a specific message\n * await injectMessage(flow, {\n * role: \"user\",\n * content: \"Additional context\",\n * beforeMessageId: \"msg-123\"\n * });\n *\n * // Inject a message and force a specific side to play next\n * await injectMessage(flow, {\n * role: \"system\",\n * content: \"New instructions for the AI\",\n * forceTurn: \"side_a\" // Force side_a to respond to this message\n * });\n * ```\n */\nexport async function injectMessage(\n flow: FlowState,\n options: InjectMessageOptions\n): Promise<Message> {\n const messageId = options.id ?? crypto.randomUUID();\n const timestamp = Date.now() * TIMESTAMP_MULTIPLIER;\n const silent = options.silent ?? false;\n\n // Build the message object with hierarchical tracking\n // If forceTopLevel is true, inject at depth 0 regardless of current flow depth\n const forceTopLevel = options.forceTopLevel ?? false;\n const message: Message = {\n id: messageId,\n role: options.role,\n content: options.content,\n name: options.name ?? null,\n tool_call_id: options.toolCallId ?? null,\n created_at: timestamp,\n status: \"completed\",\n silent,\n parent_id: forceTopLevel ? null : (flow.parentMessageId ?? null),\n depth: forceTopLevel ? 0 : flow.depth,\n };\n\n if (options.beforeMessageId) {\n // Insert before a specific message\n // First, get the target message's timestamp\n const cursor = await flow.storage.sql.exec(\n `SELECT created_at FROM messages WHERE id = ?`,\n options.beforeMessageId\n );\n const rows = cursor.toArray();\n const targetMessage = rows[0];\n\n if (!targetMessage) {\n throw new Error(\n `Message with id ${options.beforeMessageId} not found`\n );\n }\n\n // Use a timestamp slightly before the target message\n message.created_at = (targetMessage.created_at as number) - 1;\n }\n\n // Insert the message with hierarchical tracking columns\n await flow.storage.sql.exec(\n `INSERT INTO messages (id, role, content, name, tool_call_id, created_at, status, silent, parent_id, depth) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n messageId,\n message.role,\n message.content,\n message.name,\n message.tool_call_id,\n message.created_at,\n message.status,\n silent ? 1 : 0,\n message.parent_id,\n message.depth\n );\n\n // Add the message to messageHistory if it's not silent (silent messages are filtered from LLM context)\n // If it is silent, we need to reload messageHistory to ensure proper filtering\n if (!silent) {\n flow.messageHistory.push(message);\n } else {\n // Reload messageHistory to ensure silent messages are properly excluded from LLM context\n flow.messageHistory = await reloadHistory(flow);\n }\n\n // Broadcast the message if emitMessage callback is available\n if (flow.emitMessage) {\n flow.emitMessage(message);\n }\n\n // Force a turn if requested\n if (options.forceTurn) {\n forceTurn(flow, options.forceTurn);\n }\n\n return message;\n}\n\n/**\n * Get messages from the thread history\n *\n * Retrieves message history from the thread's SQLite storage.\n * Messages are ordered by creation time (oldest first by default).\n *\n * @param flow - The current FlowState\n * @param limit - Maximum number of messages to retrieve (default: 100)\n * @param offset - Number of messages to skip (default: 0)\n * @param order - Sort order: \"asc\" (oldest first) or \"desc\" (newest first) (default: \"asc\")\n * @returns Array of messages\n *\n * @example\n * ```typescript\n * import { getMessages } from '@standardagents/builder';\n *\n * // Get last 10 messages\n * const messages = await getMessages(flow, 10);\n *\n * // Get 10 messages, skipping the first 20\n * const messages = await getMessages(flow, 10, 20);\n *\n * // Get newest 10 messages\n * const messages = await getMessages(flow, 10, 0, \"desc\");\n * ```\n */\nexport async function getMessages(\n flow: FlowState,\n limit: number = 100,\n offset: number = 0,\n order: \"asc\" | \"desc\" = \"asc\"\n): Promise<Message[]> {\n const orderClause = order === \"desc\" ? \"DESC\" : \"ASC\";\n\n const cursor = await flow.storage.sql.exec(\n `SELECT\n id,\n role,\n content,\n name,\n tool_calls,\n tool_call_id,\n log_id,\n created_at,\n request_sent_at,\n response_completed_at,\n status,\n silent,\n parent_id,\n depth\n FROM messages\n ORDER BY created_at ${orderClause}\n LIMIT ? OFFSET ?`,\n limit,\n offset\n );\n\n const messages: Message[] = [];\n for (const row of cursor) {\n messages.push({\n id: row.id as string,\n role: row.role as \"system\" | \"user\" | \"assistant\" | \"tool\",\n content: row.content as string | null,\n name: row.name as string | null,\n tool_calls: row.tool_calls as string | null,\n tool_call_id: row.tool_call_id as string | null,\n log_id: row.log_id as string | null,\n created_at: row.created_at as number,\n request_sent_at: row.request_sent_at as number | null,\n response_completed_at: row.response_completed_at as number | null,\n status: row.status as \"pending\" | \"completed\" | \"failed\" | undefined,\n silent: row.silent === 1,\n parent_id: row.parent_id as string | null,\n depth: row.depth as number,\n });\n }\n\n return messages;\n}\n\n/**\n * Reload message history from storage\n *\n * Re-loads the complete message history from the thread's SQLite storage,\n * applying any filter_messages hooks. This is useful when you need to refresh\n * the message history after making changes (e.g., injecting silent messages).\n *\n * @param flow - The current FlowState\n * @returns Array of messages (reloaded from storage)\n *\n * @example\n * ```typescript\n * import { injectMessage, reloadHistory } from '@standardagents/builder';\n *\n * // Reload history after injecting a silent message\n * await injectMessage(flow, { role: \"system\", content: \"...\", silent: true });\n * flow.messageHistory = await reloadHistory(flow);\n * ```\n */\nexport async function reloadHistory(state: FlowState): Promise<Message[]> {\n // Dynamic import to avoid circular dependency\n const { FlowEngine } = await import(\"./FlowEngine.js\");\n state.messageHistory = await FlowEngine.loadMessageHistory(state);\n return state.messageHistory;\n}\n\n/**\n * Emit a custom event to WebSocket clients via the stream\n *\n * Sends a custom event to all connected WebSocket clients on the stream channel.\n * This allows backend code to push arbitrary data to the frontend\n * outside of the standard message events.\n *\n * @param flow - The current FlowState\n * @param type - The event type name (e.g., \"progress\", \"notification\")\n * @param data - The event payload (any serializable data)\n *\n * @example\n * ```typescript\n * import { emitThreadEvent } from '@standardagents/builder';\n *\n * // Emit a progress update\n * emitThreadEvent(flow, \"progress\", { step: 3, total: 10, message: \"Processing data...\" });\n *\n * // Emit a custom notification\n * emitThreadEvent(flow, \"notification\", { level: \"info\", message: \"User authenticated\" });\n *\n * // Emit metadata\n * emitThreadEvent(flow, \"metadata\", { userId: \"123\", sessionId: \"abc\" });\n * ```\n */\nexport function emitThreadEvent(\n flow: FlowState,\n type: string,\n data: unknown\n): void {\n if (!flow.emitEvent) {\n console.warn(\"Cannot emit event: emitEvent callback is not available\");\n return;\n }\n\n // Send event via the callback to DurableThread\n flow.emitEvent(type, data);\n}\n\n/**\n * Force a specific side to play the next turn\n *\n * This queues the specified side to play next without interrupting the current turn.\n * The forced turn only takes effect at the END of the current turn execution.\n *\n * If the tool queue is currently being processed (sequence.isHandling is true),\n * the forced turn is deferred until all queued tools complete. This allows patterns like:\n *\n * ```typescript\n * import { queueTool, forceTurn } from '@standardagents/builder';\n *\n * queueTool(flow, 'myTool', {});\n * forceTurn(flow, 'side_a');\n * // myTool executes first, THEN the turn switches to side_a\n * ```\n *\n * @param flow - The current FlowState\n * @param side - Which side should play next ('side_a' or 'side_b')\n *\n * @example\n * ```typescript\n * import { forceTurn } from '@standardagents/builder';\n *\n * // Force current side to continue (override stop condition)\n * // If side_a is playing and would stop, this forces it to play at least 1 more turn\n * forceTurn(flow, 'side_a');\n *\n * // Force switch to other side\n * // If side_a is playing, this forces side_b to play next turn\n * forceTurn(flow, 'side_b');\n *\n * // Force human turn in ai_human agent (execution stops and waits for user input)\n * if (flow.agentConfig.type === 'ai_human') {\n * forceTurn(flow, 'side_b'); // Stops execution, awaits user input\n * }\n * ```\n */\nexport function forceTurn(flow: FlowState, side: 'side_a' | 'side_b'): void {\n // If the tool queue is currently being processed, defer the force turn\n // until all queued tools complete. This allows queueTool + forceTurn to work together.\n if (flow.sequence.isHandling) {\n flow.pendingForceTurn = side;\n } else {\n flow.forcedNextSide = side;\n }\n}\n\n/**\n * Thread context from defineThreadEndpoint\n */\ninterface ThreadContext {\n instance: {\n updateThreadMeta: (\n threadId: string,\n params: { agent_name?: string; user_id?: string | null; tags?: string[] | null }\n ) => Promise<{\n success: boolean;\n error?: string;\n thread?: {\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n };\n }>;\n };\n metadata: {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n created_at: number;\n };\n}\n\n/**\n * Update a thread's metadata in the DurableAgentBuilder registry\n *\n * This allows updating the agent_name, user_id, and tags for an existing thread.\n * Uses the thread instance from defineThreadEndpoint context.\n *\n * @param thread - The thread context from defineThreadEndpoint ({ instance, metadata })\n * @param params - The fields to update (agent_name, user_id, tags)\n * @returns The updated thread info, or null if update failed\n *\n * @example\n * ```typescript\n * import { defineThreadEndpoint, updateThread } from '@standardagents/builder';\n *\n * export default defineThreadEndpoint(async (req, thread) => {\n * // Update thread's user_id\n * await updateThread(thread, { user_id: 'user-123' });\n *\n * // Update thread's tags\n * await updateThread(thread, { tags: ['support', 'urgent'] });\n *\n * // Update multiple fields\n * const result = await updateThread(thread, {\n * agent_name: 'new-agent',\n * user_id: 'user-456',\n * tags: ['sales']\n * });\n *\n * return Response.json(result);\n * });\n * ```\n */\nexport async function updateThread(\n thread: ThreadContext,\n params: {\n agent_name?: string;\n user_id?: string | null;\n tags?: string[] | null;\n }\n): Promise<{\n id: string;\n agent_id: string;\n user_id: string | null;\n tags: string[];\n created_at: number;\n} | null> {\n const result = await thread.instance.updateThreadMeta(thread.metadata.id, params);\n if (!result.success || !result.thread) {\n return null;\n }\n return result.thread;\n}\n\n// ============================================================\n// File System Utilities\n// ============================================================\n\n/**\n * Write a file to thread storage\n *\n * @param flow - The current FlowState\n * @param path - File path (e.g., \"/images/photo.jpg\")\n * @param data - File data as ArrayBuffer or string\n * @param mimeType - MIME type of the file\n * @param options - Optional metadata and thumbnail\n * @returns The created file record\n *\n * @example\n * ```typescript\n * import { writeFile } from '@standardagents/builder';\n *\n * // Write binary file\n * const imageData = new Uint8Array([...]);\n * await writeFile(flow, \"/images/photo.jpg\", imageData.buffer, \"image/jpeg\");\n *\n * // Write text file\n * await writeFile(flow, \"/docs/readme.md\", \"# Hello\", \"text/markdown\");\n * ```\n */\nexport async function writeFile(\n flow: FlowState,\n path: string,\n data: ArrayBuffer | string,\n mimeType: string,\n options?: {\n metadata?: Record<string, unknown>;\n thumbnail?: ArrayBuffer;\n }\n): Promise<FileRecord> {\n const instance = flow.thread.instance as any;\n\n // Convert data to base64\n let base64Data: string;\n if (typeof data === \"string\") {\n base64Data = btoa(data);\n } else {\n const bytes = new Uint8Array(data);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n base64Data = btoa(binary);\n }\n\n // Convert thumbnail to base64 if present\n let base64Thumbnail: string | undefined;\n if (options?.thumbnail) {\n const bytes = new Uint8Array(options.thumbnail);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n base64Thumbnail = btoa(binary);\n }\n\n const result = await instance.writeFile(path, base64Data, mimeType, {\n metadata: options?.metadata,\n thumbnail: base64Thumbnail,\n });\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to write file\");\n }\n\n return result.file;\n}\n\n/**\n * Write an image file with optional thumbnail\n *\n * @param flow - The current FlowState\n * @param path - File path\n * @param data - Image data as ArrayBuffer\n * @param mimeType - Image MIME type\n * @param options - Image metadata (width, height) and optional thumbnail\n * @returns The created file record\n *\n * @example\n * ```typescript\n * import { writeImage } from '@standardagents/builder';\n *\n * await writeImage(flow, \"/images/photo.jpg\", imageBuffer, \"image/jpeg\", {\n * metadata: { width: 1024, height: 768 },\n * thumbnail: thumbnailBuffer\n * });\n * ```\n */\nexport async function writeImage(\n flow: FlowState,\n path: string,\n data: ArrayBuffer,\n mimeType: string,\n options?: {\n metadata?: { width: number; height: number; [key: string]: unknown };\n thumbnail?: ArrayBuffer;\n }\n): Promise<FileRecord> {\n return writeFile(flow, path, data, mimeType, options);\n}\n\n/**\n * Link to an external file (URL, S3, R2)\n *\n * Creates a file entry pointing to an external location without storing the data locally.\n *\n * @param flow - The current FlowState\n * @param path - File path in thread storage\n * @param location - External location (https://, s3://, r2://)\n * @param options - Optional MIME type, size, and metadata\n * @returns The created file record\n *\n * @example\n * ```typescript\n * import { linkFile } from '@standardagents/builder';\n *\n * // Link to a URL\n * await linkFile(flow, \"/images/hero.jpg\", \"https://cdn.example.com/hero.jpg\");\n *\n * // Link to S3\n * await linkFile(flow, \"/data/large.csv\", \"s3://mybucket/data/large.csv\", {\n * mimeType: \"text/csv\",\n * size: 10 * 1024 * 1024 * 1024 // 10GB\n * });\n * ```\n */\nexport async function linkFile(\n flow: FlowState,\n path: string,\n location: string,\n options?: {\n mimeType?: string;\n size?: number;\n metadata?: Record<string, unknown>;\n }\n): Promise<FileRecord> {\n const instance = flow.thread.instance as any;\n const result = await instance.linkFile(path, location, options);\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to link file\");\n }\n\n return result.file;\n}\n\n/**\n * Read a file from thread storage\n *\n * @param flow - The current FlowState\n * @param path - File path\n * @returns File data as ArrayBuffer, or null if not found/external\n *\n * @example\n * ```typescript\n * import { readFile } from '@standardagents/builder';\n *\n * const data = await readFile(flow, \"/images/photo.jpg\");\n * if (data) {\n * // Process binary data\n * }\n * ```\n */\nexport async function readFile(\n flow: FlowState,\n path: string\n): Promise<ArrayBuffer | null> {\n const instance = flow.thread.instance as any;\n const result = await instance.readFile(path);\n\n if (!result.success) {\n return null;\n }\n\n // Convert base64 to ArrayBuffer\n const binary = atob(result.data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n/**\n * Get file metadata\n *\n * @param flow - The current FlowState\n * @param path - File path\n * @returns File record or null if not found\n *\n * @example\n * ```typescript\n * import { stat } from '@standardagents/builder';\n *\n * const file = await stat(flow, \"/images/photo.jpg\");\n * if (file) {\n * console.log(`Size: ${file.size}, Type: ${file.mimeType}`);\n * }\n * ```\n */\nexport async function stat(\n flow: FlowState,\n path: string\n): Promise<FileRecord | null> {\n const instance = flow.thread.instance as any;\n const result = await instance.statFile(path);\n\n if (!result.success) {\n return null;\n }\n\n return result.file;\n}\n\n/**\n * Check if file or directory exists\n *\n * @param flow - The current FlowState\n * @param path - File path\n * @returns true if exists, false otherwise\n *\n * @example\n * ```typescript\n * import { exists } from '@standardagents/builder';\n *\n * if (await exists(flow, \"/config.json\")) {\n * // File exists\n * }\n * ```\n */\nexport async function exists(flow: FlowState, path: string): Promise<boolean> {\n const instance = flow.thread.instance as any;\n const result = await instance.fileExists(path);\n return result.success && result.exists;\n}\n\n/**\n * Delete a file\n *\n * @param flow - The current FlowState\n * @param path - File path\n *\n * @example\n * ```typescript\n * import { unlink } from '@standardagents/builder';\n *\n * await unlink(flow, \"/temp/draft.txt\");\n * ```\n */\nexport async function unlink(flow: FlowState, path: string): Promise<void> {\n const instance = flow.thread.instance as any;\n const result = await instance.unlinkFile(path);\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to delete file\");\n }\n}\n\n/**\n * Create a directory\n *\n * @param flow - The current FlowState\n * @param path - Directory path\n * @returns The created directory record\n *\n * @example\n * ```typescript\n * import { mkdir } from '@standardagents/builder';\n *\n * await mkdir(flow, \"/uploads/2024\");\n * ```\n */\nexport async function mkdir(flow: FlowState, path: string): Promise<FileRecord> {\n const instance = flow.thread.instance as any;\n const result = await instance.mkdirFile(path);\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to create directory\");\n }\n\n return result.directory;\n}\n\n/**\n * List directory contents\n *\n * @param flow - The current FlowState\n * @param path - Directory path\n * @returns Array of file records in the directory\n *\n * @example\n * ```typescript\n * import { readdir } from '@standardagents/builder';\n *\n * const files = await readdir(flow, \"/images\");\n * for (const file of files) {\n * console.log(file.name, file.size);\n * }\n * ```\n */\nexport async function readdir(\n flow: FlowState,\n path: string\n): Promise<FileRecord[]> {\n const instance = flow.thread.instance as any;\n const result = await instance.readdirFile(path);\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to read directory\");\n }\n\n return result.files;\n}\n\n/**\n * Remove an empty directory\n *\n * @param flow - The current FlowState\n * @param path - Directory path\n *\n * @example\n * ```typescript\n * import { rmdir } from '@standardagents/builder';\n *\n * await rmdir(flow, \"/temp\");\n * ```\n */\nexport async function rmdir(flow: FlowState, path: string): Promise<void> {\n const instance = flow.thread.instance as any;\n const result = await instance.rmdirFile(path);\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to remove directory\");\n }\n}\n\n/**\n * Get file storage statistics\n *\n * @param flow - The current FlowState\n * @returns Storage statistics (total size and file count)\n *\n * @example\n * ```typescript\n * import { getFileStats } from '@standardagents/builder';\n *\n * const stats = await getFileStats(flow);\n * console.log(`Total: ${stats.totalSize} bytes, Files: ${stats.fileCount}`);\n * ```\n */\nexport async function getFileStats(flow: FlowState): Promise<FileStats> {\n const instance = flow.thread.instance as any;\n const result = await instance.getFileStats();\n\n if (!result.success) {\n throw new Error(result.error || \"Failed to get file stats\");\n }\n\n return result.stats;\n}\n\n/**\n * Get thumbnail for an image file\n *\n * @param flow - The current FlowState\n * @param path - Image file path\n * @returns Thumbnail data as ArrayBuffer, or null if not found\n *\n * @example\n * ```typescript\n * import { getThumbnail } from '@standardagents/builder';\n *\n * const thumb = await getThumbnail(flow, \"/images/photo.jpg\");\n * ```\n */\nexport async function getThumbnail(\n flow: FlowState,\n path: string\n): Promise<ArrayBuffer | null> {\n const instance = flow.thread.instance as any;\n const result = await instance.getFileThumbnail(path);\n\n if (!result.success) {\n return null;\n }\n\n // Convert base64 to ArrayBuffer\n const binary = atob(result.data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n/**\n * Read a text file as string\n *\n * @param flow - The current FlowState\n * @param path - File path\n * @returns File content as string, or null if not found\n *\n * @example\n * ```typescript\n * import { cat } from '@standardagents/builder';\n *\n * const content = await cat(flow, \"/docs/readme.md\");\n * ```\n */\nexport async function cat(flow: FlowState, path: string): Promise<string | null> {\n const instance = flow.thread.instance as any;\n const result = await instance.readTextFile(path);\n\n if (!result.success) {\n return null;\n }\n\n return result.content;\n}\n\n/**\n * Read first N lines of a text file\n *\n * @param flow - The current FlowState\n * @param path - File path\n * @param lines - Number of lines to read (default: 10)\n * @returns First N lines as string, or null if not found\n *\n * @example\n * ```typescript\n * import { head } from '@standardagents/builder';\n *\n * const firstLines = await head(flow, \"/logs/app.log\", 20);\n * ```\n */\nexport async function head(\n flow: FlowState,\n path: string,\n lines: number = 10\n): Promise<string | null> {\n const content = await cat(flow, path);\n if (content === null) return null;\n\n const allLines = content.split(\"\\n\");\n return allLines.slice(0, lines).join(\"\\n\");\n}\n\n/**\n * Read last N lines of a text file\n *\n * @param flow - The current FlowState\n * @param path - File path\n * @param lines - Number of lines to read (default: 10)\n * @returns Last N lines as string, or null if not found\n *\n * @example\n * ```typescript\n * import { tail } from '@standardagents/builder';\n *\n * const lastLines = await tail(flow, \"/logs/app.log\", 50);\n * ```\n */\nexport async function tail(\n flow: FlowState,\n path: string,\n lines: number = 10\n): Promise<string | null> {\n const content = await cat(flow, path);\n if (content === null) return null;\n\n const allLines = content.split(\"\\n\");\n return allLines.slice(-lines).join(\"\\n\");\n}\n\n/**\n * Search text file contents using FTS5 full-text search\n *\n * @param flow - The current FlowState\n * @param pattern - Search pattern (FTS5 syntax)\n * @param options - Search options\n * @returns Array of matching results with snippets\n *\n * @example\n * ```typescript\n * import { grep } from '@standardagents/builder';\n *\n * // Search all files\n * const results = await grep(flow, \"error\");\n *\n * // Search in specific directory\n * const results = await grep(flow, \"TODO\", { path: \"/src\" });\n * ```\n */\nexport async function grep(\n flow: FlowState,\n pattern: string,\n options?: {\n path?: string;\n limit?: number;\n }\n): Promise<GrepResult[]> {\n const instance = flow.thread.instance as any;\n const result = await instance.grepFiles(pattern, options);\n\n if (!result.success) {\n throw new Error(result.error || \"Search failed\");\n }\n\n // Map to GrepResult format\n return result.results.map((r: any) => ({\n path: r.path,\n name: r.name,\n matches: [r.snippet],\n }));\n}\n\n/**\n * Find files by path pattern\n *\n * @param flow - The current FlowState\n * @param pattern - Glob-like pattern (e.g., \"*.md\", \"/docs/subdir/*.txt\")\n * @param options - Find options\n * @returns Array of matching file records\n *\n * @example\n * ```typescript\n * import { find } from '@standardagents/builder';\n *\n * // Find all markdown files\n * const mdFiles = await find(flow, \"*.md\");\n *\n * // Find all files in docs\n * const docFiles = await find(flow, \"/docs/*\", { type: \"file\" });\n * ```\n */\nexport async function find(\n flow: FlowState,\n pattern: string,\n options?: {\n type?: \"file\" | \"directory\" | \"all\";\n limit?: number;\n }\n): Promise<FileRecord[]> {\n const instance = flow.thread.instance as any;\n const result = await instance.findFiles(pattern, options);\n\n if (!result.success) {\n throw new Error(result.error || \"Find failed\");\n }\n\n return result.files;\n}\n","/**\n * ThreadState implementation for the builder runtime.\n *\n * This class wraps the internal FlowState and ThreadInstance to provide\n * the public ThreadState interface defined in @standardagents/spec.\n *\n * @module\n */\n\nimport type {\n ThreadState,\n ExecutionState,\n GetMessagesOptions,\n MessagesResult,\n Message,\n InjectMessageInput,\n MessageUpdates,\n FileRecord,\n WriteFileOptions,\n ReaddirResult,\n FileStats,\n GrepResult,\n FindResult,\n ReadFileStreamOptions,\n FileChunk,\n ScheduledEffect,\n} from '@standardagents/spec';\n\n// Local types for internal logging (not part of spec)\ninterface GetLogsOptions {\n limit?: number;\n offset?: number;\n order?: 'asc' | 'desc';\n}\n\ninterface Log {\n id: string;\n type: string;\n data: Record<string, unknown>;\n created_at: number;\n parent_id?: string | null;\n}\nimport type { ToolResult } from '@standardagents/spec';\nimport type { FlowState, ThreadInstance, ThreadMetadata, Message as BuilderMessage, Agent } from './types.js';\nimport { injectMessage as injectMessageUtil, queueTool as queueToolUtil } from './utilities.js';\n\n/**\n * Implementation of ThreadState for the builder runtime.\n *\n * This class provides the bridge between the internal FlowState (used by\n * FlowEngine) and the public ThreadState interface (exposed to tools,\n * hooks, and endpoints).\n */\nexport class ThreadStateImpl implements ThreadState {\n private _flowState: FlowState | null;\n private _threadInstance: ThreadInstance;\n private _metadata: ThreadMetadata;\n private _executionState: ExecutionStateImpl | null = null;\n\n constructor(\n flowState: FlowState | null,\n threadInstance: ThreadInstance,\n metadata: ThreadMetadata\n ) {\n this._flowState = flowState;\n this._threadInstance = threadInstance;\n this._metadata = metadata;\n\n // Create execution state wrapper if we have a flow state\n if (flowState) {\n this._executionState = new ExecutionStateImpl(flowState);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Identity (readonly)\n // ─────────────────────────────────────────────────────────────────────────\n\n get threadId(): string {\n return this._metadata.id;\n }\n\n get agentId(): string {\n return this._metadata.agent_id;\n }\n\n get userId(): string | null {\n return this._metadata.user_id;\n }\n\n get createdAt(): number {\n return this._metadata.created_at;\n }\n\n /**\n * Get the agent configuration from the underlying FlowState.\n * This is for backward compatibility with hooks that access state.agentConfig.\n * Returns null if no flow state is available.\n */\n get agentConfig(): Agent | null {\n return this._flowState?.agentConfig ?? null;\n }\n\n /**\n * Runtime-specific context that cannot be packed or shared.\n * Contains Cloudflare env bindings for internal tool use.\n */\n get _notPackableRuntimeContext(): Record<string, unknown> | undefined {\n if (!this._flowState?.env) {\n return undefined;\n }\n return {\n env: this._flowState.env,\n };\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Messages\n // ─────────────────────────────────────────────────────────────────────────\n\n async getMessages(options?: GetMessagesOptions): Promise<MessagesResult> {\n const result = await this._threadInstance.getMessages(\n options?.limit,\n options?.offset,\n options?.order,\n options?.includeSilent,\n options?.maxDepth\n );\n\n // Map builder messages to spec messages\n return {\n messages: result.messages.map(this._mapMessage),\n total: result.total,\n hasMore: result.hasMore,\n };\n }\n\n async getMessage(messageId: string): Promise<Message | null> {\n // Get messages and find the one with matching ID\n // This could be optimized with a direct query in the future\n const { messages } = await this._threadInstance.getMessages(\n undefined,\n undefined,\n 'desc',\n true,\n undefined\n );\n const msg = messages.find((m) => m.id === messageId);\n return msg ? this._mapMessage(msg) : null;\n }\n\n async injectMessage(input: InjectMessageInput): Promise<Message> {\n if (!this._flowState) {\n throw new Error('Cannot inject messages without an execution context');\n }\n\n // Use the utility function from utilities.ts\n const message = await injectMessageUtil(this._flowState, {\n role: input.role,\n content: input.content,\n silent: input.silent,\n });\n\n return this._mapMessage(message);\n }\n\n async updateMessage(messageId: string, updates: MessageUpdates): Promise<Message> {\n // This requires direct storage access - for now, throw\n // TODO: Implement via thread instance method\n throw new Error('updateMessage not yet implemented');\n }\n\n async deleteMessage(messageId: string): Promise<boolean> {\n const result = await this._threadInstance.deleteMessage(messageId);\n return result.success;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Logs\n // ─────────────────────────────────────────────────────────────────────────\n\n async getLogs(options?: GetLogsOptions): Promise<Log[]> {\n const logs = await this._threadInstance.getLogs(\n options?.limit,\n options?.offset,\n options?.order\n );\n\n // Map to spec Log type\n return logs.map((log: any) => ({\n id: log.id,\n type: log.type,\n data: typeof log.data === 'string' ? JSON.parse(log.data) : log.data,\n created_at: log.created_at,\n parent_id: log.parent_id,\n }));\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Resource Loading\n // ─────────────────────────────────────────────────────────────────────────\n\n async loadModel<T = unknown>(name: string): Promise<T> {\n return this._threadInstance.loadModel(name) as Promise<T>;\n }\n\n async loadPrompt<T = unknown>(name: string): Promise<T> {\n return this._threadInstance.loadPrompt(name) as Promise<T>;\n }\n\n async loadAgent<T = unknown>(name: string): Promise<T> {\n return this._threadInstance.loadAgent(name) as Promise<T>;\n }\n\n getPromptNames(): string[] {\n return this._threadInstance.getPromptNames();\n }\n\n getAgentNames(): string[] {\n return this._threadInstance.getAgentNames();\n }\n\n getModelNames(): string[] {\n // TODO: Add getModelNames to ThreadInstance\n return [];\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Tool Invocation\n // ─────────────────────────────────────────────────────────────────────────\n\n queueTool(toolName: string, args: Record<string, unknown>): void {\n if (!this._flowState) {\n // TODO: Start execution if not running\n throw new Error('Cannot queue tools without an execution context');\n }\n\n queueToolUtil(this._flowState, toolName, args);\n }\n\n async invokeTool(toolName: string, args: Record<string, unknown>): Promise<ToolResult> {\n // TODO: Implement direct tool invocation\n throw new Error('invokeTool not yet implemented');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Events / Streaming\n // ─────────────────────────────────────────────────────────────────────────\n\n emit(event: string, data: unknown): void {\n if (this._flowState?.emitEvent) {\n this._flowState.emitEvent(event, data);\n }\n // No-op if no flow state or emitter\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Context Storage\n // ─────────────────────────────────────────────────────────────────────────\n\n get context(): Record<string, unknown> {\n if (this._flowState) {\n return this._flowState.context;\n }\n // Return empty object for non-executing contexts\n // TODO: Could persist this per-thread\n return {};\n }\n\n set context(value: Record<string, unknown>) {\n if (this._flowState) {\n this._flowState.context = value;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // File System\n // ─────────────────────────────────────────────────────────────────────────\n\n async writeFile(\n path: string,\n data: ArrayBuffer | string,\n mimeType: string,\n options?: WriteFileOptions\n ): Promise<FileRecord> {\n const result = await this._threadInstance.writeFile(path, data, mimeType, options as Record<string, unknown>);\n return this._mapFileRecord(result);\n }\n\n async readFile(path: string): Promise<ArrayBuffer | null> {\n return this._threadInstance.readFile(path);\n }\n\n async readFileStream(\n path: string,\n options?: ReadFileStreamOptions\n ): Promise<AsyncIterable<FileChunk> | null> {\n // Get file info to determine if chunked\n const fileInfo = await this._threadInstance.statFile(path);\n\n if (!fileInfo) {\n return null;\n }\n\n // External files cannot be streamed via this method\n if (fileInfo.storage !== 'local') {\n return null;\n }\n\n const isChunked = fileInfo.isChunked ?? fileInfo.is_chunked ?? false;\n const chunkCount = fileInfo.chunkCount ?? fileInfo.chunk_count ?? 1;\n const totalChunks = isChunked ? chunkCount : 1;\n\n const threadInstance = this._threadInstance;\n const signal = options?.signal;\n\n // Return an async generator wrapped as AsyncIterable\n return {\n [Symbol.asyncIterator]: async function* (): AsyncGenerator<FileChunk> {\n // For non-chunked files, use regular readFile and yield as single chunk\n if (!isChunked) {\n const data = await threadInstance.readFile(path);\n if (data === null) {\n return; // File disappeared\n }\n yield {\n data: new Uint8Array(data),\n index: 0,\n totalChunks: 1,\n isLast: true,\n };\n return;\n }\n\n // For chunked files, iterate through chunks\n for (let i = 0; i < totalChunks; i++) {\n // Check abort signal before each chunk\n if (signal?.aborted) {\n return;\n }\n\n const result = await threadInstance.readFileChunk(path, i);\n\n if (!result.success || !result.data) {\n throw new Error(result.error || `Failed to read chunk ${i}`);\n }\n\n // Decode base64 to Uint8Array\n const binary = atob(result.data);\n const data = new Uint8Array(binary.length);\n for (let j = 0; j < binary.length; j++) {\n data[j] = binary.charCodeAt(j);\n }\n\n yield {\n data,\n index: i,\n totalChunks,\n isLast: i === totalChunks - 1,\n };\n }\n },\n };\n }\n\n async statFile(path: string): Promise<FileRecord | null> {\n const result = await this._threadInstance.statFile(path);\n return result ? this._mapFileRecord(result) : null;\n }\n\n async readdirFile(path: string): Promise<ReaddirResult> {\n const entries = await this._threadInstance.readdirFile(path);\n return {\n entries: entries.map((e: any) => this._mapFileRecord(e)),\n };\n }\n\n async unlinkFile(path: string): Promise<void> {\n await this._threadInstance.unlinkFile(path);\n }\n\n async mkdirFile(path: string): Promise<FileRecord> {\n const result = await this._threadInstance.mkdirFile(path);\n return this._mapFileRecord(result);\n }\n\n async rmdirFile(path: string): Promise<void> {\n await this._threadInstance.rmdirFile(path);\n }\n\n async getFileStats(): Promise<FileStats> {\n const stats = await this._threadInstance.getFileStats();\n return {\n fileCount: stats.fileCount ?? stats.file_count ?? 0,\n directoryCount: stats.directoryCount ?? stats.directory_count ?? 0,\n totalSize: stats.totalSize ?? stats.total_size ?? 0,\n };\n }\n\n async grepFiles(pattern: string): Promise<GrepResult[]> {\n const results = await this._threadInstance.grepFiles(pattern);\n return results.map((r: any) => ({\n path: r.path,\n matches: r.matches || [],\n }));\n }\n\n async findFiles(pattern: string): Promise<FindResult> {\n const results = await this._threadInstance.findFiles(pattern);\n return {\n paths: Array.isArray(results) ? results : results.paths || [],\n };\n }\n\n async getFileThumbnail(path: string): Promise<ArrayBuffer | null> {\n return this._threadInstance.getFileThumbnail(path);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Execution State\n // ─────────────────────────────────────────────────────────────────────────\n\n get execution(): ExecutionState | null {\n return this._executionState;\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Agent Execution\n // ─────────────────────────────────────────────────────────────────────────\n\n async runAgent(agentName: string): Promise<void> {\n await this._threadInstance.runAgent(this._metadata.id, agentName);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Effect Scheduling\n // ─────────────────────────────────────────────────────────────────────────\n\n async scheduleEffect(name: string, args: Record<string, unknown>, delay: number = 0): Promise<string> {\n return this._threadInstance.scheduleEffect(this._metadata.id, name, args, delay);\n }\n\n async getScheduledEffects(name?: string): Promise<ScheduledEffect[]> {\n return this._threadInstance.getScheduledEffects(name);\n }\n\n async removeScheduledEffect(id: string): Promise<boolean> {\n return this._threadInstance.removeScheduledEffect(id);\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // Internal Helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n private _mapMessage = (msg: BuilderMessage): Message => {\n return {\n id: msg.id,\n role: msg.role,\n content: msg.content,\n name: msg.name,\n tool_calls: msg.tool_calls,\n tool_call_id: msg.tool_call_id,\n created_at: msg.created_at,\n parent_id: msg.parent_id,\n depth: msg.depth,\n silent: msg.silent,\n metadata: undefined, // TODO: Extract from msg if available\n };\n };\n\n private _mapFileRecord = (record: any): FileRecord => {\n return {\n path: record.path,\n name: record.name,\n mimeType: record.mimeType ?? record.mime_type ?? 'application/octet-stream',\n storage: record.storage ?? 'local',\n size: record.size ?? 0,\n isDirectory: record.isDirectory ?? record.is_directory ?? false,\n metadata: record.metadata,\n width: record.width,\n height: record.height,\n createdAt: record.createdAt ?? record.created_at,\n updatedAt: record.updatedAt ?? record.updated_at,\n };\n };\n\n // ─────────────────────────────────────────────────────────────────────────\n // Static Factory\n // ─────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a ThreadState from a FlowState (during execution).\n */\n static fromFlowState(flowState: FlowState): ThreadState {\n return new ThreadStateImpl(\n flowState,\n flowState.thread.instance,\n flowState.thread.metadata\n );\n }\n\n /**\n * Create a ThreadState without execution context (for endpoints).\n */\n static fromThreadInstance(\n threadInstance: ThreadInstance,\n metadata: ThreadMetadata\n ): ThreadState {\n return new ThreadStateImpl(null, threadInstance, metadata);\n }\n}\n\n/**\n * Implementation of ExecutionState.\n */\nclass ExecutionStateImpl implements ExecutionState {\n private _flowState: FlowState;\n\n constructor(flowState: FlowState) {\n this._flowState = flowState;\n }\n\n get flowId(): string {\n return this._flowState.flowId;\n }\n\n get currentSide(): 'a' | 'b' {\n return this._flowState.currentSide;\n }\n\n get stepCount(): number {\n return this._flowState.stepCount;\n }\n\n get sideAStepCount(): number {\n return this._flowState.sideAStepCount;\n }\n\n get sideBStepCount(): number {\n return this._flowState.sideBStepCount;\n }\n\n get stopped(): boolean {\n return this._flowState.stopped;\n }\n\n get stoppedBy(): 'a' | 'b' | undefined {\n return this._flowState.stoppedBy;\n }\n\n get messageHistory(): Message[] {\n // Map builder messages to spec messages\n return this._flowState.messageHistory.map((msg) => ({\n id: msg.id,\n role: msg.role,\n content: msg.content,\n name: msg.name,\n tool_calls: msg.tool_calls,\n tool_call_id: msg.tool_call_id,\n created_at: msg.created_at,\n parent_id: msg.parent_id,\n depth: msg.depth,\n silent: msg.silent,\n metadata: undefined,\n }));\n }\n\n forceTurn(side: 'a' | 'b'): void {\n this._flowState.forcedNextSide = side === 'a' ? 'side_a' : 'side_b';\n }\n\n stop(): void {\n this._flowState.stopped = true;\n this._flowState.stoppedBy = this._flowState.currentSide;\n }\n\n get abortSignal(): AbortSignal {\n if (!this._flowState.abortController) {\n this._flowState.abortController = new AbortController();\n }\n return this._flowState.abortController.signal;\n }\n}\n","const NullProtoObj = /* @__PURE__ */ (() => {\n\tconst e = function() {};\n\treturn e.prototype = Object.create(null), Object.freeze(e.prototype), e;\n})();\n\n/**\n* Create a new router context.\n*/\nfunction createRouter() {\n\treturn {\n\t\troot: { key: \"\" },\n\t\tstatic: new NullProtoObj()\n\t};\n}\n\nfunction splitPath(path) {\n\tconst [_, ...s] = path.split(\"/\");\n\treturn s[s.length - 1] === \"\" ? s.slice(0, -1) : s;\n}\nfunction getMatchParams(segments, paramsMap) {\n\tconst params = new NullProtoObj();\n\tfor (const [index, name] of paramsMap) {\n\t\tconst segment = index < 0 ? segments.slice(-1 * index).join(\"/\") : segments[index];\n\t\tif (typeof name === \"string\") params[name] = segment;\n\t\telse {\n\t\t\tconst match = segment.match(name);\n\t\t\tif (match) for (const key in match.groups) params[key] = match.groups[key];\n\t\t}\n\t}\n\treturn params;\n}\n\n/**\n* Add a route to the router context.\n*/\nfunction addRoute(ctx, method = \"\", path, data) {\n\tmethod = method.toUpperCase();\n\tif (path.charCodeAt(0) !== 47) path = `/${path}`;\n\tconst segments = splitPath(path);\n\tlet node = ctx.root;\n\tlet _unnamedParamIndex = 0;\n\tconst paramsMap = [];\n\tconst paramsRegexp = [];\n\tfor (let i = 0; i < segments.length; i++) {\n\t\tconst segment = segments[i];\n\t\tif (segment.startsWith(\"**\")) {\n\t\t\tif (!node.wildcard) node.wildcard = { key: \"**\" };\n\t\t\tnode = node.wildcard;\n\t\t\tparamsMap.push([\n\t\t\t\t-i,\n\t\t\t\tsegment.split(\":\")[1] || \"_\",\n\t\t\t\tsegment.length === 2\n\t\t\t]);\n\t\t\tbreak;\n\t\t}\n\t\tif (segment === \"*\" || segment.includes(\":\")) {\n\t\t\tif (!node.param) node.param = { key: \"*\" };\n\t\t\tnode = node.param;\n\t\t\tif (segment === \"*\") paramsMap.push([\n\t\t\t\ti,\n\t\t\t\t`_${_unnamedParamIndex++}`,\n\t\t\t\ttrue\n\t\t\t]);\n\t\t\telse if (segment.includes(\":\", 1)) {\n\t\t\t\tconst regexp = getParamRegexp(segment);\n\t\t\t\tparamsRegexp[i] = regexp;\n\t\t\t\tnode.hasRegexParam = true;\n\t\t\t\tparamsMap.push([\n\t\t\t\t\ti,\n\t\t\t\t\tregexp,\n\t\t\t\t\tfalse\n\t\t\t\t]);\n\t\t\t} else paramsMap.push([\n\t\t\t\ti,\n\t\t\t\tsegment.slice(1),\n\t\t\t\tfalse\n\t\t\t]);\n\t\t\tcontinue;\n\t\t}\n\t\tconst child = node.static?.[segment];\n\t\tif (child) node = child;\n\t\telse {\n\t\t\tconst staticNode = { key: segment };\n\t\t\tif (!node.static) node.static = new NullProtoObj();\n\t\t\tnode.static[segment] = staticNode;\n\t\t\tnode = staticNode;\n\t\t}\n\t}\n\tconst hasParams = paramsMap.length > 0;\n\tif (!node.methods) node.methods = new NullProtoObj();\n\tnode.methods[method] ??= [];\n\tnode.methods[method].push({\n\t\tdata: data || null,\n\t\tparamsRegexp,\n\t\tparamsMap: hasParams ? paramsMap : void 0\n\t});\n\tif (!hasParams) ctx.static[path] = node;\n}\nfunction getParamRegexp(segment) {\n\tconst regex = segment.replace(/:(\\w+)/g, (_, id) => `(?<${id}>[^/]+)`).replace(/\\./g, \"\\\\.\");\n\treturn /* @__PURE__ */ new RegExp(`^${regex}$`);\n}\n\n/**\n* Find a route by path.\n*/\nfunction findRoute(ctx, method = \"\", path, opts) {\n\tif (path.charCodeAt(path.length - 1) === 47) path = path.slice(0, -1);\n\tconst staticNode = ctx.static[path];\n\tif (staticNode && staticNode.methods) {\n\t\tconst staticMatch = staticNode.methods[method] || staticNode.methods[\"\"];\n\t\tif (staticMatch !== void 0) return staticMatch[0];\n\t}\n\tconst segments = splitPath(path);\n\tconst match = _lookupTree(ctx, ctx.root, method, segments, 0)?.[0];\n\tif (match === void 0) return;\n\tif (opts?.params === false) return match;\n\treturn {\n\t\tdata: match.data,\n\t\tparams: match.paramsMap ? getMatchParams(segments, match.paramsMap) : void 0\n\t};\n}\nfunction _lookupTree(ctx, node, method, segments, index) {\n\tif (index === segments.length) {\n\t\tif (node.methods) {\n\t\t\tconst match = node.methods[method] || node.methods[\"\"];\n\t\t\tif (match) return match;\n\t\t}\n\t\tif (node.param && node.param.methods) {\n\t\t\tconst match = node.param.methods[method] || node.param.methods[\"\"];\n\t\t\tif (match) {\n\t\t\t\tconst pMap = match[0].paramsMap;\n\t\t\t\tif (pMap?.[pMap?.length - 1]?.[2]) return match;\n\t\t\t}\n\t\t}\n\t\tif (node.wildcard && node.wildcard.methods) {\n\t\t\tconst match = node.wildcard.methods[method] || node.wildcard.methods[\"\"];\n\t\t\tif (match) {\n\t\t\t\tconst pMap = match[0].paramsMap;\n\t\t\t\tif (pMap?.[pMap?.length - 1]?.[2]) return match;\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\tconst segment = segments[index];\n\tif (node.static) {\n\t\tconst staticChild = node.static[segment];\n\t\tif (staticChild) {\n\t\t\tconst match = _lookupTree(ctx, staticChild, method, segments, index + 1);\n\t\t\tif (match) return match;\n\t\t}\n\t}\n\tif (node.param) {\n\t\tconst match = _lookupTree(ctx, node.param, method, segments, index + 1);\n\t\tif (match) {\n\t\t\tif (node.param.hasRegexParam) {\n\t\t\t\tconst exactMatch = match.find((m) => m.paramsRegexp[index]?.test(segment)) || match.find((m) => !m.paramsRegexp[index]);\n\t\t\t\treturn exactMatch ? [exactMatch] : void 0;\n\t\t\t}\n\t\t\treturn match;\n\t\t}\n\t}\n\tif (node.wildcard && node.wildcard.methods) return node.wildcard.methods[method] || node.wildcard.methods[\"\"];\n}\n\n/**\n* Remove a route from the router context.\n*/\nfunction removeRoute(ctx, method, path) {\n\tconst segments = splitPath(path);\n\treturn _remove(ctx.root, method || \"\", segments, 0);\n}\nfunction _remove(node, method, segments, index) {\n\tif (index === segments.length) {\n\t\tif (node.methods && method in node.methods) {\n\t\t\tdelete node.methods[method];\n\t\t\tif (Object.keys(node.methods).length === 0) node.methods = void 0;\n\t\t}\n\t\treturn;\n\t}\n\tconst segment = segments[index];\n\tif (segment === \"*\") {\n\t\tif (node.param) {\n\t\t\t_remove(node.param, method, segments, index + 1);\n\t\t\tif (_isEmptyNode(node.param)) node.param = void 0;\n\t\t}\n\t\treturn;\n\t}\n\tif (segment.startsWith(\"**\")) {\n\t\tif (node.wildcard) {\n\t\t\t_remove(node.wildcard, method, segments, index + 1);\n\t\t\tif (_isEmptyNode(node.wildcard)) node.wildcard = void 0;\n\t\t}\n\t\treturn;\n\t}\n\tconst childNode = node.static?.[segment];\n\tif (childNode) {\n\t\t_remove(childNode, method, segments, index + 1);\n\t\tif (_isEmptyNode(childNode)) {\n\t\t\tdelete node.static[segment];\n\t\t\tif (Object.keys(node.static).length === 0) node.static = void 0;\n\t\t}\n\t}\n}\nfunction _isEmptyNode(node) {\n\treturn node.methods === void 0 && node.static === void 0 && node.param === void 0 && node.wildcard === void 0;\n}\n\n/**\n* Find all route patterns that match the given path.\n*/\nfunction findAllRoutes(ctx, method = \"\", path, opts) {\n\tif (path.charCodeAt(path.length - 1) === 47) path = path.slice(0, -1);\n\tconst segments = splitPath(path);\n\tconst matches = _findAll(ctx, ctx.root, method, segments, 0);\n\tif (opts?.params === false) return matches;\n\treturn matches.map((m) => {\n\t\treturn {\n\t\t\tdata: m.data,\n\t\t\tparams: m.paramsMap ? getMatchParams(segments, m.paramsMap) : void 0\n\t\t};\n\t});\n}\nfunction _findAll(ctx, node, method, segments, index, matches = []) {\n\tconst segment = segments[index];\n\tif (node.wildcard && node.wildcard.methods) {\n\t\tconst match = node.wildcard.methods[method] || node.wildcard.methods[\"\"];\n\t\tif (match) matches.push(...match);\n\t}\n\tif (node.param) {\n\t\t_findAll(ctx, node.param, method, segments, index + 1, matches);\n\t\tif (index === segments.length && node.param.methods) {\n\t\t\tconst match = node.param.methods[method] || node.param.methods[\"\"];\n\t\t\tif (match) {\n\t\t\t\tconst pMap = match[0].paramsMap;\n\t\t\t\tif (pMap?.[pMap?.length - 1]?.[2]) matches.push(...match);\n\t\t\t}\n\t\t}\n\t}\n\tconst staticChild = node.static?.[segment];\n\tif (staticChild) _findAll(ctx, staticChild, method, segments, index + 1, matches);\n\tif (index === segments.length && node.methods) {\n\t\tconst match = node.methods[method] || node.methods[\"\"];\n\t\tif (match) matches.push(...match);\n\t}\n\treturn matches;\n}\n\nfunction routeToRegExp(route = \"/\") {\n\tconst reSegments = [];\n\tlet idCtr = 0;\n\tfor (const segment of route.split(\"/\")) {\n\t\tif (!segment) continue;\n\t\tif (segment === \"*\") reSegments.push(`(?<_${idCtr++}>[^/]*)`);\n\t\telse if (segment.startsWith(\"**\")) reSegments.push(segment === \"**\" ? \"?(?<_>.*)\" : `?(?<${segment.slice(3)}>.+)`);\n\t\telse if (segment.includes(\":\")) reSegments.push(segment.replace(/:(\\w+)/g, (_, id) => `(?<${id}>[^/]+)`).replace(/\\./g, \"\\\\.\"));\n\t\telse reSegments.push(segment);\n\t}\n\treturn /* @__PURE__ */ new RegExp(`^/${reSegments.join(\"/\")}/?$`);\n}\n\nexport { NullProtoObj, addRoute, createRouter, findAllRoutes, findRoute, removeRoute, routeToRegExp };","/**\n * Router and endpoint definition module for AgentBuilder.\n *\n * This module re-exports endpoint types from @standardagents/spec and provides\n * the runtime router implementation for handling HTTP requests.\n *\n * @module\n */\n\nimport { createRouter, findRoute } from \"rou3\";\nimport type { ThreadInstance, ThreadMetadata } from \"../agents/types.js\";\nimport { ThreadStateImpl } from \"../agents/ThreadStateImpl.js\";\n\n// Re-export types from spec package (for external users)\nexport {\n type VirtualModuleLoader,\n type VirtualModuleRegistry,\n type ControllerReturn,\n type ThreadEndpointHandler,\n defineThreadEndpoint,\n} from '@standardagents/spec';\n\n// Import spec's defineController for external users who want the abstract version\nimport { defineController as specDefineController } from '@standardagents/spec';\nexport { specDefineController };\n\n// Import types for use in this module\nimport type {\n ControllerContext as SpecControllerContext,\n Controller as SpecController,\n} from '@standardagents/spec';\n\n// ============================================================================\n// Cloudflare-Specific Types (Builder Implementation)\n// ============================================================================\n\n/**\n * Durable Object namespace interface.\n * This is Cloudflare-specific and used by the builder runtime.\n */\nexport interface DurableObjectNamespace<T = unknown> {\n idFromName(name: string): DurableObjectId;\n idFromString(id: string): DurableObjectId;\n newUniqueId(): DurableObjectId;\n get(id: DurableObjectId): DurableObjectStub<T>;\n}\n\n/**\n * Durable Object ID interface.\n */\nexport interface DurableObjectId {\n toString(): string;\n equals(other: DurableObjectId): boolean;\n}\n\n/**\n * Durable Object stub interface.\n * The generic type T represents the RPC methods available on the stub.\n */\nexport type DurableObjectStub<T = unknown> = {\n id: DurableObjectId;\n name?: string;\n fetch(request: Request | string, requestInitr?: RequestInit): Promise<Response>;\n} & T;\n\n/**\n * Log entry from DurableThread.getLogs()\n */\nexport interface LogEntry {\n id: string;\n message_id: string;\n provider: string;\n model: string;\n model_name: string | null;\n prompt_name: string | null;\n tools_called: string | null;\n parent_log_id: string | null;\n retry_of_log_id: string | null;\n error: string | null;\n cost_total: number | null;\n is_complete: number;\n created_at: number;\n request_body: string | null;\n}\n\n/**\n * Agent definition returned from loadAgent()\n */\nexport interface AgentDefinition {\n name: string;\n title?: string;\n type?: string;\n description?: string;\n icon?: string;\n defaultPrompt?: string;\n defaultModel?: string;\n tools?: string[];\n [key: string]: unknown;\n}\n\n/**\n * Response from getThreadMeta()\n */\nexport interface ThreadMetaResponse {\n thread: ThreadRegistryEntry;\n agent: AgentDefinition | null;\n stats: {\n messageCount: number;\n logCount: number;\n lastActivity: number | null;\n };\n}\n\n/**\n * RPC methods exposed by DurableThread for external callers.\n */\nexport interface DurableThreadRpc {\n stop(): Promise<Response>;\n getMessages(\n limit?: number,\n offset?: number,\n order?: \"ASC\" | \"DESC\",\n includeSilent?: boolean,\n maxDepth?: number\n ): Promise<{ messages: unknown[]; total: number; hasMore: boolean }>;\n deleteMessage(messageId: string): Promise<{ success: boolean; error?: string }>;\n updateMessageContent(messageId: string, content: string): Promise<{ success: boolean; error?: string }>;\n getLogs(\n limit?: number,\n offset?: number,\n order?: \"ASC\" | \"DESC\"\n ): Promise<{ logs: LogEntry[]; total: number; hasMore: boolean }>;\n getLogDetails(logId: string): Promise<unknown>;\n getThreadMeta(threadId: string): Promise<ThreadMetaResponse | null>;\n deleteThread(): Promise<void>;\n}\n\n/**\n * Thread registry entry from DurableAgentBuilder.\n */\nexport interface ThreadRegistryEntry {\n id: string;\n agent_name: string;\n user_id: string | null;\n tags: string[] | null;\n created_at: number;\n}\n\n/**\n * RPC methods exposed by DurableAgentBuilder for external callers.\n */\nexport interface DurableAgentBuilderRpc {\n createThread(params: { agent_name: string; user_id?: string; tags?: string[] }): Promise<ThreadRegistryEntry>;\n getThread(threadId: string): Promise<ThreadRegistryEntry | null>;\n listThreads(params?: {\n agent_name?: string;\n user_id?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ threads: ThreadRegistryEntry[]; total: number }>;\n deleteThread(threadId: string): Promise<void>;\n getUserByUsername(username: string): Promise<unknown>;\n createSession(session: { user_id: string; token_hash: string; expires_at: number }): Promise<void>;\n loadAgent(name: string): Promise<AgentDefinition>;\n}\n\n/**\n * Minimum required environment bindings for thread endpoints.\n * User's Env interface should extend this.\n *\n * This is Cloudflare-specific and used by the builder runtime.\n */\nexport interface ThreadEnv {\n AGENT_BUILDER_THREAD: DurableObjectNamespace<DurableThreadRpc>;\n AGENT_BUILDER: DurableObjectNamespace<DurableAgentBuilderRpc>;\n [key: string]: unknown;\n}\n\n/**\n * Builder-specific controller context with typed env.\n *\n * This extends the spec's ControllerContext with proper typing for\n * Cloudflare environment bindings.\n */\nexport interface BuilderControllerContext<Env extends ThreadEnv = ThreadEnv>\n extends Omit<SpecControllerContext, 'env'> {\n env: Env;\n}\n\n/**\n * Builder-specific controller type with typed env.\n */\nexport type BuilderController<Env extends ThreadEnv = ThreadEnv> = (\n context: BuilderControllerContext<Env>\n) => ReturnType<SpecController>;\n\n/**\n * Thread endpoint context with access to thread instance and metadata.\n */\nexport interface ThreadEndpointContext {\n req: Request;\n thread: {\n instance: ThreadInstance;\n metadata: ThreadMetadata;\n };\n}\n\n// Export builder-specific types as the default types for internal use\n// (these are what internal API files use when they import from this module)\nexport type { BuilderControllerContext as ControllerContext };\nexport type { BuilderController as Controller };\n\n// ============================================================================\n// Builder Controller Helpers\n// ============================================================================\n\n/**\n * Define a controller with typed Cloudflare environment bindings.\n *\n * This is the builder's version of defineController that provides\n * proper typing for AGENT_BUILDER_THREAD and other CF bindings.\n *\n * @example\n * ```typescript\n * import { defineController } from '../router/index.js';\n *\n * export default defineController(async ({ req, env }) => {\n * const stub = env.AGENT_BUILDER.get(env.AGENT_BUILDER.idFromName('singleton'));\n * // ...\n * });\n * ```\n */\nexport function defineController<Env extends ThreadEnv = ThreadEnv>(\n controller: BuilderController<Env>\n): BuilderController<Env> {\n return controller;\n}\n\n// ============================================================================\n// Router Implementation\n// ============================================================================\n\nexport async function route<Env extends ThreadEnv = ThreadEnv>(\n url: URL,\n request: Request,\n env: Env\n): Promise<Response | null> {\n const router = createRouter<() => Promise<SpecController>>();\n // @ts-ignore-next-line\n const routesLoader = await import(\"virtual:@standardagents-routes\");\n routesLoader.default(router);\n\n // Check for API routes first\n const route = findRoute<() => Promise<SpecController>>(\n router,\n request.method.toUpperCase(),\n url.pathname\n );\n\n if (route) {\n const controller = await route.data();\n const context: BuilderControllerContext<Env> = {\n req: request,\n params: route.params || {},\n env: env,\n url: url,\n };\n const result = await controller(context as SpecControllerContext);\n\n if (result instanceof Response) {\n return result;\n }\n if (typeof result === \"string\") {\n return new Response(result, {\n headers: {\n \"Content-Type\": \"text/plain\",\n },\n });\n }\n return Response.json(result);\n }\n\n // No API route found - not handled by this router\n // Static assets and SPA routing are handled by Cloudflare Workers Assets binding\n // configured in wrangler.jsonc\n return null;\n}\n\n// ============================================================================\n// Thread Endpoint Runtime\n// ============================================================================\n\n/**\n * Runtime implementation for defineThreadEndpoint.\n *\n * This wraps the spec's defineThreadEndpoint to provide the actual\n * thread lookup and ThreadState creation at runtime.\n *\n * @param handler - Function that receives the request and ThreadState\n * @returns A Controller that can be used with the router\n *\n * @example\n * // agentbuilder/api/threads/[id]/status.get.ts\n * import { defineThreadEndpoint } from '@standardagents/spec';\n *\n * export default defineThreadEndpoint(async (req, state) => {\n * const { messages } = await state.getMessages({ limit: 1 });\n * return Response.json({ status: \"ok\", messageCount: messages.length });\n * });\n */\nexport function createThreadEndpointHandler<Env extends ThreadEnv = ThreadEnv>(\n handler: (\n req: Request,\n context: ThreadEndpointContext[\"thread\"]\n ) => Response | Promise<Response>\n): BuilderController<Env> {\n return (async ({ req, params, env }: BuilderControllerContext<Env>) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Get thread metadata from DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const metadata = await agentBuilder.getThread(threadId) as ThreadMetadata | null;\n\n if (!metadata) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Create ThreadInstance reference\n // Note: We can't access ctx and env directly, but we can call RPC methods\n const instance = stub as unknown as ThreadInstance;\n\n // Call handler with thread context\n return await handler(req, {\n instance,\n metadata,\n });\n } catch (error: any) {\n console.error(`Error in thread endpoint for ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Internal server error\" },\n { status: 500 }\n );\n }\n }) as BuilderController<Env>;\n}\n","import { defineController } from \"../router/index\";\n\nexport default defineController(() => {\n const stream = new ReadableStream({\n start(controller) {\n const text = \"hello world\";\n let index = 0;\n const next = () => {\n if (index < text.length) {\n controller.enqueue(new TextEncoder().encode(text[index]));\n index++;\n setTimeout(next, 100);\n } else {\n controller.close();\n }\n };\n next();\n },\n });\n return new Response(stream);\n});\n","import { defineController } from '../router/index.js';\nimport type { AgentDefinition } from '../sdk/defineAgent.js';\n\n/**\n * GET /api/agents\n *\n * List all defined agents from the agentbuilder/agents directory.\n * Returns agent configuration data loaded from TypeScript files.\n *\n * Returns:\n * - HTTP 200: { agents: Array<{ id, title, type, sideA, sideB, ... }> }\n */\nexport default defineController(async ({ agents, agentNames, prompts, promptNames }) => {\n if (!agents || !agentNames) {\n return Response.json({ agents: [] });\n }\n\n // Build a map of prompts for quick lookup\n const promptMap: Record<string, any> = {};\n if (prompts && promptNames) {\n await Promise.all(\n promptNames.map(async (name: string) => {\n try {\n const loader = prompts[name];\n if (loader) {\n promptMap[name] = await loader();\n }\n } catch (error) {\n // Skip failed prompts\n }\n })\n );\n }\n\n const agentList = await Promise.all(\n agentNames.map(async (name: string) => {\n try {\n const loader = agents[name];\n if (!loader) {\n return null;\n }\n const definition = await loader() as AgentDefinition;\n\n // Get prompt names for sides\n const sideAPrompt = promptMap[definition.sideA?.prompt];\n const sideBPrompt = definition.sideB\n ? promptMap[definition.sideB?.prompt]\n : null;\n\n return {\n id: definition.name,\n name: definition.name,\n title: definition.title,\n type: definition.type || 'ai_human',\n\n // Side A configuration\n side_a_label: definition.sideA?.label || null,\n side_a_agent_prompt: definition.sideA?.prompt,\n side_a_agent_prompt_name: sideAPrompt?.name || definition.sideA?.prompt,\n side_a_stop_on_response:\n definition.sideA?.stopOnResponse !== undefined\n ? definition.sideA.stopOnResponse\n : true,\n side_a_stop_tool: definition.sideA?.stopTool || null,\n side_a_stop_tool_response_property:\n definition.sideA?.stopToolResponseProperty || null,\n side_a_max_steps: definition.sideA?.maxSteps || null,\n side_a_end_session_tool:\n definition.sideA?.endSessionTool || null,\n side_a_manual_stop_condition:\n definition.sideA?.manualStopCondition || false,\n\n // Side B configuration (if dual_ai)\n side_b_label: definition.sideB?.label || null,\n side_b_agent_prompt: definition.sideB?.prompt || null,\n side_b_agent_prompt_name: sideBPrompt?.name || definition.sideB?.prompt || null,\n side_b_stop_on_response:\n definition.sideB?.stopOnResponse !== undefined\n ? definition.sideB.stopOnResponse\n : true,\n side_b_stop_tool: definition.sideB?.stopTool || null,\n side_b_stop_tool_response_property:\n definition.sideB?.stopToolResponseProperty || null,\n side_b_max_steps: definition.sideB?.maxSteps || null,\n side_b_end_session_tool:\n definition.sideB?.endSessionTool || null,\n side_b_manual_stop_condition:\n definition.sideB?.manualStopCondition || false,\n\n // Session configuration\n max_session_turns: definition.maxSessionTurns || null,\n\n // Tool exposure\n expose_as_tool: definition.exposeAsTool || false,\n tool_description: definition.toolDescription || null,\n\n created_at: Math.floor(Date.now() / 1000),\n };\n } catch (error) {\n console.error(`Error loading agent ${name}:`, error);\n return null;\n }\n })\n );\n\n // Filter out any null entries from failed loads\n const validAgents = agentList.filter(Boolean);\n\n return Response.json({ agents: validAgents });\n});\n","/**\n * Authentication utilities for user sessions, API keys, and password hashing\n */\n\n/**\n * Generate a cryptographically secure random string\n */\nexport function generateSecureToken(length: number = 32): string {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Generate a user session token with prefix\n */\nexport function generateUserToken(): string {\n return `agtuser_${generateSecureToken(32)}`;\n}\n\n/**\n * Generate an API key with prefix\n */\nexport function generateApiKey(): string {\n return `agtbldr_${generateSecureToken(32)}`;\n}\n\n/**\n * Hash a password using PBKDF2\n */\nexport async function hashPassword(password: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(password);\n\n // Generate a random salt\n const salt = crypto.getRandomValues(new Uint8Array(16));\n\n // Import the password as a key\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n data,\n { name: 'PBKDF2' },\n false,\n ['deriveBits']\n );\n\n // Derive bits using PBKDF2\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt: salt,\n iterations: 100000,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n );\n\n // Combine salt and hash\n const hashArray = new Uint8Array(derivedBits);\n const combined = new Uint8Array(salt.length + hashArray.length);\n combined.set(salt);\n combined.set(hashArray, salt.length);\n\n // Return as base64\n return bufferToBase64(combined);\n}\n\n/**\n * Verify a password against its hash\n */\nexport async function verifyPassword(password: string, hash: string): Promise<boolean> {\n try {\n const combined = base64ToBuffer(hash);\n\n // Extract salt and hash\n const salt = combined.slice(0, 16);\n const storedHash = combined.slice(16);\n\n const encoder = new TextEncoder();\n const data = encoder.encode(password);\n\n // Import the password as a key\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n data,\n { name: 'PBKDF2' },\n false,\n ['deriveBits']\n );\n\n // Derive bits using the same salt\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'PBKDF2',\n salt: salt,\n iterations: 100000,\n hash: 'SHA-256'\n },\n keyMaterial,\n 256\n );\n\n const derivedHash = new Uint8Array(derivedBits);\n\n // Compare hashes\n if (derivedHash.length !== storedHash.length) {\n return false;\n }\n\n let matches = true;\n for (let i = 0; i < derivedHash.length; i++) {\n if (derivedHash[i] !== storedHash[i]) {\n matches = false;\n }\n }\n\n return matches;\n } catch (error) {\n console.error('Error verifying password:', error);\n return false;\n }\n}\n\n/**\n * Hash a token or API key using SHA-256\n */\nexport async function hashToken(token: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(token);\n\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = new Uint8Array(hashBuffer);\n\n return Array.from(hashArray, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Extract the last N characters from a string\n */\nexport function getLastChars(str: string, count: number = 5): string {\n return str.slice(-count);\n}\n\n/**\n * Extract the prefix from a token (e.g., \"agtuser_\" or \"agtbldr_\")\n */\nexport function getTokenPrefix(token: string): string {\n const match = token.match(/^([^_]+_)/);\n return match ? match[1] : '';\n}\n\n/**\n * Validate token format\n */\nexport function isValidUserToken(token: string): boolean {\n return token.startsWith('agtuser_') && token.length > 10;\n}\n\n/**\n * Validate API key format\n */\nexport function isValidApiKey(key: string): boolean {\n return key.startsWith('agtbldr_') && key.length > 10;\n}\n\n/**\n * Generate a UUID v4\n */\nexport function generateId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Sign a token payload using HMAC-SHA256 with the encryption key\n * Returns a signed token in the format: base64(payload).base64(signature)\n */\nexport async function signToken(payload: string, encryptionKey: string): Promise<string> {\n const encoder = new TextEncoder();\n\n // Import the encryption key for HMAC\n const keyData = encoder.encode(encryptionKey);\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n // Sign the payload\n const payloadData = encoder.encode(payload);\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, payloadData);\n\n // Convert to base64\n const payloadB64 = bufferToBase64(new Uint8Array(payloadData));\n const signatureB64 = bufferToBase64(new Uint8Array(signature));\n\n return `${payloadB64}.${signatureB64}`;\n}\n\n/**\n * Verify a signed token and extract its payload\n * Returns the payload if valid, null if invalid\n */\nexport async function verifySignedToken(signedToken: string, encryptionKey: string): Promise<string | null> {\n try {\n const parts = signedToken.split('.');\n if (parts.length !== 2) {\n return null;\n }\n\n const [payloadB64, signatureB64] = parts;\n const encoder = new TextEncoder();\n\n // Import the encryption key for HMAC\n const keyData = encoder.encode(encryptionKey);\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify']\n );\n\n // Decode the payload and signature\n const payloadData = base64ToBuffer(payloadB64);\n const signature = base64ToBuffer(signatureB64);\n\n // Verify the signature\n const isValid = await crypto.subtle.verify('HMAC', cryptoKey, signature, payloadData);\n\n if (!isValid) {\n return null;\n }\n\n // Decode payload to string\n const decoder = new TextDecoder();\n return decoder.decode(payloadData);\n } catch (error) {\n console.error('Error verifying signed token:', error);\n return null;\n }\n}\n\n/**\n * Generate a signed super admin token\n * Payload format: super_admin:timestamp:nonce\n */\nexport async function generateSuperAdminToken(encryptionKey: string): Promise<string> {\n const timestamp = Date.now();\n const nonce = generateSecureToken(16);\n const payload = `super_admin:${timestamp}:${nonce}`;\n return await signToken(payload, encryptionKey);\n}\n\n/**\n * Verify a super admin token\n * Returns true if valid, false otherwise\n */\nexport async function verifySuperAdminToken(token: string, encryptionKey: string): Promise<boolean> {\n const payload = await verifySignedToken(token, encryptionKey);\n if (!payload) {\n return false;\n }\n\n // Check payload format\n const parts = payload.split(':');\n if (parts.length !== 3 || parts[0] !== 'super_admin') {\n return false;\n }\n\n // Optionally check timestamp for expiration (30 days)\n const timestamp = parseInt(parts[1], 10);\n const age = Date.now() - timestamp;\n const maxAge = 30 * 24 * 60 * 60 * 1000; // 30 days\n\n if (age > maxAge) {\n return false;\n }\n\n return true;\n}\n\n// Helper functions\nfunction bufferToBase64(buffer: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < buffer.byteLength; i++) {\n binary += String.fromCharCode(buffer[i]);\n }\n return btoa(binary);\n}\n\nfunction base64ToBuffer(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","/**\n * Authentication middleware for protecting API routes\n *\n * Supports multiple authentication types:\n * - Super admin token (signed with ENCRYPTION_KEY)\n * - User session token (validated against DurableAgentBuilder)\n * - API key (validated against DurableAgentBuilder)\n */\n\nimport {\n verifySuperAdminToken,\n hashToken,\n isValidUserToken,\n isValidApiKey,\n} from '../utils/auth.js';\n\nexport interface AuthUser {\n id: string;\n username: string;\n role: string;\n}\n\nexport interface AuthContext {\n user: AuthUser;\n authType: 'super_admin' | 'session' | 'api_key';\n}\n\n/**\n * Extract bearer token from Authorization header or query parameter (for WebSockets)\n */\nfunction extractBearerToken(request: Request): string | null {\n // First try Authorization header\n const authHeader = request.headers.get('Authorization');\n if (authHeader && authHeader.startsWith('Bearer ')) {\n return authHeader.substring(7);\n }\n\n // For WebSocket upgrade requests, check query parameter\n const isWebSocket =\n request.headers.get('upgrade')?.toLowerCase() === 'websocket';\n if (isWebSocket) {\n try {\n const url = new URL(request.url);\n const token = url.searchParams.get('token');\n if (token) {\n return token;\n }\n } catch (err) {\n // Invalid URL, continue\n }\n }\n\n return null;\n}\n\n/**\n * Get DurableAgentBuilder singleton stub\n */\nfunction getAgentBuilder(env: any): any {\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n return env.AGENT_BUILDER.get(agentBuilderId);\n}\n\n/**\n * Authenticate a request using various token types\n */\nexport async function authenticate(\n request: Request,\n env: any\n): Promise<AuthContext | null> {\n const token = extractBearerToken(request);\n\n if (!token) {\n return null;\n }\n\n // Check if it's a signed super admin token (if super admin is configured)\n if (env.SUPER_ADMIN_PASSWORD && env.ENCRYPTION_KEY) {\n // Token contains a dot, might be a signed token\n if (token.includes('.')) {\n const isValidSuperAdmin = await verifySuperAdminToken(\n token,\n env.ENCRYPTION_KEY\n );\n if (isValidSuperAdmin) {\n return {\n user: {\n id: 'super_admin',\n username: 'admin',\n role: 'admin',\n },\n authType: 'super_admin',\n };\n }\n }\n }\n\n // Check if it's a user session token\n if (isValidUserToken(token)) {\n const tokenHash = await hashToken(token);\n const agentBuilder = getAgentBuilder(env);\n\n const session = await agentBuilder.validateSession(tokenHash);\n if (session) {\n // Get user details\n const user = await agentBuilder.getUserById(session.user_id);\n if (user) {\n return {\n user: {\n id: user.id,\n username: user.username,\n role: user.role,\n },\n authType: 'session',\n };\n }\n }\n }\n\n // Check if it's an API key\n if (isValidApiKey(token)) {\n const keyHash = await hashToken(token);\n const agentBuilder = getAgentBuilder(env);\n\n const apiKey = await agentBuilder.validateApiKey(keyHash);\n if (apiKey) {\n // Get user details\n const user = await agentBuilder.getUserById(apiKey.user_id);\n if (user) {\n return {\n user: {\n id: user.id,\n username: user.username,\n role: user.role,\n },\n authType: 'api_key',\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Middleware to require authentication\n * Returns 401 if not authenticated\n */\nexport async function requireAuth(\n request: Request,\n env: any\n): Promise<AuthContext | Response> {\n const authContext = await authenticate(request, env);\n\n if (!authContext) {\n return new Response(JSON.stringify({ error: 'Unauthorized' }), {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n return authContext;\n}\n\n/**\n * Middleware to require admin role\n * Returns 401 if not authenticated, 403 if not admin\n */\nexport async function requireAdmin(\n request: Request,\n env: any\n): Promise<AuthContext | Response> {\n const result = await requireAuth(request, env);\n\n if (result instanceof Response) {\n return result;\n }\n\n if (result.user.role !== 'admin') {\n return new Response(\n JSON.stringify({ error: 'Forbidden: Admin access required' }),\n {\n status: 403,\n headers: { 'Content-Type': 'application/json' },\n }\n );\n }\n\n return result;\n}\n","import { defineController } from '../../router/index.js';\nimport { requireAuth } from '../../middleware/auth.js';\n\n/**\n * GET /api/api-keys\n *\n * List API keys for the authenticated user.\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Returns:\n * - HTTP 200: { keys: [{ id, name, key_prefix, last_five, created_at, last_used_at }] }\n * - HTTP 401: Not authenticated\n */\nexport default defineController(async ({ req, env }) => {\n try {\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n\n // Super admin has no API keys - they need to create a user first\n if (authResult.authType === 'super_admin') {\n return Response.json({ keys: [], message: 'Super admin has no API keys. Create a user account to manage API keys.' });\n }\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n const keys = await agentBuilder.listApiKeys(authResult.user.id);\n\n return Response.json({ keys });\n } catch (error: any) {\n console.error('List API keys error:', error);\n return Response.json(\n { error: error.message || 'Failed to list API keys' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { requireAuth } from '../../middleware/auth.js';\nimport { generateApiKey, hashToken, getLastChars, getTokenPrefix } from '../../utils/auth.js';\n\n/**\n * POST /api/api-keys\n *\n * Create a new API key for the authenticated user.\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Body:\n * - name: string (name/description for the API key)\n *\n * Returns:\n * - HTTP 201: { key: <full_api_key>, id, name, key_prefix, last_five, created_at }\n * NOTE: The full key is only returned once on creation\n * - HTTP 400: Missing required fields\n * - HTTP 401: Not authenticated\n */\nexport default defineController(async ({ req, env }) => {\n try {\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n\n // Super admin cannot create API keys - they need to create a user first\n if (authResult.authType === 'super_admin') {\n return Response.json(\n { error: 'Super admin cannot create API keys. Please create a user account first.' },\n { status: 400 }\n );\n }\n\n const body = await req.json() as { name?: string };\n const { name } = body;\n\n if (!name || typeof name !== 'string') {\n return Response.json(\n { error: 'Name is required' },\n { status: 400 }\n );\n }\n\n if (name.length < 1 || name.length > 100) {\n return Response.json(\n { error: 'Name must be between 1 and 100 characters' },\n { status: 400 }\n );\n }\n\n // Generate the API key\n const apiKey = generateApiKey();\n const keyHash = await hashToken(apiKey);\n const keyPrefix = getTokenPrefix(apiKey);\n const lastFive = getLastChars(apiKey, 5);\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n const id = await agentBuilder.createApiKey({\n name,\n key_hash: keyHash,\n key_prefix: keyPrefix,\n last_five: lastFive,\n user_id: authResult.user.id,\n });\n\n const now = Math.floor(Date.now() / 1000);\n\n return Response.json({\n key: apiKey, // Only returned once on creation\n id,\n name,\n key_prefix: keyPrefix,\n last_five: lastFive,\n created_at: now,\n }, { status: 201 });\n } catch (error: any) {\n console.error('Create API key error:', error);\n return Response.json(\n { error: error.message || 'Failed to create API key' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../router/index\";\n\nexport default defineController(async ({ config }) => {\n return Response.json(config);\n});\n","import { defineController } from '../router/index.js';\nimport type { AgentDefinition } from '../sdk/defineAgent.js';\n\n/**\n * GET /api/diagnostics\n *\n * Returns diagnostic warnings about the current configuration.\n * This includes:\n * - Duplicate tool names (filesystem tools, prompts, agents with same name)\n *\n * Returns:\n * - HTTP 200: { warnings: Array<{ type, message, details }> }\n */\nexport default defineController(async ({ tools, prompts, promptNames, agents, agentNames }) => {\n const warnings: Array<{ type: string; message: string; details: any }> = [];\n\n // Track tool names and their sources\n const toolNameSources = new Map<string, Set<string>>();\n\n // Check filesystem tools\n if (tools) {\n const toolNames = Object.keys(tools);\n for (const name of toolNames) {\n const sources = toolNameSources.get(name) || new Set();\n sources.add('native tool');\n toolNameSources.set(name, sources);\n }\n }\n\n // Check prompts (all prompts are exposed as tools)\n if (prompts && promptNames) {\n for (const name of promptNames) {\n const sources = toolNameSources.get(name) || new Set();\n sources.add('prompt');\n toolNameSources.set(name, sources);\n }\n }\n\n // Check agents exposed as tools\n if (agents && agentNames) {\n for (const name of agentNames) {\n try {\n const loader = agents[name];\n if (loader) {\n const definition = await loader() as AgentDefinition;\n if (definition.exposeAsTool) {\n const sources = toolNameSources.get(name) || new Set();\n sources.add('agent');\n toolNameSources.set(name, sources);\n }\n }\n } catch {\n // Skip agents that fail to load\n }\n }\n }\n\n // Find duplicates\n for (const [name, sources] of toolNameSources) {\n if (sources.size > 1) {\n warnings.push({\n type: 'duplicate_tool_name',\n message: `Duplicate tool name \"${name}\" detected`,\n details: {\n name,\n sources: [...sources],\n },\n });\n }\n }\n\n return Response.json({ warnings });\n});\n","import { defineController } from '../router/index.js';\n\n/**\n * GET /api/events\n *\n * WebSocket endpoint for real-time events from the AgentBuilder system.\n *\n * Events:\n * - thread_created: { type: 'thread_created', thread: ThreadRegistryEntry }\n * - thread_deleted: { type: 'thread_deleted', threadId: string }\n *\n * Usage:\n * Connect via WebSocket to receive real-time updates when threads are\n * created or deleted in the system.\n */\nexport default defineController(async ({ req, env }) => {\n // Only handle WebSocket upgrade requests\n if (req.headers.get('upgrade')?.toLowerCase() !== 'websocket') {\n return Response.json(\n { error: 'This endpoint requires a WebSocket connection' },\n { status: 400 }\n );\n }\n\n try {\n // Forward the WebSocket upgrade to the DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const stub = env.AGENT_BUILDER.get(agentBuilderId);\n return await stub.fetch(req);\n } catch (error: any) {\n console.error('Error establishing events WebSocket:', error);\n return Response.json(\n { error: error.message || 'Failed to establish WebSocket connection' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../router/index.js';\nimport type { ModelDefinition } from '../sdk/defineModel.js';\n\n/**\n * GET /api/models\n *\n * List all defined models from the agentbuilder/models directory.\n * Returns model configuration data loaded from TypeScript files.\n *\n * Returns:\n * - HTTP 200: { models: Array<{ id, name, provider, model, fallbacks, ... }> }\n */\nexport default defineController(async ({ models, modelNames }) => {\n if (!models || !modelNames) {\n return Response.json({ models: [] });\n }\n\n const modelList = await Promise.all(\n modelNames.map(async (name: string) => {\n try {\n const loader = models[name];\n if (!loader) {\n return null;\n }\n const definition = await loader() as ModelDefinition;\n\n // Build fallback objects for display\n const fallbackObjects = (definition.fallbacks || []).map(\n (fallbackName: string, index: number) => ({\n id: fallbackName,\n name: fallbackName,\n order: index,\n })\n );\n\n return {\n id: definition.name,\n name: definition.name,\n provider: definition.provider,\n model: definition.model,\n input_price: definition.inputPrice,\n output_price: definition.outputPrice,\n cached_price: definition.cachedPrice,\n included_providers: definition.includedProviders,\n fallbacks: fallbackObjects,\n created_at: Math.floor(Date.now() / 1000), // Not persisted, use current time\n };\n } catch (error) {\n console.error(`Error loading model ${name}:`, error);\n return null;\n }\n })\n );\n\n // Filter out any null entries from failed loads\n const validModels = modelList.filter(Boolean);\n\n return Response.json({ models: validModels });\n});\n","import { defineController } from '../router'\n\nexport default defineController(async ({ req, params, env }) => {\n return { message: 'Modified new test API route', timestamp: new Date().toISOString() }\n})","import { defineController } from '../router/index.js';\nimport { z } from 'zod';\nimport type { PromptDefinition } from '../sdk/definePrompt.js';\n\n/**\n * Convert a Zod schema to JSON Schema format\n */\nfunction toJSONSchema(schema: any): any {\n if (!schema) return null;\n // If it's a Zod schema, convert it\n if (schema && typeof schema === 'object' && ('~standard' in schema || '_def' in schema)) {\n return z.toJSONSchema(schema);\n }\n // Already JSON Schema or plain object\n return schema;\n}\n\n/**\n * Normalize prompt content for API response.\n * - Arrays (StructuredPrompt) are serialized to JSON strings for backward compatibility\n * - Plain strings are returned as-is\n */\nfunction normalizePromptContent(prompt: string | any[] | undefined): string {\n if (!prompt) return '';\n // If it's an array (StructuredPrompt), serialize to JSON\n if (Array.isArray(prompt)) {\n return JSON.stringify(prompt);\n }\n // Plain string, return as-is\n return prompt;\n}\n\n/**\n * GET /api/prompts\n *\n * List all defined prompts from the agentbuilder/prompts directory.\n * Returns prompt configuration data loaded from TypeScript files.\n *\n * Returns:\n * - HTTP 200: { prompts: Array<{ id, name, tool_description, prompt, model, ... }> }\n */\nexport default defineController(async ({ prompts, promptNames, models, modelNames }) => {\n if (!prompts || !promptNames) {\n return Response.json({ prompts: [] });\n }\n\n // Build a map of models for quick lookup\n const modelMap: Record<string, any> = {};\n if (models && modelNames) {\n await Promise.all(\n modelNames.map(async (name: string) => {\n try {\n const loader = models[name];\n if (loader) {\n modelMap[name] = await loader();\n }\n } catch (error) {\n // Skip failed models\n }\n })\n );\n }\n\n const promptList = await Promise.all(\n promptNames.map(async (name: string) => {\n try {\n const loader = prompts[name];\n if (!loader) {\n return null;\n }\n const definition = await loader() as PromptDefinition;\n const modelDef = modelMap[definition.model];\n\n // Extract tool names from tools array\n const tools = (definition.tools || []).map((tool: string | { name: string }) =>\n typeof tool === 'string' ? tool : tool.name\n );\n\n return {\n id: definition.name,\n name: definition.name,\n tool_description: definition.toolDescription,\n prompt: normalizePromptContent(definition.prompt),\n required_schema: toJSONSchema(definition.requiredSchema),\n model_id: definition.model,\n model_name: modelDef?.name || definition.model,\n model_provider: modelDef?.provider || 'unknown',\n include_chat: definition.includeChat || false,\n include_past_tools: definition.includePastTools || false,\n parallel_tool_calls: definition.parallelToolCalls || false,\n tool_choice: definition.toolChoice || 'auto',\n tools: tools,\n reasoning: definition.reasoning || null,\n created_at: Math.floor(Date.now() / 1000),\n };\n } catch (error) {\n console.error(`Error loading prompt ${name}:`, error);\n return null;\n }\n })\n );\n\n // Filter out any null entries from failed loads\n const validPrompts = promptList.filter(Boolean);\n\n return Response.json({ prompts: validPrompts });\n});\n","import { defineController } from '../router/index.js';\n\n/**\n * Supported provider configurations.\n * Each provider has specific SDK type and API key environment variable.\n */\nconst SUPPORTED_PROVIDERS = [\n {\n name: 'openai',\n sdk: 'openai',\n label: 'OpenAI',\n envKey: 'OPENAI_API_KEY',\n },\n {\n name: 'openrouter',\n sdk: 'openrouter',\n label: 'OpenRouter',\n envKey: 'OPENROUTER_API_KEY',\n },\n];\n\n/**\n * GET /api/providers\n *\n * List all supported providers and their configuration status.\n * Providers are detected based on environment variables.\n *\n * Returns:\n * - HTTP 200: { providers: Array<{ name, sdk, hasApiKey }> }\n */\nexport default defineController(async ({ env }) => {\n const providers = SUPPORTED_PROVIDERS.map((provider) => ({\n name: provider.name,\n sdk: provider.sdk,\n label: provider.label,\n hasApiKey: Boolean(env[provider.envKey]),\n }));\n\n return Response.json({ providers });\n});\n","import { defineController } from \"../../router/index\";\nimport type { Message, Env } from \"../../agents/types\";\nimport { requireAuth } from \"../../middleware/auth\";\n\n/**\n * POST /api/threads\n *\n * Create a new thread and start execution\n *\n * Request body:\n * {\n * agent_id: string, // Required: Agent name (from TypeScript config)\n * initial_messages: Message[], // Optional: Initial conversation messages\n * data?: Record<string, any>, // Optional: Additional context data\n * tags?: string[] // Optional: Tags for searching/filtering threads\n * }\n *\n * Note: user_id is automatically set based on authentication:\n * - super_admin: user_id = null\n * - regular user: user_id = authenticated user's ID\n *\n * Returns:\n * - HTTP 200: Thread created successfully\n * - HTTP 400: Validation error\n * - HTTP 401: Unauthorized\n * - HTTP 404: Agent not found\n * - HTTP 500: Execution error\n *\n * WebSocket upgrade available for real-time telemetry\n */\nexport default defineController<Env>(async ({ req, env }) => {\n // Require authentication\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n const auth = authResult;\n // Parse request body\n let body: {\n agent_id?: string;\n initial_messages?: Message[];\n data?: Record<string, any>;\n tags?: string[];\n };\n\n try {\n body = await req.json();\n } catch (error) {\n return Response.json(\n { error: \"Invalid JSON in request body\" },\n { status: 400 }\n );\n }\n\n const { agent_id, initial_messages, data, tags } = body;\n\n // Determine user_id based on auth context\n // - super_admin: user_id = null (not associated with any user)\n // - regular user: user_id = their own user ID\n const user_id = auth.authType === 'super_admin' ? null : auth.user.id;\n\n // Validate required fields\n if (!agent_id) {\n return Response.json(\n { error: \"Missing required field: agent_id\" },\n { status: 400 }\n );\n }\n\n // initial_messages is now optional - if not provided, thread starts with no messages\n if (initial_messages !== undefined && initial_messages !== null) {\n if (!Array.isArray(initial_messages)) {\n return Response.json(\n { error: \"initial_messages must be an array\" },\n { status: 400 }\n );\n }\n }\n\n // Validate tags if provided\n if (tags !== undefined && tags !== null) {\n if (!Array.isArray(tags)) {\n return Response.json(\n { error: \"tags must be an array of strings\" },\n { status: 400 }\n );\n }\n if (!tags.every((tag) => typeof tag === \"string\")) {\n return Response.json(\n { error: \"All tags must be strings\" },\n { status: 400 }\n );\n }\n }\n\n // Get the root AgentBuilder DO\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId);\n\n // Validate agent exists by trying to load it\n try {\n await agentBuilder.loadAgent(agent_id);\n } catch (error) {\n return Response.json(\n { error: `Agent not found: ${agent_id}` },\n { status: 404 }\n );\n }\n\n try {\n // Create thread in DurableAgentBuilder\n const thread = await agentBuilder.createThread({\n agent_name: agent_id,\n user_id: user_id ?? undefined,\n tags: tags,\n });\n\n // Return thread ID immediately\n // Note: initial_messages and data are accepted but not stored here\n // They will be stored when execution is triggered (e.g., via POST /api/threads/:id/execute)\n return Response.json({\n threadId: thread.id,\n agent_id: thread.agent_name,\n message: \"Thread created successfully\",\n });\n } catch (error: any) {\n console.error(`Error creating thread:`, error);\n\n return Response.json(\n {\n error: error.message || \"Failed to create thread\",\n },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../router/index\";\nimport type { Env } from \"../../agents/types\";\nimport { requireAuth } from \"../../middleware/auth\";\n\n/**\n * Resolve an icon path to a full URL if it's an absolute path.\n * URLs are returned as-is, absolute paths get the origin prepended.\n */\nfunction resolveIconUrl(icon: string | undefined, origin: string): string | undefined {\n if (!icon) return undefined;\n // If it's already a URL (http/https), return as-is\n if (icon.startsWith('http://') || icon.startsWith('https://')) {\n return icon;\n }\n // If it's an absolute path, prepend the origin\n if (icon.startsWith('/')) {\n return `${origin}${icon}`;\n }\n // Otherwise return as-is (shouldn't happen with valid input)\n return icon;\n}\n\n/**\n * GET /api/threads\n * List all threads with optional filtering\n *\n * Query parameters:\n * - limit: number (default: 50)\n * - offset: number (default: 0)\n * - agent_id: string (optional filter by agent name)\n *\n * Note: Non-admin users only see their own threads.\n * Admins can see all threads.\n *\n * Returns:\n * - HTTP 200: List of threads with metadata\n * - HTTP 401: Unauthorized\n * - HTTP 500: Server error\n */\nexport default defineController<Env>(async ({ req, env }) => {\n if (req.method !== \"GET\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n\n // Require authentication\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n const auth = authResult;\n\n try {\n const url = new URL(req.url);\n const origin = url.origin;\n const limit = parseInt(url.searchParams.get(\"limit\") || \"50\", 10);\n const offset = parseInt(url.searchParams.get(\"offset\") || \"0\", 10);\n const agentName = url.searchParams.get(\"agent_id\");\n\n // Determine user_id filter based on role\n // Admin can see all threads, others only see their own\n const userId = auth.user.role === 'admin' ? undefined : auth.user.id;\n\n // Get the root AgentBuilder DO\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId);\n\n // List threads from DurableAgentBuilder\n const result = await agentBuilder.listThreads({\n agent_name: agentName || undefined,\n user_id: userId || undefined,\n limit,\n offset,\n });\n\n // Enrich with agent details from TypeScript definitions\n const threads = await Promise.all(\n result.threads.map(async (thread) => {\n let agentDetails: {\n name: string;\n title: string;\n type: string;\n description?: string;\n icon?: string;\n } | null = null;\n try {\n const agentDef = await agentBuilder.loadAgent(thread.agent_name);\n agentDetails = {\n name: thread.agent_name,\n title: agentDef.title || thread.agent_name,\n type: agentDef.type || 'ai_human',\n description: agentDef.description,\n icon: resolveIconUrl(agentDef.icon, origin),\n };\n } catch {\n // Agent definition might have been removed\n agentDetails = { name: thread.agent_name, title: thread.agent_name, type: 'unknown' };\n }\n\n return {\n id: thread.id,\n agent_id: thread.agent_name,\n user_id: thread.user_id,\n tags: thread.tags || [],\n created_at: thread.created_at,\n agent: agentDetails,\n };\n })\n );\n\n return Response.json({\n threads,\n total: result.total,\n hasMore: offset + threads.length < result.total,\n });\n } catch (error: any) {\n console.error(\"Error fetching threads:\", error);\n return Response.json(\n { error: error.message || \"Failed to fetch threads\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../router/index.js';\nimport { z } from 'zod';\nimport type { PromptDefinition } from '../sdk/definePrompt.js';\nimport type { AgentDefinition } from '../sdk/defineAgent.js';\n\n/**\n * Convert a Zod schema to JSON Schema format\n */\nfunction toJSONSchema(schema: any): any {\n if (!schema) return null;\n try {\n // If it's a Zod schema, convert it\n if (schema && typeof schema === 'object' && ('~standard' in schema || schema._def)) {\n return z.toJSONSchema(schema);\n }\n // Already JSON Schema or plain object\n return schema;\n } catch {\n return null;\n }\n}\n\n/**\n * GET /api/tools\n *\n * List all available tools including filesystem tools, prompts (all prompts are tools), and MCP tools.\n *\n * Query Parameters:\n * - type: 'tools' (default, includes all) | 'prompts' | 'agents'\n * - schema: 'true' to include schema data\n *\n * Returns:\n * - HTTP 200: { [name]: { description, schema?, hasError?, error?, type?, model? } }\n */\nexport default defineController(async ({ url, tools, prompts, promptNames, agents, agentNames, models, modelNames }) => {\n const type = url.searchParams.get('type');\n const includeSchema = url.searchParams.get('schema') === 'true';\n\n // Build a map of models for quick lookup\n const modelMap: Record<string, any> = {};\n if (models && modelNames) {\n await Promise.all(\n modelNames.map(async (name: string) => {\n try {\n const loader = models[name];\n if (loader) {\n modelMap[name] = await loader();\n }\n } catch (error) {\n // Skip failed models\n }\n })\n );\n }\n\n if (type === 'prompts') {\n // Return all prompts (all prompts are exposed as tools)\n if (!prompts || !promptNames) {\n return Response.json({});\n }\n\n const result: Record<string, any> = {};\n\n await Promise.all(\n promptNames.map(async (name: string) => {\n try {\n const loader = prompts[name];\n if (!loader) return;\n\n const definition = await loader() as PromptDefinition;\n const modelDef = modelMap[definition.model];\n\n result[name] = {\n description: definition.toolDescription || '',\n schema: includeSchema && definition.requiredSchema\n ? toJSONSchema(definition.requiredSchema)\n : null,\n hasError: false,\n type: 'prompt',\n model: modelDef?.name || definition.model,\n };\n } catch (error) {\n console.error(`Error loading prompt ${name}:`, error);\n }\n })\n );\n\n return Response.json(result);\n }\n\n if (type === 'agents') {\n // Return agents that are exposed as tools\n if (!agents || !agentNames) {\n return Response.json({});\n }\n\n const result: Record<string, any> = {};\n\n await Promise.all(\n agentNames.map(async (name: string) => {\n try {\n const loader = agents[name];\n if (!loader) return;\n\n const definition = await loader() as AgentDefinition;\n\n // Only include agents exposed as tools\n if (!definition.exposeAsTool) return;\n\n result[name] = {\n description: definition.toolDescription || definition.title || '',\n schema: null, // Agents don't have schemas\n hasError: false,\n type: 'agent',\n };\n } catch (error) {\n console.error(`Error loading agent ${name}:`, error);\n }\n })\n );\n\n return Response.json(result);\n }\n\n // Default: return all tools (filesystem tools + prompts)\n const result: Record<string, any> = {};\n\n // Add filesystem tools\n if (tools) {\n const toolNames = Object.keys(tools);\n\n await Promise.all(\n toolNames.map(async (name: string) => {\n try {\n const loader = tools[name];\n if (!loader) return;\n\n // Tool loaders return [description, schema, handler] tuple\n const toolResult = await loader() as [string, unknown, unknown];\n\n // Handle error case where result is an error array\n if (Array.isArray(toolResult) && typeof toolResult[0] === 'string' && toolResult[0].includes('error')) {\n result[name] = {\n description: '',\n schema: null,\n hasError: true,\n error: toolResult[0],\n type: 'tool',\n };\n return;\n }\n\n // Normal case: [description, schema, handler]\n const [description, schema] = toolResult;\n\n result[name] = {\n description: description || '',\n schema: includeSchema && schema ? toJSONSchema(schema) : null,\n hasError: false,\n type: 'tool',\n };\n } catch (error) {\n console.error(`Error loading tool ${name}:`, error);\n result[name] = {\n description: '',\n schema: null,\n hasError: true,\n error: `Error loading tool: ${error}`,\n type: 'tool',\n };\n }\n })\n );\n }\n\n // Add all prompts as tools (all prompts are exposed as tools)\n if (prompts && promptNames) {\n await Promise.all(\n promptNames.map(async (name: string) => {\n try {\n const loader = prompts[name];\n if (!loader) return;\n\n const definition = await loader() as PromptDefinition;\n const modelDef = modelMap[definition.model];\n\n result[name] = {\n description: definition.toolDescription || '',\n schema: includeSchema && definition.requiredSchema\n ? toJSONSchema(definition.requiredSchema)\n : null,\n hasError: false,\n type: 'prompt',\n model: modelDef?.name || definition.model,\n };\n } catch (error) {\n console.error(`Error loading prompt ${name}:`, error);\n }\n })\n );\n }\n\n return Response.json(result);\n});\n","import { defineController } from '../../router/index.js';\nimport { requireAdmin } from '../../middleware/auth.js';\n\n/**\n * GET /api/users\n *\n * List all users (admin only).\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Returns:\n * - HTTP 200: { users: [{ id, username, role, created_at, updated_at }] }\n * - HTTP 401: Not authenticated\n * - HTTP 403: Not admin\n */\nexport default defineController(async ({ req, env }) => {\n try {\n const authResult = await requireAdmin(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n const users = await agentBuilder.listUsers();\n\n return Response.json({ users });\n } catch (error: any) {\n console.error('List users error:', error);\n return Response.json(\n { error: error.message || 'Failed to list users' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { requireAdmin } from '../../middleware/auth.js';\nimport { hashPassword } from '../../utils/auth.js';\n\n// Valid user roles\nconst VALID_ROLES = ['admin', 'user'] as const;\ntype UserRole = typeof VALID_ROLES[number];\n\n/**\n * POST /api/users\n *\n * Create a new user (admin only).\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Body:\n * - username: string\n * - password: string\n * - role?: 'admin' | 'user' (defaults to 'user')\n *\n * Returns:\n * - HTTP 201: { user: { id, username, role, created_at, updated_at } }\n * - HTTP 400: Missing required fields, invalid role, or user already exists\n * - HTTP 401: Not authenticated\n * - HTTP 403: Not admin\n */\nexport default defineController(async ({ req, env }) => {\n try {\n const authResult = await requireAdmin(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n\n const body = await req.json() as { username?: string; password?: string; role?: string };\n const { username, password, role = 'user' } = body;\n\n if (!username || !password) {\n return Response.json(\n { error: 'Username and password are required' },\n { status: 400 }\n );\n }\n\n // Validate username format\n if (!/^[a-zA-Z0-9_-]+$/.test(username)) {\n return Response.json(\n { error: 'Username can only contain letters, numbers, underscores, and hyphens' },\n { status: 400 }\n );\n }\n\n if (username.length < 3 || username.length > 50) {\n return Response.json(\n { error: 'Username must be between 3 and 50 characters' },\n { status: 400 }\n );\n }\n\n if (password.length < 8) {\n return Response.json(\n { error: 'Password must be at least 8 characters' },\n { status: 400 }\n );\n }\n\n // Validate role\n if (!VALID_ROLES.includes(role as UserRole)) {\n return Response.json(\n { error: `Invalid role. Must be one of: ${VALID_ROLES.join(', ')}` },\n { status: 400 }\n );\n }\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n // Check if username already exists\n const existingUser = await agentBuilder.getUserByUsername(username);\n if (existingUser) {\n return Response.json(\n { error: 'Username already exists' },\n { status: 400 }\n );\n }\n\n // Hash the password\n const password_hash = await hashPassword(password);\n\n // Create the user\n const user = await agentBuilder.createUser({\n username,\n password_hash,\n role,\n });\n\n // Return user without password hash\n return Response.json({\n user: {\n id: user.id,\n username: user.username,\n role: user.role,\n created_at: user.created_at,\n updated_at: user.updated_at,\n },\n }, { status: 201 });\n } catch (error: any) {\n console.error('Create user error:', error);\n return Response.json(\n { error: error.message || 'Failed to create user' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport type { AgentDefinition } from '../../sdk/defineAgent.js';\n\n/**\n * GET /api/agents/:name\n *\n * Get details for a specific agent.\n *\n * Returns:\n * - HTTP 200: { agent: { id, name, type, sideA, sideB, ... } }\n * - HTTP 404: Agent not found\n */\nexport default defineController(async ({ params, agents, prompts, promptNames }) => {\n const { name } = params;\n\n if (!agents || !agents[name]) {\n return Response.json({ error: 'Agent not found' }, { status: 404 });\n }\n\n try {\n // Build a map of prompts for quick lookup\n const promptMap: Record<string, any> = {};\n if (prompts && promptNames) {\n await Promise.all(\n promptNames.map(async (promptName: string) => {\n try {\n const loader = prompts[promptName];\n if (loader) {\n promptMap[promptName] = await loader();\n }\n } catch (error) {\n // Skip failed prompts\n }\n })\n );\n }\n\n const loader = agents[name];\n const definition = await loader() as AgentDefinition;\n\n // Get prompt names for sides\n const sideAPrompt = promptMap[definition.sideA?.prompt];\n const sideBPrompt = definition.sideB\n ? promptMap[definition.sideB?.prompt]\n : null;\n\n const agent = {\n id: definition.name,\n name: definition.name,\n // title is deprecated - include for backward compatibility but prefer name\n title: definition.title || definition.name,\n type: definition.type || 'ai_human',\n\n // Side A configuration\n side_a_label: definition.sideA?.label || null,\n side_a_agent_prompt: definition.sideA?.prompt,\n side_a_agent_prompt_name: sideAPrompt?.name || definition.sideA?.prompt,\n side_a_stop_on_response:\n definition.sideA?.stopOnResponse !== undefined\n ? definition.sideA.stopOnResponse\n : true,\n side_a_stop_tool: definition.sideA?.stopTool || null,\n side_a_stop_tool_response_property:\n definition.sideA?.stopToolResponseProperty || null,\n side_a_max_steps: definition.sideA?.maxSteps || null,\n side_a_end_session_tool:\n definition.sideA?.endSessionTool || null,\n side_a_manual_stop_condition:\n definition.sideA?.manualStopCondition || false,\n\n // Side B configuration (if dual_ai)\n side_b_label: definition.sideB?.label || null,\n side_b_agent_prompt: definition.sideB?.prompt || null,\n side_b_agent_prompt_name: sideBPrompt?.name || definition.sideB?.prompt || null,\n side_b_stop_on_response:\n definition.sideB?.stopOnResponse !== undefined\n ? definition.sideB.stopOnResponse\n : true,\n side_b_stop_tool: definition.sideB?.stopTool || null,\n side_b_stop_tool_response_property:\n definition.sideB?.stopToolResponseProperty || null,\n side_b_max_steps: definition.sideB?.maxSteps || null,\n side_b_end_session_tool:\n definition.sideB?.endSessionTool || null,\n side_b_manual_stop_condition:\n definition.sideB?.manualStopCondition || false,\n\n // Session configuration\n max_session_turns: definition.maxSessionTurns || null,\n\n // Tool exposure\n expose_as_tool: definition.exposeAsTool || false,\n tool_description: definition.toolDescription || null,\n\n created_at: Math.floor(Date.now() / 1000),\n };\n\n return Response.json({ agent });\n } catch (error) {\n console.error(`Error loading agent ${name}:`, error);\n return Response.json(\n { error: `Error loading agent: ${error}` },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { requireAuth } from '../../middleware/auth.js';\n\n/**\n * DELETE /api/api-keys/:id\n *\n * Delete an API key for the authenticated user.\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Returns:\n * - HTTP 200: { success: true }\n * - HTTP 401: Not authenticated\n * - HTTP 404: API key not found\n */\nexport default defineController(async ({ req, env, params }) => {\n try {\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n\n // Super admin has no API keys\n if (authResult.authType === 'super_admin') {\n return Response.json(\n { error: 'Super admin has no API keys to delete.' },\n { status: 400 }\n );\n }\n\n const keyId = params.id;\n if (!keyId) {\n return Response.json(\n { error: 'API key ID is required' },\n { status: 400 }\n );\n }\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n await agentBuilder.deleteApiKey(keyId, authResult.user.id);\n\n return Response.json({ success: true });\n } catch (error: any) {\n console.error('Delete API key error:', error);\n return Response.json(\n { error: error.message || 'Failed to delete API key' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { z } from 'zod';\nimport type { PromptDefinition } from '../../sdk/definePrompt.js';\n\n/**\n * Convert a Zod schema to JSON Schema format\n */\nfunction toJSONSchema(schema: any): any {\n if (!schema) return null;\n // If it's a Zod schema, convert it\n if (schema && typeof schema === 'object' && ('~standard' in schema || '_def' in schema)) {\n return z.toJSONSchema(schema);\n }\n // Already JSON Schema or plain object\n return schema;\n}\n\n/**\n * Normalize prompt content for API response.\n * - Arrays (StructuredPrompt) are serialized to JSON strings for backward compatibility\n * - Plain strings are returned as-is\n */\nfunction normalizePromptContent(prompt: string | any[] | undefined): string {\n if (!prompt) return '';\n // If it's an array (StructuredPrompt), serialize to JSON\n if (Array.isArray(prompt)) {\n return JSON.stringify(prompt);\n }\n // Plain string, return as-is\n return prompt;\n}\n\n/**\n * GET /api/prompts/:name\n *\n * Get details for a specific prompt.\n *\n * Returns:\n * - HTTP 200: { prompt: { id, name, tool_description, prompt, model, ... } }\n * - HTTP 404: Prompt not found\n */\nexport default defineController(async ({ params, prompts, models, modelNames }) => {\n const { name } = params;\n\n if (!prompts || !prompts[name]) {\n return Response.json({ error: 'Prompt not found' }, { status: 404 });\n }\n\n try {\n // Build a map of models for quick lookup\n const modelMap: Record<string, any> = {};\n if (models && modelNames) {\n await Promise.all(\n modelNames.map(async (modelName: string) => {\n try {\n const loader = models[modelName];\n if (loader) {\n modelMap[modelName] = await loader();\n }\n } catch (error) {\n // Skip failed models\n }\n })\n );\n }\n\n const loader = prompts[name];\n const definition = await loader() as PromptDefinition;\n const modelDef = modelMap[definition.model];\n\n // Extract tools with their full config (convert camelCase to snake_case for UI)\n const tools = (definition.tools || []).map((tool: string | Record<string, any>) => {\n if (typeof tool === 'string') {\n // Simple tool name - return with default options\n return {\n name: tool,\n include_text_response: true,\n include_tool_calls: true,\n include_errors: true,\n init_user_message_property: null\n };\n }\n // Tool config object - convert camelCase to snake_case\n return {\n name: tool.name,\n include_text_response: tool.includeTextResponse !== undefined ? tool.includeTextResponse : true,\n include_tool_calls: tool.includeToolCalls !== undefined ? tool.includeToolCalls : true,\n include_errors: tool.includeErrors !== undefined ? tool.includeErrors : true,\n init_user_message_property: tool.initUserMessageProperty || null\n };\n });\n\n const prompt = {\n id: definition.name,\n name: definition.name,\n tool_description: definition.toolDescription,\n prompt: normalizePromptContent(definition.prompt),\n required_schema: toJSONSchema(definition.requiredSchema),\n model_id: definition.model,\n model_name: modelDef?.name || definition.model,\n model_provider: modelDef?.provider || 'unknown',\n include_chat: definition.includeChat || false,\n include_past_tools: definition.includePastTools || false,\n parallel_tool_calls: definition.parallelToolCalls || false,\n tool_choice: definition.toolChoice || 'auto',\n tools: tools,\n reasoning: definition.reasoning || null,\n created_at: Math.floor(Date.now() / 1000),\n };\n\n return Response.json({ prompt });\n } catch (error) {\n console.error(`Error loading prompt ${name}:`, error);\n return Response.json(\n { error: `Error loading prompt: ${error}` },\n { status: 500 }\n );\n }\n});\n","/**\n * Permissions utility for role-based access control\n *\n * Current behavior:\n * - Admin role can do everything (early return true)\n * - Other roles only get baseline access (own threads)\n *\n * The `can()` function checks arbitrary permission strings.\n * Currently, non-admin users have no explicit permissions,\n * meaning they rely on ownership checks for access.\n */\n\nimport type { AuthContext } from '../middleware/auth.js';\n\n/**\n * Check if a user has a specific permission\n *\n * @param auth - The authenticated user context\n * @param permission - The permission string to check (e.g., \"access_all_threads\")\n * @returns true if the user has the permission\n */\nexport function can(auth: AuthContext, permission: string): boolean {\n // Admin can do everything\n if (auth.user.role === 'admin') {\n return true;\n }\n\n // For now, non-admin users have no special permissions\n // They only get baseline access (own threads)\n // Future: look up permissions from a role→permissions mapping\n return false;\n}\n\n/**\n * Check if a user can access a specific thread\n *\n * @param auth - The authenticated user context\n * @param thread - The thread to check access for (must have user_id)\n * @returns true if the user can access the thread\n */\nexport function canAccessThread(\n auth: AuthContext,\n thread: { user_id: string | null }\n): boolean {\n // Admin can access all threads\n if (auth.user.role === 'admin') {\n return true;\n }\n\n // Users can only access their own threads\n // Threads with null user_id (created by super_admin) are admin-only\n if (thread.user_id === null) {\n return false;\n }\n\n return thread.user_id === auth.user.id;\n}\n","import { defineController } from \"../../router/index\";\nimport type { Env } from \"../../agents/types\";\nimport { requireAuth } from \"../../middleware/auth\";\nimport { canAccessThread } from \"../../utils/permissions\";\n\n/**\n * DELETE /api/threads/:id\n *\n * Delete a thread and all its associated data\n *\n * Returns:\n * - HTTP 200: { success: true, threadId: string }\n * - HTTP 401: Unauthorized\n * - HTTP 403: Forbidden (not owner)\n * - HTTP 404: Thread not found\n * - HTTP 500: Deletion error\n *\n * Note: This deletes:\n * - Thread record from DurableAgentBuilder\n * - All messages, tool calls, and logs from DurableThread storage\n * - The DurableThread instance itself is marked for deletion\n */\nexport default defineController<Env>(async ({ req, env, params }) => {\n // Require authentication\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n const auth = authResult;\n\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Missing thread ID\" }, { status: 400 });\n }\n\n // Get the root AgentBuilder DO\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId);\n\n // Check if thread exists\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Check access permission\n if (!canAccessThread(auth, thread)) {\n return Response.json(\n { error: \"Forbidden: You don't have access to this thread\" },\n { status: 403 }\n );\n }\n\n try {\n // Delete thread record from DurableAgentBuilder\n await agentBuilder.deleteThread(threadId);\n\n // Get DurableThread instance and call via RPC to delete its data\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method to delete DurableObject data\n await stub.deleteThread();\n\n return Response.json({\n success: true,\n threadId,\n message: \"Thread deleted successfully\",\n });\n } catch (error: any) {\n console.error(`Error deleting thread ${threadId}:`, error);\n\n return Response.json(\n {\n error: error.message || \"Failed to delete thread\",\n threadId,\n },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../router/index\";\nimport { requireAuth } from \"../../middleware/auth\";\nimport { canAccessThread } from \"../../utils/permissions\";\n\n/**\n * PATCH /api/threads/:id\n * Update thread metadata (e.g., tags, agent assignment)\n *\n * Returns:\n * - HTTP 200: Updated thread\n * - HTTP 400: Validation error\n * - HTTP 401: Unauthorized\n * - HTTP 403: Forbidden (not owner)\n * - HTTP 404: Thread not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, env, params }) => {\n if (req.method !== \"PATCH\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n\n // Require authentication\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n const auth = authResult;\n\n const threadId = params?.id as string;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n const body = await req.json() as { tags?: string[]; agent_id?: string };\n const { tags, agent_id } = body;\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n // Check if thread exists\n const existingThread = await agentBuilder.getThread(threadId);\n if (!existingThread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Check access permission\n if (!canAccessThread(auth, existingThread)) {\n return Response.json(\n { error: \"Forbidden: You don't have access to this thread\" },\n { status: 403 }\n );\n }\n\n // Build update data\n const updates: Record<string, any> = {};\n\n if (tags !== undefined) {\n if (!Array.isArray(tags)) {\n return Response.json(\n { error: \"tags must be an array of strings\" },\n { status: 400 }\n );\n }\n\n // Verify all tags are strings\n if (!tags.every((tag) => typeof tag === \"string\")) {\n return Response.json(\n { error: \"All tags must be strings\" },\n { status: 400 }\n );\n }\n\n updates.tags = tags;\n }\n\n if (agent_id !== undefined) {\n if (typeof agent_id !== \"string\") {\n return Response.json(\n { error: \"agent_id must be a string\" },\n { status: 400 }\n );\n }\n\n // Verify agent exists in TypeScript config via DurableThread\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId) as any;\n\n try {\n const agentDef = await stub.loadAgent(agent_id);\n if (!agentDef) {\n return Response.json(\n { error: `Agent not found: ${agent_id}` },\n { status: 404 }\n );\n }\n\n if (agentDef.type !== \"ai_human\") {\n return Response.json(\n { error: \"Only ai_human agents can be assigned to threads\" },\n { status: 400 }\n );\n }\n } catch (e) {\n return Response.json(\n { error: `Agent not found: ${agent_id}` },\n { status: 404 }\n );\n }\n\n updates.agent_name = agent_id;\n }\n\n if (Object.keys(updates).length === 0) {\n return Response.json(\n { error: \"No valid fields to update\" },\n { status: 400 }\n );\n }\n\n // Update thread in DurableAgentBuilder\n const updatedThread = await agentBuilder.updateThread(threadId, updates);\n\n return Response.json({\n id: updatedThread.id,\n agent_id: updatedThread.agent_name, // Map agent_name back to agent_id for API compat\n user_id: updatedThread.user_id,\n tags: updatedThread.tags || [],\n created_at: updatedThread.created_at,\n });\n } catch (error: any) {\n console.error(\"Error updating thread:\", error);\n return Response.json(\n { error: error.message || \"Failed to update thread\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../router/index\";\nimport { requireAuth } from \"../../middleware/auth\";\nimport { canAccessThread } from \"../../utils/permissions\";\nimport type { Env } from \"../../agents/types\";\n\n/**\n * Resolve an icon path to a full URL if it's an absolute path.\n * URLs are returned as-is, absolute paths get the origin prepended.\n */\nfunction resolveIconUrl(icon: string | undefined, origin: string): string | undefined {\n if (!icon) return undefined;\n // If it's already a URL (http/https), return as-is\n if (icon.startsWith('http://') || icon.startsWith('https://')) {\n return icon;\n }\n // If it's an absolute path, prepend the origin\n if (icon.startsWith('/')) {\n return `${origin}${icon}`;\n }\n // Otherwise return as-is (shouldn't happen with valid input)\n return icon;\n}\n\n/**\n * GET /api/threads/:id\n *\n * Get thread metadata from DurableAgentBuilder and stats from DurableObject\n *\n * Returns:\n * - HTTP 200: { thread, agent, stats }\n * - HTTP 401: Unauthorized\n * - HTTP 403: Forbidden (not owner)\n * - HTTP 404: Thread not found\n * - HTTP 500: Server error\n */\nexport default defineController<Env>(async ({ req, params, env }) => {\n // Require authentication\n const authResult = await requireAuth(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n const auth = authResult;\n\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // First, get thread from registry to check ownership\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId);\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Check access permission\n if (!canAccessThread(auth, thread)) {\n return Response.json(\n { error: \"Forbidden: You don't have access to this thread\" },\n { status: 403 }\n );\n }\n\n // Get DurableObject instance and call via RPC\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method directly - getThreadMeta already returns thread, agent, and stats\n const doData = await stub.getThreadMeta(threadId);\n\n if (!doData) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Resolve agent icon URL if it's an absolute path\n if (doData.agent?.icon) {\n const origin = new URL(req.url).origin;\n doData.agent.icon = resolveIconUrl(doData.agent.icon, origin);\n }\n\n return Response.json(doData);\n } catch (error: any) {\n console.error(`Error fetching thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to fetch thread\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { z } from 'zod';\n\n/**\n * Convert a Zod schema to JSON Schema format\n */\nfunction toJSONSchema(schema: any): any {\n if (!schema) return null;\n try {\n // If it's a Zod schema, convert it\n if (schema && typeof schema === 'object' && ('~standard' in schema || schema._def)) {\n return z.toJSONSchema(schema);\n }\n // Already JSON Schema or plain object\n return schema;\n } catch {\n return null;\n }\n}\n\n/**\n * GET /api/tools/:name\n *\n * Get details and schema for a specific tool.\n *\n * Returns:\n * - HTTP 200: { name, description, schema }\n * - HTTP 404: Tool not found\n */\nexport default defineController(async ({ params, tools }) => {\n const { name } = params;\n\n if (!tools || !tools[name]) {\n return Response.json({ error: 'Tool not found' }, { status: 404 });\n }\n\n try {\n const loader = tools[name];\n const toolResult = await loader() as [string, unknown, unknown];\n\n // Handle error case\n if (Array.isArray(toolResult) && typeof toolResult[0] === 'string' && toolResult[0].includes('error')) {\n return Response.json({\n name,\n description: '',\n schema: null,\n hasError: true,\n error: toolResult[0],\n });\n }\n\n // Normal case: [description, schema, handler]\n const [description, schema] = toolResult;\n\n return Response.json({\n name,\n description: description || '',\n schema: toJSONSchema(schema),\n hasError: false,\n });\n } catch (error) {\n console.error(`Error loading tool ${name}:`, error);\n return Response.json({\n name,\n description: '',\n schema: null,\n hasError: true,\n error: `Error loading tool: ${error}`,\n });\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { requireAdmin } from '../../middleware/auth.js';\n\n/**\n * DELETE /api/users/:id\n *\n * Delete a user (admin only).\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Returns:\n * - HTTP 200: { success: true }\n * - HTTP 401: Not authenticated\n * - HTTP 403: Not admin\n * - HTTP 404: User not found\n */\nexport default defineController(async ({ req, env, params }) => {\n try {\n const authResult = await requireAdmin(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n\n const { id } = params;\n\n if (!id) {\n return Response.json({ error: 'User ID is required' }, { status: 400 });\n }\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n // Check if user exists\n const user = await agentBuilder.getUserById(id);\n if (!user) {\n return Response.json({ error: 'User not found' }, { status: 404 });\n }\n\n await agentBuilder.deleteUser(id);\n\n return Response.json({ success: true });\n } catch (error: any) {\n console.error('Delete user error:', error);\n return Response.json(\n { error: error.message || 'Failed to delete user' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { requireAdmin } from '../../middleware/auth.js';\nimport { hashPassword } from '../../utils/auth.js';\n\n/**\n * PUT /api/users/:id\n *\n * Update a user (admin only).\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Body:\n * - username?: string\n * - password?: string (will be hashed)\n * - role?: string\n *\n * Returns:\n * - HTTP 200: { user: { id, username, role, created_at, updated_at } }\n * - HTTP 401: Not authenticated\n * - HTTP 403: Not admin\n * - HTTP 404: User not found\n * - HTTP 409: Username already taken\n */\nexport default defineController(async ({ req, env, params }) => {\n try {\n const authResult = await requireAdmin(req, env);\n if (authResult instanceof Response) {\n return authResult;\n }\n\n const { id } = params;\n\n if (!id) {\n return Response.json({ error: 'User ID is required' }, { status: 400 });\n }\n\n const body = await req.json() as { username?: string; password?: string; role?: string };\n const { username, password, role } = body;\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n // Check if user exists\n const existingUser = await agentBuilder.getUserById(id);\n if (!existingUser) {\n return Response.json({ error: 'User not found' }, { status: 404 });\n }\n\n // If changing username, check it's not taken by another user\n if (username && username !== existingUser.username) {\n const userWithUsername = await agentBuilder.getUserByUsername(username);\n if (userWithUsername && userWithUsername.id !== id) {\n return Response.json(\n { error: 'Username already taken' },\n { status: 409 }\n );\n }\n }\n\n // Build update params\n const updateParams: {\n username?: string;\n password_hash?: string;\n role?: 'admin';\n } = {};\n\n if (username) {\n updateParams.username = username;\n }\n if (password) {\n updateParams.password_hash = await hashPassword(password);\n }\n if (role) {\n updateParams.role = role as 'admin';\n }\n\n const updatedUser = await agentBuilder.updateUser(id, updateParams);\n\n return Response.json({\n user: {\n id: updatedUser.id,\n username: updatedUser.username,\n role: updatedUser.role,\n created_at: updatedUser.created_at,\n updated_at: updatedUser.updated_at,\n },\n });\n } catch (error: any) {\n console.error('Update user error:', error);\n return Response.json(\n { error: error.message || 'Failed to update user' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router';\n\n/**\n * GET /api/auth/config\n * Returns which authentication providers are configured\n */\nexport default defineController(async ({ env }) => {\n // Check which OAuth providers are configured by looking for their env vars\n const githubConfigured = !!(env.GITHUB_CLIENT_ID && env.GITHUB_CLIENT_SECRET);\n const googleConfigured = !!(env.GOOGLE_CLIENT_ID && env.GOOGLE_CLIENT_SECRET);\n\n return {\n github: githubConfigured,\n google: googleConfigured,\n };\n});\n","import { defineController } from '../../router/index.js';\nimport type { Env } from '../../agents/types.js';\nimport {\n verifyPassword,\n generateUserToken,\n hashToken,\n generateSuperAdminToken,\n} from '../../utils/auth.js';\n\n/**\n * POST /api/auth/login\n *\n * Authenticate a user with username/password or super admin password.\n *\n * Body:\n * - username: string (optional if using super admin)\n * - password: string\n *\n * Returns:\n * - HTTP 200: { token, user: { id, username, role } }\n * - HTTP 401: Invalid credentials\n * - HTTP 400: Missing required fields\n */\nexport default defineController<Env>(async ({ req, env }) => {\n try {\n const body = await req.json() as { username?: string; password?: string };\n const { username, password } = body;\n\n if (!password) {\n return Response.json(\n { error: 'Password is required' },\n { status: 400 }\n );\n }\n\n // Check for super admin login (requires username \"admin\" + SUPER_ADMIN_PASSWORD)\n if (env.SUPER_ADMIN_PASSWORD && username === 'admin' && password === env.SUPER_ADMIN_PASSWORD) {\n // Generate a signed super admin token\n if (!env.ENCRYPTION_KEY) {\n return Response.json(\n { error: 'Server misconfigured: ENCRYPTION_KEY required for super admin' },\n { status: 500 }\n );\n }\n\n const token = await generateSuperAdminToken(env.ENCRYPTION_KEY);\n\n return Response.json({\n token,\n user: {\n id: 'super_admin',\n username: 'admin',\n role: 'admin',\n },\n });\n }\n\n // Regular user login requires username\n if (!username) {\n return Response.json(\n { error: 'Username is required' },\n { status: 400 }\n );\n }\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n // Look up user\n const user = await agentBuilder.getUserByUsername(username);\n\n if (!user) {\n return Response.json(\n { error: 'Invalid username or password' },\n { status: 401 }\n );\n }\n\n // Verify password\n const isValid = await verifyPassword(password, user.password_hash);\n\n if (!isValid) {\n return Response.json(\n { error: 'Invalid username or password' },\n { status: 401 }\n );\n }\n\n // Generate session token\n const token = generateUserToken();\n const tokenHash = await hashToken(token);\n\n // Create session (expires in 30 days)\n const expiresAt = Math.floor(Date.now() / 1000) + 30 * 24 * 60 * 60;\n await agentBuilder.createSession({\n user_id: user.id,\n token_hash: tokenHash,\n expires_at: expiresAt,\n });\n\n return Response.json({\n token,\n user: {\n id: user.id,\n username: user.username,\n role: user.role,\n },\n });\n } catch (error: any) {\n console.error('Login error:', error);\n return Response.json(\n { error: error.message || 'Login failed' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { hashToken, isValidUserToken } from '../../utils/auth.js';\n\n/**\n * POST /api/auth/logout\n *\n * Log out the current user by invalidating their session.\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Returns:\n * - HTTP 200: { success: true }\n * - HTTP 401: Invalid or missing token\n */\nexport default defineController(async ({ req, env }) => {\n try {\n const authHeader = req.headers.get('Authorization');\n\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n return Response.json({ error: 'Unauthorized' }, { status: 401 });\n }\n\n const token = authHeader.substring(7);\n\n // Super admin tokens don't have sessions to delete\n if (token.includes('.')) {\n // It's a signed token (super admin), just return success\n return Response.json({ success: true });\n }\n\n // Regular user token - delete session\n if (isValidUserToken(token)) {\n const tokenHash = await hashToken(token);\n\n // Get DurableAgentBuilder singleton\n const agentBuilderId = env.AGENT_BUILDER.idFromName('singleton');\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n\n await agentBuilder.deleteSession(tokenHash);\n }\n\n return Response.json({ success: true });\n } catch (error: any) {\n console.error('Logout error:', error);\n return Response.json(\n { error: error.message || 'Logout failed' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\nimport { authenticate } from '../../middleware/auth.js';\n\n/**\n * GET /api/auth/me\n *\n * Get the current authenticated user's information.\n *\n * Headers:\n * - Authorization: Bearer <token>\n *\n * Returns:\n * - HTTP 200: { user: { id, username, role }, authType }\n * - HTTP 401: Not authenticated\n */\nexport default defineController(async ({ req, env }) => {\n try {\n const authContext = await authenticate(req, env);\n\n if (!authContext) {\n return Response.json({ error: 'Unauthorized' }, { status: 401 });\n }\n\n return Response.json({\n user: authContext.user,\n authType: authContext.authType,\n });\n } catch (error: any) {\n console.error('Auth check error:', error);\n return Response.json(\n { error: error.message || 'Authentication check failed' },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\n\n/**\n * Provider configurations with their API endpoints\n */\nconst PROVIDER_CONFIGS: Record<\n string,\n {\n sdk: string;\n modelsEndpoint: string;\n envKey: string;\n headers: (apiKey: string) => Record<string, string>;\n parseResponse: (data: any) => Array<{\n value: string;\n label: string;\n description: string;\n slug?: string;\n iconId?: string;\n }>;\n }\n> = {\n openai: {\n sdk: 'openai',\n modelsEndpoint: 'https://api.openai.com/v1/models',\n envKey: 'OPENAI_API_KEY',\n headers: (apiKey) => ({\n Authorization: `Bearer ${apiKey}`,\n }),\n parseResponse: (data) => {\n // Filter to only include common chat models, not fine-tuned or deprecated ones\n const chatModelPrefixes = [\n 'gpt-4',\n 'gpt-3.5',\n 'o1',\n 'o3',\n 'chatgpt',\n ];\n\n return data.data\n .filter((model: any) => {\n const id = model.id.toLowerCase();\n return chatModelPrefixes.some((prefix) => id.startsWith(prefix));\n })\n .map((model: any) => ({\n value: model.id,\n label: model.id,\n description: `Owned by ${model.owned_by}`,\n iconId: 'openai',\n }))\n .sort((a: any, b: any) => a.label.localeCompare(b.label));\n },\n },\n openrouter: {\n sdk: 'openrouter',\n modelsEndpoint: 'https://openrouter.ai/api/v1/models',\n envKey: 'OPENROUTER_API_KEY',\n headers: () => ({}), // OpenRouter models endpoint doesn't require auth\n parseResponse: (data) => {\n return data.data\n .map((model: any) => ({\n value: model.id,\n label: model.name || model.id,\n description: model.description?.slice(0, 150) + (model.description?.length > 150 ? '...' : '') || '',\n slug: model.canonical_slug || model.id,\n iconId: model.id.split('/')[0], // e.g., \"anthropic\" from \"anthropic/claude-3\"\n }))\n .sort((a: any, b: any) => a.label.localeCompare(b.label));\n },\n },\n};\n\n/**\n * POST /api/models/available\n *\n * Fetch available models from a provider's API.\n *\n * Request body:\n * - provider: string - The provider name (e.g., \"openai\", \"openrouter\")\n *\n * Returns:\n * - HTTP 200: { models: Array<{ value, label, description, slug?, iconId? }> }\n * - HTTP 400: { error: string } - Missing or invalid provider\n * - HTTP 401: { error: string } - Missing API key for provider\n * - HTTP 500: { error: string } - Failed to fetch models\n */\nexport default defineController(async ({ req, env }) => {\n const body = await req.json().catch(() => ({}));\n const { provider } = body as { provider?: string };\n\n if (!provider) {\n return Response.json({ error: 'Provider is required' }, { status: 400 });\n }\n\n const config = PROVIDER_CONFIGS[provider];\n if (!config) {\n return Response.json(\n { error: `Unknown provider: ${provider}. Supported: ${Object.keys(PROVIDER_CONFIGS).join(', ')}` },\n { status: 400 }\n );\n }\n\n const apiKey = env[config.envKey] as string | undefined;\n\n // OpenRouter doesn't require API key for listing models\n if (!apiKey && config.sdk !== 'openrouter') {\n return Response.json(\n { error: `API key not configured for ${provider}. Set ${config.envKey} environment variable.` },\n { status: 401 }\n );\n }\n\n try {\n const response = await fetch(config.modelsEndpoint, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...config.headers(apiKey || ''),\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(`Failed to fetch models from ${provider}:`, errorText);\n return Response.json(\n { error: `Failed to fetch models from ${provider}: ${response.statusText}` },\n { status: response.status }\n );\n }\n\n const data = await response.json();\n const models = config.parseResponse(data);\n\n return Response.json({ models });\n } catch (error: any) {\n console.error(`Error fetching models from ${provider}:`, error);\n return Response.json(\n { error: `Failed to fetch models: ${error.message}` },\n { status: 500 }\n );\n }\n});\n","import { defineController } from '../../router/index.js';\n\n/**\n * POST /api/models/endpoints\n *\n * Fetch available provider endpoints for a specific OpenRouter model.\n * This allows users to select which providers can serve a particular model.\n *\n * Request body:\n * - provider: string - The provider name (must be OpenRouter)\n * - modelSlug: string - The model slug (e.g., \"anthropic/claude-3-opus\")\n *\n * Returns:\n * - HTTP 200: { endpoints: Array<{ id, name, pricing, quantization?, maxPromptTokens?, maxCompletionTokens? }> }\n * - HTTP 400: { error: string } - Missing parameters or non-OpenRouter provider\n * - HTTP 404: { error: string } - Model not found\n * - HTTP 500: { error: string } - Failed to fetch endpoints\n */\nexport default defineController(async ({ req, env }) => {\n const body = await req.json().catch(() => ({}));\n const { provider, modelSlug } = body as { provider?: string; modelSlug?: string };\n\n if (!provider || !modelSlug) {\n return Response.json(\n { error: 'Provider and modelSlug are required' },\n { status: 400 }\n );\n }\n\n // This endpoint only works for OpenRouter\n if (provider !== 'openrouter') {\n return Response.json(\n { error: 'Endpoints are only available for OpenRouter provider' },\n { status: 400 }\n );\n }\n\n // Parse the model slug into author/slug format\n // e.g., \"deepseek/deepseek-r1\" -> author: \"deepseek\", slug: \"deepseek-r1\"\n const slashIndex = modelSlug.indexOf('/');\n if (slashIndex === -1) {\n return Response.json(\n { error: `Invalid model slug format: ${modelSlug}. Expected format: author/model-name` },\n { status: 400 }\n );\n }\n\n const author = modelSlug.substring(0, slashIndex);\n const slug = modelSlug.substring(slashIndex + 1);\n\n try {\n // Fetch endpoints from OpenRouter using their dedicated endpoints API\n // GET /api/v1/models/:author/:slug/endpoints\n const response = await fetch(`https://openrouter.ai/api/v1/models/${author}/${slug}/endpoints`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n return Response.json(\n { error: `Model not found: ${modelSlug}` },\n { status: 404 }\n );\n }\n const errorText = await response.text();\n console.error(`Failed to fetch endpoints from OpenRouter:`, errorText);\n return Response.json(\n { error: `Failed to fetch endpoints: ${response.statusText}` },\n { status: response.status }\n );\n }\n\n const data = await response.json();\n\n // Parse the endpoint data from the response\n const endpoints = parseOpenRouterEndpoints(data);\n\n return Response.json({ endpoints });\n } catch (error: any) {\n console.error(`Error fetching endpoints for ${modelSlug}:`, error);\n return Response.json(\n { error: `Failed to fetch endpoints: ${error.message}` },\n { status: 500 }\n );\n }\n});\n\n/**\n * Parse OpenRouter endpoints response to extract provider information\n */\nfunction parseOpenRouterEndpoints(data: any): Array<{\n id: string;\n name: string;\n pricing: { prompt: number; completion: number };\n quantization?: string;\n maxPromptTokens?: number;\n maxCompletionTokens?: number;\n}> {\n // Response structure: { data: { endpoints: [...] } }\n const model = data.data || data;\n const endpointsArray = model.endpoints || [];\n\n if (!Array.isArray(endpointsArray) || endpointsArray.length === 0) {\n return [];\n }\n\n return endpointsArray.map((endpoint: any) => ({\n // Use 'tag' as the ID since it's the provider identifier used for routing\n id: endpoint.tag || endpoint.provider_name || endpoint.name,\n name: endpoint.name || endpoint.provider_name || endpoint.tag,\n pricing: {\n // Pricing values come as strings, convert to numbers\n prompt: parseFloat(endpoint.pricing?.prompt) || 0,\n completion: parseFloat(endpoint.pricing?.completion) || 0,\n },\n quantization: endpoint.quantization,\n maxPromptTokens: endpoint.max_prompt_tokens || endpoint.context_length,\n maxCompletionTokens: endpoint.max_completion_tokens,\n }));\n}\n","import { defineController } from \"../../../router/index\";\n\n/**\n * GET /api/threads/:id/cost\n *\n * Get cost breakdown for a thread, including:\n * - Total cost across all logs\n * - Cost breakdown by model\n * - Average cost per message\n * - Average cost per message per model\n *\n * Returns:\n * - HTTP 200: { totalCost, modelBreakdown, avgCostPerMessage, avgCostPerMessageByModel }\n * - HTTP 404: Thread not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Get all logs with cost data (no pagination)\n const logsResult = await stub.getLogs(10000, 0, \"ASC\");\n const logs = logsResult.logs || [];\n\n // Calculate total cost and group by model name\n let totalCost = 0;\n const modelCosts: Record<\n string,\n { totalCost: number; count: number }\n > = {};\n\n // Count unique messages for average calculation\n const uniqueMessages = new Set<string>();\n\n for (const log of logs) {\n const cost = log.cost_total;\n if (cost !== null && cost !== undefined && !isNaN(cost)) {\n totalCost += cost;\n\n // Track unique messages\n if (log.message_id) {\n uniqueMessages.add(log.message_id);\n }\n\n // Group by model name (not ID)\n const modelKey = log.model_name || log.model || \"unknown\";\n if (!modelCosts[modelKey]) {\n modelCosts[modelKey] = {\n totalCost: 0,\n count: 0,\n };\n }\n modelCosts[modelKey].totalCost += cost;\n modelCosts[modelKey].count += 1;\n }\n }\n\n // Calculate averages\n const messageCount = uniqueMessages.size;\n const avgCostPerMessage = messageCount > 0 ? totalCost / messageCount : 0;\n\n // Calculate average per message per model\n const avgCostPerMessageByModel: Record<\n string,\n { avgCost: number; messageCount: number }\n > = {};\n\n for (const [modelName, data] of Object.entries(modelCosts)) {\n avgCostPerMessageByModel[modelName] = {\n avgCost: data.count > 0 ? data.totalCost / data.count : 0,\n messageCount: data.count,\n };\n }\n\n // Format model breakdown for response\n const modelBreakdown = Object.entries(modelCosts).map(([modelName, data]) => ({\n modelName,\n totalCost: data.totalCost,\n requestCount: data.count,\n avgCostPerRequest: data.count > 0 ? data.totalCost / data.count : 0,\n }));\n\n return Response.json({\n totalCost,\n messageCount,\n avgCostPerMessage,\n modelBreakdown,\n avgCostPerMessageByModel,\n });\n } catch (error: any) {\n console.error(`Error calculating cost for thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to calculate costs\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../../router/index\";\n\n/**\n * File System Root API\n *\n * Routes:\n * - GET /api/threads/:id/fs?stats=1 - Get storage statistics\n * - GET /api/threads/:id/fs?grep=pattern - Search file contents\n * - GET /api/threads/:id/fs?find=pattern - Find files by path pattern\n * - GET /api/threads/:id/fs - List root directory\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n if (req.method !== \"GET\") {\n return Response.json(\n { error: `Method ${req.method} not allowed` },\n { status: 405 }\n );\n }\n\n const url = new URL(req.url);\n\n try {\n // Get DurableObject instance\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId) as any;\n\n // Storage stats\n if (url.searchParams.has(\"stats\")) {\n const result = await stub.getFileStats();\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 500 });\n }\n return Response.json(result.stats);\n }\n\n // Full-text search (grep)\n const grepPattern = url.searchParams.get(\"grep\");\n if (grepPattern) {\n const path = url.searchParams.get(\"path\") || undefined;\n const limit = parseInt(url.searchParams.get(\"limit\") || \"100\", 10);\n\n const result = await stub.grepFiles(grepPattern, { path, limit });\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 500 });\n }\n return Response.json({ results: result.results, pattern: grepPattern });\n }\n\n // Find by path pattern\n const findPattern = url.searchParams.get(\"find\");\n if (findPattern) {\n const type = url.searchParams.get(\"type\") as \"file\" | \"directory\" | \"all\" | null;\n const limit = parseInt(url.searchParams.get(\"limit\") || \"100\", 10);\n\n const result = await stub.findFiles(findPattern, {\n type: type || \"all\",\n limit,\n });\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 500 });\n }\n return Response.json({ files: result.files, pattern: findPattern });\n }\n\n // Default: list root directory\n const result = await stub.readdirFile(\"/\");\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 500 });\n }\n return Response.json({ files: result.files, path: \"/\" });\n } catch (error: any) {\n console.error(`Error in fs root API for thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"File operation failed\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../router/index\";\n\n/**\n * GET /api/threads/:id/logs\n *\n * Get logs from a thread's DurableObject\n *\n * Query parameters:\n * - limit: number (default: 100)\n * - offset: number (default: 0)\n * - order: \"asc\" | \"desc\" (default: \"desc\")\n *\n * Returns:\n * - HTTP 200: { logs: Log[], total: number, hasMore: boolean }\n * - HTTP 404: Thread not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, params, env }) => {\n const url = new URL(req.url);\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Parse query parameters\n const limit = parseInt(url.searchParams.get(\"limit\") || \"100\", 10);\n const offset = parseInt(url.searchParams.get(\"offset\") || \"0\", 10);\n const order = url.searchParams.get(\"order\") === \"desc\" ? \"DESC\" : \"ASC\";\n\n // WebSocket upgrade for live log streaming\n if (req.headers.get(\"upgrade\")?.toLowerCase() === \"websocket\") {\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n // Forward the original upgrade request to the DurableObject\n return await stub.fetch(req);\n }\n\n // Get DurableObject instance and call via RPC for initial logs\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method directly\n const result = await stub.getLogs(limit, offset, order);\n\n return Response.json(result);\n } catch (error: any) {\n console.error(`Error fetching logs for thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to fetch logs\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../router/index\";\n\n/**\n * GET /api/threads/:id/messages\n *\n * Get messages from a thread's DurableObject\n *\n * By default, returns the newest messages (when truncating) in chronological order\n * (oldest first in array, newest last). This is ideal for chat UIs where you append\n * messages and scroll to the bottom.\n *\n * Query parameters:\n * - limit: number (default: 100) - Number of messages to return\n * - offset: number (default: 0) - Number of newest messages to skip (for scrolling up)\n * - order: \"asc\" | \"desc\" (default: \"desc\") - Internal fetch order (affects truncation)\n * - includeSilent: \"true\" | \"false\" (default: \"false\") - Include silent messages (UI-only)\n * - depth: number (default: 0) - Maximum depth to include (0 = top-level only, 1+ = include sub-prompts)\n *\n * Examples:\n * - GET /api/threads/:id/messages?limit=10\n * Returns newest 10 messages in chronological order [oldest...newest]\n *\n * - GET /api/threads/:id/messages?limit=10&offset=10\n * Skips newest 10, returns next 10 older messages in chronological order\n * (for scrolling up to view history)\n *\n * - GET /api/threads/:id/messages?order=asc\n * Returns oldest messages first (different truncation behavior)\n *\n * - GET /api/threads/:id/messages?includeSilent=true\n * Includes silent messages (hidden from LLM, visible in UI)\n *\n * - GET /api/threads/:id/messages?depth=1\n * Includes messages up to depth 1 (top-level + first level of sub-prompts)\n *\n * Returns:\n * - HTTP 200: { messages: Message[], total: number, hasMore: boolean }\n * - HTTP 404: Thread not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, params, env }) => {\n const url = new URL(req.url);\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Parse query parameters\n const limit = parseInt(url.searchParams.get(\"limit\") || \"100\", 10);\n const offset = parseInt(url.searchParams.get(\"offset\") || \"0\", 10);\n const order = url.searchParams.get(\"order\") === \"asc\" ? \"ASC\" : \"DESC\";\n const includeSilent = url.searchParams.get(\"includeSilent\") === \"true\";\n const maxDepth = parseInt(url.searchParams.get(\"depth\") || \"0\", 10);\n\n // Get DurableObject instance and call via RPC\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method directly\n const result = await stub.getMessages(\n limit,\n offset,\n order,\n includeSilent,\n maxDepth\n );\n\n return Response.json(result);\n } catch (error: any) {\n console.error(`Error fetching messages for thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to fetch messages\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../router/index\";\nimport type { AttachmentRef } from \"../../../agents/types\";\n\n// Helper to check if image needs processing (>2MB or unsupported format)\nfunction needsProcessing(base64Data: string, mimeType: string): boolean {\n // Estimate binary size from base64 (base64 is ~4/3 of binary size)\n const binarySize = Math.ceil(base64Data.length * 3 / 4);\n const MAX_SIZE = 2 * 1024 * 1024; // 2MB\n\n // Process if over 2MB\n if (binarySize > MAX_SIZE) {\n return true;\n }\n\n // Process if not JPEG or PNG (convert to JPEG)\n if (mimeType !== \"image/jpeg\" && mimeType !== \"image/png\") {\n return true;\n }\n\n return false;\n}\n\n/**\n * Attachment in request body\n */\ninterface AttachmentPayload {\n name: string;\n mimeType: string;\n data: string; // base64 encoded\n width?: number; // For images\n height?: number; // For images\n thumbnail?: string; // base64 encoded thumbnail\n}\n\n/**\n * Request body type\n */\ninterface MessagePayload {\n content: string;\n role: \"user\" | \"assistant\" | \"system\";\n attachments?: AttachmentPayload[];\n silent?: boolean;\n}\n\n/**\n * POST /api/threads/:id/messages\n *\n * Send a new message to the thread and trigger agent execution\n *\n * Body:\n * - content: string (message content)\n * - role: \"user\" | \"assistant\" | \"system\" (which side is sending)\n * - attachments?: Array of file attachments\n * - name: string (filename)\n * - mimeType: string\n * - data: string (base64 encoded)\n * - width?: number (for images)\n * - height?: number (for images)\n * - thumbnail?: string (base64 encoded thumbnail)\n * - silent?: boolean (hide from LLM context)\n *\n * Returns:\n * - HTTP 202: Message queued for processing\n * - HTTP 404: Thread not found\n * - HTTP 400: Invalid request\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Parse request body\n const body = (await req.json()) as MessagePayload;\n const { content = \"\", role, attachments, silent } = body;\n\n // Require either content or attachments\n const hasContent = content && typeof content === \"string\" && content.trim().length > 0;\n const hasAttachments = attachments && Array.isArray(attachments) && attachments.length > 0;\n\n if (!hasContent && !hasAttachments) {\n return Response.json(\n { error: \"Message content or attachments required\" },\n { status: 400 }\n );\n }\n\n // Get DurableObject instance\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId) as any;\n\n // Process attachments if present\n let attachmentRefs: AttachmentRef[] | undefined;\n\n if (attachments && attachments.length > 0) {\n attachmentRefs = [];\n\n for (const attachment of attachments) {\n // Generate unique ID and path for attachment\n const attachmentId = crypto.randomUUID();\n const timestamp = Date.now();\n\n // Start with original values\n let fileData = attachment.data;\n let mimeType = attachment.mimeType;\n let width = attachment.width;\n let height = attachment.height;\n\n // Process images if needed (>2MB or unsupported format)\n // Processing happens inside the DurableObject where WASM is initialized\n if (mimeType.startsWith(\"image/\") && needsProcessing(fileData, mimeType)) {\n try {\n const originalSize = Math.ceil(fileData.length * 3 / 4);\n const processed = await stub.processImage(fileData, mimeType);\n\n if (processed.success && processed.data) {\n fileData = processed.data;\n mimeType = processed.mimeType!;\n width = processed.width;\n height = processed.height;\n\n const newSize = Math.ceil(fileData.length * 3 / 4);\n console.log(\n `[image-processing] Processed ${attachment.name}: ` +\n `${(originalSize / 1024 / 1024).toFixed(2)}MB → ${(newSize / 1024 / 1024).toFixed(2)}MB, ` +\n `${processed.width}x${processed.height}, ${processed.mimeType}`\n );\n } else {\n console.error(`[image-processing] Failed to process ${attachment.name}:`, processed.error);\n // Continue with original data if processing fails\n }\n } catch (err) {\n console.error(`[image-processing] Failed to process ${attachment.name}:`, err);\n // Continue with original data if processing fails\n }\n }\n\n // Determine file extension based on (potentially updated) mimeType\n const ext = mimeType === \"image/png\" ? \"png\" :\n mimeType === \"image/jpeg\" ? \"jpg\" :\n attachment.name.split(\".\").pop() || \"bin\";\n const path = `/attachments/${timestamp}-${attachmentId}.${ext}`;\n\n // Store file in thread's file system\n const base64Size = fileData.length;\n const binarySize = Math.ceil(base64Size * 3 / 4);\n console.log(`[writeFile] Storing ${attachment.name}: ${(binarySize / 1024 / 1024).toFixed(2)}MB binary (${(base64Size / 1024 / 1024).toFixed(2)}MB base64) to ${path}`);\n\n const result = await stub.writeFile(\n path,\n fileData,\n mimeType,\n {\n thumbnail: attachment.thumbnail,\n width,\n height,\n }\n );\n\n console.log(`[writeFile] Result:`, result.success ? 'success' : result.error);\n\n if (!result.success) {\n console.error(`Failed to store attachment ${attachment.name}:`, result.error);\n continue;\n }\n\n // Create attachment reference\n const ref: AttachmentRef = {\n id: attachmentId,\n type: \"file\",\n path,\n name: attachment.name,\n mimeType: mimeType,\n };\n\n if (width) ref.width = width;\n if (height) ref.height = height;\n\n attachmentRefs.push(ref);\n }\n }\n\n // Send message with attachments\n const attachmentsJson = attachmentRefs && attachmentRefs.length > 0\n ? JSON.stringify(attachmentRefs)\n : undefined;\n return await stub.sendMessage(threadId, content, role, attachmentsJson);\n } catch (error: any) {\n console.error(`Error sending message to thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to send message\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../router/index\";\n\n/**\n * RPC endpoint for calling DurableThread methods\n * Used primarily for testing\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n // Parse request body\n const body = await req.json() as { method?: string; args?: unknown[] };\n const { method, args = [] } = body;\n\n if (!method) {\n return Response.json({ error: \"Method required\" }, { status: 400 });\n }\n\n try {\n // Get the DurableThread instance\n const id = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const thread = env.AGENT_BUILDER_THREAD.get(id);\n\n // Call the method via RPC\n // @ts-ignore - Dynamic RPC call\n const result = await thread[method](...args);\n\n // If result is a Response, return it directly\n if (result instanceof Response) {\n return result;\n }\n\n // Otherwise wrap in JSON response\n return Response.json(result);\n } catch (error: any) {\n console.error(`RPC call to ${method} failed:`, error);\n return Response.json(\n { error: error.message || \"RPC call failed\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../router/index\";\n\n/**\n * POST /api/threads/:id/stop\n *\n * Stop the currently executing thread\n *\n * Returns:\n * - HTTP 200: Thread stopped successfully or not currently running\n * - HTTP 404: Thread not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ params, env }) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance and call via RPC\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method directly\n return await stub.stop();\n } catch (error: any) {\n console.error(`Error stopping thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to stop thread\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../router/index\";\n\n/**\n * GET /api/threads/:id/stream\n *\n * WebSocket endpoint for real-time message streaming\n *\n * This endpoint is specifically for message updates and should be used\n * by applications that want to receive real-time message data without\n * getting internal log/telemetry information.\n *\n * Returns:\n * - HTTP 101: WebSocket upgrade for message streaming\n * - HTTP 400: Not a WebSocket upgrade request\n * - HTTP 404: Thread not found\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n // Only handle WebSocket upgrades\n if (req.headers.get(\"upgrade\")?.toLowerCase() !== \"websocket\") {\n return Response.json(\n { error: \"This endpoint only supports WebSocket connections\" },\n { status: 400 }\n );\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Forward WebSocket upgrade to DurableObject\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n return await stub.fetch(req);\n } catch (error: any) {\n console.error(`Error handling message stream for thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to establish message stream\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../../router/index\";\nimport type { FileRecord } from \"../../../../agents/types.js\";\n\n// Must match CHUNK_SIZE in files.ts\nconst CHUNK_SIZE = 1.75 * 1024 * 1024; // 1.75MB\n\n/**\n * Convert FileRecord to AttachmentRef format for client consumption\n */\nfunction toAttachmentRef(file: FileRecord): {\n id: string;\n type: \"file\";\n path: string;\n name: string;\n mimeType: string;\n size: number;\n width?: number;\n height?: number;\n} {\n // Use direct width/height columns, fall back to metadata for backwards compatibility\n const metadata = file.metadata as { width?: number; height?: number } | null;\n const width = file.width ?? metadata?.width;\n const height = file.height ?? metadata?.height;\n\n return {\n id: file.path, // Use path as unique ID\n type: \"file\",\n path: file.path,\n name: file.name,\n mimeType: file.mimeType,\n size: file.size,\n ...(width && { width }),\n ...(height && { height }),\n };\n}\n\n/**\n * File System API for DurableThread\n *\n * Routes:\n * - GET /api/threads/:id/fs/*path - Get file data or list directory\n * - GET /api/threads/:id/fs/*path?thumbnail=1 - Get thumbnail (images only)\n * - GET /api/threads/:id/fs?stats=1 - Get storage stats\n * - POST /api/threads/:id/fs/*path - Write file (auto-chunks large files)\n * - DELETE /api/threads/:id/fs/*path - Delete file or empty directory\n *\n * Path is a catch-all parameter, e.g.:\n * - /api/threads/abc/fs/images/photo.jpg -> path = \"images/photo.jpg\"\n * - /api/threads/abc/fs/docs/2024/report.pdf -> path = \"docs/2024/report.pdf\"\n */\nexport default defineController(async ({ req, params, env }) => {\n console.log('[fs] params received:', JSON.stringify(params));\n\n const threadId = params.id;\n // rou3 uses \"_\" for catch-all wildcard params, or check for \"path\" or \"*\"\n const pathParam = params._ || params.path || params['*'] || '';\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n console.log('[fs] threadId:', threadId, 'pathParam:', pathParam);\n\n // Normalize path - ensure it starts with /\n const path = pathParam ? `/${pathParam}` : \"/\";\n const url = new URL(req.url);\n\n try {\n // Get DurableObject instance\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId) as any;\n\n // Check for chunked upload routes\n // Pattern: /path/to/file/upload/start, /path/to/file/upload/chunk/0, /path/to/file/upload/complete\n const uploadMatch = path.match(/^(.+)\\/upload\\/(start|complete|chunk\\/(\\d+))$/);\n if (uploadMatch) {\n const filePath = uploadMatch[1];\n const action = uploadMatch[2];\n const chunkIndex = uploadMatch[3] ? parseInt(uploadMatch[3], 10) : undefined;\n\n if (action === \"start\" && req.method === \"POST\") {\n return handleChunkedUploadStart(stub, filePath, req);\n }\n if (action === \"complete\" && req.method === \"POST\") {\n return handleChunkedUploadComplete(stub, filePath, req);\n }\n if (action.startsWith(\"chunk/\") && req.method === \"PUT\" && chunkIndex !== undefined) {\n return handleChunkedUploadChunk(stub, filePath, chunkIndex, req);\n }\n\n return Response.json(\n { error: `Invalid upload action: ${action} with method ${req.method}` },\n { status: 400 }\n );\n }\n\n // Handle based on HTTP method\n switch (req.method) {\n case \"GET\":\n return handleGet(stub, path, url);\n case \"POST\":\n return handlePost(stub, path, req);\n case \"DELETE\":\n return handleDelete(stub, path);\n default:\n return Response.json(\n { error: `Method ${req.method} not allowed` },\n { status: 405 }\n );\n }\n } catch (error: any) {\n console.error(`Error in fs API for thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"File operation failed\" },\n { status: 500 }\n );\n }\n});\n\n/**\n * Handle GET requests - fetch file data, directory listing, or stats\n */\nasync function handleGet(stub: any, path: string, url: URL): Promise<Response> {\n // Check for stats request\n if (url.searchParams.has(\"stats\")) {\n const result = await stub.getFileStats();\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 500 });\n }\n return Response.json(result.stats);\n }\n\n // Check for thumbnail request\n if (url.searchParams.has(\"thumbnail\")) {\n const result = await stub.getFileThumbnail(path);\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 404 });\n }\n\n // Return binary thumbnail data\n const binary = atob(result.data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n return new Response(bytes, {\n headers: {\n \"Content-Type\": \"image/jpeg\", // Thumbnails are typically JPEG\n \"Cache-Control\": \"public, max-age=31536000\", // Cache for 1 year\n },\n });\n }\n\n // Get file info first\n const statResult = await stub.statFile(path);\n\n if (!statResult.success) {\n return Response.json({ error: \"Not found\" }, { status: 404 });\n }\n\n const file = statResult.file;\n\n // If it's a directory, list contents\n if (file.isDirectory) {\n const result = await stub.readdirFile(path);\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 500 });\n }\n return Response.json({ files: result.files, path });\n }\n\n // If it's an external file, return metadata only\n if (file.storage !== \"local\") {\n return Response.json({\n file,\n external: true,\n location: file.location,\n });\n }\n\n // For local files, check if client wants JSON metadata or raw data\n const acceptHeader = url.searchParams.get(\"format\") || \"auto\";\n\n if (acceptHeader === \"json\") {\n // Return file metadata as JSON\n return Response.json({ file });\n }\n\n // For chunked files, stream chunks directly to avoid memory issues\n if (file.isChunked && file.chunkCount) {\n return streamChunkedFile(stub, path, file);\n }\n\n // Return raw file data with appropriate content type\n const result = await stub.readFile(path);\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 404 });\n }\n\n // Convert base64 to binary\n const binary = atob(result.data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n\n return new Response(bytes, {\n headers: {\n \"Content-Type\": file.mimeType,\n \"Content-Length\": String(file.size),\n \"Content-Disposition\": `inline; filename=\"${file.name}\"`,\n },\n });\n}\n\n/**\n * Stream a chunked file directly to response, reading one chunk at a time.\n * This avoids loading the entire file into memory.\n */\nfunction streamChunkedFile(\n stub: any,\n path: string,\n file: { name: string; mimeType: string; size: number; chunkCount: number }\n): Response {\n const { readable, writable } = new TransformStream();\n const writer = writable.getWriter();\n\n // Stream chunks in background\n (async () => {\n try {\n for (let i = 0; i < file.chunkCount; i++) {\n const result = await stub.readFileChunk(path, i);\n if (!result.success) {\n console.error(`Failed to read chunk ${i}:`, result.error);\n break;\n }\n\n // Decode base64 to binary\n const binary = atob(result.data);\n const bytes = new Uint8Array(binary.length);\n for (let j = 0; j < binary.length; j++) {\n bytes[j] = binary.charCodeAt(j);\n }\n\n await writer.write(bytes);\n }\n } catch (error) {\n console.error(\"Error streaming chunked file:\", error);\n } finally {\n await writer.close();\n }\n })();\n\n return new Response(readable, {\n headers: {\n \"Content-Type\": file.mimeType,\n \"Content-Length\": String(file.size),\n \"Content-Disposition\": `inline; filename=\"${file.name}\"`,\n // Note: We set Content-Length, but also use chunked transfer internally\n },\n });\n}\n\n/**\n * Handle POST requests - write file or create directory\n */\nasync function handlePost(stub: any, path: string, req: Request): Promise<Response> {\n const contentType = req.headers.get(\"Content-Type\") || \"\";\n\n // Check if it's a directory creation request\n if (contentType.includes(\"application/json\")) {\n const body = await req.json() as any;\n\n // Directory creation\n if (body.type === \"directory\") {\n const result = await stub.mkdirFile(path);\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n return Response.json({ directory: result.directory }, { status: 201 });\n }\n\n // External file link\n if (body.location) {\n const result = await stub.linkFile(path, body.location, {\n mimeType: body.mimeType,\n size: body.size,\n metadata: body.metadata,\n });\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n return Response.json(toAttachmentRef(result.file), { status: 201 });\n }\n\n // File upload with base64 data\n if (body.data) {\n const result = await stub.writeFile(path, body.data, body.mimeType || \"application/octet-stream\", {\n metadata: body.metadata,\n thumbnail: body.thumbnail,\n });\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n return Response.json(toAttachmentRef(result.file), { status: 201 });\n }\n\n return Response.json({ error: \"Invalid request body\" }, { status: 400 });\n }\n\n // Handle raw binary upload\n const mimeType = contentType.split(\";\")[0].trim() || \"application/octet-stream\";\n const contentLength = parseInt(req.headers.get(\"Content-Length\") || \"0\", 10);\n\n // For large files, stream and chunk server-side (transparent to client)\n if (contentLength > CHUNK_SIZE && req.body) {\n return handleStreamingUpload(stub, path, mimeType, contentLength, req);\n }\n\n // Small file: load into memory and write directly\n const data = await req.arrayBuffer();\n\n // Convert to base64\n const bytes = new Uint8Array(data);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n const base64 = btoa(binary);\n\n const result = await stub.writeFile(path, base64, mimeType, {});\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n\n // Return AttachmentRef format for client consumption\n return Response.json(toAttachmentRef(result.file), { status: 201 });\n}\n\n/**\n * Handle large file uploads by streaming the request body and chunking server-side.\n * This makes chunking transparent to the client - they just send a normal PUT.\n */\nasync function handleStreamingUpload(\n stub: any,\n path: string,\n mimeType: string,\n totalSize: number,\n req: Request\n): Promise<Response> {\n // Start chunked upload session\n const startResult = await stub.startChunkedUpload(path, totalSize, mimeType, {});\n if (!startResult.success) {\n return Response.json({ error: startResult.error }, { status: 400 });\n }\n\n const reader = req.body!.getReader();\n let chunkIndex = 0;\n let buffer = new Uint8Array(0);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (value) {\n // Append incoming data to buffer\n const newBuffer = new Uint8Array(buffer.length + value.length);\n newBuffer.set(buffer);\n newBuffer.set(value, buffer.length);\n buffer = newBuffer;\n\n // Write complete chunks as we accumulate them\n while (buffer.length >= CHUNK_SIZE) {\n const chunk = buffer.slice(0, CHUNK_SIZE);\n const base64 = arrayBufferToBase64(chunk);\n\n const chunkResult = await stub.writeFileChunk(path, chunkIndex, base64);\n if (!chunkResult.success) {\n return Response.json({ error: chunkResult.error }, { status: 400 });\n }\n\n chunkIndex++;\n buffer = buffer.slice(CHUNK_SIZE);\n }\n }\n\n if (done) {\n // Write any remaining data as the final chunk\n if (buffer.length > 0) {\n const base64 = arrayBufferToBase64(buffer);\n const chunkResult = await stub.writeFileChunk(path, chunkIndex, base64);\n if (!chunkResult.success) {\n return Response.json({ error: chunkResult.error }, { status: 400 });\n }\n chunkIndex++;\n }\n break;\n }\n }\n\n // Complete the upload\n const completeResult = await stub.completeChunkedUpload(path, chunkIndex, {});\n if (!completeResult.success) {\n return Response.json({ error: completeResult.error }, { status: 400 });\n }\n\n return Response.json(toAttachmentRef(completeResult.file), { status: 201 });\n } catch (error: any) {\n console.error(\"Streaming upload failed:\", error);\n return Response.json({ error: error.message || \"Upload failed\" }, { status: 500 });\n }\n}\n\n/**\n * Convert Uint8Array to base64 string (handles large arrays)\n */\nfunction arrayBufferToBase64(bytes: Uint8Array): string {\n // Process in smaller batches to avoid call stack limits\n const BATCH_SIZE = 32768;\n let binary = \"\";\n for (let i = 0; i < bytes.length; i += BATCH_SIZE) {\n const slice = bytes.subarray(i, Math.min(i + BATCH_SIZE, bytes.length));\n binary += String.fromCharCode.apply(null, slice as unknown as number[]);\n }\n return btoa(binary);\n}\n\n/**\n * Handle DELETE requests - remove file or empty directory\n */\nasync function handleDelete(stub: any, path: string): Promise<Response> {\n // Try to get file info first\n const statResult = await stub.statFile(path);\n\n if (!statResult.success) {\n return Response.json({ error: \"Not found\" }, { status: 404 });\n }\n\n const file = statResult.file;\n\n if (file.isDirectory) {\n // Remove directory\n const result = await stub.rmdirFile(path);\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n } else {\n // Remove file\n const result = await stub.unlinkFile(path);\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n }\n\n return new Response(null, { status: 204 });\n}\n\n// ============================================================\n// Chunked Upload Handlers (for files > 1.75MB)\n// ============================================================\n\n/**\n * Handle POST /fs/*path/upload/start\n * Initializes a chunked upload session\n */\nasync function handleChunkedUploadStart(\n stub: any,\n filePath: string,\n req: Request\n): Promise<Response> {\n const body = await req.json() as {\n totalSize: number;\n mimeType: string;\n metadata?: Record<string, unknown>;\n width?: number;\n height?: number;\n };\n\n if (!body.totalSize || !body.mimeType) {\n return Response.json(\n { error: \"totalSize and mimeType are required\" },\n { status: 400 }\n );\n }\n\n const result = await stub.startChunkedUpload(filePath, body.totalSize, body.mimeType, {\n metadata: body.metadata,\n width: body.width,\n height: body.height,\n });\n\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n\n return Response.json({\n chunkSize: result.chunkSize,\n expectedChunks: result.expectedChunks,\n path: filePath,\n });\n}\n\n/**\n * Handle PUT /fs/*path/upload/chunk/:index\n * Writes a single chunk of the file\n */\nasync function handleChunkedUploadChunk(\n stub: any,\n filePath: string,\n chunkIndex: number,\n req: Request\n): Promise<Response> {\n // Accept raw binary data\n const data = await req.arrayBuffer();\n\n // Convert to base64 for RPC transport\n const bytes = new Uint8Array(data);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n const base64 = btoa(binary);\n\n const result = await stub.writeFileChunk(filePath, chunkIndex, base64);\n\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n\n return Response.json({\n chunkIndex,\n received: data.byteLength,\n });\n}\n\n/**\n * Handle POST /fs/*path/upload/complete\n * Finalizes the chunked upload and validates all chunks\n */\nasync function handleChunkedUploadComplete(\n stub: any,\n filePath: string,\n req: Request\n): Promise<Response> {\n const body = await req.json() as {\n expectedChunks: number;\n thumbnail?: string; // base64 encoded\n };\n\n if (typeof body.expectedChunks !== \"number\") {\n return Response.json(\n { error: \"expectedChunks is required\" },\n { status: 400 }\n );\n }\n\n const result = await stub.completeChunkedUpload(filePath, body.expectedChunks, {\n thumbnail: body.thumbnail,\n });\n\n if (!result.success) {\n return Response.json({ error: result.error }, { status: 400 });\n }\n\n // Return AttachmentRef format\n return Response.json(toAttachmentRef(result.file), { status: 201 });\n}\n","import { defineController } from \"../../../../router/index\";\n\n/**\n * GET /api/threads/:id/logs/:logId\n *\n * Get detailed information for a single log from a thread's DurableObject\n *\n * Returns:\n * - HTTP 200: Full log details object\n * - HTTP 404: Thread or log not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n const logId = params.logId;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n if (!logId) {\n return Response.json({ error: \"Log ID required\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance and call RPC method\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method directly\n const logDetails = await stub.getLogDetails(logId);\n\n return Response.json(logDetails);\n } catch (error: any) {\n console.error(`Error fetching log details for ${logId}:`, error);\n\n if (error.message?.includes(\"not found\")) {\n return Response.json(\n { error: error.message },\n { status: 404 }\n );\n }\n\n return Response.json(\n { error: error.message || \"Failed to fetch log details\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../../router/index\";\nimport { ThreadStateImpl } from \"../../../../agents/ThreadStateImpl\";\nimport type { ThreadInstance, ThreadMetadata } from \"../../../../agents/types\";\n\n/**\n * DELETE /api/threads/:id/messages/:messageId\n *\n * Delete a message from a thread using ThreadState.\n *\n * Returns:\n * - HTTP 200: { success: true }\n * - HTTP 404: Thread or message not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n const messageId = params.messageId;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n if (!messageId) {\n return Response.json({ error: \"Message ID required\" }, { status: 400 });\n }\n\n try {\n // Get thread metadata from DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const metadata = await agentBuilder.getThread(threadId) as ThreadMetadata | null;\n\n if (!metadata) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const instance = env.AGENT_BUILDER_THREAD.get(durableId) as unknown as ThreadInstance;\n\n // Create ThreadState and use deleteMessage\n const state = ThreadStateImpl.fromThreadInstance(instance, metadata);\n const deleted = await state.deleteMessage(messageId);\n\n if (!deleted) {\n return Response.json(\n { error: \"Message not found\" },\n { status: 404 }\n );\n }\n\n return Response.json({ success: true });\n } catch (error: any) {\n console.error(`Error deleting message ${messageId} from thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to delete message\" },\n { status: 500 }\n );\n }\n});\n","import { defineController } from \"../../../../router/index\";\n\n/**\n * PATCH /api/threads/:id/messages/:messageId\n *\n * Update a message's content in a thread's DurableObject\n *\n * Body:\n * - content: string (required) - The new message content\n *\n * Returns:\n * - HTTP 200: { success: true }\n * - HTTP 400: Missing required fields\n * - HTTP 404: Thread or message not found\n * - HTTP 500: Server error\n */\nexport default defineController(async ({ req, params, env }) => {\n const threadId = params.id;\n const messageId = params.messageId;\n\n if (!threadId) {\n return Response.json({ error: \"Thread ID required\" }, { status: 400 });\n }\n\n if (!messageId) {\n return Response.json({ error: \"Message ID required\" }, { status: 400 });\n }\n\n // Parse request body\n let body: { content?: string };\n try {\n body = await req.json();\n } catch {\n return Response.json({ error: \"Invalid JSON body\" }, { status: 400 });\n }\n\n if (typeof body.content !== \"string\") {\n return Response.json({ error: \"Content is required and must be a string\" }, { status: 400 });\n }\n\n try {\n // Verify thread exists in DurableAgentBuilder\n const agentBuilderId = env.AGENT_BUILDER.idFromName(\"singleton\");\n const agentBuilder = env.AGENT_BUILDER.get(agentBuilderId) as any;\n const thread = await agentBuilder.getThread(threadId);\n\n if (!thread) {\n return Response.json(\n { error: `Thread not found: ${threadId}` },\n { status: 404 }\n );\n }\n\n // Get DurableObject instance and call via RPC\n const durableId = env.AGENT_BUILDER_THREAD.idFromName(threadId);\n const stub = env.AGENT_BUILDER_THREAD.get(durableId);\n\n // Call RPC method directly\n const result = await stub.updateMessageContent(messageId, body.content);\n\n if (!result.success) {\n return Response.json(\n { error: result.error || \"Failed to update message\" },\n { status: 404 }\n );\n }\n\n return Response.json({ success: true });\n } catch (error: any) {\n console.error(`Error updating message ${messageId} in thread ${threadId}:`, error);\n return Response.json(\n { error: error.message || \"Failed to update message\" },\n { status: 500 }\n );\n }\n});\n","// Auto-generated file - do not edit manually\n// Generated by scripts/generate-built-in-routes.ts\n\nimport { addRoute } from 'rou3';\n\n// Import all route handlers\nimport handler0 from './api/index.post';\nimport handler1 from './api/agents.get';\nimport handler2 from './api/api-keys/index.get';\nimport handler3 from './api/api-keys/index.post';\nimport handler4 from './api/config.get';\nimport handler5 from './api/diagnostics.get';\nimport handler6 from './api/events.get';\nimport handler7 from './api/models.get';\nimport handler8 from './api/new-test.get';\nimport handler9 from './api/prompts.get';\nimport handler10 from './api/providers.get';\nimport handler11 from './api/threads/index.post';\nimport handler12 from './api/threads/index';\nimport handler13 from './api/tools.get';\nimport handler14 from './api/users/index.get';\nimport handler15 from './api/users/index.post';\nimport handler16 from './api/agents/[name].get';\nimport handler17 from './api/api-keys/[id].delete';\nimport handler18 from './api/prompts/[name].get';\nimport handler19 from './api/threads/[id].delete';\nimport handler20 from './api/threads/[id].patch';\nimport handler21 from './api/threads/[id]';\nimport handler22 from './api/tools/[name].get';\nimport handler23 from './api/users/[id].delete';\nimport handler24 from './api/users/[id].put';\nimport handler25 from './api/auth/config.get';\nimport handler26 from './api/auth/login.post';\nimport handler27 from './api/auth/logout.post';\nimport handler28 from './api/auth/me.get';\nimport handler29 from './api/models/available.post';\nimport handler30 from './api/models/endpoints.post';\nimport handler31 from './api/threads/[id]/cost.get';\nimport handler32 from './api/threads/[id]/fs/index';\nimport handler33 from './api/threads/[id]/logs.get';\nimport handler34 from './api/threads/[id]/messages.get';\nimport handler35 from './api/threads/[id]/messages.post';\nimport handler36 from './api/threads/[id]/rpc.post';\nimport handler37 from './api/threads/[id]/stop.post';\nimport handler38 from './api/threads/[id]/stream';\nimport handler39 from './api/threads/[id]/fs/[...path].delete';\nimport handler40 from './api/threads/[id]/fs/[...path].post';\nimport handler41 from './api/threads/[id]/fs/[...path]';\nimport handler42 from './api/threads/[id]/logs/[logId].get';\nimport handler43 from './api/threads/[id]/messages/[messageId].delete';\nimport handler44 from './api/threads/[id]/messages/[messageId].patch';\n\nconst routeHandlers: Record<string, any> = {\n 'POST:/': handler0,\n 'GET:/agents': handler1,\n 'GET:/api-keys': handler2,\n 'POST:/api-keys': handler3,\n 'GET:/config': handler4,\n 'GET:/diagnostics': handler5,\n 'GET:/events': handler6,\n 'GET:/models': handler7,\n 'GET:/new-test': handler8,\n 'GET:/prompts': handler9,\n 'GET:/providers': handler10,\n 'POST:/threads': handler11,\n 'GET:/threads': handler12,\n 'GET:/tools': handler13,\n 'GET:/users': handler14,\n 'POST:/users': handler15,\n 'GET:/agents/:name': handler16,\n 'DELETE:/api-keys/:id': handler17,\n 'GET:/prompts/:name': handler18,\n 'DELETE:/threads/:id': handler19,\n 'PATCH:/threads/:id': handler20,\n 'GET:/threads/:id': handler21,\n 'GET:/tools/:name': handler22,\n 'DELETE:/users/:id': handler23,\n 'PUT:/users/:id': handler24,\n 'GET:/auth/config': handler25,\n 'POST:/auth/login': handler26,\n 'POST:/auth/logout': handler27,\n 'GET:/auth/me': handler28,\n 'POST:/models/available': handler29,\n 'POST:/models/endpoints': handler30,\n 'GET:/threads/:id/cost': handler31,\n 'GET:/threads/:id/fs': handler32,\n 'GET:/threads/:id/logs': handler33,\n 'GET:/threads/:id/messages': handler34,\n 'POST:/threads/:id/messages': handler35,\n 'POST:/threads/:id/rpc': handler36,\n 'POST:/threads/:id/stop': handler37,\n 'GET:/threads/:id/stream': handler38,\n 'DELETE:/threads/:id/fs/**': handler39,\n 'POST:/threads/:id/fs/**': handler40,\n 'GET:/threads/:id/fs/**': handler41,\n 'GET:/threads/:id/logs/:logId': handler42,\n 'DELETE:/threads/:id/messages/:messageId': handler43,\n 'PATCH:/threads/:id/messages/:messageId': handler44,\n};\n\nexport interface RuntimeData {\n config?: any;\n tools?: any;\n models?: Record<string, () => Promise<any>>;\n modelNames?: string[];\n prompts?: Record<string, () => Promise<any>>;\n promptNames?: string[];\n agents?: Record<string, () => Promise<any>>;\n agentNames?: string[];\n}\n\nexport function registerBuiltInRoutes(router: any, runtimeData?: RuntimeData) {\n for (const [key, handler] of Object.entries(routeHandlers)) {\n const [method, ...routeParts] = key.split(':');\n const route = routeParts.join(':');\n const apiRoute = `/api${route}`;\n // Wrap handler to inject runtime data into context\n const wrappedHandler = async (context: any) => {\n // Add runtime data to context if provided\n const enhancedContext = {\n ...context,\n ...(runtimeData?.config && { config: runtimeData.config }),\n ...(runtimeData?.tools && { tools: runtimeData.tools }),\n ...(runtimeData?.models && { models: runtimeData.models }),\n ...(runtimeData?.modelNames && { modelNames: runtimeData.modelNames }),\n ...(runtimeData?.prompts && { prompts: runtimeData.prompts }),\n ...(runtimeData?.promptNames && { promptNames: runtimeData.promptNames }),\n ...(runtimeData?.agents && { agents: runtimeData.agents }),\n ...(runtimeData?.agentNames && { agentNames: runtimeData.agentNames }),\n };\n return handler(enhancedContext);\n };\n addRoute(router, method, apiRoute, async () => wrappedHandler);\n }\n}\n"]}
|