{"version":3,"file":"adapter.cjs","names":["#baseline"],"sources":["../../../../src/batteries/llm/ollama/adapter.ts"],"sourcesContent":["/**\n * Cross-environment executor adapter for the native Ollama `/api/chat` endpoint.\n *\n * @module @nhtio/adk/batteries/llm/ollama/adapter\n *\n * @remarks\n * Native Ollama LLM adapter targeting `/api/chat` (NOT the OpenAI-compat `/v1` layer — the\n * `openai_chat_completions` battery already covers `/v1`). Works against both LOCAL Ollama\n * (`http://localhost:11434`, no auth) and CLOUD Ollama (`https://ollama.com`, `Authorization:\n * Bearer <apiKey>`); the only difference is `baseURL` + the auth header. Native is HTTP-only — a\n * Unix-socket deployment is reached via a custom `fetch` or an external bridge, not an adapter\n * option.\n *\n * Structurally a sibling of the OpenAI Chat Completions adapter, with the native-wire divergences:\n *\n * - Request body: generation params are NESTED under `options`; `think` / `format` / `keep_alive`\n *   are top-level native controls; ADK control fields are stripped before sending.\n * - Streaming: NDJSON (newline-delimited JSON objects), terminated in-band by `done: true` — there\n *   is no SSE `data:` framing and no `[DONE]` sentinel. Whole `tool_calls` arrive per chunk (no\n *   delta accumulation).\n * - Reasoning: the single native `message.thinking` field (no multi-field precedence dance).\n * - Tool calls: `arguments` is already a JSON OBJECT (no `JSON.parse`); native calls carry no `id`,\n *   so the adapter synthesizes one (uuidv6) for correlation / checksum / spool keying. Tool-result\n *   history messages use `tool_name` (the originating tool), not `tool_call_id`.\n * - Generation stats: the terminal `done: true` object's token counts + nanosecond durations +\n *   `done_reason` are surfaced via `helpers.reportGenerationStats`.\n */\n\nimport { DateTime } from 'luxon'\nimport { sha256 } from 'js-sha256'\nimport { v6 as uuidv6 } from 'uuid'\nimport { validateOptions } from './validation'\nimport { isError, isInstanceOf, isObject } from '@nhtio/adk/guards'\nimport { resolveToolCallParser } from '../chat_common/tool_parsers'\nimport { canonicalStringify } from '../../../lib/utils/canonical_json'\nimport { InMemorySpoolStore } from '@nhtio/adk/batteries/storage/in_memory'\nimport { looksLikeSpooledArtifact, normalizeToolName } from '../chat_common/helpers'\nimport {\n  computeBackoff,\n  sleepWithJitter,\n  parseRetryAfter,\n  linkAbortSignals,\n} from '../../../lib/utils/retry'\nimport {\n  Tokenizable,\n  ToolCall,\n  Message,\n  Thought,\n  SpooledArtifact,\n  Media,\n  ArtifactTool,\n} from '@nhtio/adk/common'\nimport {\n  E_INVALID_OLLAMA_OPTIONS,\n  E_OLLAMA_CONTEXT_OVERFLOW,\n  E_OLLAMA_HTTP_ERROR,\n  E_OLLAMA_STREAM_ERROR,\n  E_OLLAMA_STREAM_STALLED,\n  E_OLLAMA_REQUEST_TIMEOUT,\n  E_OLLAMA_INVALID_TOOL_CALL_ARGS,\n} from './exceptions'\nimport {\n  defaultDescriptionToChatCompletionsJsonSchema,\n  defaultRenderUntrustedContent,\n  defaultRenderTrustedContent,\n  defaultRenderStandingInstructions,\n  defaultRenderMemories,\n  defaultRenderRetrievables,\n  defaultRenderRetrievableHandleBody,\n  defaultRenderRetrievableSafetyDirective,\n  defaultRenderFirstPartyRetrievables,\n  defaultRenderThirdPartyPublicRetrievables,\n  defaultRenderThirdPartyPrivateRetrievables,\n  defaultRenderThought,\n  defaultFilterThoughts,\n  defaultToolsToChatCompletionsTools,\n  defaultRenderChatCompletionsSystemPrompt,\n  defaultRenderOllamaTimelineMessage,\n  defaultRenderOllamaToolCallResult,\n  defaultBuildOllamaHistory,\n  ollamaToolsFromTools,\n} from './helpers'\nimport type { Tool, Memory } from '@nhtio/adk/common'\nimport type { DispatchContext } from '@nhtio/adk/types'\nimport type { TokenEncoding, TokenEncodingId } from '@nhtio/adk/types'\nimport type {\n  DispatchExecutorFn,\n  DispatchExecutorHelpers,\n  GenerationStats,\n} from '@nhtio/adk/dispatch_runner'\nimport type {\n  OllamaAdapterOptions,\n  OllamaHelpers,\n  OllamaChatRequestBody,\n  OllamaChatStreamChunk,\n  OllamaChatResponse,\n  OllamaToolCall,\n  OllamaRuntimeOptions,\n} from './types'\n\n// ─── An assembled native tool call (id synthesized; args already an object) ───\n// NOTE: unlike the OpenAI adapter, the request body is assembled EXPLICITLY (model / messages /\n// stream / think / format / keep_alive / options / tools) rather than by spreading non-control\n// keys, because native generation params live nested under `options`, not at the top level. So\n// there is no ADK_CONTROL_KEYS strip-set here.\n\ninterface AssembledOllamaToolCall {\n  id: string\n  name: string\n  args: Record<string, unknown>\n}\n\n// ─── Option merging ───────────────────────────────────────────────────────────\n\nconst mergeRecord = <T extends Record<string, unknown>>(\n  layers: ReadonlyArray<T | undefined>\n): T | undefined => {\n  let merged: T | undefined\n  for (const layer of layers) {\n    if (!layer) continue\n    merged = { ...(merged ?? ({} as T)), ...layer }\n  }\n  return merged\n}\n\nconst mergeOptions = (\n  baseline: OllamaAdapterOptions,\n  exec: Partial<OllamaAdapterOptions> | undefined,\n  stash: Partial<OllamaAdapterOptions> | undefined\n): Partial<OllamaAdapterOptions> => {\n  const layers = [baseline as Partial<OllamaAdapterOptions>, exec ?? {}, stash ?? {}]\n  const out: Record<string, unknown> = {}\n  for (const layer of layers) {\n    for (const [k, v] of Object.entries(layer)) {\n      if (v === undefined) continue\n      if (k === 'headers' || k === 'helpers' || k === 'retry' || k === 'options') continue\n      out[k] = v\n    }\n  }\n  const headers = mergeRecord(layers.map((l) => l.headers as Record<string, string> | undefined))\n  if (headers !== undefined) out.headers = headers\n  const helpers = mergeRecord(layers.map((l) => l.helpers as Record<string, unknown> | undefined))\n  if (helpers !== undefined) out.helpers = helpers\n  const retry = mergeRecord(layers.map((l) => l.retry as Record<string, unknown> | undefined))\n  if (retry !== undefined) out.retry = retry\n  // Nested runtime `options` merge key-by-key, like headers — a stash override that sets one\n  // sampling param should not clear the others set in the constructor.\n  const runtime = mergeRecord(layers.map((l) => l.options as Record<string, unknown> | undefined))\n  if (runtime !== undefined) out.options = runtime\n  return out as Partial<OllamaAdapterOptions>\n}\n\n// ─── Helper resolution ────────────────────────────────────────────────────────\n\nconst resolveHelpers = (overrides: Partial<OllamaHelpers> | undefined): OllamaHelpers => {\n  const src = overrides ?? {}\n  return {\n    descriptionToChatCompletionsJsonSchema:\n      src.descriptionToChatCompletionsJsonSchema ?? defaultDescriptionToChatCompletionsJsonSchema,\n    renderUntrustedContent: src.renderUntrustedContent ?? defaultRenderUntrustedContent,\n    renderTrustedContent: src.renderTrustedContent ?? defaultRenderTrustedContent,\n    renderStandingInstructions: src.renderStandingInstructions ?? defaultRenderStandingInstructions,\n    renderMemories: src.renderMemories ?? defaultRenderMemories,\n    renderRetrievables: src.renderRetrievables ?? defaultRenderRetrievables,\n    renderRetrievableHandleBody:\n      src.renderRetrievableHandleBody ?? defaultRenderRetrievableHandleBody,\n    renderRetrievableSafetyDirective:\n      src.renderRetrievableSafetyDirective ?? defaultRenderRetrievableSafetyDirective,\n    renderFirstPartyRetrievables:\n      src.renderFirstPartyRetrievables ?? defaultRenderFirstPartyRetrievables,\n    renderThirdPartyPublicRetrievables:\n      src.renderThirdPartyPublicRetrievables ?? defaultRenderThirdPartyPublicRetrievables,\n    renderThirdPartyPrivateRetrievables:\n      src.renderThirdPartyPrivateRetrievables ?? defaultRenderThirdPartyPrivateRetrievables,\n    renderThought: src.renderThought ?? defaultRenderThought,\n    filterThoughts: src.filterThoughts ?? defaultFilterThoughts,\n    toolsToChatCompletionsTools:\n      src.toolsToChatCompletionsTools ?? defaultToolsToChatCompletionsTools,\n    renderChatCompletionsSystemPrompt:\n      src.renderChatCompletionsSystemPrompt ?? defaultRenderChatCompletionsSystemPrompt,\n    renderOllamaTimelineMessage:\n      src.renderOllamaTimelineMessage ?? defaultRenderOllamaTimelineMessage,\n    renderOllamaToolCallResult: src.renderOllamaToolCallResult ?? defaultRenderOllamaToolCallResult,\n    buildOllamaHistory: src.buildOllamaHistory ?? defaultBuildOllamaHistory,\n  }\n}\n\n// ─── ID / checksum / time helpers ─────────────────────────────────────────────\n\nconst computeChecksum = (tool: string, args: unknown): string =>\n  sha256(canonicalStringify({ tool, args }))\n\nconst nowIso = (): string => DateTime.now().toISO() ?? new Date().toISOString()\n\nconst estimateTokensOf = async (\n  value: { estimateTokens: (encoding: TokenEncoding) => number | Promise<number> },\n  encoding: TokenEncodingId\n): Promise<number> => Promise.resolve(value.estimateTokens(encoding as TokenEncoding))\n\n// ─── Generation-stats extraction ──────────────────────────────────────────────\n\nconst extractGenerationStats = (\n  src: OllamaChatStreamChunk | OllamaChatResponse,\n  model: string\n): GenerationStats => {\n  const stats: GenerationStats = { provider: 'ollama', model: src.model ?? model, raw: { ...src } }\n  if (typeof src.prompt_eval_count === 'number') stats.promptTokens = src.prompt_eval_count\n  if (typeof src.eval_count === 'number') stats.completionTokens = src.eval_count\n  if (typeof src.prompt_eval_count === 'number' && typeof src.eval_count === 'number') {\n    stats.totalTokens = src.prompt_eval_count + src.eval_count\n  }\n  if (typeof src.total_duration === 'number') stats.totalDurationNs = src.total_duration\n  if (typeof src.load_duration === 'number') stats.loadDurationNs = src.load_duration\n  if (typeof src.prompt_eval_duration === 'number') {\n    stats.promptEvalDurationNs = src.prompt_eval_duration\n  }\n  if (typeof src.eval_duration === 'number') stats.evalDurationNs = src.eval_duration\n  if (typeof src.done_reason === 'string') stats.finishReason = src.done_reason\n  return stats\n}\n\n// ─── Adapter class ────────────────────────────────────────────────────────────\n\n/**\n * Opinionated cross-environment LLM adapter for the native Ollama `/api/chat` wire shape.\n *\n * @remarks\n * Construction validates options eagerly via {@link validateOptions} and throws\n * {@link @nhtio/adk/batteries/llm/ollama!E_INVALID_OLLAMA_OPTIONS} on failure. The returned instance is reusable: call\n * {@link OllamaAdapter.executor} once per `DispatchRunner` configuration to obtain a\n * {@link @nhtio/adk!DispatchExecutorFn} bound to the baseline plus optional executor-scope\n * overrides. Per-iteration overrides live on `ctx.stash.ollama` and take highest precedence;\n * `headers`, `helpers`, `retry`, and the nested runtime `options` merge key-by-key across all three\n * layers, every other field is replaced wholesale at the highest layer that sets it.\n */\nexport class OllamaAdapter {\n  /** Customary key for per-iteration overrides on `ctx.stash`. */\n  public static readonly STASH_KEY = 'ollama' as const\n\n  readonly #baseline: OllamaAdapterOptions\n\n  /**\n   * @param options - Constructor-baseline options. Re-validated on every iteration after\n   *   per-dispatch and per-iteration overrides are layered in.\n   * @throws {@link @nhtio/adk/batteries/llm/ollama!E_INVALID_OLLAMA_OPTIONS} when `options` does not satisfy `ollamaOptionsSchema`.\n   */\n  constructor(options: unknown) {\n    this.#baseline = validateOptions(options)\n  }\n\n  /**\n   * Returns a {@link @nhtio/adk!DispatchExecutorFn} bound to this adapter's baseline plus optional\n   * executor-scope overrides.\n   *\n   * @param overrides - Optional executor-scope overrides. Higher precedence than the baseline,\n   *   lower precedence than `ctx.stash[STASH_KEY]`.\n   */\n  executor(overrides?: Partial<OllamaAdapterOptions>): DispatchExecutorFn {\n    const baseline = this.#baseline\n    const adapterClass = OllamaAdapter\n    return async (ctx: DispatchContext, helpers: DispatchExecutorHelpers): Promise<void> => {\n      const localWarn = (msg: string): void => {\n        helpers.log.warn({ kind: 'helper-warning', message: msg })\n      }\n\n      // ── Step 1: merge & validate ──────────────────────────────────────────\n      const stashRaw = ctx.stash.get(adapterClass.STASH_KEY, {}) as unknown\n      const stashOverrides =\n        stashRaw && typeof stashRaw === 'object' ? (stashRaw as Partial<OllamaAdapterOptions>) : {}\n      const merged = validateOptions(mergeOptions(baseline, overrides, stashOverrides))\n\n      // Cross-field invariant: tokenEncoding non-null requires contextWindow.\n      if (merged.tokenEncoding !== null && merged.contextWindow === undefined) {\n        throw new E_INVALID_OLLAMA_OPTIONS([\n          'tokenEncoding is non-null but contextWindow is undefined',\n        ])\n      }\n\n      // ── Step 2: resolve helpers ───────────────────────────────────────────\n      const resolvedHelpers = resolveHelpers(merged.helpers)\n\n      // ── Step 3: artifact-reader tools ─────────────────────────────────────\n      // Forged by the DispatchRunner CORE into `ctx.tools` before the input pipeline runs (generation is a\n      // generic core concern; this battery owns only representation). Read the pre-forged `ctx.tools`\n      // directly — no local merge, no bindContext here.\n\n      // ── Step 4: pre-render tool-call results ──────────────────────────────\n      // Key by primitive identity: duplicate ids must not cross-wire pre-rendered results.\n      const renderedToolCallResults = new Map<ToolCall, string>()\n      for (const tc of ctx.turnToolCalls) {\n        const rendered = await resolvedHelpers.renderOllamaToolCallResult({\n          toolCall: tc,\n          results: tc.results as\n            | Tokenizable\n            | SpooledArtifact\n            | SpooledArtifact[]\n            | Media\n            | Media[],\n          tool: ctx.tools.get(tc.tool) as Tool | ArtifactTool | undefined,\n          renderUntrustedContent: resolvedHelpers.renderUntrustedContent,\n          renderTrustedContent: resolvedHelpers.renderTrustedContent,\n          unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n          warn: localWarn,\n        })\n        renderedToolCallResults.set(tc, rendered)\n      }\n\n      // ── Step 5: context window enforcement ────────────────────────────────\n      if (merged.tokenEncoding !== null && merged.contextWindow !== undefined) {\n        const encoding = merged.tokenEncoding as TokenEncodingId\n        let spTokens = await estimateTokensOf(ctx.systemPrompt, encoding)\n        let siTokens = 0\n        for (const si of ctx.standingInstructions) {\n          siTokens += await estimateTokensOf(si, encoding)\n        }\n        let memTokens = 0\n        for (const mem of ctx.turnMemories as Set<Memory>) {\n          memTokens += await estimateTokensOf(mem.content, encoding)\n        }\n        let retTokens = 0\n        for (const r of ctx.turnRetrievables) {\n          retTokens +=\n            !r.inline && SpooledArtifact.isSpooledArtifact(r.content) && r.content.hasSizeHints()\n              ? r.content.estimateHandleTokens(\n                  r.id,\n                  encoding as TokenEncoding,\n                  resolvedHelpers.renderRetrievableHandleBody\n                )\n              : await estimateTokensOf(r.content, encoding)\n        }\n        let tlTokens = 0\n        for (const msg of ctx.turnMessages) {\n          if (msg.content !== undefined) {\n            tlTokens += await estimateTokensOf(msg.content, encoding)\n          }\n        }\n        for (const th of ctx.turnThoughts) {\n          tlTokens += await estimateTokensOf(th.content, encoding)\n        }\n        for (const rendered of renderedToolCallResults.values()) {\n          tlTokens += await estimateTokensOf(new Tokenizable(rendered), encoding)\n        }\n        // Tool DECLARATIONS: Ollama renders the `tools` array through the MODEL'S OWN Go chat template\n        // (the `.Tools` template variable), which is per-model and lives SERVER-side — there is no single\n        // fixed conversion to reproduce client-side (seeing the exact string needs `ollama show` / debug\n        // logs; evaluating the model's Go template via /api/show is deliberately out of scope for a guard\n        // backstop). Tally the serialized wire `tools` JSON as an honest FLOOR. Without this the guard\n        // undercounts a tool-heavy prompt by the entire declaration block.\n        let toolTokens = 0\n        const visibleTools = ctx.tools.visible()\n        if (visibleTools.length > 0) {\n          const toolsJson = JSON.stringify(\n            ollamaToolsFromTools(visibleTools, {\n              descriptionToChatCompletionsJsonSchema:\n                resolvedHelpers.descriptionToChatCompletionsJsonSchema,\n            })\n          )\n          toolTokens = await estimateTokensOf(new Tokenizable(toolsJson), encoding)\n        }\n        const total = spTokens + siTokens + memTokens + retTokens + tlTokens + toolTokens\n        const perBucketObj = {\n          systemPrompt: spTokens,\n          standingInstructions: siTokens,\n          memories: memTokens,\n          retrievables: retTokens,\n          timeline: tlTokens,\n          tools: toolTokens,\n        }\n        helpers.log.debug({\n          kind: 'context-window-usage',\n          message: `Context window usage: ${total}/${merged.contextWindow} tokens`,\n          payload: { total, limit: merged.contextWindow, encoding, perBucket: perBucketObj },\n        })\n        if (total > merged.contextWindow) {\n          throw new E_OLLAMA_CONTEXT_OVERFLOW([\n            total,\n            merged.contextWindow,\n            encoding,\n            JSON.stringify(perBucketObj),\n          ])\n        }\n      }\n\n      // ── Step 6: build request body ────────────────────────────────────────\n      const { messages: wireMessages, reasoningPayloads } =\n        await resolvedHelpers.buildOllamaHistory({\n          systemPrompt: ctx.systemPrompt,\n          standingInstructions: ctx.standingInstructions,\n          memories: ctx.turnMemories,\n          retrievables: ctx.turnRetrievables,\n          messages: ctx.turnMessages,\n          thoughts: ctx.turnThoughts,\n          toolCalls: ctx.turnToolCalls,\n          tools: ctx.tools,\n          renderedToolCallResults,\n          bucketOrder: merged.bucketOrder ?? [\n            'standingInstructions',\n            'memories',\n            'retrievables',\n            'timeline',\n          ],\n          selfIdentity: merged.selfIdentity ?? 'assistant',\n          thoughtSurfacing: merged.thoughtSurfacing ?? 'all-self',\n          replayCompatibility: merged.replayCompatibility ?? [],\n          renderOllamaToolCallResult: resolvedHelpers.renderOllamaToolCallResult,\n          renderChatCompletionsSystemPrompt: resolvedHelpers.renderChatCompletionsSystemPrompt,\n          renderStandingInstructions: resolvedHelpers.renderStandingInstructions,\n          renderMemories: resolvedHelpers.renderMemories,\n          renderRetrievables: resolvedHelpers.renderRetrievables,\n          renderRetrievableHandleBody: resolvedHelpers.renderRetrievableHandleBody,\n          renderRetrievableSafetyDirective: resolvedHelpers.renderRetrievableSafetyDirective,\n          renderFirstPartyRetrievables: resolvedHelpers.renderFirstPartyRetrievables,\n          renderThirdPartyPublicRetrievables: resolvedHelpers.renderThirdPartyPublicRetrievables,\n          renderThirdPartyPrivateRetrievables: resolvedHelpers.renderThirdPartyPrivateRetrievables,\n          renderOllamaTimelineMessage: resolvedHelpers.renderOllamaTimelineMessage,\n          renderThought: resolvedHelpers.renderThought,\n          filterThoughts: resolvedHelpers.filterThoughts,\n          renderUntrustedContent: resolvedHelpers.renderUntrustedContent,\n          renderTrustedContent: resolvedHelpers.renderTrustedContent,\n          unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n          warn: localWarn,\n        })\n\n      const stream = merged.stream ?? true\n      const body: OllamaChatRequestBody = {\n        model: merged.model,\n        messages: wireMessages,\n        stream,\n      }\n      // Native top-level controls — included only when defined. `think` is conditional-presence:\n      // omitted → absent; `false` → think:false; truthy/effort → verbatim.\n      if (merged.think !== undefined) body.think = merged.think\n      if (merged.format !== undefined) body.format = merged.format\n      if (merged.keep_alive !== undefined) body.keep_alive = merged.keep_alive\n      if (merged.options !== undefined) body.options = merged.options as OllamaRuntimeOptions\n      const toolsArr = ctx.tools.visible()\n      if (toolsArr.length > 0) {\n        body.tools = ollamaToolsFromTools(toolsArr, {\n          descriptionToChatCompletionsJsonSchema:\n            resolvedHelpers.descriptionToChatCompletionsJsonSchema,\n        })\n      }\n      if (reasoningPayloads.length > 0) {\n        body._adk_reasoning_payloads = reasoningPayloads\n      }\n\n      // One id for this whole generation — correlates the TO tap (onPromptAssembled) with the FROM tap\n      // (onRawGeneration) below.\n      const dispatchStreamId = uuidv6()\n\n      // Prompt-assembled observability tap: the EXACT request body going TO Ollama, the instant it is built\n      // and BEFORE the POST. Mirror of onRawGeneration. Handed back AS-IS — no redaction — and swallow\n      // observer errors so it can never corrupt the generation path.\n      if (merged.onPromptAssembled) {\n        try {\n          merged.onPromptAssembled({\n            battery: 'ollama',\n            kind: 'request-body',\n            messages: body.messages,\n            tools: body.tools,\n            requestBody: body,\n            streamed: stream,\n            streamId: dispatchStreamId,\n          })\n        } catch {\n          /* observer errors are non-fatal */\n        }\n      }\n\n      // ── Step 7: POST with retry / timeout loop ────────────────────────────\n      const rawBase = merged.baseURL ?? 'http://localhost:11434'\n      const baseURL = rawBase.endsWith('/') ? rawBase.slice(0, -1) : rawBase\n      const url = `${baseURL}/api/chat`\n\n      const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n      if (stream) headers['Accept'] = 'application/x-ndjson'\n      if (merged.apiKey) headers['Authorization'] = `Bearer ${merged.apiKey}`\n      if (merged.headers) Object.assign(headers, merged.headers)\n\n      const retryCfg = {\n        maxAttempts: merged.retry?.maxAttempts ?? 1,\n        baseDelayMs: merged.retry?.baseDelayMs ?? 500,\n        maxDelayMs: merged.retry?.maxDelayMs ?? 30_000,\n        retriableStatuses: merged.retry?.retriableStatuses ?? [429, 502, 503, 504],\n        honorRetryAfter: merged.retry?.honorRetryAfter ?? true,\n      }\n\n      const fetchFn = merged.fetch ?? globalThis.fetch\n      const maxAttempts = retryCfg.maxAttempts\n\n      let response: Response | undefined\n      let attempt = 1\n      let disposeLink: () => void = () => {}\n      while (attempt <= maxAttempts) {\n        if (ctx.abortSignal.aborted) return\n\n        const internalController = new AbortController()\n        let timeoutHandle: ReturnType<typeof setTimeout> | undefined\n        const requestTimeoutMs = merged.requestTimeoutMs ?? 0\n        if (requestTimeoutMs > 0) {\n          timeoutHandle = setTimeout(() => internalController.abort(), requestTimeoutMs)\n        }\n        disposeLink()\n        const { signal: linkedSignal, dispose: disposeCurrentLink } = linkAbortSignals([\n          ctx.abortSignal,\n          internalController.signal,\n        ])\n        disposeLink = disposeCurrentLink\n\n        try {\n          response = await fetchFn(url, {\n            method: 'POST',\n            headers,\n            body: JSON.stringify(body),\n            signal: linkedSignal,\n          })\n        } catch (err) {\n          if (timeoutHandle !== undefined) clearTimeout(timeoutHandle)\n          if (ctx.abortSignal.aborted) return\n          if (internalController.signal.aborted) {\n            helpers.log.warn({\n              kind: 'request-timeout',\n              message: `Request timed out after ${requestTimeoutMs}ms on attempt ${attempt}/${maxAttempts}`,\n              payload: { requestTimeoutMs, attempt, maxAttempts },\n            })\n            if (attempt < maxAttempts) {\n              const delay = computeBackoff(attempt, retryCfg)\n              await sleepWithJitter(delay, ctx.abortSignal)\n              attempt += 1\n              continue\n            }\n            ctx.nack(new E_OLLAMA_REQUEST_TIMEOUT([requestTimeoutMs]))\n            return\n          }\n          helpers.log.error({\n            kind: 'transport-error',\n            message: `Transport failure on attempt ${attempt}/${maxAttempts}: ${isError(err) ? err.message : String(err)}`,\n            payload: { attempt, maxAttempts, detail: isError(err) ? err.message : String(err) },\n          })\n          ctx.nack(new E_OLLAMA_HTTP_ERROR([0, isError(err) ? err.message : String(err)]))\n          return\n        }\n\n        if (timeoutHandle !== undefined) clearTimeout(timeoutHandle)\n\n        if (!response.ok) {\n          const status = response.status\n          const retriable = retryCfg.retriableStatuses.includes(status)\n          if (retriable && attempt < maxAttempts) {\n            let delay = computeBackoff(attempt, retryCfg)\n            if (retryCfg.honorRetryAfter !== false) {\n              const ra = response.headers.get('Retry-After')\n              if (ra) {\n                const raMs = parseRetryAfter(ra)\n                if (raMs > 0) delay = Math.min(Math.max(delay, raMs), retryCfg.maxDelayMs)\n              }\n            }\n            helpers.log.warn({\n              kind: 'retry-attempt',\n              message: `HTTP ${status} on attempt ${attempt}/${maxAttempts}; retrying in ~${delay}ms`,\n              payload: {\n                reason: 'http-status',\n                status,\n                delayMs: delay,\n                attempt: attempt + 1,\n                maxAttempts,\n              },\n            })\n            await sleepWithJitter(delay, ctx.abortSignal)\n            attempt += 1\n            continue\n          }\n          const errBody = await response.text().catch(() => '')\n          helpers.log.error({\n            kind: 'http-error',\n            message: `HTTP ${status} (terminal): ${errBody.slice(0, 256)}`,\n            payload: { status, body: errBody, attempt, maxAttempts, retriable },\n          })\n          ctx.nack(new E_OLLAMA_HTTP_ERROR([status, errBody]))\n          return\n        }\n\n        break\n      }\n\n      if (!response) return\n\n      const spoolStore = merged.spoolStore ?? new InMemorySpoolStore()\n      const selfIdentity = merged.selfIdentity ?? 'assistant'\n\n      // ── Inner helper: persist + execute one assembled tool call ───────────\n      const executeAndPersistToolCall = async (call: AssembledOllamaToolCall): Promise<void> => {\n        // Resolve the provider id once at ingress so reporting, persistence, and spooling agree.\n        const callId = merged.toolCallIdFilter?.(call.id, ctx) ?? call.id\n        const tool = ctx.tools.get(call.name)\n        // Native /api/chat delivers `arguments` already parsed as an object. Validate it IS an\n        // object (defensive against a non-conformant server/proxy emitting an array/null/primitive)\n        // — there is no JSON.parse step. A non-object short-circuits to a persisted error ToolCall.\n        let args: Record<string, unknown> = {}\n        let parseError: InstanceType<typeof E_OLLAMA_INVALID_TOOL_CALL_ARGS> | undefined\n        if (isObject(call.args)) {\n          args = call.args\n        } else {\n          const receivedKind = Array.isArray(call.args)\n            ? 'array'\n            : call.args === null\n              ? 'null'\n              : typeof call.args\n          parseError = new E_OLLAMA_INVALID_TOOL_CALL_ARGS([\n            `must be a JSON object; received ${receivedKind}`,\n            JSON.stringify(call.args),\n          ])\n        }\n        const completedAt = nowIso()\n        if (parseError !== undefined) {\n          const toolName = normalizeToolName(call.name)\n          const results = new Tokenizable(parseError.message)\n          helpers.reportToolCall(callId, { tool: toolName, args })\n          helpers.reportToolCall(callId, { results, isError: true, isComplete: true })\n          await ctx.storeToolCall(\n            new ToolCall({\n              id: callId,\n              tool: toolName,\n              args,\n              checksum: computeChecksum(toolName, args),\n              isComplete: true,\n              isError: true,\n              results,\n              createdAt: completedAt,\n              updatedAt: completedAt,\n              completedAt,\n            })\n          )\n          return\n        }\n        if (!tool) {\n          const toolName = normalizeToolName(call.name)\n          const available = ctx.tools\n            .all()\n            .map((t) => t.name)\n            .sort()\n          const errText =\n            available.length > 0\n              ? `Tool not found: ${toolName}. Available tools: ${available.join(', ')}.`\n              : `Tool not found: ${toolName}. No tools are available this turn.`\n          const results = new Tokenizable(errText)\n          helpers.reportToolCall(callId, { tool: toolName, args })\n          helpers.reportToolCall(callId, { results, isError: true, isComplete: true })\n          await ctx.storeToolCall(\n            new ToolCall({\n              id: callId,\n              tool: toolName,\n              args,\n              checksum: computeChecksum(toolName, args),\n              isComplete: true,\n              isError: true,\n              results,\n              createdAt: completedAt,\n              updatedAt: completedAt,\n              completedAt,\n            })\n          )\n          return\n        }\n        helpers.reportToolCall(callId, { tool: tool.name, args })\n        const isArtifactTool = ArtifactTool.isArtifactTool(tool)\n        let results: Tokenizable | SpooledArtifact | SpooledArtifact[] | Media | Media[] =\n          new Tokenizable('')\n        let toolHadError = false\n        try {\n          const raw = await tool.executor(ctx)(args)\n          if (isArtifactTool) {\n            if (Tokenizable.isTokenizable(raw)) {\n              results = raw\n            } else if (typeof raw === 'string') {\n              results = new Tokenizable(raw)\n            } else {\n              throw new Error(\n                `ArtifactTool \"${tool.name}\" returned a non-string/non-Tokenizable value`\n              )\n            }\n          } else if (Media.isMedia(raw)) {\n            results = raw\n          } else if (Array.isArray(raw) && raw.length > 0 && raw.every((m) => Media.isMedia(m))) {\n            results = raw as Media[]\n          } else if (looksLikeSpooledArtifact(raw)) {\n            results = raw as SpooledArtifact\n          } else if (typeof raw === 'string' || isInstanceOf(raw, 'Uint8Array', Uint8Array)) {\n            const reader = await spoolStore.write(callId, raw as string | Uint8Array)\n            const ArtifactCtor = (tool as Tool).artifactConstructor?.() ?? SpooledArtifact\n            results = new ArtifactCtor(reader)\n          } else {\n            const reader = await spoolStore.write(callId, String(raw))\n            const ArtifactCtor = (tool as Tool).artifactConstructor?.() ?? SpooledArtifact\n            results = new ArtifactCtor(reader)\n          }\n        } catch (err) {\n          toolHadError = true\n          let detailMsg = isError(err) ? err.message : String(err)\n          if (\n            isError(err) &&\n            isError(err.cause) &&\n            err.cause.message &&\n            err.cause.message !== err.message\n          ) {\n            detailMsg = `${detailMsg} ${err.cause.message}`\n          }\n          results = new Tokenizable(detailMsg)\n        }\n        helpers.reportToolCall(callId, { results, isError: toolHadError, isComplete: true })\n        const completedAt2 = nowIso()\n        await ctx.storeToolCall(\n          new ToolCall({\n            id: callId,\n            tool: tool.name,\n            args,\n            checksum: computeChecksum(tool.name, args),\n            isComplete: true,\n            isError: toolHadError,\n            results,\n            fromArtifactTool: isArtifactTool,\n            // ArtifactTool results are the documented exception: they inline the slice the model queried\n            // from a prior artifact (handing back a handle to a query result would be recursion). Every\n            // other result keeps the secure default (inline:false → handle).\n            inline: isArtifactTool,\n            createdAt: completedAt2,\n            updatedAt: completedAt2,\n            completedAt: completedAt2,\n          })\n        )\n      }\n\n      // FALLBACK tool-call recovery. Native /api/chat tool-calling is authoritative; this is consulted\n      // ONLY when the provider returned zero structured calls AND the caller opted in via\n      // `localToolCallParser`. Small models routinely emit a call in a surface form the server template\n      // misses (`<call:name{…}`, a ```json block, bare `name\\nkey: value`), landing it in `content` with\n      // empty `tool_calls`. Pure parse — returns the assembled calls (empty when disabled or no match) so\n      // each call site can reflect them in the onRawGeneration tap and then execute. Fully\n      // backward-compatible: absent option → `[]` → today's native-only behaviour.\n      const parseFallbackToolCalls = (content: string): AssembledOllamaToolCall[] => {\n        if (merged.localToolCallParser === undefined) return []\n        if (typeof content !== 'string' || content.length === 0) return []\n        const parser = resolveToolCallParser(merged.localToolCallParser)\n        const toolNames = ctx.tools.visible().map((t) => t.name)\n        return parser(content, { toolNames }).calls.map((c) => ({\n          id: uuidv6(),\n          name: c.name,\n          args: c.arguments as Record<string, unknown>,\n        }))\n      }\n\n      // ── Step 8: streaming path (NDJSON) ───────────────────────────────────\n      if (stream) {\n        if (!response.body) {\n          ctx.nack(new E_OLLAMA_STREAM_ERROR(['response has no body']))\n          return\n        }\n        const reader = response.body.getReader()\n        const decoder = new TextDecoder()\n        const streamId = dispatchStreamId\n\n        let buffer = ''\n        let idleTimer: ReturnType<typeof setTimeout> | undefined\n        let stalled = false\n        let partialMessageContent = ''\n        let sawMessageDelta = false\n        let partialThinking = ''\n        let sawThinking = false\n        let doneSeen = false\n        const collectedToolCalls: AssembledOllamaToolCall[] = []\n        const thoughtStreamId = `${streamId}:thought`\n\n        const idleMs = merged.streamIdleTimeoutMs ?? 0\n        const armIdleTimer = (): void => {\n          if (idleMs <= 0) return\n          if (idleTimer) clearTimeout(idleTimer)\n          idleTimer = setTimeout(() => {\n            stalled = true\n            helpers.log.warn({\n              kind: 'stream-idle-timeout',\n              message: `NDJSON stream went idle for ${idleMs}ms; cancelling`,\n              payload: { idleMs },\n            })\n            reader.cancel().catch(() => {})\n          }, idleMs)\n        }\n        const clearIdleTimer = (): void => {\n          if (idleTimer) {\n            clearTimeout(idleTimer)\n            idleTimer = undefined\n          }\n        }\n\n        const drainAndPersist = async (\n          statsSrc: OllamaChatStreamChunk | undefined\n        ): Promise<void> => {\n          if (sawMessageDelta) {\n            helpers.reportMessage(streamId, '', { isComplete: true })\n            await ctx.storeMessage(\n              new Message({\n                id: streamId,\n                role: 'assistant',\n                content: partialMessageContent,\n                identity: selfIdentity,\n                createdAt: nowIso(),\n                updatedAt: nowIso(),\n              })\n            )\n          }\n          if (sawThinking) {\n            helpers.reportThought(thoughtStreamId, '', { isComplete: true })\n            await ctx.storeThought(\n              new Thought({\n                id: thoughtStreamId,\n                content: partialThinking,\n                identity: selfIdentity,\n                createdAt: nowIso(),\n                updatedAt: nowIso(),\n              })\n            )\n          }\n          if (statsSrc !== undefined) {\n            helpers.reportGenerationStats(extractGenerationStats(statsSrc, merged.model))\n          }\n\n          // Fallback recovery (opt-in): if the server returned no structured calls, try to parse one out\n          // of the accumulated `content`. Consulted only when native calls are absent, so the provider\n          // always wins.\n          const fallbackCalls =\n            collectedToolCalls.length === 0 ? parseFallbackToolCalls(partialMessageContent) : []\n          const effectiveCalls = collectedToolCalls.length > 0 ? collectedToolCalls : fallbackCalls\n\n          // Raw-generation observability tap (FROM Ollama) — streaming path. `rawText`/`cleanedText` are\n          // the accumulated assistant content; `toolCalls` are the calls this dispatch will act on\n          // (native, or fallback-recovered — args already an object). Fired once at stream drain;\n          // observer errors swallowed.\n          if (merged.onRawGeneration) {\n            try {\n              merged.onRawGeneration({\n                rawText: partialMessageContent,\n                cleanedText: partialMessageContent,\n                reasoning: sawThinking ? [partialThinking] : [],\n                toolCalls: effectiveCalls.map((c) => ({\n                  name: c.name,\n                  arguments: c.args as never,\n                })),\n                streamed: true,\n                streamId: dispatchStreamId,\n              })\n            } catch {\n              /* observer errors are non-fatal */\n            }\n          }\n\n          if (effectiveCalls.length === 0) {\n            if (merged.autoAck) ctx.ack()\n            return\n          }\n          for (const call of effectiveCalls) {\n            if (ctx.abortSignal.aborted) return\n            await executeAndPersistToolCall(call)\n          }\n        }\n\n        const handleChunk = (chunk: OllamaChatStreamChunk): void => {\n          const m = chunk.message\n          if (m) {\n            if (typeof m.content === 'string' && m.content.length > 0) {\n              sawMessageDelta = true\n              partialMessageContent += m.content\n              helpers.reportMessage(streamId, m.content)\n            }\n            if (typeof m.thinking === 'string' && m.thinking.length > 0) {\n              sawThinking = true\n              partialThinking += m.thinking\n              helpers.reportThought(thoughtStreamId, m.thinking)\n            }\n            if (Array.isArray(m.tool_calls)) {\n              for (const tc of m.tool_calls) {\n                collectedToolCalls.push({\n                  id: uuidv6(),\n                  name: tc.function?.name ?? '',\n                  args: (tc.function?.arguments ?? {}) as Record<string, unknown>,\n                })\n              }\n            }\n          }\n        }\n\n        const parseLine = (line: string): OllamaChatStreamChunk | undefined => {\n          const trimmed = line.trim()\n          if (trimmed.length === 0) return undefined\n          try {\n            return JSON.parse(trimmed) as OllamaChatStreamChunk\n          } catch {\n            helpers.log.trace({\n              kind: 'ndjson-parse-failure',\n              message: 'Failed to parse NDJSON line as JSON; skipping',\n              payload: { linePreview: trimmed.slice(0, 256) },\n            })\n            return undefined\n          }\n        }\n\n        try {\n          armIdleTimer()\n          while (true) {\n            const { done, value } = await reader.read()\n            if (done) break\n            armIdleTimer()\n            if (ctx.abortSignal.aborted) {\n              clearIdleTimer()\n              return\n            }\n            buffer += decoder.decode(value, { stream: true })\n            let nl = buffer.indexOf('\\n')\n            while (nl !== -1) {\n              const line = buffer.slice(0, nl)\n              buffer = buffer.slice(nl + 1)\n              const chunk = parseLine(line)\n              if (chunk !== undefined) {\n                handleChunk(chunk)\n                if (chunk.done === true) {\n                  doneSeen = true\n                  clearIdleTimer()\n                  await drainAndPersist(chunk)\n                  return\n                }\n              }\n              nl = buffer.indexOf('\\n')\n            }\n          }\n          clearIdleTimer()\n          if (stalled) {\n            ctx.nack(new E_OLLAMA_STREAM_STALLED([idleMs]))\n            return\n          }\n          // Flush any residual non-newline-terminated final line.\n          if (!doneSeen && buffer.trim().length > 0) {\n            const chunk = parseLine(buffer)\n            buffer = ''\n            if (chunk !== undefined) {\n              handleChunk(chunk)\n              if (chunk.done === true) {\n                await drainAndPersist(chunk)\n                return\n              }\n            }\n          }\n          if (!doneSeen) {\n            helpers.log.warn({\n              kind: 'ndjson-eof-without-done',\n              message: 'NDJSON stream ended without a done:true chunk; draining accumulated state',\n            })\n            await drainAndPersist(undefined)\n          }\n        } catch (err) {\n          clearIdleTimer()\n          if (ctx.abortSignal.aborted) return\n          if (stalled) {\n            ctx.nack(new E_OLLAMA_STREAM_STALLED([idleMs]))\n            return\n          }\n          helpers.log.error({\n            kind: 'stream-error',\n            message: `NDJSON stream failed: ${isError(err) ? err.message : String(err)}`,\n            payload: { detail: isError(err) ? err.message : String(err) },\n          })\n          ctx.nack(new E_OLLAMA_STREAM_ERROR([isError(err) ? err.message : String(err)]))\n          return\n        }\n        return\n      }\n\n      // ── Step 9: non-streaming path ────────────────────────────────────────\n      let parsed: OllamaChatResponse\n      try {\n        parsed = (await response.json()) as OllamaChatResponse\n      } catch (err) {\n        ctx.nack(new E_OLLAMA_STREAM_ERROR([isError(err) ? err.message : String(err)]))\n        return\n      }\n      const responseId = uuidv6()\n      const msg = parsed.message\n\n      if (msg && typeof msg.content === 'string' && msg.content.length > 0) {\n        const messageId = `${responseId}:message`\n        helpers.reportMessage(messageId, msg.content, { isComplete: true })\n        await ctx.storeMessage(\n          new Message({\n            id: messageId,\n            role: 'assistant',\n            content: msg.content,\n            identity: selfIdentity,\n            createdAt: nowIso(),\n            updatedAt: nowIso(),\n          })\n        )\n      }\n      if (msg && typeof msg.thinking === 'string' && msg.thinking.length > 0) {\n        const thoughtId = `${responseId}:thought`\n        helpers.reportThought(thoughtId, msg.thinking, { isComplete: true })\n        await ctx.storeThought(\n          new Thought({\n            id: thoughtId,\n            content: msg.thinking,\n            identity: selfIdentity,\n            createdAt: nowIso(),\n            updatedAt: nowIso(),\n          })\n        )\n      }\n\n      helpers.reportGenerationStats(extractGenerationStats(parsed, merged.model))\n\n      const rawCalls: OllamaToolCall[] = msg?.tool_calls ?? []\n      const content = typeof msg?.content === 'string' ? msg.content : ''\n\n      // Fallback recovery (opt-in): if the server returned no structured calls, try to parse one out of\n      // the assistant `content`. Consulted only when native calls are absent, so the provider always wins.\n      const nativeCalls: AssembledOllamaToolCall[] = rawCalls.map((tc) => ({\n        id: uuidv6(),\n        name: tc.function?.name ?? '',\n        args: (tc.function?.arguments ?? {}) as Record<string, unknown>,\n      }))\n      const calls = nativeCalls.length > 0 ? nativeCalls : parseFallbackToolCalls(content)\n\n      // Raw-generation observability tap (FROM Ollama) — non-streaming path. `rawText`/`cleanedText` are\n      // the returned assistant content; `toolCalls` are the calls this dispatch will act on (native, or\n      // fallback-recovered — args already an object). Fired once per terminal generation; observer errors\n      // swallowed.\n      if (merged.onRawGeneration) {\n        try {\n          merged.onRawGeneration({\n            rawText: content,\n            cleanedText: content,\n            reasoning:\n              typeof msg?.thinking === 'string' && msg.thinking.length > 0 ? [msg.thinking] : [],\n            toolCalls: calls.map((c) => ({\n              name: c.name,\n              arguments: c.args as never,\n            })),\n            streamed: false,\n            streamId: dispatchStreamId,\n          })\n        } catch {\n          /* observer errors are non-fatal */\n        }\n      }\n\n      if (calls.length === 0) {\n        if (merged.autoAck) ctx.ack()\n        return\n      }\n      for (const call of calls) {\n        if (ctx.abortSignal.aborted) return\n        await executeAndPersistToolCall(call)\n      }\n    }\n  }\n\n  /**\n   * Returns `true` when `value` is an {@link OllamaAdapter} instance.\n   */\n  public static isOllamaAdapter(value: unknown): value is OllamaAdapter {\n    return isInstanceOf(value, 'OllamaAdapter', OllamaAdapter)\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkHA,IAAM,eACJ,WACkB;CAClB,IAAI;CACJ,KAAK,MAAM,SAAS,QAAQ;EAC1B,IAAI,CAAC,OAAO;EACZ,SAAS;GAAE,GAAI,UAAW,CAAC;GAAU,GAAG;EAAM;CAChD;CACA,OAAO;AACT;AAEA,IAAM,gBACJ,UACA,MACA,UACkC;CAClC,MAAM,SAAS;EAAC;EAA2C,QAAQ,CAAC;EAAG,SAAS,CAAC;CAAC;CAClF,MAAM,MAA+B,CAAC;CACtC,KAAK,MAAM,SAAS,QAClB,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,GAAG;EAC1C,IAAI,MAAM,KAAA,GAAW;EACrB,IAAI,MAAM,aAAa,MAAM,aAAa,MAAM,WAAW,MAAM,WAAW;EAC5E,IAAI,KAAK;CACX;CAEF,MAAM,UAAU,YAAY,OAAO,KAAK,MAAM,EAAE,OAA6C,CAAC;CAC9F,IAAI,YAAY,KAAA,GAAW,IAAI,UAAU;CACzC,MAAM,UAAU,YAAY,OAAO,KAAK,MAAM,EAAE,OAA8C,CAAC;CAC/F,IAAI,YAAY,KAAA,GAAW,IAAI,UAAU;CACzC,MAAM,QAAQ,YAAY,OAAO,KAAK,MAAM,EAAE,KAA4C,CAAC;CAC3F,IAAI,UAAU,KAAA,GAAW,IAAI,QAAQ;CAGrC,MAAM,UAAU,YAAY,OAAO,KAAK,MAAM,EAAE,OAA8C,CAAC;CAC/F,IAAI,YAAY,KAAA,GAAW,IAAI,UAAU;CACzC,OAAO;AACT;AAIA,IAAM,kBAAkB,cAAiE;CACvF,MAAM,MAAM,aAAa,CAAC;CAC1B,OAAO;EACL,wCACE,IAAI,0CAA0C,gBAAA;EAChD,wBAAwB,IAAI,0BAA0B,gBAAA;EACtD,sBAAsB,IAAI,wBAAwB,gBAAA;EAClD,4BAA4B,IAAI,8BAA8B,gBAAA;EAC9D,gBAAgB,IAAI,kBAAkB,gBAAA;EACtC,oBAAoB,IAAI,sBAAsB,gBAAA;EAC9C,6BACE,IAAI,+BAA+B,gBAAA;EACrC,kCACE,IAAI,oCAAoC,gBAAA;EAC1C,8BACE,IAAI,gCAAgC,gBAAA;EACtC,oCACE,IAAI,sCAAsC,gBAAA;EAC5C,qCACE,IAAI,uCAAuC,gBAAA;EAC7C,eAAe,IAAI,iBAAiB,gBAAA;EACpC,gBAAgB,IAAI,kBAAkB,gBAAA;EACtC,6BACE,IAAI,+BAA+B,gBAAA;EACrC,mCACE,IAAI,qCAAqC,gBAAA;EAC3C,6BACE,IAAI,+BAA+B,qCAAA;EACrC,4BAA4B,IAAI,8BAA8B,qCAAA;EAC9D,oBAAoB,IAAI,sBAAsB,qCAAA;CAChD;AACF;AAIA,IAAM,mBAAmB,MAAc,UAAA,GAAA,UAAA,QAC9B,yBAAA,mBAAmB;CAAE;CAAM;AAAK,CAAC,CAAC;AAE3C,IAAM,eAAuB,MAAA,SAAS,IAAI,EAAE,MAAM,sBAAK,IAAI,KAAK,GAAE,YAAY;AAE9E,IAAM,mBAAmB,OACvB,OACA,aACoB,QAAQ,QAAQ,MAAM,eAAe,QAAyB,CAAC;AAIrF,IAAM,0BACJ,KACA,UACoB;CACpB,MAAM,QAAyB;EAAE,UAAU;EAAU,OAAO,IAAI,SAAS;EAAO,KAAK,EAAE,GAAG,IAAI;CAAE;CAChG,IAAI,OAAO,IAAI,sBAAsB,UAAU,MAAM,eAAe,IAAI;CACxE,IAAI,OAAO,IAAI,eAAe,UAAU,MAAM,mBAAmB,IAAI;CACrE,IAAI,OAAO,IAAI,sBAAsB,YAAY,OAAO,IAAI,eAAe,UACzE,MAAM,cAAc,IAAI,oBAAoB,IAAI;CAElD,IAAI,OAAO,IAAI,mBAAmB,UAAU,MAAM,kBAAkB,IAAI;CACxE,IAAI,OAAO,IAAI,kBAAkB,UAAU,MAAM,iBAAiB,IAAI;CACtE,IAAI,OAAO,IAAI,yBAAyB,UACtC,MAAM,uBAAuB,IAAI;CAEnC,IAAI,OAAO,IAAI,kBAAkB,UAAU,MAAM,iBAAiB,IAAI;CACtE,IAAI,OAAO,IAAI,gBAAgB,UAAU,MAAM,eAAe,IAAI;CAClE,OAAO;AACT;;;;;;;;;;;;;AAgBA,IAAa,gBAAb,MAAa,cAAc;;CAEzB,OAAuB,YAAY;CAEnC;;;;;;CAOA,YAAY,SAAkB;EAC5B,KAAKA,YAAY,wCAAA,gBAAgB,OAAO;CAC1C;;;;;;;;CASA,SAAS,WAA+D;EACtE,MAAM,WAAW,KAAKA;EACtB,MAAM,eAAe;EACrB,OAAO,OAAO,KAAsB,YAAoD;GACtF,MAAM,aAAa,QAAsB;IACvC,QAAQ,IAAI,KAAK;KAAE,MAAM;KAAkB,SAAS;IAAI,CAAC;GAC3D;GAGA,MAAM,WAAW,IAAI,MAAM,IAAI,aAAa,WAAW,CAAC,CAAC;GAGzD,MAAM,SAAS,wCAAA,gBAAgB,aAAa,UAAU,WADpD,YAAY,OAAO,aAAa,WAAY,WAA6C,CAAC,CACb,CAAC;GAGhF,IAAI,OAAO,kBAAkB,QAAQ,OAAO,kBAAkB,KAAA,GAC5D,MAAM,IAAI,wCAAA,yBAAyB,CACjC,0DACF,CAAC;GAIH,MAAM,kBAAkB,eAAe,OAAO,OAAO;GASrD,MAAM,0CAA0B,IAAI,IAAsB;GAC1D,KAAK,MAAM,MAAM,IAAI,eAAe;IAClC,MAAM,WAAW,MAAM,gBAAgB,2BAA2B;KAChE,UAAU;KACV,SAAS,GAAG;KAMZ,MAAM,IAAI,MAAM,IAAI,GAAG,IAAI;KAC3B,wBAAwB,gBAAgB;KACxC,sBAAsB,gBAAgB;KACtC,wBAAwB,OAAO,0BAA0B;KACzD,MAAM;IACR,CAAC;IACD,wBAAwB,IAAI,IAAI,QAAQ;GAC1C;GAGA,IAAI,OAAO,kBAAkB,QAAQ,OAAO,kBAAkB,KAAA,GAAW;IACvE,MAAM,WAAW,OAAO;IACxB,IAAI,WAAW,MAAM,iBAAiB,IAAI,cAAc,QAAQ;IAChE,IAAI,WAAW;IACf,KAAK,MAAM,MAAM,IAAI,sBACnB,YAAY,MAAM,iBAAiB,IAAI,QAAQ;IAEjD,IAAI,YAAY;IAChB,KAAK,MAAM,OAAO,IAAI,cACpB,aAAa,MAAM,iBAAiB,IAAI,SAAS,QAAQ;IAE3D,IAAI,YAAY;IAChB,KAAK,MAAM,KAAK,IAAI,kBAClB,aACE,CAAC,EAAE,UAAU,yBAAA,gBAAgB,kBAAkB,EAAE,OAAO,KAAK,EAAE,QAAQ,aAAa,IAChF,EAAE,QAAQ,qBACR,EAAE,IACF,UACA,gBAAgB,2BAClB,IACA,MAAM,iBAAiB,EAAE,SAAS,QAAQ;IAElD,IAAI,WAAW;IACf,KAAK,MAAM,OAAO,IAAI,cACpB,IAAI,IAAI,YAAY,KAAA,GAClB,YAAY,MAAM,iBAAiB,IAAI,SAAS,QAAQ;IAG5D,KAAK,MAAM,MAAM,IAAI,cACnB,YAAY,MAAM,iBAAiB,GAAG,SAAS,QAAQ;IAEzD,KAAK,MAAM,YAAY,wBAAwB,OAAO,GACpD,YAAY,MAAM,iBAAiB,IAAI,oBAAA,YAAY,QAAQ,GAAG,QAAQ;IAQxE,IAAI,aAAa;IACjB,MAAM,eAAe,IAAI,MAAM,QAAQ;IACvC,IAAI,aAAa,SAAS,GAOxB,aAAa,MAAM,iBAAiB,IAAI,oBAAA,YANtB,KAAK,UACrB,qCAAA,qBAAqB,cAAc,EACjC,wCACE,gBAAgB,uCACpB,CAAC,CAEiD,CAAS,GAAG,QAAQ;IAE1E,MAAM,QAAQ,WAAW,WAAW,YAAY,YAAY,WAAW;IACvE,MAAM,eAAe;KACnB,cAAc;KACd,sBAAsB;KACtB,UAAU;KACV,cAAc;KACd,UAAU;KACV,OAAO;IACT;IACA,QAAQ,IAAI,MAAM;KAChB,MAAM;KACN,SAAS,yBAAyB,MAAM,GAAG,OAAO,cAAc;KAChE,SAAS;MAAE;MAAO,OAAO,OAAO;MAAe;MAAU,WAAW;KAAa;IACnF,CAAC;IACD,IAAI,QAAQ,OAAO,eACjB,MAAM,IAAI,wCAAA,0BAA0B;KAClC;KACA,OAAO;KACP;KACA,KAAK,UAAU,YAAY;IAC7B,CAAC;GAEL;GAGA,MAAM,EAAE,UAAU,cAAc,sBAC9B,MAAM,gBAAgB,mBAAmB;IACvC,cAAc,IAAI;IAClB,sBAAsB,IAAI;IAC1B,UAAU,IAAI;IACd,cAAc,IAAI;IAClB,UAAU,IAAI;IACd,UAAU,IAAI;IACd,WAAW,IAAI;IACf,OAAO,IAAI;IACX;IACA,aAAa,OAAO,eAAe;KACjC;KACA;KACA;KACA;IACF;IACA,cAAc,OAAO,gBAAgB;IACrC,kBAAkB,OAAO,oBAAoB;IAC7C,qBAAqB,OAAO,uBAAuB,CAAC;IACpD,4BAA4B,gBAAgB;IAC5C,mCAAmC,gBAAgB;IACnD,4BAA4B,gBAAgB;IAC5C,gBAAgB,gBAAgB;IAChC,oBAAoB,gBAAgB;IACpC,6BAA6B,gBAAgB;IAC7C,kCAAkC,gBAAgB;IAClD,8BAA8B,gBAAgB;IAC9C,oCAAoC,gBAAgB;IACpD,qCAAqC,gBAAgB;IACrD,6BAA6B,gBAAgB;IAC7C,eAAe,gBAAgB;IAC/B,gBAAgB,gBAAgB;IAChC,wBAAwB,gBAAgB;IACxC,sBAAsB,gBAAgB;IACtC,wBAAwB,OAAO,0BAA0B;IACzD,MAAM;GACR,CAAC;GAEH,MAAM,SAAS,OAAO,UAAU;GAChC,MAAM,OAA8B;IAClC,OAAO,OAAO;IACd,UAAU;IACV;GACF;GAGA,IAAI,OAAO,UAAU,KAAA,GAAW,KAAK,QAAQ,OAAO;GACpD,IAAI,OAAO,WAAW,KAAA,GAAW,KAAK,SAAS,OAAO;GACtD,IAAI,OAAO,eAAe,KAAA,GAAW,KAAK,aAAa,OAAO;GAC9D,IAAI,OAAO,YAAY,KAAA,GAAW,KAAK,UAAU,OAAO;GACxD,MAAM,WAAW,IAAI,MAAM,QAAQ;GACnC,IAAI,SAAS,SAAS,GACpB,KAAK,QAAQ,qCAAA,qBAAqB,UAAU,EAC1C,wCACE,gBAAgB,uCACpB,CAAC;GAEH,IAAI,kBAAkB,SAAS,GAC7B,KAAK,0BAA0B;GAKjC,MAAM,oBAAA,GAAA,KAAA,IAA0B;GAKhC,IAAI,OAAO,mBACT,IAAI;IACF,OAAO,kBAAkB;KACvB,SAAS;KACT,MAAM;KACN,UAAU,KAAK;KACf,OAAO,KAAK;KACZ,aAAa;KACb,UAAU;KACV,UAAU;IACZ,CAAC;GACH,QAAQ,CAER;GAIF,MAAM,UAAU,OAAO,WAAW;GAElC,MAAM,MAAM,GADI,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI,QACxC;GAEvB,MAAM,UAAkC,EAAE,gBAAgB,mBAAmB;GAC7E,IAAI,QAAQ,QAAQ,YAAY;GAChC,IAAI,OAAO,QAAQ,QAAQ,mBAAmB,UAAU,OAAO;GAC/D,IAAI,OAAO,SAAS,OAAO,OAAO,SAAS,OAAO,OAAO;GAEzD,MAAM,WAAW;IACf,aAAa,OAAO,OAAO,eAAe;IAC1C,aAAa,OAAO,OAAO,eAAe;IAC1C,YAAY,OAAO,OAAO,cAAc;IACxC,mBAAmB,OAAO,OAAO,qBAAqB;KAAC;KAAK;KAAK;KAAK;IAAG;IACzE,iBAAiB,OAAO,OAAO,mBAAmB;GACpD;GAEA,MAAM,UAAU,OAAO,SAAS,WAAW;GAC3C,MAAM,cAAc,SAAS;GAE7B,IAAI;GACJ,IAAI,UAAU;GACd,IAAI,oBAAgC,CAAC;GACrC,OAAO,WAAW,aAAa;IAC7B,IAAI,IAAI,YAAY,SAAS;IAE7B,MAAM,qBAAqB,IAAI,gBAAgB;IAC/C,IAAI;IACJ,MAAM,mBAAmB,OAAO,oBAAoB;IACpD,IAAI,mBAAmB,GACrB,gBAAgB,iBAAiB,mBAAmB,MAAM,GAAG,gBAAgB;IAE/E,YAAY;IACZ,MAAM,EAAE,QAAQ,cAAc,SAAS,uBAAuB,wBAAA,iBAAiB,CAC7E,IAAI,aACJ,mBAAmB,MACrB,CAAC;IACD,cAAc;IAEd,IAAI;KACF,WAAW,MAAM,QAAQ,KAAK;MAC5B,QAAQ;MACR;MACA,MAAM,KAAK,UAAU,IAAI;MACzB,QAAQ;KACV,CAAC;IACH,SAAS,KAAK;KACZ,IAAI,kBAAkB,KAAA,GAAW,aAAa,aAAa;KAC3D,IAAI,IAAI,YAAY,SAAS;KAC7B,IAAI,mBAAmB,OAAO,SAAS;MACrC,QAAQ,IAAI,KAAK;OACf,MAAM;OACN,SAAS,2BAA2B,iBAAiB,gBAAgB,QAAQ,GAAG;OAChF,SAAS;QAAE;QAAkB;QAAS;OAAY;MACpD,CAAC;MACD,IAAI,UAAU,aAAa;OAEzB,MAAM,wBAAA,gBADQ,wBAAA,eAAe,SAAS,QAChB,GAAO,IAAI,WAAW;OAC5C,WAAW;OACX;MACF;MACA,IAAI,KAAK,IAAI,wCAAA,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;MACzD;KACF;KACA,QAAQ,IAAI,MAAM;MAChB,MAAM;MACN,SAAS,gCAAgC,QAAQ,GAAG,YAAY,IAAI,eAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;MAC3G,SAAS;OAAE;OAAS;OAAa,QAAQ,eAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;MAAE;KACpF,CAAC;KACD,IAAI,KAAK,IAAI,wCAAA,oBAAoB,CAAC,GAAG,eAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC,CAAC;KAC/E;IACF;IAEA,IAAI,kBAAkB,KAAA,GAAW,aAAa,aAAa;IAE3D,IAAI,CAAC,SAAS,IAAI;KAChB,MAAM,SAAS,SAAS;KACxB,MAAM,YAAY,SAAS,kBAAkB,SAAS,MAAM;KAC5D,IAAI,aAAa,UAAU,aAAa;MACtC,IAAI,QAAQ,wBAAA,eAAe,SAAS,QAAQ;MAC5C,IAAI,SAAS,oBAAoB,OAAO;OACtC,MAAM,KAAK,SAAS,QAAQ,IAAI,aAAa;OAC7C,IAAI,IAAI;QACN,MAAM,OAAO,wBAAA,gBAAgB,EAAE;QAC/B,IAAI,OAAO,GAAG,QAAQ,KAAK,IAAI,KAAK,IAAI,OAAO,IAAI,GAAG,SAAS,UAAU;OAC3E;MACF;MACA,QAAQ,IAAI,KAAK;OACf,MAAM;OACN,SAAS,QAAQ,OAAO,cAAc,QAAQ,GAAG,YAAY,iBAAiB,MAAM;OACpF,SAAS;QACP,QAAQ;QACR;QACA,SAAS;QACT,SAAS,UAAU;QACnB;OACF;MACF,CAAC;MACD,MAAM,wBAAA,gBAAgB,OAAO,IAAI,WAAW;MAC5C,WAAW;MACX;KACF;KACA,MAAM,UAAU,MAAM,SAAS,KAAK,EAAE,YAAY,EAAE;KACpD,QAAQ,IAAI,MAAM;MAChB,MAAM;MACN,SAAS,QAAQ,OAAO,eAAe,QAAQ,MAAM,GAAG,GAAG;MAC3D,SAAS;OAAE;OAAQ,MAAM;OAAS;OAAS;OAAa;MAAU;KACpE,CAAC;KACD,IAAI,KAAK,IAAI,wCAAA,oBAAoB,CAAC,QAAQ,OAAO,CAAC,CAAC;KACnD;IACF;IAEA;GACF;GAEA,IAAI,CAAC,UAAU;GAEf,MAAM,aAAa,OAAO,cAAc,IAAI,oCAAA,mBAAmB;GAC/D,MAAM,eAAe,OAAO,gBAAgB;GAG5C,MAAM,4BAA4B,OAAO,SAAiD;IAExF,MAAM,SAAS,OAAO,mBAAmB,KAAK,IAAI,GAAG,KAAK,KAAK;IAC/D,MAAM,OAAO,IAAI,MAAM,IAAI,KAAK,IAAI;IAIpC,IAAI,OAAgC,CAAC;IACrC,IAAI;IACJ,IAAI,eAAA,SAAS,KAAK,IAAI,GACpB,OAAO,KAAK;SAOZ,aAAa,IAAI,wCAAA,gCAAgC,CAC/C,mCANmB,MAAM,QAAQ,KAAK,IAAI,IACxC,UACA,KAAK,SAAS,OACZ,SACA,OAAO,KAAK,QAGhB,KAAK,UAAU,KAAK,IAAI,CAC1B,CAAC;IAEH,MAAM,cAAc,OAAO;IAC3B,IAAI,eAAe,KAAA,GAAW;KAC5B,MAAM,WAAW,gBAAA,kBAAkB,KAAK,IAAI;KAC5C,MAAM,UAAU,IAAI,oBAAA,YAAY,WAAW,OAAO;KAClD,QAAQ,eAAe,QAAQ;MAAE,MAAM;MAAU;KAAK,CAAC;KACvD,QAAQ,eAAe,QAAQ;MAAE;MAAS,SAAS;MAAM,YAAY;KAAK,CAAC;KAC3E,MAAM,IAAI,cACR,IAAI,kBAAA,SAAS;MACX,IAAI;MACJ,MAAM;MACN;MACA,UAAU,gBAAgB,UAAU,IAAI;MACxC,YAAY;MACZ,SAAS;MACT;MACA,WAAW;MACX,WAAW;MACX;KACF,CAAC,CACH;KACA;IACF;IACA,IAAI,CAAC,MAAM;KACT,MAAM,WAAW,gBAAA,kBAAkB,KAAK,IAAI;KAC5C,MAAM,YAAY,IAAI,MACnB,IAAI,EACJ,KAAK,MAAM,EAAE,IAAI,EACjB,KAAK;KAKR,MAAM,UAAU,IAAI,oBAAA,YAHlB,UAAU,SAAS,IACf,mBAAmB,SAAS,qBAAqB,UAAU,KAAK,IAAI,EAAE,KACtE,mBAAmB,SAAS,oCACK;KACvC,QAAQ,eAAe,QAAQ;MAAE,MAAM;MAAU;KAAK,CAAC;KACvD,QAAQ,eAAe,QAAQ;MAAE;MAAS,SAAS;MAAM,YAAY;KAAK,CAAC;KAC3E,MAAM,IAAI,cACR,IAAI,kBAAA,SAAS;MACX,IAAI;MACJ,MAAM;MACN;MACA,UAAU,gBAAgB,UAAU,IAAI;MACxC,YAAY;MACZ,SAAS;MACT;MACA,WAAW;MACX,WAAW;MACX;KACF,CAAC,CACH;KACA;IACF;IACA,QAAQ,eAAe,QAAQ;KAAE,MAAM,KAAK;KAAM;IAAK,CAAC;IACxD,MAAM,iBAAiB,yBAAA,aAAa,eAAe,IAAI;IACvD,IAAI,UACF,IAAI,oBAAA,YAAY,EAAE;IACpB,IAAI,eAAe;IACnB,IAAI;KACF,MAAM,MAAM,MAAM,KAAK,SAAS,GAAG,EAAE,IAAI;KACzC,IAAI,gBACF,IAAI,oBAAA,YAAY,cAAc,GAAG,GAC/B,UAAU;UACL,IAAI,OAAO,QAAQ,UACxB,UAAU,IAAI,oBAAA,YAAY,GAAG;UAE7B,MAAM,IAAI,MACR,iBAAiB,KAAK,KAAK,8CAC7B;UAEG,IAAI,kBAAA,MAAM,QAAQ,GAAG,GAC1B,UAAU;UACL,IAAI,MAAM,QAAQ,GAAG,KAAK,IAAI,SAAS,KAAK,IAAI,OAAO,MAAM,kBAAA,MAAM,QAAQ,CAAC,CAAC,GAClF,UAAU;UACL,IAAI,gBAAA,yBAAyB,GAAG,GACrC,UAAU;UACL,IAAI,OAAO,QAAQ,YAAY,eAAA,aAAa,KAAK,cAAc,UAAU,GAAG;MACjF,MAAM,SAAS,MAAM,WAAW,MAAM,QAAQ,GAA0B;MAExE,UAAU,MADY,KAAc,sBAAsB,MAAK,yBAAA,iBACpC,MAAM;KACnC,OAAO;MACL,MAAM,SAAS,MAAM,WAAW,MAAM,QAAQ,OAAO,GAAG,CAAC;MAEzD,UAAU,MADY,KAAc,sBAAsB,MAAK,yBAAA,iBACpC,MAAM;KACnC;IACF,SAAS,KAAK;KACZ,eAAe;KACf,IAAI,YAAY,eAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;KACvD,IACE,eAAA,QAAQ,GAAG,KACX,eAAA,QAAQ,IAAI,KAAK,KACjB,IAAI,MAAM,WACV,IAAI,MAAM,YAAY,IAAI,SAE1B,YAAY,GAAG,UAAU,GAAG,IAAI,MAAM;KAExC,UAAU,IAAI,oBAAA,YAAY,SAAS;IACrC;IACA,QAAQ,eAAe,QAAQ;KAAE;KAAS,SAAS;KAAc,YAAY;IAAK,CAAC;IACnF,MAAM,eAAe,OAAO;IAC5B,MAAM,IAAI,cACR,IAAI,kBAAA,SAAS;KACX,IAAI;KACJ,MAAM,KAAK;KACX;KACA,UAAU,gBAAgB,KAAK,MAAM,IAAI;KACzC,YAAY;KACZ,SAAS;KACT;KACA,kBAAkB;KAIlB,QAAQ;KACR,WAAW;KACX,WAAW;KACX,aAAa;IACf,CAAC,CACH;GACF;GASA,MAAM,0BAA0B,YAA+C;IAC7E,IAAI,OAAO,wBAAwB,KAAA,GAAW,OAAO,CAAC;IACtD,IAAI,OAAO,YAAY,YAAY,QAAQ,WAAW,GAAG,OAAO,CAAC;IAGjE,OAFe,qBAAA,sBAAsB,OAAO,mBAErC,EAAO,SAAS,EAAE,WADP,IAAI,MAAM,QAAQ,EAAE,KAAK,MAAM,EAAE,IAC1B,EAAU,CAAC,EAAE,MAAM,KAAK,OAAO;KACtD,KAAA,GAAA,KAAA,IAAW;KACX,MAAM,EAAE;KACR,MAAM,EAAE;IACV,EAAE;GACJ;GAGA,IAAI,QAAQ;IACV,IAAI,CAAC,SAAS,MAAM;KAClB,IAAI,KAAK,IAAI,wCAAA,sBAAsB,CAAC,sBAAsB,CAAC,CAAC;KAC5D;IACF;IACA,MAAM,SAAS,SAAS,KAAK,UAAU;IACvC,MAAM,UAAU,IAAI,YAAY;IAChC,MAAM,WAAW;IAEjB,IAAI,SAAS;IACb,IAAI;IACJ,IAAI,UAAU;IACd,IAAI,wBAAwB;IAC5B,IAAI,kBAAkB;IACtB,IAAI,kBAAkB;IACtB,IAAI,cAAc;IAClB,IAAI,WAAW;IACf,MAAM,qBAAgD,CAAC;IACvD,MAAM,kBAAkB,GAAG,SAAS;IAEpC,MAAM,SAAS,OAAO,uBAAuB;IAC7C,MAAM,qBAA2B;KAC/B,IAAI,UAAU,GAAG;KACjB,IAAI,WAAW,aAAa,SAAS;KACrC,YAAY,iBAAiB;MAC3B,UAAU;MACV,QAAQ,IAAI,KAAK;OACf,MAAM;OACN,SAAS,+BAA+B,OAAO;OAC/C,SAAS,EAAE,OAAO;MACpB,CAAC;MACD,OAAO,OAAO,EAAE,YAAY,CAAC,CAAC;KAChC,GAAG,MAAM;IACX;IACA,MAAM,uBAA6B;KACjC,IAAI,WAAW;MACb,aAAa,SAAS;MACtB,YAAY,KAAA;KACd;IACF;IAEA,MAAM,kBAAkB,OACtB,aACkB;KAClB,IAAI,iBAAiB;MACnB,QAAQ,cAAc,UAAU,IAAI,EAAE,YAAY,KAAK,CAAC;MACxD,MAAM,IAAI,aACR,IAAI,gBAAA,QAAQ;OACV,IAAI;OACJ,MAAM;OACN,SAAS;OACT,UAAU;OACV,WAAW,OAAO;OAClB,WAAW,OAAO;MACpB,CAAC,CACH;KACF;KACA,IAAI,aAAa;MACf,QAAQ,cAAc,iBAAiB,IAAI,EAAE,YAAY,KAAK,CAAC;MAC/D,MAAM,IAAI,aACR,IAAI,gBAAA,QAAQ;OACV,IAAI;OACJ,SAAS;OACT,UAAU;OACV,WAAW,OAAO;OAClB,WAAW,OAAO;MACpB,CAAC,CACH;KACF;KACA,IAAI,aAAa,KAAA,GACf,QAAQ,sBAAsB,uBAAuB,UAAU,OAAO,KAAK,CAAC;KAM9E,MAAM,gBACJ,mBAAmB,WAAW,IAAI,uBAAuB,qBAAqB,IAAI,CAAC;KACrF,MAAM,iBAAiB,mBAAmB,SAAS,IAAI,qBAAqB;KAM5E,IAAI,OAAO,iBACT,IAAI;MACF,OAAO,gBAAgB;OACrB,SAAS;OACT,aAAa;OACb,WAAW,cAAc,CAAC,eAAe,IAAI,CAAC;OAC9C,WAAW,eAAe,KAAK,OAAO;QACpC,MAAM,EAAE;QACR,WAAW,EAAE;OACf,EAAE;OACF,UAAU;OACV,UAAU;MACZ,CAAC;KACH,QAAQ,CAER;KAGF,IAAI,eAAe,WAAW,GAAG;MAC/B,IAAI,OAAO,SAAS,IAAI,IAAI;MAC5B;KACF;KACA,KAAK,MAAM,QAAQ,gBAAgB;MACjC,IAAI,IAAI,YAAY,SAAS;MAC7B,MAAM,0BAA0B,IAAI;KACtC;IACF;IAEA,MAAM,eAAe,UAAuC;KAC1D,MAAM,IAAI,MAAM;KAChB,IAAI,GAAG;MACL,IAAI,OAAO,EAAE,YAAY,YAAY,EAAE,QAAQ,SAAS,GAAG;OACzD,kBAAkB;OAClB,yBAAyB,EAAE;OAC3B,QAAQ,cAAc,UAAU,EAAE,OAAO;MAC3C;MACA,IAAI,OAAO,EAAE,aAAa,YAAY,EAAE,SAAS,SAAS,GAAG;OAC3D,cAAc;OACd,mBAAmB,EAAE;OACrB,QAAQ,cAAc,iBAAiB,EAAE,QAAQ;MACnD;MACA,IAAI,MAAM,QAAQ,EAAE,UAAU,GAC5B,KAAK,MAAM,MAAM,EAAE,YACjB,mBAAmB,KAAK;OACtB,KAAA,GAAA,KAAA,IAAW;OACX,MAAM,GAAG,UAAU,QAAQ;OAC3B,MAAO,GAAG,UAAU,aAAa,CAAC;MACpC,CAAC;KAGP;IACF;IAEA,MAAM,aAAa,SAAoD;KACrE,MAAM,UAAU,KAAK,KAAK;KAC1B,IAAI,QAAQ,WAAW,GAAG,OAAO,KAAA;KACjC,IAAI;MACF,OAAO,KAAK,MAAM,OAAO;KAC3B,QAAQ;MACN,QAAQ,IAAI,MAAM;OAChB,MAAM;OACN,SAAS;OACT,SAAS,EAAE,aAAa,QAAQ,MAAM,GAAG,GAAG,EAAE;MAChD,CAAC;MACD;KACF;IACF;IAEA,IAAI;KACF,aAAa;KACb,OAAO,MAAM;MACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;MAC1C,IAAI,MAAM;MACV,aAAa;MACb,IAAI,IAAI,YAAY,SAAS;OAC3B,eAAe;OACf;MACF;MACA,UAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;MAChD,IAAI,KAAK,OAAO,QAAQ,IAAI;MAC5B,OAAO,OAAO,IAAI;OAChB,MAAM,OAAO,OAAO,MAAM,GAAG,EAAE;OAC/B,SAAS,OAAO,MAAM,KAAK,CAAC;OAC5B,MAAM,QAAQ,UAAU,IAAI;OAC5B,IAAI,UAAU,KAAA,GAAW;QACvB,YAAY,KAAK;QACjB,IAAI,MAAM,SAAS,MAAM;SACvB,WAAW;SACX,eAAe;SACf,MAAM,gBAAgB,KAAK;SAC3B;QACF;OACF;OACA,KAAK,OAAO,QAAQ,IAAI;MAC1B;KACF;KACA,eAAe;KACf,IAAI,SAAS;MACX,IAAI,KAAK,IAAI,wCAAA,wBAAwB,CAAC,MAAM,CAAC,CAAC;MAC9C;KACF;KAEA,IAAI,CAAC,YAAY,OAAO,KAAK,EAAE,SAAS,GAAG;MACzC,MAAM,QAAQ,UAAU,MAAM;MAC9B,SAAS;MACT,IAAI,UAAU,KAAA,GAAW;OACvB,YAAY,KAAK;OACjB,IAAI,MAAM,SAAS,MAAM;QACvB,MAAM,gBAAgB,KAAK;QAC3B;OACF;MACF;KACF;KACA,IAAI,CAAC,UAAU;MACb,QAAQ,IAAI,KAAK;OACf,MAAM;OACN,SAAS;MACX,CAAC;MACD,MAAM,gBAAgB,KAAA,CAAS;KACjC;IACF,SAAS,KAAK;KACZ,eAAe;KACf,IAAI,IAAI,YAAY,SAAS;KAC7B,IAAI,SAAS;MACX,IAAI,KAAK,IAAI,wCAAA,wBAAwB,CAAC,MAAM,CAAC,CAAC;MAC9C;KACF;KACA,QAAQ,IAAI,MAAM;MAChB,MAAM;MACN,SAAS,yBAAyB,eAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;MACzE,SAAS,EAAE,QAAQ,eAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG,EAAE;KAC9D,CAAC;KACD,IAAI,KAAK,IAAI,wCAAA,sBAAsB,CAAC,eAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC,CAAC;KAC9E;IACF;IACA;GACF;GAGA,IAAI;GACJ,IAAI;IACF,SAAU,MAAM,SAAS,KAAK;GAChC,SAAS,KAAK;IACZ,IAAI,KAAK,IAAI,wCAAA,sBAAsB,CAAC,eAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC,CAAC;IAC9E;GACF;GACA,MAAM,cAAA,GAAA,KAAA,IAAoB;GAC1B,MAAM,MAAM,OAAO;GAEnB,IAAI,OAAO,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,SAAS,GAAG;IACpE,MAAM,YAAY,GAAG,WAAW;IAChC,QAAQ,cAAc,WAAW,IAAI,SAAS,EAAE,YAAY,KAAK,CAAC;IAClE,MAAM,IAAI,aACR,IAAI,gBAAA,QAAQ;KACV,IAAI;KACJ,MAAM;KACN,SAAS,IAAI;KACb,UAAU;KACV,WAAW,OAAO;KAClB,WAAW,OAAO;IACpB,CAAC,CACH;GACF;GACA,IAAI,OAAO,OAAO,IAAI,aAAa,YAAY,IAAI,SAAS,SAAS,GAAG;IACtE,MAAM,YAAY,GAAG,WAAW;IAChC,QAAQ,cAAc,WAAW,IAAI,UAAU,EAAE,YAAY,KAAK,CAAC;IACnE,MAAM,IAAI,aACR,IAAI,gBAAA,QAAQ;KACV,IAAI;KACJ,SAAS,IAAI;KACb,UAAU;KACV,WAAW,OAAO;KAClB,WAAW,OAAO;IACpB,CAAC,CACH;GACF;GAEA,QAAQ,sBAAsB,uBAAuB,QAAQ,OAAO,KAAK,CAAC;GAE1E,MAAM,WAA6B,KAAK,cAAc,CAAC;GACvD,MAAM,UAAU,OAAO,KAAK,YAAY,WAAW,IAAI,UAAU;GAIjE,MAAM,cAAyC,SAAS,KAAK,QAAQ;IACnE,KAAA,GAAA,KAAA,IAAW;IACX,MAAM,GAAG,UAAU,QAAQ;IAC3B,MAAO,GAAG,UAAU,aAAa,CAAC;GACpC,EAAE;GACF,MAAM,QAAQ,YAAY,SAAS,IAAI,cAAc,uBAAuB,OAAO;GAMnF,IAAI,OAAO,iBACT,IAAI;IACF,OAAO,gBAAgB;KACrB,SAAS;KACT,aAAa;KACb,WACE,OAAO,KAAK,aAAa,YAAY,IAAI,SAAS,SAAS,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC;KACnF,WAAW,MAAM,KAAK,OAAO;MAC3B,MAAM,EAAE;MACR,WAAW,EAAE;KACf,EAAE;KACF,UAAU;KACV,UAAU;IACZ,CAAC;GACH,QAAQ,CAER;GAGF,IAAI,MAAM,WAAW,GAAG;IACtB,IAAI,OAAO,SAAS,IAAI,IAAI;IAC5B;GACF;GACA,KAAK,MAAM,QAAQ,OAAO;IACxB,IAAI,IAAI,YAAY,SAAS;IAC7B,MAAM,0BAA0B,IAAI;GACtC;EACF;CACF;;;;CAKA,OAAc,gBAAgB,OAAwC;EACpE,OAAO,eAAA,aAAa,OAAO,iBAAiB,aAAa;CAC3D;AACF"}